11b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor//===--- ASTImporter.cpp - Importing ASTs from other Contexts ---*- C++ -*-===// 21b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor// 31b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor// The LLVM Compiler Infrastructure 41b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor// 51b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor// This file is distributed under the University of Illinois Open Source 61b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor// License. See LICENSE.TXT for details. 71b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor// 81b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor//===----------------------------------------------------------------------===// 91b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor// 101b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor// This file defines the ASTImporter class which imports AST nodes from one 111b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor// context into another context. 121b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor// 131b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor//===----------------------------------------------------------------------===// 141b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor#include "clang/AST/ASTImporter.h" 151b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor#include "clang/AST/ASTContext.h" 16885237354fd902998c6ae9d7cc3dc8de96b123dcDouglas Gregor#include "clang/AST/ASTDiagnostic.h" 1796a01b4acf76fb8fe1e05341a97a27b39fb0b914Douglas Gregor#include "clang/AST/DeclCXX.h" 181b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor#include "clang/AST/DeclObjC.h" 19089459a16bf7e9cd10617d1fac5ec0240a0a1ee6Douglas Gregor#include "clang/AST/DeclVisitor.h" 204800d95d28b20eca5d57c108ae3d2e6e312c1182Douglas Gregor#include "clang/AST/StmtVisitor.h" 211b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor#include "clang/AST/TypeVisitor.h" 22885237354fd902998c6ae9d7cc3dc8de96b123dcDouglas Gregor#include "clang/Basic/FileManager.h" 23885237354fd902998c6ae9d7cc3dc8de96b123dcDouglas Gregor#include "clang/Basic/SourceManager.h" 24885237354fd902998c6ae9d7cc3dc8de96b123dcDouglas Gregor#include "llvm/Support/MemoryBuffer.h" 2573dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor#include <deque> 261b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor 2727c72d8ca8bbb2861959c71f737e2560a7bf9991Douglas Gregornamespace clang { 28089459a16bf7e9cd10617d1fac5ec0240a0a1ee6Douglas Gregor class ASTNodeImporter : public TypeVisitor<ASTNodeImporter, QualType>, 294800d95d28b20eca5d57c108ae3d2e6e312c1182Douglas Gregor public DeclVisitor<ASTNodeImporter, Decl *>, 304800d95d28b20eca5d57c108ae3d2e6e312c1182Douglas Gregor public StmtVisitor<ASTNodeImporter, Stmt *> { 311b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor ASTImporter &Importer; 321b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor 331b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor public: 341b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor explicit ASTNodeImporter(ASTImporter &Importer) : Importer(Importer) { } 351b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor 361b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor using TypeVisitor<ASTNodeImporter, QualType>::Visit; 379bed8798964d9f07599c2c9199701f86fbc70e20Douglas Gregor using DeclVisitor<ASTNodeImporter, Decl *>::Visit; 384800d95d28b20eca5d57c108ae3d2e6e312c1182Douglas Gregor using StmtVisitor<ASTNodeImporter, Stmt *>::Visit; 391b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor 401b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor // Importing types 41f4c7371fb1d3cebcfb40abad4537bb82515704eaJohn McCall QualType VisitType(const Type *T); 42f4c7371fb1d3cebcfb40abad4537bb82515704eaJohn McCall QualType VisitBuiltinType(const BuiltinType *T); 43f4c7371fb1d3cebcfb40abad4537bb82515704eaJohn McCall QualType VisitComplexType(const ComplexType *T); 44f4c7371fb1d3cebcfb40abad4537bb82515704eaJohn McCall QualType VisitPointerType(const PointerType *T); 45f4c7371fb1d3cebcfb40abad4537bb82515704eaJohn McCall QualType VisitBlockPointerType(const BlockPointerType *T); 46f4c7371fb1d3cebcfb40abad4537bb82515704eaJohn McCall QualType VisitLValueReferenceType(const LValueReferenceType *T); 47f4c7371fb1d3cebcfb40abad4537bb82515704eaJohn McCall QualType VisitRValueReferenceType(const RValueReferenceType *T); 48f4c7371fb1d3cebcfb40abad4537bb82515704eaJohn McCall QualType VisitMemberPointerType(const MemberPointerType *T); 49f4c7371fb1d3cebcfb40abad4537bb82515704eaJohn McCall QualType VisitConstantArrayType(const ConstantArrayType *T); 50f4c7371fb1d3cebcfb40abad4537bb82515704eaJohn McCall QualType VisitIncompleteArrayType(const IncompleteArrayType *T); 51f4c7371fb1d3cebcfb40abad4537bb82515704eaJohn McCall QualType VisitVariableArrayType(const VariableArrayType *T); 521b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor // FIXME: DependentSizedArrayType 531b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor // FIXME: DependentSizedExtVectorType 54f4c7371fb1d3cebcfb40abad4537bb82515704eaJohn McCall QualType VisitVectorType(const VectorType *T); 55f4c7371fb1d3cebcfb40abad4537bb82515704eaJohn McCall QualType VisitExtVectorType(const ExtVectorType *T); 56f4c7371fb1d3cebcfb40abad4537bb82515704eaJohn McCall QualType VisitFunctionNoProtoType(const FunctionNoProtoType *T); 57f4c7371fb1d3cebcfb40abad4537bb82515704eaJohn McCall QualType VisitFunctionProtoType(const FunctionProtoType *T); 581b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor // FIXME: UnresolvedUsingType 590aeb2890389ec1872e49a18fb2022bfb9f96578dSean Callanan QualType VisitParenType(const ParenType *T); 60f4c7371fb1d3cebcfb40abad4537bb82515704eaJohn McCall QualType VisitTypedefType(const TypedefType *T); 61f4c7371fb1d3cebcfb40abad4537bb82515704eaJohn McCall QualType VisitTypeOfExprType(const TypeOfExprType *T); 621b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor // FIXME: DependentTypeOfExprType 63f4c7371fb1d3cebcfb40abad4537bb82515704eaJohn McCall QualType VisitTypeOfType(const TypeOfType *T); 64f4c7371fb1d3cebcfb40abad4537bb82515704eaJohn McCall QualType VisitDecltypeType(const DecltypeType *T); 65ca63c200346c0ca9e00194ec6e34a5a7b0ed9321Sean Hunt QualType VisitUnaryTransformType(const UnaryTransformType *T); 6634b41d939a1328f484511c6002ba2456db879a29Richard Smith QualType VisitAutoType(const AutoType *T); 671b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor // FIXME: DependentDecltypeType 68f4c7371fb1d3cebcfb40abad4537bb82515704eaJohn McCall QualType VisitRecordType(const RecordType *T); 69f4c7371fb1d3cebcfb40abad4537bb82515704eaJohn McCall QualType VisitEnumType(const EnumType *T); 701b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor // FIXME: TemplateTypeParmType 711b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor // FIXME: SubstTemplateTypeParmType 72f4c7371fb1d3cebcfb40abad4537bb82515704eaJohn McCall QualType VisitTemplateSpecializationType(const TemplateSpecializationType *T); 73f4c7371fb1d3cebcfb40abad4537bb82515704eaJohn McCall QualType VisitElaboratedType(const ElaboratedType *T); 744714c12a1ab759156b78be8f109ea4c12213af57Douglas Gregor // FIXME: DependentNameType 7533500955d731c73717af52088b7fc0e7a85681e7John McCall // FIXME: DependentTemplateSpecializationType 76f4c7371fb1d3cebcfb40abad4537bb82515704eaJohn McCall QualType VisitObjCInterfaceType(const ObjCInterfaceType *T); 77f4c7371fb1d3cebcfb40abad4537bb82515704eaJohn McCall QualType VisitObjCObjectType(const ObjCObjectType *T); 78f4c7371fb1d3cebcfb40abad4537bb82515704eaJohn McCall QualType VisitObjCObjectPointerType(const ObjCObjectPointerType *T); 79089459a16bf7e9cd10617d1fac5ec0240a0a1ee6Douglas Gregor 80cd0d56a523f877ffd1fe1575caf758b4357f1661Douglas Gregor // Importing declarations 81a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor bool ImportDeclParts(NamedDecl *D, DeclContext *&DC, 82a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor DeclContext *&LexicalDC, DeclarationName &Name, 83788c62d1e87bfb596078817237f672a5f000999aDouglas Gregor SourceLocation &Loc); 846bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines void ImportDefinitionIfNeeded(Decl *FromD, Decl *ToD = nullptr); 852577743c5650c646fb705df01403707e94f2df04Abramo Bagnara void ImportDeclarationNameLoc(const DeclarationNameInfo &From, 862577743c5650c646fb705df01403707e94f2df04Abramo Bagnara DeclarationNameInfo& To); 87d8868a634d4fd362243dc646e58c3cf956c81dcdDouglas Gregor void ImportDeclContext(DeclContext *FromDC, bool ForceImport = false); 88ac32ff9812e7d6bc31573b5499bfd005fc8b8f39Douglas Gregor 89cd0d56a523f877ffd1fe1575caf758b4357f1661Douglas Gregor /// \brief What we should import from the definition. 90cd0d56a523f877ffd1fe1575caf758b4357f1661Douglas Gregor enum ImportDefinitionKind { 91cd0d56a523f877ffd1fe1575caf758b4357f1661Douglas Gregor /// \brief Import the default subset of the definition, which might be 92cd0d56a523f877ffd1fe1575caf758b4357f1661Douglas Gregor /// nothing (if minimal import is set) or might be everything (if minimal 93cd0d56a523f877ffd1fe1575caf758b4357f1661Douglas Gregor /// import is not set). 94cd0d56a523f877ffd1fe1575caf758b4357f1661Douglas Gregor IDK_Default, 95cd0d56a523f877ffd1fe1575caf758b4357f1661Douglas Gregor /// \brief Import everything. 96cd0d56a523f877ffd1fe1575caf758b4357f1661Douglas Gregor IDK_Everything, 97cd0d56a523f877ffd1fe1575caf758b4357f1661Douglas Gregor /// \brief Import only the bare bones needed to establish a valid 98cd0d56a523f877ffd1fe1575caf758b4357f1661Douglas Gregor /// DeclContext. 99cd0d56a523f877ffd1fe1575caf758b4357f1661Douglas Gregor IDK_Basic 100cd0d56a523f877ffd1fe1575caf758b4357f1661Douglas Gregor }; 101cd0d56a523f877ffd1fe1575caf758b4357f1661Douglas Gregor 102ac32ff9812e7d6bc31573b5499bfd005fc8b8f39Douglas Gregor bool shouldForceImportDeclContext(ImportDefinitionKind IDK) { 103ac32ff9812e7d6bc31573b5499bfd005fc8b8f39Douglas Gregor return IDK == IDK_Everything || 104ac32ff9812e7d6bc31573b5499bfd005fc8b8f39Douglas Gregor (IDK == IDK_Default && !Importer.isMinimalImport()); 105ac32ff9812e7d6bc31573b5499bfd005fc8b8f39Douglas Gregor } 106ac32ff9812e7d6bc31573b5499bfd005fc8b8f39Douglas Gregor 1071cf038c516c5e1f56ea9cff61aac7f7841744a91Douglas Gregor bool ImportDefinition(RecordDecl *From, RecordDecl *To, 108cd0d56a523f877ffd1fe1575caf758b4357f1661Douglas Gregor ImportDefinitionKind Kind = IDK_Default); 109ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo bool ImportDefinition(VarDecl *From, VarDecl *To, 110ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo ImportDefinitionKind Kind = IDK_Default); 1111cf038c516c5e1f56ea9cff61aac7f7841744a91Douglas Gregor bool ImportDefinition(EnumDecl *From, EnumDecl *To, 112ac32ff9812e7d6bc31573b5499bfd005fc8b8f39Douglas Gregor ImportDefinitionKind Kind = IDK_Default); 1135602f7e77e975d780f84079532408c0064566c3bDouglas Gregor bool ImportDefinition(ObjCInterfaceDecl *From, ObjCInterfaceDecl *To, 114ac32ff9812e7d6bc31573b5499bfd005fc8b8f39Douglas Gregor ImportDefinitionKind Kind = IDK_Default); 1155602f7e77e975d780f84079532408c0064566c3bDouglas Gregor bool ImportDefinition(ObjCProtocolDecl *From, ObjCProtocolDecl *To, 116ac32ff9812e7d6bc31573b5499bfd005fc8b8f39Douglas Gregor ImportDefinitionKind Kind = IDK_Default); 117040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor TemplateParameterList *ImportTemplateParameterList( 118040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor TemplateParameterList *Params); 119d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor TemplateArgument ImportTemplateArgument(const TemplateArgument &From); 120d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor bool ImportTemplateArguments(const TemplateArgument *FromArgs, 121d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor unsigned NumFromArgs, 1225f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner SmallVectorImpl<TemplateArgument> &ToArgs); 12393ed7cf05f900b9150dcf59c0e0f37f3bd325f62Douglas Gregor bool IsStructuralMatch(RecordDecl *FromRecord, RecordDecl *ToRecord, 12493ed7cf05f900b9150dcf59c0e0f37f3bd325f62Douglas Gregor bool Complain = true); 125ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo bool IsStructuralMatch(VarDecl *FromVar, VarDecl *ToVar, 126ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo bool Complain = true); 12773dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor bool IsStructuralMatch(EnumDecl *FromEnum, EnumDecl *ToRecord); 1281cef45955d87dde48c78b6878dc0ee67a3404b6cDouglas Gregor bool IsStructuralMatch(EnumConstantDecl *FromEC, EnumConstantDecl *ToEC); 129040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor bool IsStructuralMatch(ClassTemplateDecl *From, ClassTemplateDecl *To); 130ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo bool IsStructuralMatch(VarTemplateDecl *From, VarTemplateDecl *To); 13189cc9d6e2aaf794fbd2c228a3755c19062ca0ba0Douglas Gregor Decl *VisitDecl(Decl *D); 132f1b69466146cda83936fae66839c446602e05133Sean Callanan Decl *VisitTranslationUnitDecl(TranslationUnitDecl *D); 133788c62d1e87bfb596078817237f672a5f000999aDouglas Gregor Decl *VisitNamespaceDecl(NamespaceDecl *D); 134162e1c1b487352434552147967c3dd296ebee2f7Richard Smith Decl *VisitTypedefNameDecl(TypedefNameDecl *D, bool IsAlias); 1359e5d996444e40fdf5cce44ee82bec0d4e3df3d56Douglas Gregor Decl *VisitTypedefDecl(TypedefDecl *D); 136162e1c1b487352434552147967c3dd296ebee2f7Richard Smith Decl *VisitTypeAliasDecl(TypeAliasDecl *D); 13736ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas Gregor Decl *VisitEnumDecl(EnumDecl *D); 13896a01b4acf76fb8fe1e05341a97a27b39fb0b914Douglas Gregor Decl *VisitRecordDecl(RecordDecl *D); 13936ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas Gregor Decl *VisitEnumConstantDecl(EnumConstantDecl *D); 140a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor Decl *VisitFunctionDecl(FunctionDecl *D); 141c144f3534e2f7a70ea9ebf8dd83090a2883d61fbDouglas Gregor Decl *VisitCXXMethodDecl(CXXMethodDecl *D); 142c144f3534e2f7a70ea9ebf8dd83090a2883d61fbDouglas Gregor Decl *VisitCXXConstructorDecl(CXXConstructorDecl *D); 143c144f3534e2f7a70ea9ebf8dd83090a2883d61fbDouglas Gregor Decl *VisitCXXDestructorDecl(CXXDestructorDecl *D); 144c144f3534e2f7a70ea9ebf8dd83090a2883d61fbDouglas Gregor Decl *VisitCXXConversionDecl(CXXConversionDecl *D); 14596a01b4acf76fb8fe1e05341a97a27b39fb0b914Douglas Gregor Decl *VisitFieldDecl(FieldDecl *D); 14687c2e121cf0522fc266efe2922b58091cd2e0182Francois Pichet Decl *VisitIndirectFieldDecl(IndirectFieldDecl *D); 1472e55e3af2f6d6c0509495357fade95105dd144cdDouglas Gregor Decl *VisitObjCIvarDecl(ObjCIvarDecl *D); 148089459a16bf7e9cd10617d1fac5ec0240a0a1ee6Douglas Gregor Decl *VisitVarDecl(VarDecl *D); 1492cd00932b9b5403047139ce8cfaa3ae47966f894Douglas Gregor Decl *VisitImplicitParamDecl(ImplicitParamDecl *D); 150a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor Decl *VisitParmVarDecl(ParmVarDecl *D); 151c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor Decl *VisitObjCMethodDecl(ObjCMethodDecl *D); 152b4677b62a8e9bba0913dfe1456bd9d689cdbccacDouglas Gregor Decl *VisitObjCCategoryDecl(ObjCCategoryDecl *D); 1532e2a400383c7a64a927f61eeed596b08928e1d4bDouglas Gregor Decl *VisitObjCProtocolDecl(ObjCProtocolDecl *D); 154a12d294db5bd59cd8836b9bd0dafadaaa2e3dd8aDouglas Gregor Decl *VisitObjCInterfaceDecl(ObjCInterfaceDecl *D); 1553daef29bf390dbdb3603748280afd5827d1811daDouglas Gregor Decl *VisitObjCCategoryImplDecl(ObjCCategoryImplDecl *D); 156dd182ff10b9145e432dea1fd2fb67100ccca3b10Douglas Gregor Decl *VisitObjCImplementationDecl(ObjCImplementationDecl *D); 157e3261624c1870e52d7efc2ac83e647713361ac6cDouglas Gregor Decl *VisitObjCPropertyDecl(ObjCPropertyDecl *D); 158954e0c75c42f321945aff8b9ee96da43cd90c752Douglas Gregor Decl *VisitObjCPropertyImplDecl(ObjCPropertyImplDecl *D); 159040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor Decl *VisitTemplateTypeParmDecl(TemplateTypeParmDecl *D); 160040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor Decl *VisitNonTypeTemplateParmDecl(NonTypeTemplateParmDecl *D); 161040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor Decl *VisitTemplateTemplateParmDecl(TemplateTemplateParmDecl *D); 162040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor Decl *VisitClassTemplateDecl(ClassTemplateDecl *D); 163d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor Decl *VisitClassTemplateSpecializationDecl( 164d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor ClassTemplateSpecializationDecl *D); 165ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo Decl *VisitVarTemplateDecl(VarTemplateDecl *D); 166ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo Decl *VisitVarTemplateSpecializationDecl(VarTemplateSpecializationDecl *D); 167ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo 1684800d95d28b20eca5d57c108ae3d2e6e312c1182Douglas Gregor // Importing statements 1694800d95d28b20eca5d57c108ae3d2e6e312c1182Douglas Gregor Stmt *VisitStmt(Stmt *S); 1704800d95d28b20eca5d57c108ae3d2e6e312c1182Douglas Gregor 1714800d95d28b20eca5d57c108ae3d2e6e312c1182Douglas Gregor // Importing expressions 1724800d95d28b20eca5d57c108ae3d2e6e312c1182Douglas Gregor Expr *VisitExpr(Expr *E); 173440806306674e23ad74726208cbdc6f37849dd9dDouglas Gregor Expr *VisitDeclRefExpr(DeclRefExpr *E); 1744800d95d28b20eca5d57c108ae3d2e6e312c1182Douglas Gregor Expr *VisitIntegerLiteral(IntegerLiteral *E); 175b2e400aae8c62c4e1616016f40618baace0da065Douglas Gregor Expr *VisitCharacterLiteral(CharacterLiteral *E); 176f638f9580ba0da99a66668f00e1a1d4987067bddDouglas Gregor Expr *VisitParenExpr(ParenExpr *E); 177f638f9580ba0da99a66668f00e1a1d4987067bddDouglas Gregor Expr *VisitUnaryOperator(UnaryOperator *E); 178f4e3cfbe8abd124be6341ef5d714819b4fbd9082Peter Collingbourne Expr *VisitUnaryExprOrTypeTraitExpr(UnaryExprOrTypeTraitExpr *E); 179f638f9580ba0da99a66668f00e1a1d4987067bddDouglas Gregor Expr *VisitBinaryOperator(BinaryOperator *E); 180f638f9580ba0da99a66668f00e1a1d4987067bddDouglas Gregor Expr *VisitCompoundAssignOperator(CompoundAssignOperator *E); 18136ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas Gregor Expr *VisitImplicitCastExpr(ImplicitCastExpr *E); 182008847a70ab122a99911149199855060fb3753b4Douglas Gregor Expr *VisitCStyleCastExpr(CStyleCastExpr *E); 1831b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor }; 1841b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor} 18527c72d8ca8bbb2861959c71f737e2560a7bf9991Douglas Gregorusing namespace clang; 1861b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor 1871b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor//---------------------------------------------------------------------------- 18873dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor// Structural Equivalence 18973dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor//---------------------------------------------------------------------------- 19073dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor 19173dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregornamespace { 19273dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor struct StructuralEquivalenceContext { 19373dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor /// \brief AST contexts for which we are checking structural equivalence. 19473dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor ASTContext &C1, &C2; 19573dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor 19673dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor /// \brief The set of "tentative" equivalences between two canonical 19773dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor /// declarations, mapping from a declaration in the first context to the 19873dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor /// declaration in the second context that we believe to be equivalent. 19973dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor llvm::DenseMap<Decl *, Decl *> TentativeEquivalences; 20073dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor 20173dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor /// \brief Queue of declarations in the first context whose equivalence 20273dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor /// with a declaration in the second context still needs to be verified. 20373dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor std::deque<Decl *> DeclsToCheck; 20473dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor 205ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor /// \brief Declaration (from, to) pairs that are known not to be equivalent 206ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor /// (which we have already complained about). 207ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor llvm::DenseSet<std::pair<Decl *, Decl *> > &NonEquivalentDecls; 208ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor 20973dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor /// \brief Whether we're being strict about the spelling of types when 21073dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor /// unifying two types. 21173dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor bool StrictTypeSpelling; 21293ed7cf05f900b9150dcf59c0e0f37f3bd325f62Douglas Gregor 21393ed7cf05f900b9150dcf59c0e0f37f3bd325f62Douglas Gregor /// \brief Whether to complain about failures. 21493ed7cf05f900b9150dcf59c0e0f37f3bd325f62Douglas Gregor bool Complain; 21593ed7cf05f900b9150dcf59c0e0f37f3bd325f62Douglas Gregor 2165b9268f26ac53a74d2c504279fe577d988d5615dRichard Smith /// \brief \c true if the last diagnostic came from C2. 2175b9268f26ac53a74d2c504279fe577d988d5615dRichard Smith bool LastDiagFromC2; 2185b9268f26ac53a74d2c504279fe577d988d5615dRichard Smith 21973dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor StructuralEquivalenceContext(ASTContext &C1, ASTContext &C2, 220ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor llvm::DenseSet<std::pair<Decl *, Decl *> > &NonEquivalentDecls, 22193ed7cf05f900b9150dcf59c0e0f37f3bd325f62Douglas Gregor bool StrictTypeSpelling = false, 22293ed7cf05f900b9150dcf59c0e0f37f3bd325f62Douglas Gregor bool Complain = true) 22333e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis : C1(C1), C2(C2), NonEquivalentDecls(NonEquivalentDecls), 2245b9268f26ac53a74d2c504279fe577d988d5615dRichard Smith StrictTypeSpelling(StrictTypeSpelling), Complain(Complain), 2255b9268f26ac53a74d2c504279fe577d988d5615dRichard Smith LastDiagFromC2(false) {} 22673dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor 22773dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor /// \brief Determine whether the two declarations are structurally 22873dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor /// equivalent. 22973dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor bool IsStructurallyEquivalent(Decl *D1, Decl *D2); 23073dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor 23173dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor /// \brief Determine whether the two types are structurally equivalent. 23273dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor bool IsStructurallyEquivalent(QualType T1, QualType T2); 23373dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor 23473dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor private: 23573dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor /// \brief Finish checking all of the structural equivalences. 23673dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor /// 23773dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor /// \returns true if an error occurred, false otherwise. 23873dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor bool Finish(); 23973dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor 24073dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor public: 24173dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor DiagnosticBuilder Diag1(SourceLocation Loc, unsigned DiagID) { 242347f64feb4f144c97757b4d8469030e793dbb36eDouglas Gregor assert(Complain && "Not allowed to complain"); 2435b9268f26ac53a74d2c504279fe577d988d5615dRichard Smith if (LastDiagFromC2) 2445b9268f26ac53a74d2c504279fe577d988d5615dRichard Smith C1.getDiagnostics().notePriorDiagnosticFrom(C2.getDiagnostics()); 2455b9268f26ac53a74d2c504279fe577d988d5615dRichard Smith LastDiagFromC2 = false; 24633e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis return C1.getDiagnostics().Report(Loc, DiagID); 24773dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor } 24873dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor 24973dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor DiagnosticBuilder Diag2(SourceLocation Loc, unsigned DiagID) { 250347f64feb4f144c97757b4d8469030e793dbb36eDouglas Gregor assert(Complain && "Not allowed to complain"); 2515b9268f26ac53a74d2c504279fe577d988d5615dRichard Smith if (!LastDiagFromC2) 2525b9268f26ac53a74d2c504279fe577d988d5615dRichard Smith C2.getDiagnostics().notePriorDiagnosticFrom(C1.getDiagnostics()); 2535b9268f26ac53a74d2c504279fe577d988d5615dRichard Smith LastDiagFromC2 = true; 25433e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis return C2.getDiagnostics().Report(Loc, DiagID); 25573dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor } 25673dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor }; 25773dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor} 25873dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor 25973dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregorstatic bool IsStructurallyEquivalent(StructuralEquivalenceContext &Context, 26073dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor QualType T1, QualType T2); 26173dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregorstatic bool IsStructurallyEquivalent(StructuralEquivalenceContext &Context, 26273dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor Decl *D1, Decl *D2); 26373dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor 26473dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor/// \brief Determine structural equivalence of two expressions. 26573dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregorstatic bool IsStructurallyEquivalent(StructuralEquivalenceContext &Context, 26673dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor Expr *E1, Expr *E2) { 26773dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor if (!E1 || !E2) 26873dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor return E1 == E2; 26973dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor 27073dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor // FIXME: Actually perform a structural comparison! 27173dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor return true; 27273dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor} 27373dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor 27473dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor/// \brief Determine whether two identifiers are equivalent. 27573dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregorstatic bool IsStructurallyEquivalent(const IdentifierInfo *Name1, 27673dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor const IdentifierInfo *Name2) { 27773dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor if (!Name1 || !Name2) 27873dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor return Name1 == Name2; 27973dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor 28073dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor return Name1->getName() == Name2->getName(); 28173dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor} 28273dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor 28373dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor/// \brief Determine whether two nested-name-specifiers are equivalent. 28473dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregorstatic bool IsStructurallyEquivalent(StructuralEquivalenceContext &Context, 28573dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor NestedNameSpecifier *NNS1, 28673dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor NestedNameSpecifier *NNS2) { 28773dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor // FIXME: Implement! 28873dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor return true; 28973dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor} 29073dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor 29173dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor/// \brief Determine whether two template arguments are equivalent. 29273dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregorstatic bool IsStructurallyEquivalent(StructuralEquivalenceContext &Context, 29373dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor const TemplateArgument &Arg1, 29473dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor const TemplateArgument &Arg2) { 295d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor if (Arg1.getKind() != Arg2.getKind()) 296d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor return false; 297d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor 298d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor switch (Arg1.getKind()) { 299d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor case TemplateArgument::Null: 300d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor return true; 301d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor 302d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor case TemplateArgument::Type: 303d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor return Context.IsStructurallyEquivalent(Arg1.getAsType(), Arg2.getAsType()); 304d7a6b1640e565487d163023a6a2e83f55476ae96Eli Friedman 305d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor case TemplateArgument::Integral: 306d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor if (!Context.IsStructurallyEquivalent(Arg1.getIntegralType(), 307d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor Arg2.getIntegralType())) 308d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor return false; 309d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor 31081695fa3a4772a62131eca45f8582cff72b1b9dbEric Christopher return llvm::APSInt::isSameValue(Arg1.getAsIntegral(), Arg2.getAsIntegral()); 311d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor 312d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor case TemplateArgument::Declaration: 313d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor return Context.IsStructurallyEquivalent(Arg1.getAsDecl(), Arg2.getAsDecl()); 314d7a6b1640e565487d163023a6a2e83f55476ae96Eli Friedman 315d7a6b1640e565487d163023a6a2e83f55476ae96Eli Friedman case TemplateArgument::NullPtr: 316d7a6b1640e565487d163023a6a2e83f55476ae96Eli Friedman return true; // FIXME: Is this correct? 317d7a6b1640e565487d163023a6a2e83f55476ae96Eli Friedman 318d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor case TemplateArgument::Template: 319d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor return IsStructurallyEquivalent(Context, 320d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor Arg1.getAsTemplate(), 321d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor Arg2.getAsTemplate()); 322a7fc901a2e39bfe55bfcff5934b2d9fdf9656491Douglas Gregor 323a7fc901a2e39bfe55bfcff5934b2d9fdf9656491Douglas Gregor case TemplateArgument::TemplateExpansion: 324a7fc901a2e39bfe55bfcff5934b2d9fdf9656491Douglas Gregor return IsStructurallyEquivalent(Context, 325a7fc901a2e39bfe55bfcff5934b2d9fdf9656491Douglas Gregor Arg1.getAsTemplateOrTemplatePattern(), 326a7fc901a2e39bfe55bfcff5934b2d9fdf9656491Douglas Gregor Arg2.getAsTemplateOrTemplatePattern()); 327a7fc901a2e39bfe55bfcff5934b2d9fdf9656491Douglas Gregor 328d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor case TemplateArgument::Expression: 329d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor return IsStructurallyEquivalent(Context, 330d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor Arg1.getAsExpr(), Arg2.getAsExpr()); 331d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor 332d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor case TemplateArgument::Pack: 333d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor if (Arg1.pack_size() != Arg2.pack_size()) 334d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor return false; 335d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor 336d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor for (unsigned I = 0, N = Arg1.pack_size(); I != N; ++I) 337d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor if (!IsStructurallyEquivalent(Context, 338d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor Arg1.pack_begin()[I], 339d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor Arg2.pack_begin()[I])) 340d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor return false; 341d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor 342d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor return true; 343d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor } 344d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor 345d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor llvm_unreachable("Invalid template argument kind"); 34673dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor} 34773dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor 34873dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor/// \brief Determine structural equivalence for the common part of array 34973dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor/// types. 35073dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregorstatic bool IsArrayStructurallyEquivalent(StructuralEquivalenceContext &Context, 35173dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor const ArrayType *Array1, 35273dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor const ArrayType *Array2) { 35373dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor if (!IsStructurallyEquivalent(Context, 35473dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor Array1->getElementType(), 35573dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor Array2->getElementType())) 35673dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor return false; 35773dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor if (Array1->getSizeModifier() != Array2->getSizeModifier()) 35873dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor return false; 35973dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor if (Array1->getIndexTypeQualifiers() != Array2->getIndexTypeQualifiers()) 36073dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor return false; 36173dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor 36273dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor return true; 36373dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor} 36473dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor 36573dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor/// \brief Determine structural equivalence of two types. 36673dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregorstatic bool IsStructurallyEquivalent(StructuralEquivalenceContext &Context, 36773dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor QualType T1, QualType T2) { 36873dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor if (T1.isNull() || T2.isNull()) 36973dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor return T1.isNull() && T2.isNull(); 37073dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor 37173dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor if (!Context.StrictTypeSpelling) { 37273dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor // We aren't being strict about token-to-token equivalence of types, 37373dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor // so map down to the canonical type. 37473dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor T1 = Context.C1.getCanonicalType(T1); 37573dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor T2 = Context.C2.getCanonicalType(T2); 37673dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor } 37773dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor 37873dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor if (T1.getQualifiers() != T2.getQualifiers()) 37973dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor return false; 38073dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor 381ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor Type::TypeClass TC = T1->getTypeClass(); 382ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor 383ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor if (T1->getTypeClass() != T2->getTypeClass()) { 384ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor // Compare function types with prototypes vs. without prototypes as if 385ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor // both did not have prototypes. 386ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor if (T1->getTypeClass() == Type::FunctionProto && 387ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor T2->getTypeClass() == Type::FunctionNoProto) 388ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor TC = Type::FunctionNoProto; 389ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor else if (T1->getTypeClass() == Type::FunctionNoProto && 390ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor T2->getTypeClass() == Type::FunctionProto) 391ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor TC = Type::FunctionNoProto; 392ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor else 393ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor return false; 394ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor } 39573dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor 396ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor switch (TC) { 397ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor case Type::Builtin: 39873dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor // FIXME: Deal with Char_S/Char_U. 39973dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor if (cast<BuiltinType>(T1)->getKind() != cast<BuiltinType>(T2)->getKind()) 40073dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor return false; 40173dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor break; 40273dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor 40373dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor case Type::Complex: 40473dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor if (!IsStructurallyEquivalent(Context, 40573dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor cast<ComplexType>(T1)->getElementType(), 40673dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor cast<ComplexType>(T2)->getElementType())) 40773dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor return false; 40873dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor break; 40973dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor 410651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines case Type::Adjusted: 41112df246d6dea2ee1f92c186f922f1afcf499647aReid Kleckner case Type::Decayed: 41212df246d6dea2ee1f92c186f922f1afcf499647aReid Kleckner if (!IsStructurallyEquivalent(Context, 413651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines cast<AdjustedType>(T1)->getOriginalType(), 414651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines cast<AdjustedType>(T2)->getOriginalType())) 41512df246d6dea2ee1f92c186f922f1afcf499647aReid Kleckner return false; 41612df246d6dea2ee1f92c186f922f1afcf499647aReid Kleckner break; 41712df246d6dea2ee1f92c186f922f1afcf499647aReid Kleckner 41873dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor case Type::Pointer: 41973dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor if (!IsStructurallyEquivalent(Context, 42073dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor cast<PointerType>(T1)->getPointeeType(), 42173dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor cast<PointerType>(T2)->getPointeeType())) 42273dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor return false; 42373dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor break; 42473dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor 42573dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor case Type::BlockPointer: 42673dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor if (!IsStructurallyEquivalent(Context, 42773dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor cast<BlockPointerType>(T1)->getPointeeType(), 42873dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor cast<BlockPointerType>(T2)->getPointeeType())) 42973dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor return false; 43073dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor break; 43173dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor 43273dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor case Type::LValueReference: 43373dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor case Type::RValueReference: { 43473dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor const ReferenceType *Ref1 = cast<ReferenceType>(T1); 43573dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor const ReferenceType *Ref2 = cast<ReferenceType>(T2); 43673dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor if (Ref1->isSpelledAsLValue() != Ref2->isSpelledAsLValue()) 43773dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor return false; 43873dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor if (Ref1->isInnerRef() != Ref2->isInnerRef()) 43973dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor return false; 44073dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor if (!IsStructurallyEquivalent(Context, 44173dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor Ref1->getPointeeTypeAsWritten(), 44273dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor Ref2->getPointeeTypeAsWritten())) 44373dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor return false; 44473dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor break; 44573dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor } 44673dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor 44773dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor case Type::MemberPointer: { 44873dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor const MemberPointerType *MemPtr1 = cast<MemberPointerType>(T1); 44973dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor const MemberPointerType *MemPtr2 = cast<MemberPointerType>(T2); 45073dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor if (!IsStructurallyEquivalent(Context, 45173dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor MemPtr1->getPointeeType(), 45273dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor MemPtr2->getPointeeType())) 45373dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor return false; 45473dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor if (!IsStructurallyEquivalent(Context, 45573dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor QualType(MemPtr1->getClass(), 0), 45673dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor QualType(MemPtr2->getClass(), 0))) 45773dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor return false; 45873dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor break; 45973dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor } 46073dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor 46173dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor case Type::ConstantArray: { 46273dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor const ConstantArrayType *Array1 = cast<ConstantArrayType>(T1); 46373dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor const ConstantArrayType *Array2 = cast<ConstantArrayType>(T2); 46481695fa3a4772a62131eca45f8582cff72b1b9dbEric Christopher if (!llvm::APInt::isSameValue(Array1->getSize(), Array2->getSize())) 46573dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor return false; 46673dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor 46773dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor if (!IsArrayStructurallyEquivalent(Context, Array1, Array2)) 46873dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor return false; 46973dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor break; 47073dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor } 47173dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor 47273dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor case Type::IncompleteArray: 47373dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor if (!IsArrayStructurallyEquivalent(Context, 47473dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor cast<ArrayType>(T1), 47573dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor cast<ArrayType>(T2))) 47673dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor return false; 47773dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor break; 47873dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor 47973dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor case Type::VariableArray: { 48073dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor const VariableArrayType *Array1 = cast<VariableArrayType>(T1); 48173dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor const VariableArrayType *Array2 = cast<VariableArrayType>(T2); 48273dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor if (!IsStructurallyEquivalent(Context, 48373dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor Array1->getSizeExpr(), Array2->getSizeExpr())) 48473dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor return false; 48573dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor 48673dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor if (!IsArrayStructurallyEquivalent(Context, Array1, Array2)) 48773dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor return false; 48873dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor 48973dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor break; 49073dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor } 49173dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor 49273dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor case Type::DependentSizedArray: { 49373dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor const DependentSizedArrayType *Array1 = cast<DependentSizedArrayType>(T1); 49473dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor const DependentSizedArrayType *Array2 = cast<DependentSizedArrayType>(T2); 49573dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor if (!IsStructurallyEquivalent(Context, 49673dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor Array1->getSizeExpr(), Array2->getSizeExpr())) 49773dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor return false; 49873dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor 49973dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor if (!IsArrayStructurallyEquivalent(Context, Array1, Array2)) 50073dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor return false; 50173dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor 50273dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor break; 50373dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor } 50473dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor 50573dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor case Type::DependentSizedExtVector: { 50673dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor const DependentSizedExtVectorType *Vec1 50773dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor = cast<DependentSizedExtVectorType>(T1); 50873dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor const DependentSizedExtVectorType *Vec2 50973dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor = cast<DependentSizedExtVectorType>(T2); 51073dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor if (!IsStructurallyEquivalent(Context, 51173dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor Vec1->getSizeExpr(), Vec2->getSizeExpr())) 51273dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor return false; 51373dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor if (!IsStructurallyEquivalent(Context, 51473dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor Vec1->getElementType(), 51573dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor Vec2->getElementType())) 51673dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor return false; 51773dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor break; 51873dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor } 51973dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor 52073dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor case Type::Vector: 52173dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor case Type::ExtVector: { 52273dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor const VectorType *Vec1 = cast<VectorType>(T1); 52373dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor const VectorType *Vec2 = cast<VectorType>(T2); 52473dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor if (!IsStructurallyEquivalent(Context, 52573dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor Vec1->getElementType(), 52673dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor Vec2->getElementType())) 52773dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor return false; 52873dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor if (Vec1->getNumElements() != Vec2->getNumElements()) 52973dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor return false; 530e86d78cf4754a6aef2cf9a33d847aa15338e276fBob Wilson if (Vec1->getVectorKind() != Vec2->getVectorKind()) 53173dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor return false; 5320e12b44081c6395a6d60a05a85a6012f7bb23b16Douglas Gregor break; 53373dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor } 53473dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor 53573dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor case Type::FunctionProto: { 53673dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor const FunctionProtoType *Proto1 = cast<FunctionProtoType>(T1); 53773dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor const FunctionProtoType *Proto2 = cast<FunctionProtoType>(T2); 538651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines if (Proto1->getNumParams() != Proto2->getNumParams()) 53973dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor return false; 540651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines for (unsigned I = 0, N = Proto1->getNumParams(); I != N; ++I) { 541651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines if (!IsStructurallyEquivalent(Context, Proto1->getParamType(I), 542651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines Proto2->getParamType(I))) 54373dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor return false; 54473dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor } 54573dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor if (Proto1->isVariadic() != Proto2->isVariadic()) 54673dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor return false; 54760618fa7f88d5162bb5b40988b6b38d4d75d6fc6Sebastian Redl if (Proto1->getExceptionSpecType() != Proto2->getExceptionSpecType()) 54873dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor return false; 54960618fa7f88d5162bb5b40988b6b38d4d75d6fc6Sebastian Redl if (Proto1->getExceptionSpecType() == EST_Dynamic) { 55060618fa7f88d5162bb5b40988b6b38d4d75d6fc6Sebastian Redl if (Proto1->getNumExceptions() != Proto2->getNumExceptions()) 55160618fa7f88d5162bb5b40988b6b38d4d75d6fc6Sebastian Redl return false; 55260618fa7f88d5162bb5b40988b6b38d4d75d6fc6Sebastian Redl for (unsigned I = 0, N = Proto1->getNumExceptions(); I != N; ++I) { 55360618fa7f88d5162bb5b40988b6b38d4d75d6fc6Sebastian Redl if (!IsStructurallyEquivalent(Context, 55460618fa7f88d5162bb5b40988b6b38d4d75d6fc6Sebastian Redl Proto1->getExceptionType(I), 55560618fa7f88d5162bb5b40988b6b38d4d75d6fc6Sebastian Redl Proto2->getExceptionType(I))) 55660618fa7f88d5162bb5b40988b6b38d4d75d6fc6Sebastian Redl return false; 55760618fa7f88d5162bb5b40988b6b38d4d75d6fc6Sebastian Redl } 55860618fa7f88d5162bb5b40988b6b38d4d75d6fc6Sebastian Redl } else if (Proto1->getExceptionSpecType() == EST_ComputedNoexcept) { 55973dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor if (!IsStructurallyEquivalent(Context, 56060618fa7f88d5162bb5b40988b6b38d4d75d6fc6Sebastian Redl Proto1->getNoexceptExpr(), 56160618fa7f88d5162bb5b40988b6b38d4d75d6fc6Sebastian Redl Proto2->getNoexceptExpr())) 56273dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor return false; 56373dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor } 56473dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor if (Proto1->getTypeQuals() != Proto2->getTypeQuals()) 56573dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor return false; 56673dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor 56773dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor // Fall through to check the bits common with FunctionNoProtoType. 56873dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor } 56973dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor 57073dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor case Type::FunctionNoProto: { 57173dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor const FunctionType *Function1 = cast<FunctionType>(T1); 57273dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor const FunctionType *Function2 = cast<FunctionType>(T2); 573651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines if (!IsStructurallyEquivalent(Context, Function1->getReturnType(), 574651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines Function2->getReturnType())) 57573dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor return false; 576264ba48dc98f3f843935a485d5b086f7e0fdc4f1Rafael Espindola if (Function1->getExtInfo() != Function2->getExtInfo()) 577264ba48dc98f3f843935a485d5b086f7e0fdc4f1Rafael Espindola return false; 57873dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor break; 57973dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor } 58073dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor 58173dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor case Type::UnresolvedUsing: 58273dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor if (!IsStructurallyEquivalent(Context, 58373dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor cast<UnresolvedUsingType>(T1)->getDecl(), 58473dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor cast<UnresolvedUsingType>(T2)->getDecl())) 58573dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor return false; 58673dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor 58773dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor break; 5889d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall 5899d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall case Type::Attributed: 5909d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall if (!IsStructurallyEquivalent(Context, 5919d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall cast<AttributedType>(T1)->getModifiedType(), 5929d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall cast<AttributedType>(T2)->getModifiedType())) 5939d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall return false; 5949d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall if (!IsStructurallyEquivalent(Context, 5959d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall cast<AttributedType>(T1)->getEquivalentType(), 5969d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall cast<AttributedType>(T2)->getEquivalentType())) 5979d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall return false; 5989d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall break; 59973dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor 600075f8f1b6bed4d1b224c74f87508534cc6392ce6Abramo Bagnara case Type::Paren: 601075f8f1b6bed4d1b224c74f87508534cc6392ce6Abramo Bagnara if (!IsStructurallyEquivalent(Context, 602075f8f1b6bed4d1b224c74f87508534cc6392ce6Abramo Bagnara cast<ParenType>(T1)->getInnerType(), 603075f8f1b6bed4d1b224c74f87508534cc6392ce6Abramo Bagnara cast<ParenType>(T2)->getInnerType())) 604075f8f1b6bed4d1b224c74f87508534cc6392ce6Abramo Bagnara return false; 605075f8f1b6bed4d1b224c74f87508534cc6392ce6Abramo Bagnara break; 606075f8f1b6bed4d1b224c74f87508534cc6392ce6Abramo Bagnara 60773dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor case Type::Typedef: 60873dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor if (!IsStructurallyEquivalent(Context, 60973dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor cast<TypedefType>(T1)->getDecl(), 61073dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor cast<TypedefType>(T2)->getDecl())) 61173dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor return false; 61273dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor break; 61373dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor 61473dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor case Type::TypeOfExpr: 61573dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor if (!IsStructurallyEquivalent(Context, 61673dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor cast<TypeOfExprType>(T1)->getUnderlyingExpr(), 61773dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor cast<TypeOfExprType>(T2)->getUnderlyingExpr())) 61873dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor return false; 61973dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor break; 62073dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor 62173dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor case Type::TypeOf: 62273dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor if (!IsStructurallyEquivalent(Context, 62373dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor cast<TypeOfType>(T1)->getUnderlyingType(), 62473dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor cast<TypeOfType>(T2)->getUnderlyingType())) 62573dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor return false; 62673dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor break; 627ca63c200346c0ca9e00194ec6e34a5a7b0ed9321Sean Hunt 628ca63c200346c0ca9e00194ec6e34a5a7b0ed9321Sean Hunt case Type::UnaryTransform: 629ca63c200346c0ca9e00194ec6e34a5a7b0ed9321Sean Hunt if (!IsStructurallyEquivalent(Context, 630ca63c200346c0ca9e00194ec6e34a5a7b0ed9321Sean Hunt cast<UnaryTransformType>(T1)->getUnderlyingType(), 631ca63c200346c0ca9e00194ec6e34a5a7b0ed9321Sean Hunt cast<UnaryTransformType>(T1)->getUnderlyingType())) 632ca63c200346c0ca9e00194ec6e34a5a7b0ed9321Sean Hunt return false; 633ca63c200346c0ca9e00194ec6e34a5a7b0ed9321Sean Hunt break; 634ca63c200346c0ca9e00194ec6e34a5a7b0ed9321Sean Hunt 63573dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor case Type::Decltype: 63673dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor if (!IsStructurallyEquivalent(Context, 63773dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor cast<DecltypeType>(T1)->getUnderlyingExpr(), 63873dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor cast<DecltypeType>(T2)->getUnderlyingExpr())) 63973dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor return false; 64073dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor break; 64173dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor 64234b41d939a1328f484511c6002ba2456db879a29Richard Smith case Type::Auto: 64334b41d939a1328f484511c6002ba2456db879a29Richard Smith if (!IsStructurallyEquivalent(Context, 64434b41d939a1328f484511c6002ba2456db879a29Richard Smith cast<AutoType>(T1)->getDeducedType(), 64534b41d939a1328f484511c6002ba2456db879a29Richard Smith cast<AutoType>(T2)->getDeducedType())) 64634b41d939a1328f484511c6002ba2456db879a29Richard Smith return false; 64734b41d939a1328f484511c6002ba2456db879a29Richard Smith break; 64834b41d939a1328f484511c6002ba2456db879a29Richard Smith 64973dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor case Type::Record: 65073dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor case Type::Enum: 65173dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor if (!IsStructurallyEquivalent(Context, 65273dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor cast<TagType>(T1)->getDecl(), 65373dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor cast<TagType>(T2)->getDecl())) 65473dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor return false; 65573dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor break; 656465d41b92b2c862f3062c412a0538db65c6a2661Abramo Bagnara 65773dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor case Type::TemplateTypeParm: { 65873dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor const TemplateTypeParmType *Parm1 = cast<TemplateTypeParmType>(T1); 65973dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor const TemplateTypeParmType *Parm2 = cast<TemplateTypeParmType>(T2); 66073dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor if (Parm1->getDepth() != Parm2->getDepth()) 66173dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor return false; 66273dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor if (Parm1->getIndex() != Parm2->getIndex()) 66373dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor return false; 66473dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor if (Parm1->isParameterPack() != Parm2->isParameterPack()) 66573dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor return false; 66673dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor 66773dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor // Names of template type parameters are never significant. 66873dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor break; 66973dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor } 67073dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor 67173dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor case Type::SubstTemplateTypeParm: { 67273dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor const SubstTemplateTypeParmType *Subst1 67373dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor = cast<SubstTemplateTypeParmType>(T1); 67473dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor const SubstTemplateTypeParmType *Subst2 67573dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor = cast<SubstTemplateTypeParmType>(T2); 67673dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor if (!IsStructurallyEquivalent(Context, 67773dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor QualType(Subst1->getReplacedParameter(), 0), 67873dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor QualType(Subst2->getReplacedParameter(), 0))) 67973dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor return false; 68073dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor if (!IsStructurallyEquivalent(Context, 68173dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor Subst1->getReplacementType(), 68273dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor Subst2->getReplacementType())) 68373dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor return false; 68473dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor break; 68573dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor } 68673dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor 6870bc15d92bf98cd01e7904d7fca9895dacc237618Douglas Gregor case Type::SubstTemplateTypeParmPack: { 6880bc15d92bf98cd01e7904d7fca9895dacc237618Douglas Gregor const SubstTemplateTypeParmPackType *Subst1 6890bc15d92bf98cd01e7904d7fca9895dacc237618Douglas Gregor = cast<SubstTemplateTypeParmPackType>(T1); 6900bc15d92bf98cd01e7904d7fca9895dacc237618Douglas Gregor const SubstTemplateTypeParmPackType *Subst2 6910bc15d92bf98cd01e7904d7fca9895dacc237618Douglas Gregor = cast<SubstTemplateTypeParmPackType>(T2); 6920bc15d92bf98cd01e7904d7fca9895dacc237618Douglas Gregor if (!IsStructurallyEquivalent(Context, 6930bc15d92bf98cd01e7904d7fca9895dacc237618Douglas Gregor QualType(Subst1->getReplacedParameter(), 0), 6940bc15d92bf98cd01e7904d7fca9895dacc237618Douglas Gregor QualType(Subst2->getReplacedParameter(), 0))) 6950bc15d92bf98cd01e7904d7fca9895dacc237618Douglas Gregor return false; 6960bc15d92bf98cd01e7904d7fca9895dacc237618Douglas Gregor if (!IsStructurallyEquivalent(Context, 6970bc15d92bf98cd01e7904d7fca9895dacc237618Douglas Gregor Subst1->getArgumentPack(), 6980bc15d92bf98cd01e7904d7fca9895dacc237618Douglas Gregor Subst2->getArgumentPack())) 6990bc15d92bf98cd01e7904d7fca9895dacc237618Douglas Gregor return false; 7000bc15d92bf98cd01e7904d7fca9895dacc237618Douglas Gregor break; 7010bc15d92bf98cd01e7904d7fca9895dacc237618Douglas Gregor } 70273dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor case Type::TemplateSpecialization: { 70373dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor const TemplateSpecializationType *Spec1 70473dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor = cast<TemplateSpecializationType>(T1); 70573dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor const TemplateSpecializationType *Spec2 70673dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor = cast<TemplateSpecializationType>(T2); 70773dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor if (!IsStructurallyEquivalent(Context, 70873dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor Spec1->getTemplateName(), 70973dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor Spec2->getTemplateName())) 71073dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor return false; 71173dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor if (Spec1->getNumArgs() != Spec2->getNumArgs()) 71273dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor return false; 71373dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor for (unsigned I = 0, N = Spec1->getNumArgs(); I != N; ++I) { 71473dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor if (!IsStructurallyEquivalent(Context, 71573dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor Spec1->getArg(I), Spec2->getArg(I))) 71673dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor return false; 71773dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor } 71873dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor break; 71973dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor } 72073dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor 721465d41b92b2c862f3062c412a0538db65c6a2661Abramo Bagnara case Type::Elaborated: { 722465d41b92b2c862f3062c412a0538db65c6a2661Abramo Bagnara const ElaboratedType *Elab1 = cast<ElaboratedType>(T1); 723465d41b92b2c862f3062c412a0538db65c6a2661Abramo Bagnara const ElaboratedType *Elab2 = cast<ElaboratedType>(T2); 724465d41b92b2c862f3062c412a0538db65c6a2661Abramo Bagnara // CHECKME: what if a keyword is ETK_None or ETK_typename ? 725465d41b92b2c862f3062c412a0538db65c6a2661Abramo Bagnara if (Elab1->getKeyword() != Elab2->getKeyword()) 726465d41b92b2c862f3062c412a0538db65c6a2661Abramo Bagnara return false; 72773dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor if (!IsStructurallyEquivalent(Context, 728465d41b92b2c862f3062c412a0538db65c6a2661Abramo Bagnara Elab1->getQualifier(), 729465d41b92b2c862f3062c412a0538db65c6a2661Abramo Bagnara Elab2->getQualifier())) 73073dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor return false; 73173dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor if (!IsStructurallyEquivalent(Context, 732465d41b92b2c862f3062c412a0538db65c6a2661Abramo Bagnara Elab1->getNamedType(), 733465d41b92b2c862f3062c412a0538db65c6a2661Abramo Bagnara Elab2->getNamedType())) 73473dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor return false; 73573dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor break; 73673dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor } 73773dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor 7383cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall case Type::InjectedClassName: { 7393cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall const InjectedClassNameType *Inj1 = cast<InjectedClassNameType>(T1); 7403cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall const InjectedClassNameType *Inj2 = cast<InjectedClassNameType>(T2); 7413cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall if (!IsStructurallyEquivalent(Context, 74231f17ecbef57b5679c017c375db330546b7b5145John McCall Inj1->getInjectedSpecializationType(), 74331f17ecbef57b5679c017c375db330546b7b5145John McCall Inj2->getInjectedSpecializationType())) 7443cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall return false; 7453cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall break; 7463cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall } 7473cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall 7484714c12a1ab759156b78be8f109ea4c12213af57Douglas Gregor case Type::DependentName: { 7494714c12a1ab759156b78be8f109ea4c12213af57Douglas Gregor const DependentNameType *Typename1 = cast<DependentNameType>(T1); 7504714c12a1ab759156b78be8f109ea4c12213af57Douglas Gregor const DependentNameType *Typename2 = cast<DependentNameType>(T2); 75173dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor if (!IsStructurallyEquivalent(Context, 75273dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor Typename1->getQualifier(), 75373dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor Typename2->getQualifier())) 75473dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor return false; 75573dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor if (!IsStructurallyEquivalent(Typename1->getIdentifier(), 75673dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor Typename2->getIdentifier())) 75773dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor return false; 75873dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor 75973dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor break; 76073dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor } 76173dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor 76233500955d731c73717af52088b7fc0e7a85681e7John McCall case Type::DependentTemplateSpecialization: { 76333500955d731c73717af52088b7fc0e7a85681e7John McCall const DependentTemplateSpecializationType *Spec1 = 76433500955d731c73717af52088b7fc0e7a85681e7John McCall cast<DependentTemplateSpecializationType>(T1); 76533500955d731c73717af52088b7fc0e7a85681e7John McCall const DependentTemplateSpecializationType *Spec2 = 76633500955d731c73717af52088b7fc0e7a85681e7John McCall cast<DependentTemplateSpecializationType>(T2); 76733500955d731c73717af52088b7fc0e7a85681e7John McCall if (!IsStructurallyEquivalent(Context, 76833500955d731c73717af52088b7fc0e7a85681e7John McCall Spec1->getQualifier(), 76933500955d731c73717af52088b7fc0e7a85681e7John McCall Spec2->getQualifier())) 77033500955d731c73717af52088b7fc0e7a85681e7John McCall return false; 77133500955d731c73717af52088b7fc0e7a85681e7John McCall if (!IsStructurallyEquivalent(Spec1->getIdentifier(), 77233500955d731c73717af52088b7fc0e7a85681e7John McCall Spec2->getIdentifier())) 77333500955d731c73717af52088b7fc0e7a85681e7John McCall return false; 77433500955d731c73717af52088b7fc0e7a85681e7John McCall if (Spec1->getNumArgs() != Spec2->getNumArgs()) 77533500955d731c73717af52088b7fc0e7a85681e7John McCall return false; 77633500955d731c73717af52088b7fc0e7a85681e7John McCall for (unsigned I = 0, N = Spec1->getNumArgs(); I != N; ++I) { 77733500955d731c73717af52088b7fc0e7a85681e7John McCall if (!IsStructurallyEquivalent(Context, 77833500955d731c73717af52088b7fc0e7a85681e7John McCall Spec1->getArg(I), Spec2->getArg(I))) 77933500955d731c73717af52088b7fc0e7a85681e7John McCall return false; 78033500955d731c73717af52088b7fc0e7a85681e7John McCall } 78133500955d731c73717af52088b7fc0e7a85681e7John McCall break; 78233500955d731c73717af52088b7fc0e7a85681e7John McCall } 7837536dd5e6c99584481b7dab68b7e7d8df9c54054Douglas Gregor 7847536dd5e6c99584481b7dab68b7e7d8df9c54054Douglas Gregor case Type::PackExpansion: 7857536dd5e6c99584481b7dab68b7e7d8df9c54054Douglas Gregor if (!IsStructurallyEquivalent(Context, 7867536dd5e6c99584481b7dab68b7e7d8df9c54054Douglas Gregor cast<PackExpansionType>(T1)->getPattern(), 7877536dd5e6c99584481b7dab68b7e7d8df9c54054Douglas Gregor cast<PackExpansionType>(T2)->getPattern())) 7887536dd5e6c99584481b7dab68b7e7d8df9c54054Douglas Gregor return false; 7897536dd5e6c99584481b7dab68b7e7d8df9c54054Douglas Gregor break; 7907536dd5e6c99584481b7dab68b7e7d8df9c54054Douglas Gregor 79173dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor case Type::ObjCInterface: { 79273dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor const ObjCInterfaceType *Iface1 = cast<ObjCInterfaceType>(T1); 79373dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor const ObjCInterfaceType *Iface2 = cast<ObjCInterfaceType>(T2); 79473dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor if (!IsStructurallyEquivalent(Context, 79573dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor Iface1->getDecl(), Iface2->getDecl())) 79673dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor return false; 797c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall break; 798c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall } 799c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall 800c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall case Type::ObjCObject: { 801c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall const ObjCObjectType *Obj1 = cast<ObjCObjectType>(T1); 802c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall const ObjCObjectType *Obj2 = cast<ObjCObjectType>(T2); 803c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall if (!IsStructurallyEquivalent(Context, 804c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall Obj1->getBaseType(), 805c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall Obj2->getBaseType())) 806c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall return false; 807c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall if (Obj1->getNumProtocols() != Obj2->getNumProtocols()) 80873dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor return false; 809c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall for (unsigned I = 0, N = Obj1->getNumProtocols(); I != N; ++I) { 81073dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor if (!IsStructurallyEquivalent(Context, 811c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall Obj1->getProtocol(I), 812c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall Obj2->getProtocol(I))) 81373dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor return false; 81473dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor } 81573dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor break; 81673dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor } 81773dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor 81873dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor case Type::ObjCObjectPointer: { 81973dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor const ObjCObjectPointerType *Ptr1 = cast<ObjCObjectPointerType>(T1); 82073dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor const ObjCObjectPointerType *Ptr2 = cast<ObjCObjectPointerType>(T2); 82173dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor if (!IsStructurallyEquivalent(Context, 82273dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor Ptr1->getPointeeType(), 82373dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor Ptr2->getPointeeType())) 82473dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor return false; 82573dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor break; 82673dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor } 827b001de7458d17c17e6d8b8034c7cfcefd3b70c00Eli Friedman 828b001de7458d17c17e6d8b8034c7cfcefd3b70c00Eli Friedman case Type::Atomic: { 829b001de7458d17c17e6d8b8034c7cfcefd3b70c00Eli Friedman if (!IsStructurallyEquivalent(Context, 830b001de7458d17c17e6d8b8034c7cfcefd3b70c00Eli Friedman cast<AtomicType>(T1)->getValueType(), 831b001de7458d17c17e6d8b8034c7cfcefd3b70c00Eli Friedman cast<AtomicType>(T2)->getValueType())) 832b001de7458d17c17e6d8b8034c7cfcefd3b70c00Eli Friedman return false; 833b001de7458d17c17e6d8b8034c7cfcefd3b70c00Eli Friedman break; 834b001de7458d17c17e6d8b8034c7cfcefd3b70c00Eli Friedman } 835b001de7458d17c17e6d8b8034c7cfcefd3b70c00Eli Friedman 83673dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor } // end switch 83773dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor 83873dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor return true; 83973dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor} 84073dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor 8417c9412cdad37146e6d1eee15eaa0d7a1d93e6ee1Douglas Gregor/// \brief Determine structural equivalence of two fields. 8427c9412cdad37146e6d1eee15eaa0d7a1d93e6ee1Douglas Gregorstatic bool IsStructurallyEquivalent(StructuralEquivalenceContext &Context, 8437c9412cdad37146e6d1eee15eaa0d7a1d93e6ee1Douglas Gregor FieldDecl *Field1, FieldDecl *Field2) { 8447c9412cdad37146e6d1eee15eaa0d7a1d93e6ee1Douglas Gregor RecordDecl *Owner2 = cast<RecordDecl>(Field2->getDeclContext()); 84511ce5fe7d8dda29f3d093e5759a7476b140e3241Douglas Gregor 84611ce5fe7d8dda29f3d093e5759a7476b140e3241Douglas Gregor // For anonymous structs/unions, match up the anonymous struct/union type 84711ce5fe7d8dda29f3d093e5759a7476b140e3241Douglas Gregor // declarations directly, so that we don't go off searching for anonymous 84811ce5fe7d8dda29f3d093e5759a7476b140e3241Douglas Gregor // types 84911ce5fe7d8dda29f3d093e5759a7476b140e3241Douglas Gregor if (Field1->isAnonymousStructOrUnion() && 85011ce5fe7d8dda29f3d093e5759a7476b140e3241Douglas Gregor Field2->isAnonymousStructOrUnion()) { 85111ce5fe7d8dda29f3d093e5759a7476b140e3241Douglas Gregor RecordDecl *D1 = Field1->getType()->castAs<RecordType>()->getDecl(); 85211ce5fe7d8dda29f3d093e5759a7476b140e3241Douglas Gregor RecordDecl *D2 = Field2->getType()->castAs<RecordType>()->getDecl(); 85311ce5fe7d8dda29f3d093e5759a7476b140e3241Douglas Gregor return IsStructurallyEquivalent(Context, D1, D2); 85411ce5fe7d8dda29f3d093e5759a7476b140e3241Douglas Gregor } 855fff418b1abea921685a1175a8ee0b597594bddc1Sean Callanan 856fff418b1abea921685a1175a8ee0b597594bddc1Sean Callanan // Check for equivalent field names. 857fff418b1abea921685a1175a8ee0b597594bddc1Sean Callanan IdentifierInfo *Name1 = Field1->getIdentifier(); 858fff418b1abea921685a1175a8ee0b597594bddc1Sean Callanan IdentifierInfo *Name2 = Field2->getIdentifier(); 859fff418b1abea921685a1175a8ee0b597594bddc1Sean Callanan if (!::IsStructurallyEquivalent(Name1, Name2)) 860fff418b1abea921685a1175a8ee0b597594bddc1Sean Callanan return false; 86111ce5fe7d8dda29f3d093e5759a7476b140e3241Douglas Gregor 86211ce5fe7d8dda29f3d093e5759a7476b140e3241Douglas Gregor if (!IsStructurallyEquivalent(Context, 8637c9412cdad37146e6d1eee15eaa0d7a1d93e6ee1Douglas Gregor Field1->getType(), Field2->getType())) { 864347f64feb4f144c97757b4d8469030e793dbb36eDouglas Gregor if (Context.Complain) { 865347f64feb4f144c97757b4d8469030e793dbb36eDouglas Gregor Context.Diag2(Owner2->getLocation(), diag::warn_odr_tag_type_inconsistent) 866347f64feb4f144c97757b4d8469030e793dbb36eDouglas Gregor << Context.C2.getTypeDeclType(Owner2); 867347f64feb4f144c97757b4d8469030e793dbb36eDouglas Gregor Context.Diag2(Field2->getLocation(), diag::note_odr_field) 868347f64feb4f144c97757b4d8469030e793dbb36eDouglas Gregor << Field2->getDeclName() << Field2->getType(); 869347f64feb4f144c97757b4d8469030e793dbb36eDouglas Gregor Context.Diag1(Field1->getLocation(), diag::note_odr_field) 870347f64feb4f144c97757b4d8469030e793dbb36eDouglas Gregor << Field1->getDeclName() << Field1->getType(); 871347f64feb4f144c97757b4d8469030e793dbb36eDouglas Gregor } 8727c9412cdad37146e6d1eee15eaa0d7a1d93e6ee1Douglas Gregor return false; 8737c9412cdad37146e6d1eee15eaa0d7a1d93e6ee1Douglas Gregor } 8747c9412cdad37146e6d1eee15eaa0d7a1d93e6ee1Douglas Gregor 8757c9412cdad37146e6d1eee15eaa0d7a1d93e6ee1Douglas Gregor if (Field1->isBitField() != Field2->isBitField()) { 876347f64feb4f144c97757b4d8469030e793dbb36eDouglas Gregor if (Context.Complain) { 877347f64feb4f144c97757b4d8469030e793dbb36eDouglas Gregor Context.Diag2(Owner2->getLocation(), diag::warn_odr_tag_type_inconsistent) 878347f64feb4f144c97757b4d8469030e793dbb36eDouglas Gregor << Context.C2.getTypeDeclType(Owner2); 879347f64feb4f144c97757b4d8469030e793dbb36eDouglas Gregor if (Field1->isBitField()) { 880347f64feb4f144c97757b4d8469030e793dbb36eDouglas Gregor Context.Diag1(Field1->getLocation(), diag::note_odr_bit_field) 881347f64feb4f144c97757b4d8469030e793dbb36eDouglas Gregor << Field1->getDeclName() << Field1->getType() 882347f64feb4f144c97757b4d8469030e793dbb36eDouglas Gregor << Field1->getBitWidthValue(Context.C1); 883347f64feb4f144c97757b4d8469030e793dbb36eDouglas Gregor Context.Diag2(Field2->getLocation(), diag::note_odr_not_bit_field) 884347f64feb4f144c97757b4d8469030e793dbb36eDouglas Gregor << Field2->getDeclName(); 885347f64feb4f144c97757b4d8469030e793dbb36eDouglas Gregor } else { 886347f64feb4f144c97757b4d8469030e793dbb36eDouglas Gregor Context.Diag2(Field2->getLocation(), diag::note_odr_bit_field) 887347f64feb4f144c97757b4d8469030e793dbb36eDouglas Gregor << Field2->getDeclName() << Field2->getType() 888347f64feb4f144c97757b4d8469030e793dbb36eDouglas Gregor << Field2->getBitWidthValue(Context.C2); 889347f64feb4f144c97757b4d8469030e793dbb36eDouglas Gregor Context.Diag1(Field1->getLocation(), diag::note_odr_not_bit_field) 890347f64feb4f144c97757b4d8469030e793dbb36eDouglas Gregor << Field1->getDeclName(); 891347f64feb4f144c97757b4d8469030e793dbb36eDouglas Gregor } 8927c9412cdad37146e6d1eee15eaa0d7a1d93e6ee1Douglas Gregor } 8937c9412cdad37146e6d1eee15eaa0d7a1d93e6ee1Douglas Gregor return false; 8947c9412cdad37146e6d1eee15eaa0d7a1d93e6ee1Douglas Gregor } 8957c9412cdad37146e6d1eee15eaa0d7a1d93e6ee1Douglas Gregor 8967c9412cdad37146e6d1eee15eaa0d7a1d93e6ee1Douglas Gregor if (Field1->isBitField()) { 8977c9412cdad37146e6d1eee15eaa0d7a1d93e6ee1Douglas Gregor // Make sure that the bit-fields are the same length. 8987c9412cdad37146e6d1eee15eaa0d7a1d93e6ee1Douglas Gregor unsigned Bits1 = Field1->getBitWidthValue(Context.C1); 8997c9412cdad37146e6d1eee15eaa0d7a1d93e6ee1Douglas Gregor unsigned Bits2 = Field2->getBitWidthValue(Context.C2); 9007c9412cdad37146e6d1eee15eaa0d7a1d93e6ee1Douglas Gregor 9017c9412cdad37146e6d1eee15eaa0d7a1d93e6ee1Douglas Gregor if (Bits1 != Bits2) { 902347f64feb4f144c97757b4d8469030e793dbb36eDouglas Gregor if (Context.Complain) { 903347f64feb4f144c97757b4d8469030e793dbb36eDouglas Gregor Context.Diag2(Owner2->getLocation(), diag::warn_odr_tag_type_inconsistent) 904347f64feb4f144c97757b4d8469030e793dbb36eDouglas Gregor << Context.C2.getTypeDeclType(Owner2); 905347f64feb4f144c97757b4d8469030e793dbb36eDouglas Gregor Context.Diag2(Field2->getLocation(), diag::note_odr_bit_field) 906347f64feb4f144c97757b4d8469030e793dbb36eDouglas Gregor << Field2->getDeclName() << Field2->getType() << Bits2; 907347f64feb4f144c97757b4d8469030e793dbb36eDouglas Gregor Context.Diag1(Field1->getLocation(), diag::note_odr_bit_field) 908347f64feb4f144c97757b4d8469030e793dbb36eDouglas Gregor << Field1->getDeclName() << Field1->getType() << Bits1; 909347f64feb4f144c97757b4d8469030e793dbb36eDouglas Gregor } 9107c9412cdad37146e6d1eee15eaa0d7a1d93e6ee1Douglas Gregor return false; 9117c9412cdad37146e6d1eee15eaa0d7a1d93e6ee1Douglas Gregor } 9127c9412cdad37146e6d1eee15eaa0d7a1d93e6ee1Douglas Gregor } 9137c9412cdad37146e6d1eee15eaa0d7a1d93e6ee1Douglas Gregor 9147c9412cdad37146e6d1eee15eaa0d7a1d93e6ee1Douglas Gregor return true; 9157c9412cdad37146e6d1eee15eaa0d7a1d93e6ee1Douglas Gregor} 9167c9412cdad37146e6d1eee15eaa0d7a1d93e6ee1Douglas Gregor 91711ce5fe7d8dda29f3d093e5759a7476b140e3241Douglas Gregor/// \brief Find the index of the given anonymous struct/union within its 91811ce5fe7d8dda29f3d093e5759a7476b140e3241Douglas Gregor/// context. 91911ce5fe7d8dda29f3d093e5759a7476b140e3241Douglas Gregor/// 92011ce5fe7d8dda29f3d093e5759a7476b140e3241Douglas Gregor/// \returns Returns the index of this anonymous struct/union in its context, 92111ce5fe7d8dda29f3d093e5759a7476b140e3241Douglas Gregor/// including the next assigned index (if none of them match). Returns an 92211ce5fe7d8dda29f3d093e5759a7476b140e3241Douglas Gregor/// empty option if the context is not a record, i.e.. if the anonymous 92311ce5fe7d8dda29f3d093e5759a7476b140e3241Douglas Gregor/// struct/union is at namespace or block scope. 924dc84cd5efdd3430efb22546b4ac656aa0540b210David Blaikiestatic Optional<unsigned> findAnonymousStructOrUnionIndex(RecordDecl *Anon) { 92511ce5fe7d8dda29f3d093e5759a7476b140e3241Douglas Gregor ASTContext &Context = Anon->getASTContext(); 92611ce5fe7d8dda29f3d093e5759a7476b140e3241Douglas Gregor QualType AnonTy = Context.getRecordType(Anon); 92711ce5fe7d8dda29f3d093e5759a7476b140e3241Douglas Gregor 92811ce5fe7d8dda29f3d093e5759a7476b140e3241Douglas Gregor RecordDecl *Owner = dyn_cast<RecordDecl>(Anon->getDeclContext()); 92911ce5fe7d8dda29f3d093e5759a7476b140e3241Douglas Gregor if (!Owner) 93066874fb18afbffb8b2ca05576851a64534be3352David Blaikie return None; 93111ce5fe7d8dda29f3d093e5759a7476b140e3241Douglas Gregor 93211ce5fe7d8dda29f3d093e5759a7476b140e3241Douglas Gregor unsigned Index = 0; 933651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines for (const auto *D : Owner->noload_decls()) { 934651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines const auto *F = dyn_cast<FieldDecl>(D); 93511ce5fe7d8dda29f3d093e5759a7476b140e3241Douglas Gregor if (!F || !F->isAnonymousStructOrUnion()) 93611ce5fe7d8dda29f3d093e5759a7476b140e3241Douglas Gregor continue; 93711ce5fe7d8dda29f3d093e5759a7476b140e3241Douglas Gregor 93811ce5fe7d8dda29f3d093e5759a7476b140e3241Douglas Gregor if (Context.hasSameType(F->getType(), AnonTy)) 93911ce5fe7d8dda29f3d093e5759a7476b140e3241Douglas Gregor break; 94011ce5fe7d8dda29f3d093e5759a7476b140e3241Douglas Gregor 94111ce5fe7d8dda29f3d093e5759a7476b140e3241Douglas Gregor ++Index; 94211ce5fe7d8dda29f3d093e5759a7476b140e3241Douglas Gregor } 94311ce5fe7d8dda29f3d093e5759a7476b140e3241Douglas Gregor 94411ce5fe7d8dda29f3d093e5759a7476b140e3241Douglas Gregor return Index; 94511ce5fe7d8dda29f3d093e5759a7476b140e3241Douglas Gregor} 94611ce5fe7d8dda29f3d093e5759a7476b140e3241Douglas Gregor 94773dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor/// \brief Determine structural equivalence of two records. 94873dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregorstatic bool IsStructurallyEquivalent(StructuralEquivalenceContext &Context, 94973dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor RecordDecl *D1, RecordDecl *D2) { 95073dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor if (D1->isUnion() != D2->isUnion()) { 951347f64feb4f144c97757b4d8469030e793dbb36eDouglas Gregor if (Context.Complain) { 952347f64feb4f144c97757b4d8469030e793dbb36eDouglas Gregor Context.Diag2(D2->getLocation(), diag::warn_odr_tag_type_inconsistent) 953347f64feb4f144c97757b4d8469030e793dbb36eDouglas Gregor << Context.C2.getTypeDeclType(D2); 954347f64feb4f144c97757b4d8469030e793dbb36eDouglas Gregor Context.Diag1(D1->getLocation(), diag::note_odr_tag_kind_here) 955347f64feb4f144c97757b4d8469030e793dbb36eDouglas Gregor << D1->getDeclName() << (unsigned)D1->getTagKind(); 956347f64feb4f144c97757b4d8469030e793dbb36eDouglas Gregor } 95773dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor return false; 95873dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor } 95911ce5fe7d8dda29f3d093e5759a7476b140e3241Douglas Gregor 96011ce5fe7d8dda29f3d093e5759a7476b140e3241Douglas Gregor if (D1->isAnonymousStructOrUnion() && D2->isAnonymousStructOrUnion()) { 96111ce5fe7d8dda29f3d093e5759a7476b140e3241Douglas Gregor // If both anonymous structs/unions are in a record context, make sure 96211ce5fe7d8dda29f3d093e5759a7476b140e3241Douglas Gregor // they occur in the same location in the context records. 963dc84cd5efdd3430efb22546b4ac656aa0540b210David Blaikie if (Optional<unsigned> Index1 = findAnonymousStructOrUnionIndex(D1)) { 964dc84cd5efdd3430efb22546b4ac656aa0540b210David Blaikie if (Optional<unsigned> Index2 = findAnonymousStructOrUnionIndex(D2)) { 96511ce5fe7d8dda29f3d093e5759a7476b140e3241Douglas Gregor if (*Index1 != *Index2) 96611ce5fe7d8dda29f3d093e5759a7476b140e3241Douglas Gregor return false; 96711ce5fe7d8dda29f3d093e5759a7476b140e3241Douglas Gregor } 96811ce5fe7d8dda29f3d093e5759a7476b140e3241Douglas Gregor } 96911ce5fe7d8dda29f3d093e5759a7476b140e3241Douglas Gregor } 97011ce5fe7d8dda29f3d093e5759a7476b140e3241Douglas Gregor 971d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor // If both declarations are class template specializations, we know 972d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor // the ODR applies, so check the template and template arguments. 973d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor ClassTemplateSpecializationDecl *Spec1 974d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor = dyn_cast<ClassTemplateSpecializationDecl>(D1); 975d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor ClassTemplateSpecializationDecl *Spec2 976d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor = dyn_cast<ClassTemplateSpecializationDecl>(D2); 977d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor if (Spec1 && Spec2) { 978d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor // Check that the specialized templates are the same. 979d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor if (!IsStructurallyEquivalent(Context, Spec1->getSpecializedTemplate(), 980d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor Spec2->getSpecializedTemplate())) 981d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor return false; 982d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor 983d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor // Check that the template arguments are the same. 984d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor if (Spec1->getTemplateArgs().size() != Spec2->getTemplateArgs().size()) 985d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor return false; 986d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor 987d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor for (unsigned I = 0, N = Spec1->getTemplateArgs().size(); I != N; ++I) 988d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor if (!IsStructurallyEquivalent(Context, 989d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor Spec1->getTemplateArgs().get(I), 990d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor Spec2->getTemplateArgs().get(I))) 991d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor return false; 992d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor } 993d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor // If one is a class template specialization and the other is not, these 994fc8f0e14ad142ed811e90fbd9a30e419e301c717Chris Lattner // structures are different. 995d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor else if (Spec1 || Spec2) 996d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor return false; 997d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor 998ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor // Compare the definitions of these two records. If either or both are 999ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor // incomplete, we assume that they are equivalent. 1000ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor D1 = D1->getDefinition(); 1001ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor D2 = D2->getDefinition(); 1002ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor if (!D1 || !D2) 1003ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor return true; 1004ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor 100573dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor if (CXXRecordDecl *D1CXX = dyn_cast<CXXRecordDecl>(D1)) { 100673dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor if (CXXRecordDecl *D2CXX = dyn_cast<CXXRecordDecl>(D2)) { 100773dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor if (D1CXX->getNumBases() != D2CXX->getNumBases()) { 1008347f64feb4f144c97757b4d8469030e793dbb36eDouglas Gregor if (Context.Complain) { 1009347f64feb4f144c97757b4d8469030e793dbb36eDouglas Gregor Context.Diag2(D2->getLocation(), diag::warn_odr_tag_type_inconsistent) 1010347f64feb4f144c97757b4d8469030e793dbb36eDouglas Gregor << Context.C2.getTypeDeclType(D2); 1011347f64feb4f144c97757b4d8469030e793dbb36eDouglas Gregor Context.Diag2(D2->getLocation(), diag::note_odr_number_of_bases) 1012347f64feb4f144c97757b4d8469030e793dbb36eDouglas Gregor << D2CXX->getNumBases(); 1013347f64feb4f144c97757b4d8469030e793dbb36eDouglas Gregor Context.Diag1(D1->getLocation(), diag::note_odr_number_of_bases) 1014347f64feb4f144c97757b4d8469030e793dbb36eDouglas Gregor << D1CXX->getNumBases(); 1015347f64feb4f144c97757b4d8469030e793dbb36eDouglas Gregor } 101673dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor return false; 101773dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor } 101873dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor 101973dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor // Check the base classes. 102073dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor for (CXXRecordDecl::base_class_iterator Base1 = D1CXX->bases_begin(), 102173dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor BaseEnd1 = D1CXX->bases_end(), 102273dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor Base2 = D2CXX->bases_begin(); 102373dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor Base1 != BaseEnd1; 102473dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor ++Base1, ++Base2) { 102573dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor if (!IsStructurallyEquivalent(Context, 102673dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor Base1->getType(), Base2->getType())) { 1027347f64feb4f144c97757b4d8469030e793dbb36eDouglas Gregor if (Context.Complain) { 1028347f64feb4f144c97757b4d8469030e793dbb36eDouglas Gregor Context.Diag2(D2->getLocation(), diag::warn_odr_tag_type_inconsistent) 1029347f64feb4f144c97757b4d8469030e793dbb36eDouglas Gregor << Context.C2.getTypeDeclType(D2); 1030347f64feb4f144c97757b4d8469030e793dbb36eDouglas Gregor Context.Diag2(Base2->getLocStart(), diag::note_odr_base) 1031347f64feb4f144c97757b4d8469030e793dbb36eDouglas Gregor << Base2->getType() 1032347f64feb4f144c97757b4d8469030e793dbb36eDouglas Gregor << Base2->getSourceRange(); 1033347f64feb4f144c97757b4d8469030e793dbb36eDouglas Gregor Context.Diag1(Base1->getLocStart(), diag::note_odr_base) 1034347f64feb4f144c97757b4d8469030e793dbb36eDouglas Gregor << Base1->getType() 1035347f64feb4f144c97757b4d8469030e793dbb36eDouglas Gregor << Base1->getSourceRange(); 1036347f64feb4f144c97757b4d8469030e793dbb36eDouglas Gregor } 103773dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor return false; 103873dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor } 103973dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor 104073dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor // Check virtual vs. non-virtual inheritance mismatch. 104173dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor if (Base1->isVirtual() != Base2->isVirtual()) { 1042347f64feb4f144c97757b4d8469030e793dbb36eDouglas Gregor if (Context.Complain) { 1043347f64feb4f144c97757b4d8469030e793dbb36eDouglas Gregor Context.Diag2(D2->getLocation(), diag::warn_odr_tag_type_inconsistent) 1044347f64feb4f144c97757b4d8469030e793dbb36eDouglas Gregor << Context.C2.getTypeDeclType(D2); 1045347f64feb4f144c97757b4d8469030e793dbb36eDouglas Gregor Context.Diag2(Base2->getLocStart(), 1046347f64feb4f144c97757b4d8469030e793dbb36eDouglas Gregor diag::note_odr_virtual_base) 1047347f64feb4f144c97757b4d8469030e793dbb36eDouglas Gregor << Base2->isVirtual() << Base2->getSourceRange(); 1048347f64feb4f144c97757b4d8469030e793dbb36eDouglas Gregor Context.Diag1(Base1->getLocStart(), diag::note_odr_base) 1049347f64feb4f144c97757b4d8469030e793dbb36eDouglas Gregor << Base1->isVirtual() 1050347f64feb4f144c97757b4d8469030e793dbb36eDouglas Gregor << Base1->getSourceRange(); 1051347f64feb4f144c97757b4d8469030e793dbb36eDouglas Gregor } 105273dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor return false; 105373dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor } 105473dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor } 105573dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor } else if (D1CXX->getNumBases() > 0) { 1056347f64feb4f144c97757b4d8469030e793dbb36eDouglas Gregor if (Context.Complain) { 1057347f64feb4f144c97757b4d8469030e793dbb36eDouglas Gregor Context.Diag2(D2->getLocation(), diag::warn_odr_tag_type_inconsistent) 1058347f64feb4f144c97757b4d8469030e793dbb36eDouglas Gregor << Context.C2.getTypeDeclType(D2); 1059347f64feb4f144c97757b4d8469030e793dbb36eDouglas Gregor const CXXBaseSpecifier *Base1 = D1CXX->bases_begin(); 1060347f64feb4f144c97757b4d8469030e793dbb36eDouglas Gregor Context.Diag1(Base1->getLocStart(), diag::note_odr_base) 1061347f64feb4f144c97757b4d8469030e793dbb36eDouglas Gregor << Base1->getType() 1062347f64feb4f144c97757b4d8469030e793dbb36eDouglas Gregor << Base1->getSourceRange(); 1063347f64feb4f144c97757b4d8469030e793dbb36eDouglas Gregor Context.Diag2(D2->getLocation(), diag::note_odr_missing_base); 1064347f64feb4f144c97757b4d8469030e793dbb36eDouglas Gregor } 106573dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor return false; 106673dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor } 106773dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor } 106873dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor 106973dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor // Check the fields for consistency. 10702bd4b60a955d2911af938401708d016eb3acc723Dmitri Gribenko RecordDecl::field_iterator Field2 = D2->field_begin(), 107173dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor Field2End = D2->field_end(); 10722bd4b60a955d2911af938401708d016eb3acc723Dmitri Gribenko for (RecordDecl::field_iterator Field1 = D1->field_begin(), 107373dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor Field1End = D1->field_end(); 107473dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor Field1 != Field1End; 107573dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor ++Field1, ++Field2) { 107673dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor if (Field2 == Field2End) { 1077347f64feb4f144c97757b4d8469030e793dbb36eDouglas Gregor if (Context.Complain) { 1078347f64feb4f144c97757b4d8469030e793dbb36eDouglas Gregor Context.Diag2(D2->getLocation(), diag::warn_odr_tag_type_inconsistent) 1079347f64feb4f144c97757b4d8469030e793dbb36eDouglas Gregor << Context.C2.getTypeDeclType(D2); 1080347f64feb4f144c97757b4d8469030e793dbb36eDouglas Gregor Context.Diag1(Field1->getLocation(), diag::note_odr_field) 1081347f64feb4f144c97757b4d8469030e793dbb36eDouglas Gregor << Field1->getDeclName() << Field1->getType(); 1082347f64feb4f144c97757b4d8469030e793dbb36eDouglas Gregor Context.Diag2(D2->getLocation(), diag::note_odr_missing_field); 1083347f64feb4f144c97757b4d8469030e793dbb36eDouglas Gregor } 108473dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor return false; 108573dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor } 108673dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor 1087581deb3da481053c4993c7600f97acf7768caac5David Blaikie if (!IsStructurallyEquivalent(Context, *Field1, *Field2)) 10887c9412cdad37146e6d1eee15eaa0d7a1d93e6ee1Douglas Gregor return false; 108973dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor } 109073dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor 109173dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor if (Field2 != Field2End) { 1092347f64feb4f144c97757b4d8469030e793dbb36eDouglas Gregor if (Context.Complain) { 1093347f64feb4f144c97757b4d8469030e793dbb36eDouglas Gregor Context.Diag2(D2->getLocation(), diag::warn_odr_tag_type_inconsistent) 1094347f64feb4f144c97757b4d8469030e793dbb36eDouglas Gregor << Context.C2.getTypeDeclType(D2); 1095347f64feb4f144c97757b4d8469030e793dbb36eDouglas Gregor Context.Diag2(Field2->getLocation(), diag::note_odr_field) 1096347f64feb4f144c97757b4d8469030e793dbb36eDouglas Gregor << Field2->getDeclName() << Field2->getType(); 1097347f64feb4f144c97757b4d8469030e793dbb36eDouglas Gregor Context.Diag1(D1->getLocation(), diag::note_odr_missing_field); 1098347f64feb4f144c97757b4d8469030e793dbb36eDouglas Gregor } 109973dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor return false; 110073dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor } 110173dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor 110273dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor return true; 110373dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor} 110473dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor 110573dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor/// \brief Determine structural equivalence of two enums. 110673dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregorstatic bool IsStructurallyEquivalent(StructuralEquivalenceContext &Context, 110773dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor EnumDecl *D1, EnumDecl *D2) { 110873dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor EnumDecl::enumerator_iterator EC2 = D2->enumerator_begin(), 110973dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor EC2End = D2->enumerator_end(); 111073dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor for (EnumDecl::enumerator_iterator EC1 = D1->enumerator_begin(), 111173dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor EC1End = D1->enumerator_end(); 111273dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor EC1 != EC1End; ++EC1, ++EC2) { 111373dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor if (EC2 == EC2End) { 1114347f64feb4f144c97757b4d8469030e793dbb36eDouglas Gregor if (Context.Complain) { 1115347f64feb4f144c97757b4d8469030e793dbb36eDouglas Gregor Context.Diag2(D2->getLocation(), diag::warn_odr_tag_type_inconsistent) 1116347f64feb4f144c97757b4d8469030e793dbb36eDouglas Gregor << Context.C2.getTypeDeclType(D2); 1117347f64feb4f144c97757b4d8469030e793dbb36eDouglas Gregor Context.Diag1(EC1->getLocation(), diag::note_odr_enumerator) 1118347f64feb4f144c97757b4d8469030e793dbb36eDouglas Gregor << EC1->getDeclName() 1119347f64feb4f144c97757b4d8469030e793dbb36eDouglas Gregor << EC1->getInitVal().toString(10); 1120347f64feb4f144c97757b4d8469030e793dbb36eDouglas Gregor Context.Diag2(D2->getLocation(), diag::note_odr_missing_enumerator); 1121347f64feb4f144c97757b4d8469030e793dbb36eDouglas Gregor } 112273dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor return false; 112373dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor } 112473dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor 112573dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor llvm::APSInt Val1 = EC1->getInitVal(); 112673dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor llvm::APSInt Val2 = EC2->getInitVal(); 112781695fa3a4772a62131eca45f8582cff72b1b9dbEric Christopher if (!llvm::APSInt::isSameValue(Val1, Val2) || 112873dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor !IsStructurallyEquivalent(EC1->getIdentifier(), EC2->getIdentifier())) { 1129347f64feb4f144c97757b4d8469030e793dbb36eDouglas Gregor if (Context.Complain) { 1130347f64feb4f144c97757b4d8469030e793dbb36eDouglas Gregor Context.Diag2(D2->getLocation(), diag::warn_odr_tag_type_inconsistent) 1131347f64feb4f144c97757b4d8469030e793dbb36eDouglas Gregor << Context.C2.getTypeDeclType(D2); 1132347f64feb4f144c97757b4d8469030e793dbb36eDouglas Gregor Context.Diag2(EC2->getLocation(), diag::note_odr_enumerator) 1133347f64feb4f144c97757b4d8469030e793dbb36eDouglas Gregor << EC2->getDeclName() 1134347f64feb4f144c97757b4d8469030e793dbb36eDouglas Gregor << EC2->getInitVal().toString(10); 1135347f64feb4f144c97757b4d8469030e793dbb36eDouglas Gregor Context.Diag1(EC1->getLocation(), diag::note_odr_enumerator) 1136347f64feb4f144c97757b4d8469030e793dbb36eDouglas Gregor << EC1->getDeclName() 1137347f64feb4f144c97757b4d8469030e793dbb36eDouglas Gregor << EC1->getInitVal().toString(10); 1138347f64feb4f144c97757b4d8469030e793dbb36eDouglas Gregor } 1139347f64feb4f144c97757b4d8469030e793dbb36eDouglas Gregor return false; 1140347f64feb4f144c97757b4d8469030e793dbb36eDouglas Gregor } 1141347f64feb4f144c97757b4d8469030e793dbb36eDouglas Gregor } 1142347f64feb4f144c97757b4d8469030e793dbb36eDouglas Gregor 1143347f64feb4f144c97757b4d8469030e793dbb36eDouglas Gregor if (EC2 != EC2End) { 1144347f64feb4f144c97757b4d8469030e793dbb36eDouglas Gregor if (Context.Complain) { 114573dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor Context.Diag2(D2->getLocation(), diag::warn_odr_tag_type_inconsistent) 114673dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor << Context.C2.getTypeDeclType(D2); 114773dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor Context.Diag2(EC2->getLocation(), diag::note_odr_enumerator) 114873dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor << EC2->getDeclName() 114973dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor << EC2->getInitVal().toString(10); 1150347f64feb4f144c97757b4d8469030e793dbb36eDouglas Gregor Context.Diag1(D1->getLocation(), diag::note_odr_missing_enumerator); 115173dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor } 115273dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor return false; 115373dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor } 115473dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor 115573dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor return true; 115673dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor} 1157040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor 1158040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregorstatic bool IsStructurallyEquivalent(StructuralEquivalenceContext &Context, 1159040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor TemplateParameterList *Params1, 1160040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor TemplateParameterList *Params2) { 1161040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor if (Params1->size() != Params2->size()) { 1162347f64feb4f144c97757b4d8469030e793dbb36eDouglas Gregor if (Context.Complain) { 1163347f64feb4f144c97757b4d8469030e793dbb36eDouglas Gregor Context.Diag2(Params2->getTemplateLoc(), 1164347f64feb4f144c97757b4d8469030e793dbb36eDouglas Gregor diag::err_odr_different_num_template_parameters) 1165347f64feb4f144c97757b4d8469030e793dbb36eDouglas Gregor << Params1->size() << Params2->size(); 1166347f64feb4f144c97757b4d8469030e793dbb36eDouglas Gregor Context.Diag1(Params1->getTemplateLoc(), 1167347f64feb4f144c97757b4d8469030e793dbb36eDouglas Gregor diag::note_odr_template_parameter_list); 1168347f64feb4f144c97757b4d8469030e793dbb36eDouglas Gregor } 1169040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor return false; 1170040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor } 1171040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor 1172040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor for (unsigned I = 0, N = Params1->size(); I != N; ++I) { 1173040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor if (Params1->getParam(I)->getKind() != Params2->getParam(I)->getKind()) { 1174347f64feb4f144c97757b4d8469030e793dbb36eDouglas Gregor if (Context.Complain) { 1175347f64feb4f144c97757b4d8469030e793dbb36eDouglas Gregor Context.Diag2(Params2->getParam(I)->getLocation(), 1176347f64feb4f144c97757b4d8469030e793dbb36eDouglas Gregor diag::err_odr_different_template_parameter_kind); 1177347f64feb4f144c97757b4d8469030e793dbb36eDouglas Gregor Context.Diag1(Params1->getParam(I)->getLocation(), 1178347f64feb4f144c97757b4d8469030e793dbb36eDouglas Gregor diag::note_odr_template_parameter_here); 1179347f64feb4f144c97757b4d8469030e793dbb36eDouglas Gregor } 1180040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor return false; 1181040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor } 1182040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor 1183040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor if (!Context.IsStructurallyEquivalent(Params1->getParam(I), 1184040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor Params2->getParam(I))) { 1185040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor 1186040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor return false; 1187040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor } 1188040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor } 1189040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor 1190040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor return true; 1191040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor} 1192040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor 1193040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregorstatic bool IsStructurallyEquivalent(StructuralEquivalenceContext &Context, 1194040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor TemplateTypeParmDecl *D1, 1195040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor TemplateTypeParmDecl *D2) { 1196040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor if (D1->isParameterPack() != D2->isParameterPack()) { 1197347f64feb4f144c97757b4d8469030e793dbb36eDouglas Gregor if (Context.Complain) { 1198347f64feb4f144c97757b4d8469030e793dbb36eDouglas Gregor Context.Diag2(D2->getLocation(), diag::err_odr_parameter_pack_non_pack) 1199347f64feb4f144c97757b4d8469030e793dbb36eDouglas Gregor << D2->isParameterPack(); 1200347f64feb4f144c97757b4d8469030e793dbb36eDouglas Gregor Context.Diag1(D1->getLocation(), diag::note_odr_parameter_pack_non_pack) 1201347f64feb4f144c97757b4d8469030e793dbb36eDouglas Gregor << D1->isParameterPack(); 1202347f64feb4f144c97757b4d8469030e793dbb36eDouglas Gregor } 1203040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor return false; 1204040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor } 1205040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor 1206040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor return true; 1207040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor} 1208040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor 1209040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregorstatic bool IsStructurallyEquivalent(StructuralEquivalenceContext &Context, 1210040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor NonTypeTemplateParmDecl *D1, 1211040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor NonTypeTemplateParmDecl *D2) { 1212040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor if (D1->isParameterPack() != D2->isParameterPack()) { 121347395d9360782a854594804aafe13ee877c4c0c4Douglas Gregor if (Context.Complain) { 1214347f64feb4f144c97757b4d8469030e793dbb36eDouglas Gregor Context.Diag2(D2->getLocation(), diag::err_odr_parameter_pack_non_pack) 1215347f64feb4f144c97757b4d8469030e793dbb36eDouglas Gregor << D2->isParameterPack(); 1216347f64feb4f144c97757b4d8469030e793dbb36eDouglas Gregor Context.Diag1(D1->getLocation(), diag::note_odr_parameter_pack_non_pack) 1217347f64feb4f144c97757b4d8469030e793dbb36eDouglas Gregor << D1->isParameterPack(); 1218347f64feb4f144c97757b4d8469030e793dbb36eDouglas Gregor } 1219040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor return false; 1220040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor } 1221040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor 1222040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor // Check types. 1223040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor if (!Context.IsStructurallyEquivalent(D1->getType(), D2->getType())) { 1224347f64feb4f144c97757b4d8469030e793dbb36eDouglas Gregor if (Context.Complain) { 1225347f64feb4f144c97757b4d8469030e793dbb36eDouglas Gregor Context.Diag2(D2->getLocation(), 1226347f64feb4f144c97757b4d8469030e793dbb36eDouglas Gregor diag::err_odr_non_type_parameter_type_inconsistent) 1227347f64feb4f144c97757b4d8469030e793dbb36eDouglas Gregor << D2->getType() << D1->getType(); 1228347f64feb4f144c97757b4d8469030e793dbb36eDouglas Gregor Context.Diag1(D1->getLocation(), diag::note_odr_value_here) 1229347f64feb4f144c97757b4d8469030e793dbb36eDouglas Gregor << D1->getType(); 1230347f64feb4f144c97757b4d8469030e793dbb36eDouglas Gregor } 1231040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor return false; 1232040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor } 1233040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor 1234040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor return true; 1235040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor} 1236040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor 1237040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregorstatic bool IsStructurallyEquivalent(StructuralEquivalenceContext &Context, 1238040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor TemplateTemplateParmDecl *D1, 1239040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor TemplateTemplateParmDecl *D2) { 1240040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor if (D1->isParameterPack() != D2->isParameterPack()) { 1241347f64feb4f144c97757b4d8469030e793dbb36eDouglas Gregor if (Context.Complain) { 1242347f64feb4f144c97757b4d8469030e793dbb36eDouglas Gregor Context.Diag2(D2->getLocation(), diag::err_odr_parameter_pack_non_pack) 1243347f64feb4f144c97757b4d8469030e793dbb36eDouglas Gregor << D2->isParameterPack(); 1244347f64feb4f144c97757b4d8469030e793dbb36eDouglas Gregor Context.Diag1(D1->getLocation(), diag::note_odr_parameter_pack_non_pack) 1245347f64feb4f144c97757b4d8469030e793dbb36eDouglas Gregor << D1->isParameterPack(); 1246347f64feb4f144c97757b4d8469030e793dbb36eDouglas Gregor } 1247040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor return false; 1248040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor } 124947395d9360782a854594804aafe13ee877c4c0c4Douglas Gregor 1250040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor // Check template parameter lists. 1251040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor return IsStructurallyEquivalent(Context, D1->getTemplateParameters(), 1252040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor D2->getTemplateParameters()); 1253040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor} 1254040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor 1255040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregorstatic bool IsStructurallyEquivalent(StructuralEquivalenceContext &Context, 1256040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor ClassTemplateDecl *D1, 1257040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor ClassTemplateDecl *D2) { 1258040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor // Check template parameters. 1259040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor if (!IsStructurallyEquivalent(Context, 1260040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor D1->getTemplateParameters(), 1261040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor D2->getTemplateParameters())) 1262040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor return false; 126373dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor 1264040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor // Check the templated declaration. 1265040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor return Context.IsStructurallyEquivalent(D1->getTemplatedDecl(), 1266040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor D2->getTemplatedDecl()); 1267040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor} 1268040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor 126973dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor/// \brief Determine structural equivalence of two declarations. 127073dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregorstatic bool IsStructurallyEquivalent(StructuralEquivalenceContext &Context, 127173dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor Decl *D1, Decl *D2) { 127273dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor // FIXME: Check for known structural equivalences via a callback of some sort. 127373dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor 1274ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor // Check whether we already know that these two declarations are not 1275ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor // structurally equivalent. 1276ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor if (Context.NonEquivalentDecls.count(std::make_pair(D1->getCanonicalDecl(), 1277ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor D2->getCanonicalDecl()))) 1278ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor return false; 1279ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor 128073dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor // Determine whether we've already produced a tentative equivalence for D1. 128173dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor Decl *&EquivToD1 = Context.TentativeEquivalences[D1->getCanonicalDecl()]; 128273dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor if (EquivToD1) 128373dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor return EquivToD1 == D2->getCanonicalDecl(); 128473dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor 128573dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor // Produce a tentative equivalence D1 <-> D2, which will be checked later. 128673dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor EquivToD1 = D2->getCanonicalDecl(); 128773dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor Context.DeclsToCheck.push_back(D1->getCanonicalDecl()); 128873dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor return true; 128973dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor} 129073dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor 129173dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregorbool StructuralEquivalenceContext::IsStructurallyEquivalent(Decl *D1, 129273dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor Decl *D2) { 129373dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor if (!::IsStructurallyEquivalent(*this, D1, D2)) 129473dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor return false; 129573dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor 129673dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor return !Finish(); 129773dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor} 129873dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor 129973dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregorbool StructuralEquivalenceContext::IsStructurallyEquivalent(QualType T1, 130073dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor QualType T2) { 130173dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor if (!::IsStructurallyEquivalent(*this, T1, T2)) 130273dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor return false; 130373dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor 130473dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor return !Finish(); 130573dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor} 130673dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor 130773dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregorbool StructuralEquivalenceContext::Finish() { 130873dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor while (!DeclsToCheck.empty()) { 130973dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor // Check the next declaration. 131073dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor Decl *D1 = DeclsToCheck.front(); 131173dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor DeclsToCheck.pop_front(); 131273dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor 131373dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor Decl *D2 = TentativeEquivalences[D1]; 131473dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor assert(D2 && "Unrecorded tentative equivalence?"); 131573dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor 1316ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor bool Equivalent = true; 1317ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor 131873dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor // FIXME: Switch on all declaration kinds. For now, we're just going to 131973dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor // check the obvious ones. 132073dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor if (RecordDecl *Record1 = dyn_cast<RecordDecl>(D1)) { 132173dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor if (RecordDecl *Record2 = dyn_cast<RecordDecl>(D2)) { 132273dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor // Check for equivalent structure names. 132373dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor IdentifierInfo *Name1 = Record1->getIdentifier(); 1324162e1c1b487352434552147967c3dd296ebee2f7Richard Smith if (!Name1 && Record1->getTypedefNameForAnonDecl()) 1325162e1c1b487352434552147967c3dd296ebee2f7Richard Smith Name1 = Record1->getTypedefNameForAnonDecl()->getIdentifier(); 132673dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor IdentifierInfo *Name2 = Record2->getIdentifier(); 1327162e1c1b487352434552147967c3dd296ebee2f7Richard Smith if (!Name2 && Record2->getTypedefNameForAnonDecl()) 1328162e1c1b487352434552147967c3dd296ebee2f7Richard Smith Name2 = Record2->getTypedefNameForAnonDecl()->getIdentifier(); 1329ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor if (!::IsStructurallyEquivalent(Name1, Name2) || 1330ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor !::IsStructurallyEquivalent(*this, Record1, Record2)) 1331ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor Equivalent = false; 133273dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor } else { 133373dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor // Record/non-record mismatch. 1334ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor Equivalent = false; 133573dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor } 1336ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor } else if (EnumDecl *Enum1 = dyn_cast<EnumDecl>(D1)) { 133773dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor if (EnumDecl *Enum2 = dyn_cast<EnumDecl>(D2)) { 133873dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor // Check for equivalent enum names. 133973dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor IdentifierInfo *Name1 = Enum1->getIdentifier(); 1340162e1c1b487352434552147967c3dd296ebee2f7Richard Smith if (!Name1 && Enum1->getTypedefNameForAnonDecl()) 1341162e1c1b487352434552147967c3dd296ebee2f7Richard Smith Name1 = Enum1->getTypedefNameForAnonDecl()->getIdentifier(); 134273dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor IdentifierInfo *Name2 = Enum2->getIdentifier(); 1343162e1c1b487352434552147967c3dd296ebee2f7Richard Smith if (!Name2 && Enum2->getTypedefNameForAnonDecl()) 1344162e1c1b487352434552147967c3dd296ebee2f7Richard Smith Name2 = Enum2->getTypedefNameForAnonDecl()->getIdentifier(); 1345ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor if (!::IsStructurallyEquivalent(Name1, Name2) || 1346ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor !::IsStructurallyEquivalent(*this, Enum1, Enum2)) 1347ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor Equivalent = false; 134873dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor } else { 134973dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor // Enum/non-enum mismatch 1350ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor Equivalent = false; 135173dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor } 1352162e1c1b487352434552147967c3dd296ebee2f7Richard Smith } else if (TypedefNameDecl *Typedef1 = dyn_cast<TypedefNameDecl>(D1)) { 1353162e1c1b487352434552147967c3dd296ebee2f7Richard Smith if (TypedefNameDecl *Typedef2 = dyn_cast<TypedefNameDecl>(D2)) { 135473dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor if (!::IsStructurallyEquivalent(Typedef1->getIdentifier(), 1355ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor Typedef2->getIdentifier()) || 1356ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor !::IsStructurallyEquivalent(*this, 135773dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor Typedef1->getUnderlyingType(), 135873dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor Typedef2->getUnderlyingType())) 1359ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor Equivalent = false; 136073dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor } else { 136173dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor // Typedef/non-typedef mismatch. 1362ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor Equivalent = false; 136373dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor } 1364040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor } else if (ClassTemplateDecl *ClassTemplate1 1365040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor = dyn_cast<ClassTemplateDecl>(D1)) { 1366040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor if (ClassTemplateDecl *ClassTemplate2 = dyn_cast<ClassTemplateDecl>(D2)) { 1367040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor if (!::IsStructurallyEquivalent(ClassTemplate1->getIdentifier(), 1368040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor ClassTemplate2->getIdentifier()) || 1369040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor !::IsStructurallyEquivalent(*this, ClassTemplate1, ClassTemplate2)) 1370040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor Equivalent = false; 1371040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor } else { 1372040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor // Class template/non-class-template mismatch. 1373040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor Equivalent = false; 1374040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor } 1375040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor } else if (TemplateTypeParmDecl *TTP1= dyn_cast<TemplateTypeParmDecl>(D1)) { 1376040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor if (TemplateTypeParmDecl *TTP2 = dyn_cast<TemplateTypeParmDecl>(D2)) { 1377040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor if (!::IsStructurallyEquivalent(*this, TTP1, TTP2)) 1378040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor Equivalent = false; 1379040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor } else { 1380040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor // Kind mismatch. 1381040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor Equivalent = false; 1382040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor } 1383040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor } else if (NonTypeTemplateParmDecl *NTTP1 1384040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor = dyn_cast<NonTypeTemplateParmDecl>(D1)) { 1385040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor if (NonTypeTemplateParmDecl *NTTP2 1386040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor = dyn_cast<NonTypeTemplateParmDecl>(D2)) { 1387040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor if (!::IsStructurallyEquivalent(*this, NTTP1, NTTP2)) 1388040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor Equivalent = false; 1389040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor } else { 1390040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor // Kind mismatch. 1391040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor Equivalent = false; 1392040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor } 1393040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor } else if (TemplateTemplateParmDecl *TTP1 1394040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor = dyn_cast<TemplateTemplateParmDecl>(D1)) { 1395040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor if (TemplateTemplateParmDecl *TTP2 1396040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor = dyn_cast<TemplateTemplateParmDecl>(D2)) { 1397040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor if (!::IsStructurallyEquivalent(*this, TTP1, TTP2)) 1398040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor Equivalent = false; 1399040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor } else { 1400040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor // Kind mismatch. 1401040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor Equivalent = false; 1402040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor } 1403040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor } 1404040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor 1405ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor if (!Equivalent) { 1406ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor // Note that these two declarations are not equivalent (and we already 1407ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor // know about it). 1408ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor NonEquivalentDecls.insert(std::make_pair(D1->getCanonicalDecl(), 1409ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor D2->getCanonicalDecl())); 1410ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor return true; 1411ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor } 141273dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor // FIXME: Check other declaration kinds! 141373dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor } 141473dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor 141573dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor return false; 141673dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor} 141773dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor 141873dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor//---------------------------------------------------------------------------- 14191b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor// Import Types 14201b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor//---------------------------------------------------------------------------- 14211b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor 1422f4c7371fb1d3cebcfb40abad4537bb82515704eaJohn McCallQualType ASTNodeImporter::VisitType(const Type *T) { 142389cc9d6e2aaf794fbd2c228a3755c19062ca0ba0Douglas Gregor Importer.FromDiag(SourceLocation(), diag::err_unsupported_ast_node) 142489cc9d6e2aaf794fbd2c228a3755c19062ca0ba0Douglas Gregor << T->getTypeClassName(); 142589cc9d6e2aaf794fbd2c228a3755c19062ca0ba0Douglas Gregor return QualType(); 142689cc9d6e2aaf794fbd2c228a3755c19062ca0ba0Douglas Gregor} 142789cc9d6e2aaf794fbd2c228a3755c19062ca0ba0Douglas Gregor 1428f4c7371fb1d3cebcfb40abad4537bb82515704eaJohn McCallQualType ASTNodeImporter::VisitBuiltinType(const BuiltinType *T) { 14291b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor switch (T->getKind()) { 1430e0a22d06888c13989b3f72db319f1d498bf69153John McCall#define SHARED_SINGLETON_TYPE(Expansion) 1431e0a22d06888c13989b3f72db319f1d498bf69153John McCall#define BUILTIN_TYPE(Id, SingletonId) \ 1432e0a22d06888c13989b3f72db319f1d498bf69153John McCall case BuiltinType::Id: return Importer.getToContext().SingletonId; 1433e0a22d06888c13989b3f72db319f1d498bf69153John McCall#include "clang/AST/BuiltinTypes.def" 1434e0a22d06888c13989b3f72db319f1d498bf69153John McCall 1435e0a22d06888c13989b3f72db319f1d498bf69153John McCall // FIXME: for Char16, Char32, and NullPtr, make sure that the "to" 1436e0a22d06888c13989b3f72db319f1d498bf69153John McCall // context supports C++. 1437e0a22d06888c13989b3f72db319f1d498bf69153John McCall 1438e0a22d06888c13989b3f72db319f1d498bf69153John McCall // FIXME: for ObjCId, ObjCClass, and ObjCSel, make sure that the "to" 1439e0a22d06888c13989b3f72db319f1d498bf69153John McCall // context supports ObjC. 1440e0a22d06888c13989b3f72db319f1d498bf69153John McCall 14411b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor case BuiltinType::Char_U: 14421b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor // The context we're importing from has an unsigned 'char'. If we're 14431b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor // importing into a context with a signed 'char', translate to 14441b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor // 'unsigned char' instead. 14454e4d08403ca5cfd4d558fa2936215d3a4e5a528dDavid Blaikie if (Importer.getToContext().getLangOpts().CharIsSigned) 14461b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor return Importer.getToContext().UnsignedCharTy; 14471b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor 14481b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor return Importer.getToContext().CharTy; 14491b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor 14501b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor case BuiltinType::Char_S: 14511b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor // The context we're importing from has an unsigned 'char'. If we're 14521b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor // importing into a context with a signed 'char', translate to 14531b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor // 'unsigned char' instead. 14544e4d08403ca5cfd4d558fa2936215d3a4e5a528dDavid Blaikie if (!Importer.getToContext().getLangOpts().CharIsSigned) 14551b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor return Importer.getToContext().SignedCharTy; 14561b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor 14571b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor return Importer.getToContext().CharTy; 14581b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor 14593f59c975aa5d047f7edd1b900b5e885c38af0ef7Chris Lattner case BuiltinType::WChar_S: 14603f59c975aa5d047f7edd1b900b5e885c38af0ef7Chris Lattner case BuiltinType::WChar_U: 14611b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor // FIXME: If not in C++, shall we translate to the C equivalent of 14621b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor // wchar_t? 14631b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor return Importer.getToContext().WCharTy; 14641b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor } 14653026348bd4c13a0f83b59839f64065e0fcbea253David Blaikie 14663026348bd4c13a0f83b59839f64065e0fcbea253David Blaikie llvm_unreachable("Invalid BuiltinType Kind!"); 14671b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor} 14681b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor 1469f4c7371fb1d3cebcfb40abad4537bb82515704eaJohn McCallQualType ASTNodeImporter::VisitComplexType(const ComplexType *T) { 14701b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor QualType ToElementType = Importer.Import(T->getElementType()); 14711b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor if (ToElementType.isNull()) 14721b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor return QualType(); 14731b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor 14741b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor return Importer.getToContext().getComplexType(ToElementType); 14751b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor} 14761b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor 1477f4c7371fb1d3cebcfb40abad4537bb82515704eaJohn McCallQualType ASTNodeImporter::VisitPointerType(const PointerType *T) { 14781b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor QualType ToPointeeType = Importer.Import(T->getPointeeType()); 14791b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor if (ToPointeeType.isNull()) 14801b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor return QualType(); 14811b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor 14821b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor return Importer.getToContext().getPointerType(ToPointeeType); 14831b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor} 14841b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor 1485f4c7371fb1d3cebcfb40abad4537bb82515704eaJohn McCallQualType ASTNodeImporter::VisitBlockPointerType(const BlockPointerType *T) { 14861b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor // FIXME: Check for blocks support in "to" context. 14871b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor QualType ToPointeeType = Importer.Import(T->getPointeeType()); 14881b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor if (ToPointeeType.isNull()) 14891b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor return QualType(); 14901b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor 14911b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor return Importer.getToContext().getBlockPointerType(ToPointeeType); 14921b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor} 14931b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor 1494f4c7371fb1d3cebcfb40abad4537bb82515704eaJohn McCallQualType 1495f4c7371fb1d3cebcfb40abad4537bb82515704eaJohn McCallASTNodeImporter::VisitLValueReferenceType(const LValueReferenceType *T) { 14961b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor // FIXME: Check for C++ support in "to" context. 14971b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor QualType ToPointeeType = Importer.Import(T->getPointeeTypeAsWritten()); 14981b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor if (ToPointeeType.isNull()) 14991b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor return QualType(); 15001b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor 15011b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor return Importer.getToContext().getLValueReferenceType(ToPointeeType); 15021b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor} 15031b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor 1504f4c7371fb1d3cebcfb40abad4537bb82515704eaJohn McCallQualType 1505f4c7371fb1d3cebcfb40abad4537bb82515704eaJohn McCallASTNodeImporter::VisitRValueReferenceType(const RValueReferenceType *T) { 15061b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor // FIXME: Check for C++0x support in "to" context. 15071b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor QualType ToPointeeType = Importer.Import(T->getPointeeTypeAsWritten()); 15081b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor if (ToPointeeType.isNull()) 15091b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor return QualType(); 15101b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor 15111b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor return Importer.getToContext().getRValueReferenceType(ToPointeeType); 15121b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor} 15131b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor 1514f4c7371fb1d3cebcfb40abad4537bb82515704eaJohn McCallQualType ASTNodeImporter::VisitMemberPointerType(const MemberPointerType *T) { 15151b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor // FIXME: Check for C++ support in "to" context. 15161b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor QualType ToPointeeType = Importer.Import(T->getPointeeType()); 15171b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor if (ToPointeeType.isNull()) 15181b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor return QualType(); 15191b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor 15201b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor QualType ClassType = Importer.Import(QualType(T->getClass(), 0)); 15211b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor return Importer.getToContext().getMemberPointerType(ToPointeeType, 15221b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor ClassType.getTypePtr()); 15231b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor} 15241b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor 1525f4c7371fb1d3cebcfb40abad4537bb82515704eaJohn McCallQualType ASTNodeImporter::VisitConstantArrayType(const ConstantArrayType *T) { 15261b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor QualType ToElementType = Importer.Import(T->getElementType()); 15271b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor if (ToElementType.isNull()) 15281b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor return QualType(); 15291b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor 15301b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor return Importer.getToContext().getConstantArrayType(ToElementType, 15311b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor T->getSize(), 15321b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor T->getSizeModifier(), 15331b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor T->getIndexTypeCVRQualifiers()); 15341b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor} 15351b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor 1536f4c7371fb1d3cebcfb40abad4537bb82515704eaJohn McCallQualType 1537f4c7371fb1d3cebcfb40abad4537bb82515704eaJohn McCallASTNodeImporter::VisitIncompleteArrayType(const IncompleteArrayType *T) { 15381b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor QualType ToElementType = Importer.Import(T->getElementType()); 15391b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor if (ToElementType.isNull()) 15401b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor return QualType(); 15411b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor 15421b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor return Importer.getToContext().getIncompleteArrayType(ToElementType, 15431b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor T->getSizeModifier(), 15441b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor T->getIndexTypeCVRQualifiers()); 15451b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor} 15461b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor 1547f4c7371fb1d3cebcfb40abad4537bb82515704eaJohn McCallQualType ASTNodeImporter::VisitVariableArrayType(const VariableArrayType *T) { 15481b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor QualType ToElementType = Importer.Import(T->getElementType()); 15491b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor if (ToElementType.isNull()) 15501b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor return QualType(); 15511b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor 15521b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor Expr *Size = Importer.Import(T->getSizeExpr()); 15531b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor if (!Size) 15541b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor return QualType(); 15551b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor 15561b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor SourceRange Brackets = Importer.Import(T->getBracketsRange()); 15571b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor return Importer.getToContext().getVariableArrayType(ToElementType, Size, 15581b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor T->getSizeModifier(), 15591b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor T->getIndexTypeCVRQualifiers(), 15601b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor Brackets); 15611b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor} 15621b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor 1563f4c7371fb1d3cebcfb40abad4537bb82515704eaJohn McCallQualType ASTNodeImporter::VisitVectorType(const VectorType *T) { 15641b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor QualType ToElementType = Importer.Import(T->getElementType()); 15651b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor if (ToElementType.isNull()) 15661b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor return QualType(); 15671b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor 15681b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor return Importer.getToContext().getVectorType(ToElementType, 15691b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor T->getNumElements(), 1570e86d78cf4754a6aef2cf9a33d847aa15338e276fBob Wilson T->getVectorKind()); 15711b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor} 15721b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor 1573f4c7371fb1d3cebcfb40abad4537bb82515704eaJohn McCallQualType ASTNodeImporter::VisitExtVectorType(const ExtVectorType *T) { 15741b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor QualType ToElementType = Importer.Import(T->getElementType()); 15751b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor if (ToElementType.isNull()) 15761b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor return QualType(); 15771b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor 15781b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor return Importer.getToContext().getExtVectorType(ToElementType, 15791b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor T->getNumElements()); 15801b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor} 15811b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor 1582f4c7371fb1d3cebcfb40abad4537bb82515704eaJohn McCallQualType 1583f4c7371fb1d3cebcfb40abad4537bb82515704eaJohn McCallASTNodeImporter::VisitFunctionNoProtoType(const FunctionNoProtoType *T) { 15841b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor // FIXME: What happens if we're importing a function without a prototype 15851b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor // into C++? Should we make it variadic? 1586651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines QualType ToResultType = Importer.Import(T->getReturnType()); 15871b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor if (ToResultType.isNull()) 15881b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor return QualType(); 1589264ba48dc98f3f843935a485d5b086f7e0fdc4f1Rafael Espindola 15901b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor return Importer.getToContext().getFunctionNoProtoType(ToResultType, 1591264ba48dc98f3f843935a485d5b086f7e0fdc4f1Rafael Espindola T->getExtInfo()); 15921b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor} 15931b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor 1594d498f384d154e154e939a9c764054cd4a8d76819Argyrios KyrtzidisQualType ASTNodeImporter::VisitFunctionProtoType(const FunctionProtoType *T) { 1595651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines QualType ToResultType = Importer.Import(T->getReturnType()); 15961b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor if (ToResultType.isNull()) 15971b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor return QualType(); 15981b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor 15991b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor // Import argument types 16005f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner SmallVector<QualType, 4> ArgTypes; 1601651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines for (const auto &A : T->param_types()) { 1602651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines QualType ArgType = Importer.Import(A); 16031b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor if (ArgType.isNull()) 16041b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor return QualType(); 16051b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor ArgTypes.push_back(ArgType); 16061b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor } 16071b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor 16081b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor // Import exception types 16095f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner SmallVector<QualType, 4> ExceptionTypes; 1610651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines for (const auto &E : T->exceptions()) { 1611651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines QualType ExceptionType = Importer.Import(E); 16121b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor if (ExceptionType.isNull()) 16131b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor return QualType(); 16141b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor ExceptionTypes.push_back(ExceptionType); 16151b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor } 1616e23cf437fe76b1ed02d63c3f61b456fd48a915f5John McCall 1617f0fdefc13a58db2a8b32bb47ac23bc16efad6fdaArgyrios Kyrtzidis FunctionProtoType::ExtProtoInfo FromEPI = T->getExtProtoInfo(); 1618f0fdefc13a58db2a8b32bb47ac23bc16efad6fdaArgyrios Kyrtzidis FunctionProtoType::ExtProtoInfo ToEPI; 1619f0fdefc13a58db2a8b32bb47ac23bc16efad6fdaArgyrios Kyrtzidis 1620f0fdefc13a58db2a8b32bb47ac23bc16efad6fdaArgyrios Kyrtzidis ToEPI.ExtInfo = FromEPI.ExtInfo; 1621f0fdefc13a58db2a8b32bb47ac23bc16efad6fdaArgyrios Kyrtzidis ToEPI.Variadic = FromEPI.Variadic; 1622f0fdefc13a58db2a8b32bb47ac23bc16efad6fdaArgyrios Kyrtzidis ToEPI.HasTrailingReturn = FromEPI.HasTrailingReturn; 1623f0fdefc13a58db2a8b32bb47ac23bc16efad6fdaArgyrios Kyrtzidis ToEPI.TypeQuals = FromEPI.TypeQuals; 1624f0fdefc13a58db2a8b32bb47ac23bc16efad6fdaArgyrios Kyrtzidis ToEPI.RefQualifier = FromEPI.RefQualifier; 1625f0fdefc13a58db2a8b32bb47ac23bc16efad6fdaArgyrios Kyrtzidis ToEPI.NumExceptions = ExceptionTypes.size(); 1626f0fdefc13a58db2a8b32bb47ac23bc16efad6fdaArgyrios Kyrtzidis ToEPI.Exceptions = ExceptionTypes.data(); 1627651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines ToEPI.ConsumedParameters = FromEPI.ConsumedParameters; 1628d498f384d154e154e939a9c764054cd4a8d76819Argyrios Kyrtzidis ToEPI.ExceptionSpecType = FromEPI.ExceptionSpecType; 1629d498f384d154e154e939a9c764054cd4a8d76819Argyrios Kyrtzidis ToEPI.NoexceptExpr = Importer.Import(FromEPI.NoexceptExpr); 1630d498f384d154e154e939a9c764054cd4a8d76819Argyrios Kyrtzidis ToEPI.ExceptionSpecDecl = cast_or_null<FunctionDecl>( 1631f0fdefc13a58db2a8b32bb47ac23bc16efad6fdaArgyrios Kyrtzidis Importer.Import(FromEPI.ExceptionSpecDecl)); 1632d498f384d154e154e939a9c764054cd4a8d76819Argyrios Kyrtzidis ToEPI.ExceptionSpecTemplate = cast_or_null<FunctionDecl>( 1633f0fdefc13a58db2a8b32bb47ac23bc16efad6fdaArgyrios Kyrtzidis Importer.Import(FromEPI.ExceptionSpecTemplate)); 1634f0fdefc13a58db2a8b32bb47ac23bc16efad6fdaArgyrios Kyrtzidis 1635bea522ff43a3f11c7a2bc7949119dbb9fce19e39Jordan Rose return Importer.getToContext().getFunctionType(ToResultType, ArgTypes, ToEPI); 1636f0fdefc13a58db2a8b32bb47ac23bc16efad6fdaArgyrios Kyrtzidis} 1637f0fdefc13a58db2a8b32bb47ac23bc16efad6fdaArgyrios Kyrtzidis 16380aeb2890389ec1872e49a18fb2022bfb9f96578dSean CallananQualType ASTNodeImporter::VisitParenType(const ParenType *T) { 16390aeb2890389ec1872e49a18fb2022bfb9f96578dSean Callanan QualType ToInnerType = Importer.Import(T->getInnerType()); 16400aeb2890389ec1872e49a18fb2022bfb9f96578dSean Callanan if (ToInnerType.isNull()) 16410aeb2890389ec1872e49a18fb2022bfb9f96578dSean Callanan return QualType(); 16420aeb2890389ec1872e49a18fb2022bfb9f96578dSean Callanan 16430aeb2890389ec1872e49a18fb2022bfb9f96578dSean Callanan return Importer.getToContext().getParenType(ToInnerType); 16440aeb2890389ec1872e49a18fb2022bfb9f96578dSean Callanan} 16450aeb2890389ec1872e49a18fb2022bfb9f96578dSean Callanan 1646f4c7371fb1d3cebcfb40abad4537bb82515704eaJohn McCallQualType ASTNodeImporter::VisitTypedefType(const TypedefType *T) { 1647162e1c1b487352434552147967c3dd296ebee2f7Richard Smith TypedefNameDecl *ToDecl 1648162e1c1b487352434552147967c3dd296ebee2f7Richard Smith = dyn_cast_or_null<TypedefNameDecl>(Importer.Import(T->getDecl())); 16491b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor if (!ToDecl) 16501b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor return QualType(); 16511b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor 16521b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor return Importer.getToContext().getTypeDeclType(ToDecl); 16531b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor} 16541b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor 1655f4c7371fb1d3cebcfb40abad4537bb82515704eaJohn McCallQualType ASTNodeImporter::VisitTypeOfExprType(const TypeOfExprType *T) { 16561b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor Expr *ToExpr = Importer.Import(T->getUnderlyingExpr()); 16571b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor if (!ToExpr) 16581b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor return QualType(); 16591b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor 16601b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor return Importer.getToContext().getTypeOfExprType(ToExpr); 16611b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor} 16621b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor 1663f4c7371fb1d3cebcfb40abad4537bb82515704eaJohn McCallQualType ASTNodeImporter::VisitTypeOfType(const TypeOfType *T) { 16641b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor QualType ToUnderlyingType = Importer.Import(T->getUnderlyingType()); 16651b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor if (ToUnderlyingType.isNull()) 16661b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor return QualType(); 16671b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor 16681b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor return Importer.getToContext().getTypeOfType(ToUnderlyingType); 16691b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor} 16701b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor 1671f4c7371fb1d3cebcfb40abad4537bb82515704eaJohn McCallQualType ASTNodeImporter::VisitDecltypeType(const DecltypeType *T) { 167234b41d939a1328f484511c6002ba2456db879a29Richard Smith // FIXME: Make sure that the "to" context supports C++0x! 16731b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor Expr *ToExpr = Importer.Import(T->getUnderlyingExpr()); 16741b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor if (!ToExpr) 16751b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor return QualType(); 16761b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor 1677f8af98286022f72157d84951b48fde5fb369ab29Douglas Gregor QualType UnderlyingType = Importer.Import(T->getUnderlyingType()); 1678f8af98286022f72157d84951b48fde5fb369ab29Douglas Gregor if (UnderlyingType.isNull()) 1679f8af98286022f72157d84951b48fde5fb369ab29Douglas Gregor return QualType(); 1680f8af98286022f72157d84951b48fde5fb369ab29Douglas Gregor 1681f8af98286022f72157d84951b48fde5fb369ab29Douglas Gregor return Importer.getToContext().getDecltypeType(ToExpr, UnderlyingType); 16821b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor} 16831b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor 1684ca63c200346c0ca9e00194ec6e34a5a7b0ed9321Sean HuntQualType ASTNodeImporter::VisitUnaryTransformType(const UnaryTransformType *T) { 1685ca63c200346c0ca9e00194ec6e34a5a7b0ed9321Sean Hunt QualType ToBaseType = Importer.Import(T->getBaseType()); 1686ca63c200346c0ca9e00194ec6e34a5a7b0ed9321Sean Hunt QualType ToUnderlyingType = Importer.Import(T->getUnderlyingType()); 1687ca63c200346c0ca9e00194ec6e34a5a7b0ed9321Sean Hunt if (ToBaseType.isNull() || ToUnderlyingType.isNull()) 1688ca63c200346c0ca9e00194ec6e34a5a7b0ed9321Sean Hunt return QualType(); 1689ca63c200346c0ca9e00194ec6e34a5a7b0ed9321Sean Hunt 1690ca63c200346c0ca9e00194ec6e34a5a7b0ed9321Sean Hunt return Importer.getToContext().getUnaryTransformType(ToBaseType, 1691ca63c200346c0ca9e00194ec6e34a5a7b0ed9321Sean Hunt ToUnderlyingType, 1692ca63c200346c0ca9e00194ec6e34a5a7b0ed9321Sean Hunt T->getUTTKind()); 1693ca63c200346c0ca9e00194ec6e34a5a7b0ed9321Sean Hunt} 1694ca63c200346c0ca9e00194ec6e34a5a7b0ed9321Sean Hunt 169534b41d939a1328f484511c6002ba2456db879a29Richard SmithQualType ASTNodeImporter::VisitAutoType(const AutoType *T) { 1696a2c3646c35dd09d21b74826240aa916545b1873fRichard Smith // FIXME: Make sure that the "to" context supports C++11! 169734b41d939a1328f484511c6002ba2456db879a29Richard Smith QualType FromDeduced = T->getDeducedType(); 169834b41d939a1328f484511c6002ba2456db879a29Richard Smith QualType ToDeduced; 169934b41d939a1328f484511c6002ba2456db879a29Richard Smith if (!FromDeduced.isNull()) { 170034b41d939a1328f484511c6002ba2456db879a29Richard Smith ToDeduced = Importer.Import(FromDeduced); 170134b41d939a1328f484511c6002ba2456db879a29Richard Smith if (ToDeduced.isNull()) 170234b41d939a1328f484511c6002ba2456db879a29Richard Smith return QualType(); 170334b41d939a1328f484511c6002ba2456db879a29Richard Smith } 170434b41d939a1328f484511c6002ba2456db879a29Richard Smith 1705fad9e13f3cb85198f0ee5af620ba81cd78574faaFaisal Vali return Importer.getToContext().getAutoType(ToDeduced, T->isDecltypeAuto(), 1706fad9e13f3cb85198f0ee5af620ba81cd78574faaFaisal Vali /*IsDependent*/false); 170734b41d939a1328f484511c6002ba2456db879a29Richard Smith} 170834b41d939a1328f484511c6002ba2456db879a29Richard Smith 1709f4c7371fb1d3cebcfb40abad4537bb82515704eaJohn McCallQualType ASTNodeImporter::VisitRecordType(const RecordType *T) { 17101b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor RecordDecl *ToDecl 17111b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor = dyn_cast_or_null<RecordDecl>(Importer.Import(T->getDecl())); 17121b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor if (!ToDecl) 17131b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor return QualType(); 17141b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor 17151b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor return Importer.getToContext().getTagDeclType(ToDecl); 17161b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor} 17171b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor 1718f4c7371fb1d3cebcfb40abad4537bb82515704eaJohn McCallQualType ASTNodeImporter::VisitEnumType(const EnumType *T) { 17191b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor EnumDecl *ToDecl 17201b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor = dyn_cast_or_null<EnumDecl>(Importer.Import(T->getDecl())); 17211b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor if (!ToDecl) 17221b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor return QualType(); 17231b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor 17241b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor return Importer.getToContext().getTagDeclType(ToDecl); 17251b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor} 17261b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor 1727d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas GregorQualType ASTNodeImporter::VisitTemplateSpecializationType( 1728f4c7371fb1d3cebcfb40abad4537bb82515704eaJohn McCall const TemplateSpecializationType *T) { 1729d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor TemplateName ToTemplate = Importer.Import(T->getTemplateName()); 1730d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor if (ToTemplate.isNull()) 1731d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor return QualType(); 1732d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor 17335f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner SmallVector<TemplateArgument, 2> ToTemplateArgs; 1734d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor if (ImportTemplateArguments(T->getArgs(), T->getNumArgs(), ToTemplateArgs)) 1735d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor return QualType(); 1736d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor 1737d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor QualType ToCanonType; 1738d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor if (!QualType(T, 0).isCanonical()) { 1739d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor QualType FromCanonType 1740d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor = Importer.getFromContext().getCanonicalType(QualType(T, 0)); 1741d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor ToCanonType =Importer.Import(FromCanonType); 1742d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor if (ToCanonType.isNull()) 1743d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor return QualType(); 1744d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor } 1745d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor return Importer.getToContext().getTemplateSpecializationType(ToTemplate, 1746d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor ToTemplateArgs.data(), 1747d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor ToTemplateArgs.size(), 1748d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor ToCanonType); 1749d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor} 1750d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor 1751f4c7371fb1d3cebcfb40abad4537bb82515704eaJohn McCallQualType ASTNodeImporter::VisitElaboratedType(const ElaboratedType *T) { 17526bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines NestedNameSpecifier *ToQualifier = nullptr; 1753465d41b92b2c862f3062c412a0538db65c6a2661Abramo Bagnara // Note: the qualifier in an ElaboratedType is optional. 1754465d41b92b2c862f3062c412a0538db65c6a2661Abramo Bagnara if (T->getQualifier()) { 1755465d41b92b2c862f3062c412a0538db65c6a2661Abramo Bagnara ToQualifier = Importer.Import(T->getQualifier()); 1756465d41b92b2c862f3062c412a0538db65c6a2661Abramo Bagnara if (!ToQualifier) 1757465d41b92b2c862f3062c412a0538db65c6a2661Abramo Bagnara return QualType(); 1758465d41b92b2c862f3062c412a0538db65c6a2661Abramo Bagnara } 17591b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor 17601b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor QualType ToNamedType = Importer.Import(T->getNamedType()); 17611b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor if (ToNamedType.isNull()) 17621b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor return QualType(); 17631b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor 1764465d41b92b2c862f3062c412a0538db65c6a2661Abramo Bagnara return Importer.getToContext().getElaboratedType(T->getKeyword(), 1765465d41b92b2c862f3062c412a0538db65c6a2661Abramo Bagnara ToQualifier, ToNamedType); 17661b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor} 17671b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor 1768f4c7371fb1d3cebcfb40abad4537bb82515704eaJohn McCallQualType ASTNodeImporter::VisitObjCInterfaceType(const ObjCInterfaceType *T) { 17691b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor ObjCInterfaceDecl *Class 17701b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor = dyn_cast_or_null<ObjCInterfaceDecl>(Importer.Import(T->getDecl())); 17711b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor if (!Class) 17721b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor return QualType(); 17731b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor 1774c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall return Importer.getToContext().getObjCInterfaceType(Class); 1775c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall} 1776c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall 1777f4c7371fb1d3cebcfb40abad4537bb82515704eaJohn McCallQualType ASTNodeImporter::VisitObjCObjectType(const ObjCObjectType *T) { 1778c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall QualType ToBaseType = Importer.Import(T->getBaseType()); 1779c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall if (ToBaseType.isNull()) 1780c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall return QualType(); 1781c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall 17825f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner SmallVector<ObjCProtocolDecl *, 4> Protocols; 1783651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines for (auto *P : T->quals()) { 17841b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor ObjCProtocolDecl *Protocol 1785651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines = dyn_cast_or_null<ObjCProtocolDecl>(Importer.Import(P)); 17861b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor if (!Protocol) 17871b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor return QualType(); 17881b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor Protocols.push_back(Protocol); 17891b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor } 17901b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor 1791c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall return Importer.getToContext().getObjCObjectType(ToBaseType, 1792c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall Protocols.data(), 1793c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall Protocols.size()); 17941b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor} 17951b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor 1796f4c7371fb1d3cebcfb40abad4537bb82515704eaJohn McCallQualType 1797f4c7371fb1d3cebcfb40abad4537bb82515704eaJohn McCallASTNodeImporter::VisitObjCObjectPointerType(const ObjCObjectPointerType *T) { 17981b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor QualType ToPointeeType = Importer.Import(T->getPointeeType()); 17991b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor if (ToPointeeType.isNull()) 18001b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor return QualType(); 18011b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor 1802c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall return Importer.getToContext().getObjCObjectPointerType(ToPointeeType); 18031b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor} 18041b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor 1805089459a16bf7e9cd10617d1fac5ec0240a0a1ee6Douglas Gregor//---------------------------------------------------------------------------- 1806089459a16bf7e9cd10617d1fac5ec0240a0a1ee6Douglas Gregor// Import Declarations 1807089459a16bf7e9cd10617d1fac5ec0240a0a1ee6Douglas Gregor//---------------------------------------------------------------------------- 1808a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregorbool ASTNodeImporter::ImportDeclParts(NamedDecl *D, DeclContext *&DC, 1809a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor DeclContext *&LexicalDC, 1810a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor DeclarationName &Name, 1811a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor SourceLocation &Loc) { 1812089459a16bf7e9cd10617d1fac5ec0240a0a1ee6Douglas Gregor // Import the context of this declaration. 1813a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor DC = Importer.ImportContext(D->getDeclContext()); 1814089459a16bf7e9cd10617d1fac5ec0240a0a1ee6Douglas Gregor if (!DC) 1815a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor return true; 1816a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor 1817a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor LexicalDC = DC; 18189bed8798964d9f07599c2c9199701f86fbc70e20Douglas Gregor if (D->getDeclContext() != D->getLexicalDeclContext()) { 18199bed8798964d9f07599c2c9199701f86fbc70e20Douglas Gregor LexicalDC = Importer.ImportContext(D->getLexicalDeclContext()); 18209bed8798964d9f07599c2c9199701f86fbc70e20Douglas Gregor if (!LexicalDC) 1821a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor return true; 18229bed8798964d9f07599c2c9199701f86fbc70e20Douglas Gregor } 1823a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor 1824089459a16bf7e9cd10617d1fac5ec0240a0a1ee6Douglas Gregor // Import the name of this declaration. 1825a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor Name = Importer.Import(D->getDeclName()); 1826089459a16bf7e9cd10617d1fac5ec0240a0a1ee6Douglas Gregor if (D->getDeclName() && !Name) 1827a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor return true; 1828a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor 1829a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor // Import the location of this declaration. 1830a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor Loc = Importer.Import(D->getLocation()); 1831a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor return false; 1832a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor} 1833a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor 18341cf038c516c5e1f56ea9cff61aac7f7841744a91Douglas Gregorvoid ASTNodeImporter::ImportDefinitionIfNeeded(Decl *FromD, Decl *ToD) { 18351cf038c516c5e1f56ea9cff61aac7f7841744a91Douglas Gregor if (!FromD) 18361cf038c516c5e1f56ea9cff61aac7f7841744a91Douglas Gregor return; 18371cf038c516c5e1f56ea9cff61aac7f7841744a91Douglas Gregor 18381cf038c516c5e1f56ea9cff61aac7f7841744a91Douglas Gregor if (!ToD) { 18391cf038c516c5e1f56ea9cff61aac7f7841744a91Douglas Gregor ToD = Importer.Import(FromD); 18401cf038c516c5e1f56ea9cff61aac7f7841744a91Douglas Gregor if (!ToD) 18411cf038c516c5e1f56ea9cff61aac7f7841744a91Douglas Gregor return; 18421cf038c516c5e1f56ea9cff61aac7f7841744a91Douglas Gregor } 18431cf038c516c5e1f56ea9cff61aac7f7841744a91Douglas Gregor 18441cf038c516c5e1f56ea9cff61aac7f7841744a91Douglas Gregor if (RecordDecl *FromRecord = dyn_cast<RecordDecl>(FromD)) { 18451cf038c516c5e1f56ea9cff61aac7f7841744a91Douglas Gregor if (RecordDecl *ToRecord = cast_or_null<RecordDecl>(ToD)) { 18462246823e207a4846c842a27cf99d99920cd2b178Sean Callanan if (FromRecord->getDefinition() && FromRecord->isCompleteDefinition() && !ToRecord->getDefinition()) { 18471cf038c516c5e1f56ea9cff61aac7f7841744a91Douglas Gregor ImportDefinition(FromRecord, ToRecord); 18481cf038c516c5e1f56ea9cff61aac7f7841744a91Douglas Gregor } 18491cf038c516c5e1f56ea9cff61aac7f7841744a91Douglas Gregor } 18501cf038c516c5e1f56ea9cff61aac7f7841744a91Douglas Gregor return; 18511cf038c516c5e1f56ea9cff61aac7f7841744a91Douglas Gregor } 18521cf038c516c5e1f56ea9cff61aac7f7841744a91Douglas Gregor 18531cf038c516c5e1f56ea9cff61aac7f7841744a91Douglas Gregor if (EnumDecl *FromEnum = dyn_cast<EnumDecl>(FromD)) { 18541cf038c516c5e1f56ea9cff61aac7f7841744a91Douglas Gregor if (EnumDecl *ToEnum = cast_or_null<EnumDecl>(ToD)) { 18551cf038c516c5e1f56ea9cff61aac7f7841744a91Douglas Gregor if (FromEnum->getDefinition() && !ToEnum->getDefinition()) { 18561cf038c516c5e1f56ea9cff61aac7f7841744a91Douglas Gregor ImportDefinition(FromEnum, ToEnum); 18571cf038c516c5e1f56ea9cff61aac7f7841744a91Douglas Gregor } 18581cf038c516c5e1f56ea9cff61aac7f7841744a91Douglas Gregor } 18591cf038c516c5e1f56ea9cff61aac7f7841744a91Douglas Gregor return; 18601cf038c516c5e1f56ea9cff61aac7f7841744a91Douglas Gregor } 18611cf038c516c5e1f56ea9cff61aac7f7841744a91Douglas Gregor} 18621cf038c516c5e1f56ea9cff61aac7f7841744a91Douglas Gregor 18632577743c5650c646fb705df01403707e94f2df04Abramo Bagnaravoid 18642577743c5650c646fb705df01403707e94f2df04Abramo BagnaraASTNodeImporter::ImportDeclarationNameLoc(const DeclarationNameInfo &From, 18652577743c5650c646fb705df01403707e94f2df04Abramo Bagnara DeclarationNameInfo& To) { 18662577743c5650c646fb705df01403707e94f2df04Abramo Bagnara // NOTE: To.Name and To.Loc are already imported. 18672577743c5650c646fb705df01403707e94f2df04Abramo Bagnara // We only have to import To.LocInfo. 18682577743c5650c646fb705df01403707e94f2df04Abramo Bagnara switch (To.getName().getNameKind()) { 18692577743c5650c646fb705df01403707e94f2df04Abramo Bagnara case DeclarationName::Identifier: 18702577743c5650c646fb705df01403707e94f2df04Abramo Bagnara case DeclarationName::ObjCZeroArgSelector: 18712577743c5650c646fb705df01403707e94f2df04Abramo Bagnara case DeclarationName::ObjCOneArgSelector: 18722577743c5650c646fb705df01403707e94f2df04Abramo Bagnara case DeclarationName::ObjCMultiArgSelector: 18732577743c5650c646fb705df01403707e94f2df04Abramo Bagnara case DeclarationName::CXXUsingDirective: 18742577743c5650c646fb705df01403707e94f2df04Abramo Bagnara return; 18752577743c5650c646fb705df01403707e94f2df04Abramo Bagnara 18762577743c5650c646fb705df01403707e94f2df04Abramo Bagnara case DeclarationName::CXXOperatorName: { 18772577743c5650c646fb705df01403707e94f2df04Abramo Bagnara SourceRange Range = From.getCXXOperatorNameRange(); 18782577743c5650c646fb705df01403707e94f2df04Abramo Bagnara To.setCXXOperatorNameRange(Importer.Import(Range)); 18792577743c5650c646fb705df01403707e94f2df04Abramo Bagnara return; 18802577743c5650c646fb705df01403707e94f2df04Abramo Bagnara } 18812577743c5650c646fb705df01403707e94f2df04Abramo Bagnara case DeclarationName::CXXLiteralOperatorName: { 18822577743c5650c646fb705df01403707e94f2df04Abramo Bagnara SourceLocation Loc = From.getCXXLiteralOperatorNameLoc(); 18832577743c5650c646fb705df01403707e94f2df04Abramo Bagnara To.setCXXLiteralOperatorNameLoc(Importer.Import(Loc)); 18842577743c5650c646fb705df01403707e94f2df04Abramo Bagnara return; 18852577743c5650c646fb705df01403707e94f2df04Abramo Bagnara } 18862577743c5650c646fb705df01403707e94f2df04Abramo Bagnara case DeclarationName::CXXConstructorName: 18872577743c5650c646fb705df01403707e94f2df04Abramo Bagnara case DeclarationName::CXXDestructorName: 18882577743c5650c646fb705df01403707e94f2df04Abramo Bagnara case DeclarationName::CXXConversionFunctionName: { 18892577743c5650c646fb705df01403707e94f2df04Abramo Bagnara TypeSourceInfo *FromTInfo = From.getNamedTypeInfo(); 18902577743c5650c646fb705df01403707e94f2df04Abramo Bagnara To.setNamedTypeInfo(Importer.Import(FromTInfo)); 18912577743c5650c646fb705df01403707e94f2df04Abramo Bagnara return; 18922577743c5650c646fb705df01403707e94f2df04Abramo Bagnara } 18932577743c5650c646fb705df01403707e94f2df04Abramo Bagnara } 189421a25167b8279df3d8f889d041a4fd98733d3c27Douglas Gregor llvm_unreachable("Unknown name kind."); 18952577743c5650c646fb705df01403707e94f2df04Abramo Bagnara} 18962577743c5650c646fb705df01403707e94f2df04Abramo Bagnara 1897ac32ff9812e7d6bc31573b5499bfd005fc8b8f39Douglas Gregorvoid ASTNodeImporter::ImportDeclContext(DeclContext *FromDC, bool ForceImport) { 1898d8868a634d4fd362243dc646e58c3cf956c81dcdDouglas Gregor if (Importer.isMinimalImport() && !ForceImport) { 18998cc4fd795e01d50a7a7c96f4c0356d23b00d9349Sean Callanan Importer.ImportContext(FromDC); 1900d8868a634d4fd362243dc646e58c3cf956c81dcdDouglas Gregor return; 1901d8868a634d4fd362243dc646e58c3cf956c81dcdDouglas Gregor } 1902d8868a634d4fd362243dc646e58c3cf956c81dcdDouglas Gregor 1903651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines for (auto *From : FromDC->decls()) 1904651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines Importer.Import(From); 1905083a821bbd02bbc521275a2f144abe39a6c2745cDouglas Gregor} 1906083a821bbd02bbc521275a2f144abe39a6c2745cDouglas Gregor 19071cf038c516c5e1f56ea9cff61aac7f7841744a91Douglas Gregorbool ASTNodeImporter::ImportDefinition(RecordDecl *From, RecordDecl *To, 1908cd0d56a523f877ffd1fe1575caf758b4357f1661Douglas Gregor ImportDefinitionKind Kind) { 1909cd0d56a523f877ffd1fe1575caf758b4357f1661Douglas Gregor if (To->getDefinition() || To->isBeingDefined()) { 1910cd0d56a523f877ffd1fe1575caf758b4357f1661Douglas Gregor if (Kind == IDK_Everything) 1911cd0d56a523f877ffd1fe1575caf758b4357f1661Douglas Gregor ImportDeclContext(From, /*ForceImport=*/true); 1912cd0d56a523f877ffd1fe1575caf758b4357f1661Douglas Gregor 1913d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor return false; 1914cd0d56a523f877ffd1fe1575caf758b4357f1661Douglas Gregor } 1915d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor 1916d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor To->startDefinition(); 1917d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor 1918d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor // Add base classes. 1919d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor if (CXXRecordDecl *ToCXX = dyn_cast<CXXRecordDecl>(To)) { 1920d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor CXXRecordDecl *FromCXX = cast<CXXRecordDecl>(From); 192127c72d8ca8bbb2861959c71f737e2560a7bf9991Douglas Gregor 192227c72d8ca8bbb2861959c71f737e2560a7bf9991Douglas Gregor struct CXXRecordDecl::DefinitionData &ToData = ToCXX->data(); 192327c72d8ca8bbb2861959c71f737e2560a7bf9991Douglas Gregor struct CXXRecordDecl::DefinitionData &FromData = FromCXX->data(); 192427c72d8ca8bbb2861959c71f737e2560a7bf9991Douglas Gregor ToData.UserDeclaredConstructor = FromData.UserDeclaredConstructor; 19257d04d3a6855bc74d5c1a2213717eb5402b772ae6Richard Smith ToData.UserDeclaredSpecialMembers = FromData.UserDeclaredSpecialMembers; 192627c72d8ca8bbb2861959c71f737e2560a7bf9991Douglas Gregor ToData.Aggregate = FromData.Aggregate; 192727c72d8ca8bbb2861959c71f737e2560a7bf9991Douglas Gregor ToData.PlainOldData = FromData.PlainOldData; 192827c72d8ca8bbb2861959c71f737e2560a7bf9991Douglas Gregor ToData.Empty = FromData.Empty; 192927c72d8ca8bbb2861959c71f737e2560a7bf9991Douglas Gregor ToData.Polymorphic = FromData.Polymorphic; 193027c72d8ca8bbb2861959c71f737e2560a7bf9991Douglas Gregor ToData.Abstract = FromData.Abstract; 193127c72d8ca8bbb2861959c71f737e2560a7bf9991Douglas Gregor ToData.IsStandardLayout = FromData.IsStandardLayout; 193227c72d8ca8bbb2861959c71f737e2560a7bf9991Douglas Gregor ToData.HasNoNonEmptyBases = FromData.HasNoNonEmptyBases; 193327c72d8ca8bbb2861959c71f737e2560a7bf9991Douglas Gregor ToData.HasPrivateFields = FromData.HasPrivateFields; 193427c72d8ca8bbb2861959c71f737e2560a7bf9991Douglas Gregor ToData.HasProtectedFields = FromData.HasProtectedFields; 193527c72d8ca8bbb2861959c71f737e2560a7bf9991Douglas Gregor ToData.HasPublicFields = FromData.HasPublicFields; 193627c72d8ca8bbb2861959c71f737e2560a7bf9991Douglas Gregor ToData.HasMutableFields = FromData.HasMutableFields; 1937651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines ToData.HasVariantMembers = FromData.HasVariantMembers; 1938dfefb840e36f069286ef6cf178ef339c90f4603dRichard Smith ToData.HasOnlyCMembers = FromData.HasOnlyCMembers; 1939d079abfb5eefaf7da232e39a6564f561402cf4feRichard Smith ToData.HasInClassInitializer = FromData.HasInClassInitializer; 1940d5bc867f6597ee8d4eb31ea217934e436fc7c7e3Richard Smith ToData.HasUninitializedReferenceMember 1941d5bc867f6597ee8d4eb31ea217934e436fc7c7e3Richard Smith = FromData.HasUninitializedReferenceMember; 1942bc2a35d5ff492107dab5bdb7682f0da2f4a88861Richard Smith ToData.NeedOverloadResolutionForMoveConstructor 1943bc2a35d5ff492107dab5bdb7682f0da2f4a88861Richard Smith = FromData.NeedOverloadResolutionForMoveConstructor; 1944bc2a35d5ff492107dab5bdb7682f0da2f4a88861Richard Smith ToData.NeedOverloadResolutionForMoveAssignment 1945bc2a35d5ff492107dab5bdb7682f0da2f4a88861Richard Smith = FromData.NeedOverloadResolutionForMoveAssignment; 1946bc2a35d5ff492107dab5bdb7682f0da2f4a88861Richard Smith ToData.NeedOverloadResolutionForDestructor 1947bc2a35d5ff492107dab5bdb7682f0da2f4a88861Richard Smith = FromData.NeedOverloadResolutionForDestructor; 1948bc2a35d5ff492107dab5bdb7682f0da2f4a88861Richard Smith ToData.DefaultedMoveConstructorIsDeleted 1949bc2a35d5ff492107dab5bdb7682f0da2f4a88861Richard Smith = FromData.DefaultedMoveConstructorIsDeleted; 1950bc2a35d5ff492107dab5bdb7682f0da2f4a88861Richard Smith ToData.DefaultedMoveAssignmentIsDeleted 1951bc2a35d5ff492107dab5bdb7682f0da2f4a88861Richard Smith = FromData.DefaultedMoveAssignmentIsDeleted; 1952bc2a35d5ff492107dab5bdb7682f0da2f4a88861Richard Smith ToData.DefaultedDestructorIsDeleted = FromData.DefaultedDestructorIsDeleted; 19537d04d3a6855bc74d5c1a2213717eb5402b772ae6Richard Smith ToData.HasTrivialSpecialMembers = FromData.HasTrivialSpecialMembers; 19547d04d3a6855bc74d5c1a2213717eb5402b772ae6Richard Smith ToData.HasIrrelevantDestructor = FromData.HasIrrelevantDestructor; 195527c72d8ca8bbb2861959c71f737e2560a7bf9991Douglas Gregor ToData.HasConstexprNonCopyMoveConstructor 195627c72d8ca8bbb2861959c71f737e2560a7bf9991Douglas Gregor = FromData.HasConstexprNonCopyMoveConstructor; 1957dfefb840e36f069286ef6cf178ef339c90f4603dRichard Smith ToData.DefaultedDefaultConstructorIsConstexpr 1958dfefb840e36f069286ef6cf178ef339c90f4603dRichard Smith = FromData.DefaultedDefaultConstructorIsConstexpr; 1959dfefb840e36f069286ef6cf178ef339c90f4603dRichard Smith ToData.HasConstexprDefaultConstructor 1960dfefb840e36f069286ef6cf178ef339c90f4603dRichard Smith = FromData.HasConstexprDefaultConstructor; 196127c72d8ca8bbb2861959c71f737e2560a7bf9991Douglas Gregor ToData.HasNonLiteralTypeFieldsOrBases 196227c72d8ca8bbb2861959c71f737e2560a7bf9991Douglas Gregor = FromData.HasNonLiteralTypeFieldsOrBases; 1963dfefb840e36f069286ef6cf178ef339c90f4603dRichard Smith // ComputedVisibleConversions not imported. 196427c72d8ca8bbb2861959c71f737e2560a7bf9991Douglas Gregor ToData.UserProvidedDefaultConstructor 196527c72d8ca8bbb2861959c71f737e2560a7bf9991Douglas Gregor = FromData.UserProvidedDefaultConstructor; 19667d04d3a6855bc74d5c1a2213717eb5402b772ae6Richard Smith ToData.DeclaredSpecialMembers = FromData.DeclaredSpecialMembers; 1967acf796b4797c5b3e9e237148fa622afdc04b3effRichard Smith ToData.ImplicitCopyConstructorHasConstParam 1968acf796b4797c5b3e9e237148fa622afdc04b3effRichard Smith = FromData.ImplicitCopyConstructorHasConstParam; 1969acf796b4797c5b3e9e237148fa622afdc04b3effRichard Smith ToData.ImplicitCopyAssignmentHasConstParam 1970acf796b4797c5b3e9e237148fa622afdc04b3effRichard Smith = FromData.ImplicitCopyAssignmentHasConstParam; 1971acf796b4797c5b3e9e237148fa622afdc04b3effRichard Smith ToData.HasDeclaredCopyConstructorWithConstParam 1972acf796b4797c5b3e9e237148fa622afdc04b3effRichard Smith = FromData.HasDeclaredCopyConstructorWithConstParam; 1973acf796b4797c5b3e9e237148fa622afdc04b3effRichard Smith ToData.HasDeclaredCopyAssignmentWithConstParam 1974acf796b4797c5b3e9e237148fa622afdc04b3effRichard Smith = FromData.HasDeclaredCopyAssignmentWithConstParam; 1975dfefb840e36f069286ef6cf178ef339c90f4603dRichard Smith ToData.IsLambda = FromData.IsLambda; 1976dfefb840e36f069286ef6cf178ef339c90f4603dRichard Smith 19775f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner SmallVector<CXXBaseSpecifier *, 4> Bases; 1978651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines for (const auto &Base1 : FromCXX->bases()) { 1979651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines QualType T = Importer.Import(Base1.getType()); 1980d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor if (T.isNull()) 1981c04d9d1be026cb201a716df1cd28a88878958beeDouglas Gregor return true; 1982f90b27ad077c3339b62befc892382845339f9490Douglas Gregor 1983f90b27ad077c3339b62befc892382845339f9490Douglas Gregor SourceLocation EllipsisLoc; 1984651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines if (Base1.isPackExpansion()) 1985651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines EllipsisLoc = Importer.Import(Base1.getEllipsisLoc()); 19861cf038c516c5e1f56ea9cff61aac7f7841744a91Douglas Gregor 19871cf038c516c5e1f56ea9cff61aac7f7841744a91Douglas Gregor // Ensure that we have a definition for the base. 1988651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines ImportDefinitionIfNeeded(Base1.getType()->getAsCXXRecordDecl()); 19891cf038c516c5e1f56ea9cff61aac7f7841744a91Douglas Gregor 1990d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor Bases.push_back( 1991d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor new (Importer.getToContext()) 1992651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines CXXBaseSpecifier(Importer.Import(Base1.getSourceRange()), 1993651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines Base1.isVirtual(), 1994651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines Base1.isBaseOfClass(), 1995651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines Base1.getAccessSpecifierAsWritten(), 1996651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines Importer.Import(Base1.getTypeSourceInfo()), 1997f90b27ad077c3339b62befc892382845339f9490Douglas Gregor EllipsisLoc)); 1998d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor } 1999d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor if (!Bases.empty()) 2000d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor ToCXX->setBases(Bases.data(), Bases.size()); 2001d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor } 2002d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor 2003ac32ff9812e7d6bc31573b5499bfd005fc8b8f39Douglas Gregor if (shouldForceImportDeclContext(Kind)) 2004cd0d56a523f877ffd1fe1575caf758b4357f1661Douglas Gregor ImportDeclContext(From, /*ForceImport=*/true); 2005cd0d56a523f877ffd1fe1575caf758b4357f1661Douglas Gregor 2006d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor To->completeDefinition(); 2007c04d9d1be026cb201a716df1cd28a88878958beeDouglas Gregor return false; 2008d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor} 2009d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor 2010ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufobool ASTNodeImporter::ImportDefinition(VarDecl *From, VarDecl *To, 2011ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo ImportDefinitionKind Kind) { 2012ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo if (To->getDefinition()) 2013ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo return false; 2014ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo 2015ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo // FIXME: Can we really import any initializer? Alternatively, we could force 2016ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo // ourselves to import every declaration of a variable and then only use 2017ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo // getInit() here. 2018ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo To->setInit(Importer.Import(const_cast<Expr *>(From->getAnyInitializer()))); 2019ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo 2020ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo // FIXME: Other bits to merge? 2021ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo 2022ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo return false; 2023ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo} 2024ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo 20251cf038c516c5e1f56ea9cff61aac7f7841744a91Douglas Gregorbool ASTNodeImporter::ImportDefinition(EnumDecl *From, EnumDecl *To, 2026ac32ff9812e7d6bc31573b5499bfd005fc8b8f39Douglas Gregor ImportDefinitionKind Kind) { 2027ac32ff9812e7d6bc31573b5499bfd005fc8b8f39Douglas Gregor if (To->getDefinition() || To->isBeingDefined()) { 2028ac32ff9812e7d6bc31573b5499bfd005fc8b8f39Douglas Gregor if (Kind == IDK_Everything) 2029ac32ff9812e7d6bc31573b5499bfd005fc8b8f39Douglas Gregor ImportDeclContext(From, /*ForceImport=*/true); 20301cf038c516c5e1f56ea9cff61aac7f7841744a91Douglas Gregor return false; 2031ac32ff9812e7d6bc31573b5499bfd005fc8b8f39Douglas Gregor } 20321cf038c516c5e1f56ea9cff61aac7f7841744a91Douglas Gregor 20331cf038c516c5e1f56ea9cff61aac7f7841744a91Douglas Gregor To->startDefinition(); 20341cf038c516c5e1f56ea9cff61aac7f7841744a91Douglas Gregor 20351cf038c516c5e1f56ea9cff61aac7f7841744a91Douglas Gregor QualType T = Importer.Import(Importer.getFromContext().getTypeDeclType(From)); 20361cf038c516c5e1f56ea9cff61aac7f7841744a91Douglas Gregor if (T.isNull()) 20371cf038c516c5e1f56ea9cff61aac7f7841744a91Douglas Gregor return true; 20381cf038c516c5e1f56ea9cff61aac7f7841744a91Douglas Gregor 20391cf038c516c5e1f56ea9cff61aac7f7841744a91Douglas Gregor QualType ToPromotionType = Importer.Import(From->getPromotionType()); 20401cf038c516c5e1f56ea9cff61aac7f7841744a91Douglas Gregor if (ToPromotionType.isNull()) 20411cf038c516c5e1f56ea9cff61aac7f7841744a91Douglas Gregor return true; 2042ac32ff9812e7d6bc31573b5499bfd005fc8b8f39Douglas Gregor 2043ac32ff9812e7d6bc31573b5499bfd005fc8b8f39Douglas Gregor if (shouldForceImportDeclContext(Kind)) 2044ac32ff9812e7d6bc31573b5499bfd005fc8b8f39Douglas Gregor ImportDeclContext(From, /*ForceImport=*/true); 20451cf038c516c5e1f56ea9cff61aac7f7841744a91Douglas Gregor 20461cf038c516c5e1f56ea9cff61aac7f7841744a91Douglas Gregor // FIXME: we might need to merge the number of positive or negative bits 20471cf038c516c5e1f56ea9cff61aac7f7841744a91Douglas Gregor // if the enumerator lists don't match. 20481cf038c516c5e1f56ea9cff61aac7f7841744a91Douglas Gregor To->completeDefinition(T, ToPromotionType, 20491cf038c516c5e1f56ea9cff61aac7f7841744a91Douglas Gregor From->getNumPositiveBits(), 20501cf038c516c5e1f56ea9cff61aac7f7841744a91Douglas Gregor From->getNumNegativeBits()); 20511cf038c516c5e1f56ea9cff61aac7f7841744a91Douglas Gregor return false; 20521cf038c516c5e1f56ea9cff61aac7f7841744a91Douglas Gregor} 20531cf038c516c5e1f56ea9cff61aac7f7841744a91Douglas Gregor 2054040afaeea2313dc69fd532995ac88cccdd62da56Douglas GregorTemplateParameterList *ASTNodeImporter::ImportTemplateParameterList( 2055040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor TemplateParameterList *Params) { 20565f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner SmallVector<NamedDecl *, 4> ToParams; 2057040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor ToParams.reserve(Params->size()); 2058040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor for (TemplateParameterList::iterator P = Params->begin(), 2059040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor PEnd = Params->end(); 2060040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor P != PEnd; ++P) { 2061040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor Decl *To = Importer.Import(*P); 2062040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor if (!To) 20636bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return nullptr; 20646bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 2065040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor ToParams.push_back(cast<NamedDecl>(To)); 2066040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor } 2067040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor 2068040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor return TemplateParameterList::Create(Importer.getToContext(), 2069040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor Importer.Import(Params->getTemplateLoc()), 2070040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor Importer.Import(Params->getLAngleLoc()), 2071040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor ToParams.data(), ToParams.size(), 2072040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor Importer.Import(Params->getRAngleLoc())); 2073040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor} 2074040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor 2075d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas GregorTemplateArgument 2076d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas GregorASTNodeImporter::ImportTemplateArgument(const TemplateArgument &From) { 2077d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor switch (From.getKind()) { 2078d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor case TemplateArgument::Null: 2079d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor return TemplateArgument(); 2080d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor 2081d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor case TemplateArgument::Type: { 2082d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor QualType ToType = Importer.Import(From.getAsType()); 2083d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor if (ToType.isNull()) 2084d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor return TemplateArgument(); 2085d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor return TemplateArgument(ToType); 2086d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor } 2087d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor 2088d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor case TemplateArgument::Integral: { 2089d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor QualType ToType = Importer.Import(From.getIntegralType()); 2090d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor if (ToType.isNull()) 2091d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor return TemplateArgument(); 2092855243789cb44799c03f4c7216d3d6308805f549Benjamin Kramer return TemplateArgument(From, ToType); 2093d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor } 2094d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor 2095d7a6b1640e565487d163023a6a2e83f55476ae96Eli Friedman case TemplateArgument::Declaration: { 2096d7a6b1640e565487d163023a6a2e83f55476ae96Eli Friedman ValueDecl *FromD = From.getAsDecl(); 2097d7a6b1640e565487d163023a6a2e83f55476ae96Eli Friedman if (ValueDecl *To = cast_or_null<ValueDecl>(Importer.Import(FromD))) 2098d7a6b1640e565487d163023a6a2e83f55476ae96Eli Friedman return TemplateArgument(To, From.isDeclForReferenceParam()); 2099d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor return TemplateArgument(); 2100d7a6b1640e565487d163023a6a2e83f55476ae96Eli Friedman } 2101d7a6b1640e565487d163023a6a2e83f55476ae96Eli Friedman 2102d7a6b1640e565487d163023a6a2e83f55476ae96Eli Friedman case TemplateArgument::NullPtr: { 2103d7a6b1640e565487d163023a6a2e83f55476ae96Eli Friedman QualType ToType = Importer.Import(From.getNullPtrType()); 2104d7a6b1640e565487d163023a6a2e83f55476ae96Eli Friedman if (ToType.isNull()) 2105d7a6b1640e565487d163023a6a2e83f55476ae96Eli Friedman return TemplateArgument(); 2106d7a6b1640e565487d163023a6a2e83f55476ae96Eli Friedman return TemplateArgument(ToType, /*isNullPtr*/true); 2107d7a6b1640e565487d163023a6a2e83f55476ae96Eli Friedman } 2108d7a6b1640e565487d163023a6a2e83f55476ae96Eli Friedman 2109d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor case TemplateArgument::Template: { 2110d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor TemplateName ToTemplate = Importer.Import(From.getAsTemplate()); 2111d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor if (ToTemplate.isNull()) 2112d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor return TemplateArgument(); 2113d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor 2114d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor return TemplateArgument(ToTemplate); 2115d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor } 2116a7fc901a2e39bfe55bfcff5934b2d9fdf9656491Douglas Gregor 2117a7fc901a2e39bfe55bfcff5934b2d9fdf9656491Douglas Gregor case TemplateArgument::TemplateExpansion: { 2118a7fc901a2e39bfe55bfcff5934b2d9fdf9656491Douglas Gregor TemplateName ToTemplate 2119a7fc901a2e39bfe55bfcff5934b2d9fdf9656491Douglas Gregor = Importer.Import(From.getAsTemplateOrTemplatePattern()); 2120a7fc901a2e39bfe55bfcff5934b2d9fdf9656491Douglas Gregor if (ToTemplate.isNull()) 2121a7fc901a2e39bfe55bfcff5934b2d9fdf9656491Douglas Gregor return TemplateArgument(); 2122a7fc901a2e39bfe55bfcff5934b2d9fdf9656491Douglas Gregor 21232be29f423acad3bbe39099a78db2805acb5bdf17Douglas Gregor return TemplateArgument(ToTemplate, From.getNumTemplateExpansions()); 2124a7fc901a2e39bfe55bfcff5934b2d9fdf9656491Douglas Gregor } 2125a7fc901a2e39bfe55bfcff5934b2d9fdf9656491Douglas Gregor 2126d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor case TemplateArgument::Expression: 2127d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor if (Expr *ToExpr = Importer.Import(From.getAsExpr())) 2128d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor return TemplateArgument(ToExpr); 2129d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor return TemplateArgument(); 2130d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor 2131d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor case TemplateArgument::Pack: { 21325f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner SmallVector<TemplateArgument, 2> ToPack; 2133d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor ToPack.reserve(From.pack_size()); 2134d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor if (ImportTemplateArguments(From.pack_begin(), From.pack_size(), ToPack)) 2135d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor return TemplateArgument(); 2136d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor 2137d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor TemplateArgument *ToArgs 2138d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor = new (Importer.getToContext()) TemplateArgument[ToPack.size()]; 2139d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor std::copy(ToPack.begin(), ToPack.end(), ToArgs); 2140d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor return TemplateArgument(ToArgs, ToPack.size()); 2141d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor } 2142d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor } 2143d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor 2144d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor llvm_unreachable("Invalid template argument kind"); 2145d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor} 2146d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor 2147d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregorbool ASTNodeImporter::ImportTemplateArguments(const TemplateArgument *FromArgs, 2148d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor unsigned NumFromArgs, 21495f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner SmallVectorImpl<TemplateArgument> &ToArgs) { 2150d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor for (unsigned I = 0; I != NumFromArgs; ++I) { 2151d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor TemplateArgument To = ImportTemplateArgument(FromArgs[I]); 2152d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor if (To.isNull() && !FromArgs[I].isNull()) 2153d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor return true; 2154d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor 2155d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor ToArgs.push_back(To); 2156d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor } 2157d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor 2158d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor return false; 2159d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor} 2160d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor 216196a01b4acf76fb8fe1e05341a97a27b39fb0b914Douglas Gregorbool ASTNodeImporter::IsStructuralMatch(RecordDecl *FromRecord, 216293ed7cf05f900b9150dcf59c0e0f37f3bd325f62Douglas Gregor RecordDecl *ToRecord, bool Complain) { 21638f2cb42e1aa5dbdd6fa651a5da7ab8a3a0d4deceSean Callanan // Eliminate a potential failure point where we attempt to re-import 21648f2cb42e1aa5dbdd6fa651a5da7ab8a3a0d4deceSean Callanan // something we're trying to import while completing ToRecord. 21658f2cb42e1aa5dbdd6fa651a5da7ab8a3a0d4deceSean Callanan Decl *ToOrigin = Importer.GetOriginalDecl(ToRecord); 21668f2cb42e1aa5dbdd6fa651a5da7ab8a3a0d4deceSean Callanan if (ToOrigin) { 21678f2cb42e1aa5dbdd6fa651a5da7ab8a3a0d4deceSean Callanan RecordDecl *ToOriginRecord = dyn_cast<RecordDecl>(ToOrigin); 21688f2cb42e1aa5dbdd6fa651a5da7ab8a3a0d4deceSean Callanan if (ToOriginRecord) 21698f2cb42e1aa5dbdd6fa651a5da7ab8a3a0d4deceSean Callanan ToRecord = ToOriginRecord; 21708f2cb42e1aa5dbdd6fa651a5da7ab8a3a0d4deceSean Callanan } 21718f2cb42e1aa5dbdd6fa651a5da7ab8a3a0d4deceSean Callanan 2172bb2d176c4f434e9e73f63f2f9d128f63ce3e10d0Benjamin Kramer StructuralEquivalenceContext Ctx(Importer.getFromContext(), 21738f2cb42e1aa5dbdd6fa651a5da7ab8a3a0d4deceSean Callanan ToRecord->getASTContext(), 217493ed7cf05f900b9150dcf59c0e0f37f3bd325f62Douglas Gregor Importer.getNonEquivalentDecls(), 217593ed7cf05f900b9150dcf59c0e0f37f3bd325f62Douglas Gregor false, Complain); 2176bb2d176c4f434e9e73f63f2f9d128f63ce3e10d0Benjamin Kramer return Ctx.IsStructurallyEquivalent(FromRecord, ToRecord); 217796a01b4acf76fb8fe1e05341a97a27b39fb0b914Douglas Gregor} 217896a01b4acf76fb8fe1e05341a97a27b39fb0b914Douglas Gregor 2179ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufobool ASTNodeImporter::IsStructuralMatch(VarDecl *FromVar, VarDecl *ToVar, 2180ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo bool Complain) { 2181ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo StructuralEquivalenceContext Ctx( 2182ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo Importer.getFromContext(), Importer.getToContext(), 2183ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo Importer.getNonEquivalentDecls(), false, Complain); 2184ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo return Ctx.IsStructurallyEquivalent(FromVar, ToVar); 2185ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo} 2186ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo 218736ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas Gregorbool ASTNodeImporter::IsStructuralMatch(EnumDecl *FromEnum, EnumDecl *ToEnum) { 2188bb2d176c4f434e9e73f63f2f9d128f63ce3e10d0Benjamin Kramer StructuralEquivalenceContext Ctx(Importer.getFromContext(), 218973dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor Importer.getToContext(), 2190ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor Importer.getNonEquivalentDecls()); 2191bb2d176c4f434e9e73f63f2f9d128f63ce3e10d0Benjamin Kramer return Ctx.IsStructurallyEquivalent(FromEnum, ToEnum); 219236ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas Gregor} 219336ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas Gregor 21941cef45955d87dde48c78b6878dc0ee67a3404b6cDouglas Gregorbool ASTNodeImporter::IsStructuralMatch(EnumConstantDecl *FromEC, 21951cef45955d87dde48c78b6878dc0ee67a3404b6cDouglas Gregor EnumConstantDecl *ToEC) 21961cef45955d87dde48c78b6878dc0ee67a3404b6cDouglas Gregor{ 21971cef45955d87dde48c78b6878dc0ee67a3404b6cDouglas Gregor const llvm::APSInt &FromVal = FromEC->getInitVal(); 21981cef45955d87dde48c78b6878dc0ee67a3404b6cDouglas Gregor const llvm::APSInt &ToVal = ToEC->getInitVal(); 21991cef45955d87dde48c78b6878dc0ee67a3404b6cDouglas Gregor 22001cef45955d87dde48c78b6878dc0ee67a3404b6cDouglas Gregor return FromVal.isSigned() == ToVal.isSigned() && 22011cef45955d87dde48c78b6878dc0ee67a3404b6cDouglas Gregor FromVal.getBitWidth() == ToVal.getBitWidth() && 22021cef45955d87dde48c78b6878dc0ee67a3404b6cDouglas Gregor FromVal == ToVal; 22031cef45955d87dde48c78b6878dc0ee67a3404b6cDouglas Gregor} 22041cef45955d87dde48c78b6878dc0ee67a3404b6cDouglas Gregor 22051cef45955d87dde48c78b6878dc0ee67a3404b6cDouglas Gregorbool ASTNodeImporter::IsStructuralMatch(ClassTemplateDecl *From, 2206040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor ClassTemplateDecl *To) { 2207040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor StructuralEquivalenceContext Ctx(Importer.getFromContext(), 2208040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor Importer.getToContext(), 2209040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor Importer.getNonEquivalentDecls()); 2210040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor return Ctx.IsStructurallyEquivalent(From, To); 2211040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor} 2212040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor 2213ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufobool ASTNodeImporter::IsStructuralMatch(VarTemplateDecl *From, 2214ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo VarTemplateDecl *To) { 2215ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo StructuralEquivalenceContext Ctx(Importer.getFromContext(), 2216ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo Importer.getToContext(), 2217ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo Importer.getNonEquivalentDecls()); 2218ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo return Ctx.IsStructurallyEquivalent(From, To); 2219ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo} 2220ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo 2221a404ea673cbee5e74af710a5f1ab571e71580b67Douglas GregorDecl *ASTNodeImporter::VisitDecl(Decl *D) { 2222a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor Importer.FromDiag(D->getLocation(), diag::err_unsupported_ast_node) 2223a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor << D->getDeclKindName(); 22246bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return nullptr; 2225a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor} 2226a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor 2227f1b69466146cda83936fae66839c446602e05133Sean CallananDecl *ASTNodeImporter::VisitTranslationUnitDecl(TranslationUnitDecl *D) { 2228f1b69466146cda83936fae66839c446602e05133Sean Callanan TranslationUnitDecl *ToD = 2229f1b69466146cda83936fae66839c446602e05133Sean Callanan Importer.getToContext().getTranslationUnitDecl(); 2230f1b69466146cda83936fae66839c446602e05133Sean Callanan 2231f1b69466146cda83936fae66839c446602e05133Sean Callanan Importer.Imported(D, ToD); 2232f1b69466146cda83936fae66839c446602e05133Sean Callanan 2233f1b69466146cda83936fae66839c446602e05133Sean Callanan return ToD; 2234f1b69466146cda83936fae66839c446602e05133Sean Callanan} 2235f1b69466146cda83936fae66839c446602e05133Sean Callanan 2236788c62d1e87bfb596078817237f672a5f000999aDouglas GregorDecl *ASTNodeImporter::VisitNamespaceDecl(NamespaceDecl *D) { 2237788c62d1e87bfb596078817237f672a5f000999aDouglas Gregor // Import the major distinguishing characteristics of this namespace. 2238788c62d1e87bfb596078817237f672a5f000999aDouglas Gregor DeclContext *DC, *LexicalDC; 2239788c62d1e87bfb596078817237f672a5f000999aDouglas Gregor DeclarationName Name; 2240788c62d1e87bfb596078817237f672a5f000999aDouglas Gregor SourceLocation Loc; 2241788c62d1e87bfb596078817237f672a5f000999aDouglas Gregor if (ImportDeclParts(D, DC, LexicalDC, Name, Loc)) 22426bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return nullptr; 22436bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 22446bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines NamespaceDecl *MergeWithNamespace = nullptr; 2245788c62d1e87bfb596078817237f672a5f000999aDouglas Gregor if (!Name) { 2246788c62d1e87bfb596078817237f672a5f000999aDouglas Gregor // This is an anonymous namespace. Adopt an existing anonymous 2247788c62d1e87bfb596078817237f672a5f000999aDouglas Gregor // namespace if we can. 2248788c62d1e87bfb596078817237f672a5f000999aDouglas Gregor // FIXME: Not testable. 2249788c62d1e87bfb596078817237f672a5f000999aDouglas Gregor if (TranslationUnitDecl *TU = dyn_cast<TranslationUnitDecl>(DC)) 2250788c62d1e87bfb596078817237f672a5f000999aDouglas Gregor MergeWithNamespace = TU->getAnonymousNamespace(); 2251788c62d1e87bfb596078817237f672a5f000999aDouglas Gregor else 2252788c62d1e87bfb596078817237f672a5f000999aDouglas Gregor MergeWithNamespace = cast<NamespaceDecl>(DC)->getAnonymousNamespace(); 2253788c62d1e87bfb596078817237f672a5f000999aDouglas Gregor } else { 22545f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner SmallVector<NamedDecl *, 4> ConflictingDecls; 2255cfa88f893915ceb8ae4ce2f17c46c24a4d67502fDmitri Gribenko SmallVector<NamedDecl *, 2> FoundDecls; 2256b75a3451bcae1301875282e73a13934c90b6574cDouglas Gregor DC->localUncachedLookup(Name, FoundDecls); 2257b75a3451bcae1301875282e73a13934c90b6574cDouglas Gregor for (unsigned I = 0, N = FoundDecls.size(); I != N; ++I) { 2258b75a3451bcae1301875282e73a13934c90b6574cDouglas Gregor if (!FoundDecls[I]->isInIdentifierNamespace(Decl::IDNS_Namespace)) 2259788c62d1e87bfb596078817237f672a5f000999aDouglas Gregor continue; 2260788c62d1e87bfb596078817237f672a5f000999aDouglas Gregor 2261b75a3451bcae1301875282e73a13934c90b6574cDouglas Gregor if (NamespaceDecl *FoundNS = dyn_cast<NamespaceDecl>(FoundDecls[I])) { 2262788c62d1e87bfb596078817237f672a5f000999aDouglas Gregor MergeWithNamespace = FoundNS; 2263788c62d1e87bfb596078817237f672a5f000999aDouglas Gregor ConflictingDecls.clear(); 2264788c62d1e87bfb596078817237f672a5f000999aDouglas Gregor break; 2265788c62d1e87bfb596078817237f672a5f000999aDouglas Gregor } 2266788c62d1e87bfb596078817237f672a5f000999aDouglas Gregor 2267b75a3451bcae1301875282e73a13934c90b6574cDouglas Gregor ConflictingDecls.push_back(FoundDecls[I]); 2268788c62d1e87bfb596078817237f672a5f000999aDouglas Gregor } 2269788c62d1e87bfb596078817237f672a5f000999aDouglas Gregor 2270788c62d1e87bfb596078817237f672a5f000999aDouglas Gregor if (!ConflictingDecls.empty()) { 22710d6b1640eb4d1a4a0203235cfdfcdaf3335af36dJohn McCall Name = Importer.HandleNameConflict(Name, DC, Decl::IDNS_Namespace, 2272788c62d1e87bfb596078817237f672a5f000999aDouglas Gregor ConflictingDecls.data(), 2273788c62d1e87bfb596078817237f672a5f000999aDouglas Gregor ConflictingDecls.size()); 2274788c62d1e87bfb596078817237f672a5f000999aDouglas Gregor } 2275788c62d1e87bfb596078817237f672a5f000999aDouglas Gregor } 2276788c62d1e87bfb596078817237f672a5f000999aDouglas Gregor 2277788c62d1e87bfb596078817237f672a5f000999aDouglas Gregor // Create the "to" namespace, if needed. 2278788c62d1e87bfb596078817237f672a5f000999aDouglas Gregor NamespaceDecl *ToNamespace = MergeWithNamespace; 2279788c62d1e87bfb596078817237f672a5f000999aDouglas Gregor if (!ToNamespace) { 2280acba90f30876b4140b738f0d3dd0e50724053a96Abramo Bagnara ToNamespace = NamespaceDecl::Create(Importer.getToContext(), DC, 2281f5c9f9fd6f5e2850b9b0f19283430245b696c6e5Douglas Gregor D->isInline(), 2282acba90f30876b4140b738f0d3dd0e50724053a96Abramo Bagnara Importer.Import(D->getLocStart()), 2283f5c9f9fd6f5e2850b9b0f19283430245b696c6e5Douglas Gregor Loc, Name.getAsIdentifierInfo(), 22846bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines /*PrevDecl=*/nullptr); 2285788c62d1e87bfb596078817237f672a5f000999aDouglas Gregor ToNamespace->setLexicalDeclContext(LexicalDC); 22869faf810f08132aabb34a478297dfeea89c3bbe17Sean Callanan LexicalDC->addDeclInternal(ToNamespace); 2287788c62d1e87bfb596078817237f672a5f000999aDouglas Gregor 2288788c62d1e87bfb596078817237f672a5f000999aDouglas Gregor // If this is an anonymous namespace, register it as the anonymous 2289788c62d1e87bfb596078817237f672a5f000999aDouglas Gregor // namespace within its context. 2290788c62d1e87bfb596078817237f672a5f000999aDouglas Gregor if (!Name) { 2291788c62d1e87bfb596078817237f672a5f000999aDouglas Gregor if (TranslationUnitDecl *TU = dyn_cast<TranslationUnitDecl>(DC)) 2292788c62d1e87bfb596078817237f672a5f000999aDouglas Gregor TU->setAnonymousNamespace(ToNamespace); 2293788c62d1e87bfb596078817237f672a5f000999aDouglas Gregor else 2294788c62d1e87bfb596078817237f672a5f000999aDouglas Gregor cast<NamespaceDecl>(DC)->setAnonymousNamespace(ToNamespace); 2295788c62d1e87bfb596078817237f672a5f000999aDouglas Gregor } 2296788c62d1e87bfb596078817237f672a5f000999aDouglas Gregor } 2297788c62d1e87bfb596078817237f672a5f000999aDouglas Gregor Importer.Imported(D, ToNamespace); 2298788c62d1e87bfb596078817237f672a5f000999aDouglas Gregor 2299788c62d1e87bfb596078817237f672a5f000999aDouglas Gregor ImportDeclContext(D); 2300788c62d1e87bfb596078817237f672a5f000999aDouglas Gregor 2301788c62d1e87bfb596078817237f672a5f000999aDouglas Gregor return ToNamespace; 2302788c62d1e87bfb596078817237f672a5f000999aDouglas Gregor} 2303788c62d1e87bfb596078817237f672a5f000999aDouglas Gregor 2304162e1c1b487352434552147967c3dd296ebee2f7Richard SmithDecl *ASTNodeImporter::VisitTypedefNameDecl(TypedefNameDecl *D, bool IsAlias) { 23059e5d996444e40fdf5cce44ee82bec0d4e3df3d56Douglas Gregor // Import the major distinguishing characteristics of this typedef. 23069e5d996444e40fdf5cce44ee82bec0d4e3df3d56Douglas Gregor DeclContext *DC, *LexicalDC; 23079e5d996444e40fdf5cce44ee82bec0d4e3df3d56Douglas Gregor DeclarationName Name; 23089e5d996444e40fdf5cce44ee82bec0d4e3df3d56Douglas Gregor SourceLocation Loc; 23099e5d996444e40fdf5cce44ee82bec0d4e3df3d56Douglas Gregor if (ImportDeclParts(D, DC, LexicalDC, Name, Loc)) 23106bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return nullptr; 23116bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 23129e5d996444e40fdf5cce44ee82bec0d4e3df3d56Douglas Gregor // If this typedef is not in block scope, determine whether we've 23139e5d996444e40fdf5cce44ee82bec0d4e3df3d56Douglas Gregor // seen a typedef with the same name (that we can merge with) or any 23149e5d996444e40fdf5cce44ee82bec0d4e3df3d56Douglas Gregor // other entity by that name (which name lookup could conflict with). 23159e5d996444e40fdf5cce44ee82bec0d4e3df3d56Douglas Gregor if (!DC->isFunctionOrMethod()) { 23165f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner SmallVector<NamedDecl *, 4> ConflictingDecls; 23179e5d996444e40fdf5cce44ee82bec0d4e3df3d56Douglas Gregor unsigned IDNS = Decl::IDNS_Ordinary; 2318cfa88f893915ceb8ae4ce2f17c46c24a4d67502fDmitri Gribenko SmallVector<NamedDecl *, 2> FoundDecls; 2319b75a3451bcae1301875282e73a13934c90b6574cDouglas Gregor DC->localUncachedLookup(Name, FoundDecls); 2320b75a3451bcae1301875282e73a13934c90b6574cDouglas Gregor for (unsigned I = 0, N = FoundDecls.size(); I != N; ++I) { 2321b75a3451bcae1301875282e73a13934c90b6574cDouglas Gregor if (!FoundDecls[I]->isInIdentifierNamespace(IDNS)) 23229e5d996444e40fdf5cce44ee82bec0d4e3df3d56Douglas Gregor continue; 2323162e1c1b487352434552147967c3dd296ebee2f7Richard Smith if (TypedefNameDecl *FoundTypedef = 2324b75a3451bcae1301875282e73a13934c90b6574cDouglas Gregor dyn_cast<TypedefNameDecl>(FoundDecls[I])) { 2325ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor if (Importer.IsStructurallyEquivalent(D->getUnderlyingType(), 2326ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor FoundTypedef->getUnderlyingType())) 23275ce5dab3c30e4255b8f62b148b6a86f09a444aaaDouglas Gregor return Importer.Imported(D, FoundTypedef); 23289e5d996444e40fdf5cce44ee82bec0d4e3df3d56Douglas Gregor } 23299e5d996444e40fdf5cce44ee82bec0d4e3df3d56Douglas Gregor 2330b75a3451bcae1301875282e73a13934c90b6574cDouglas Gregor ConflictingDecls.push_back(FoundDecls[I]); 23319e5d996444e40fdf5cce44ee82bec0d4e3df3d56Douglas Gregor } 23329e5d996444e40fdf5cce44ee82bec0d4e3df3d56Douglas Gregor 23339e5d996444e40fdf5cce44ee82bec0d4e3df3d56Douglas Gregor if (!ConflictingDecls.empty()) { 23349e5d996444e40fdf5cce44ee82bec0d4e3df3d56Douglas Gregor Name = Importer.HandleNameConflict(Name, DC, IDNS, 23359e5d996444e40fdf5cce44ee82bec0d4e3df3d56Douglas Gregor ConflictingDecls.data(), 23369e5d996444e40fdf5cce44ee82bec0d4e3df3d56Douglas Gregor ConflictingDecls.size()); 23379e5d996444e40fdf5cce44ee82bec0d4e3df3d56Douglas Gregor if (!Name) 23386bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return nullptr; 23399e5d996444e40fdf5cce44ee82bec0d4e3df3d56Douglas Gregor } 23409e5d996444e40fdf5cce44ee82bec0d4e3df3d56Douglas Gregor } 23419e5d996444e40fdf5cce44ee82bec0d4e3df3d56Douglas Gregor 2342ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor // Import the underlying type of this typedef; 2343ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor QualType T = Importer.Import(D->getUnderlyingType()); 2344ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor if (T.isNull()) 23456bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return nullptr; 23466bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 23479e5d996444e40fdf5cce44ee82bec0d4e3df3d56Douglas Gregor // Create the new typedef node. 23489e5d996444e40fdf5cce44ee82bec0d4e3df3d56Douglas Gregor TypeSourceInfo *TInfo = Importer.Import(D->getTypeSourceInfo()); 2349344577e6b58f42d18dc8118c8903b49a85dc005eAbramo Bagnara SourceLocation StartL = Importer.Import(D->getLocStart()); 2350162e1c1b487352434552147967c3dd296ebee2f7Richard Smith TypedefNameDecl *ToTypedef; 2351162e1c1b487352434552147967c3dd296ebee2f7Richard Smith if (IsAlias) 23527c9412cdad37146e6d1eee15eaa0d7a1d93e6ee1Douglas Gregor ToTypedef = TypeAliasDecl::Create(Importer.getToContext(), DC, 23537c9412cdad37146e6d1eee15eaa0d7a1d93e6ee1Douglas Gregor StartL, Loc, 23547c9412cdad37146e6d1eee15eaa0d7a1d93e6ee1Douglas Gregor Name.getAsIdentifierInfo(), 23557c9412cdad37146e6d1eee15eaa0d7a1d93e6ee1Douglas Gregor TInfo); 23567c9412cdad37146e6d1eee15eaa0d7a1d93e6ee1Douglas Gregor else 2357162e1c1b487352434552147967c3dd296ebee2f7Richard Smith ToTypedef = TypedefDecl::Create(Importer.getToContext(), DC, 2358162e1c1b487352434552147967c3dd296ebee2f7Richard Smith StartL, Loc, 2359162e1c1b487352434552147967c3dd296ebee2f7Richard Smith Name.getAsIdentifierInfo(), 2360162e1c1b487352434552147967c3dd296ebee2f7Richard Smith TInfo); 23617c9412cdad37146e6d1eee15eaa0d7a1d93e6ee1Douglas Gregor 2362325bf177ac0f1db7888e2d7b194515466ba91762Douglas Gregor ToTypedef->setAccess(D->getAccess()); 23639e5d996444e40fdf5cce44ee82bec0d4e3df3d56Douglas Gregor ToTypedef->setLexicalDeclContext(LexicalDC); 23645ce5dab3c30e4255b8f62b148b6a86f09a444aaaDouglas Gregor Importer.Imported(D, ToTypedef); 23659faf810f08132aabb34a478297dfeea89c3bbe17Sean Callanan LexicalDC->addDeclInternal(ToTypedef); 2366ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor 23679e5d996444e40fdf5cce44ee82bec0d4e3df3d56Douglas Gregor return ToTypedef; 23689e5d996444e40fdf5cce44ee82bec0d4e3df3d56Douglas Gregor} 23699e5d996444e40fdf5cce44ee82bec0d4e3df3d56Douglas Gregor 2370162e1c1b487352434552147967c3dd296ebee2f7Richard SmithDecl *ASTNodeImporter::VisitTypedefDecl(TypedefDecl *D) { 2371162e1c1b487352434552147967c3dd296ebee2f7Richard Smith return VisitTypedefNameDecl(D, /*IsAlias=*/false); 2372162e1c1b487352434552147967c3dd296ebee2f7Richard Smith} 2373162e1c1b487352434552147967c3dd296ebee2f7Richard Smith 2374162e1c1b487352434552147967c3dd296ebee2f7Richard SmithDecl *ASTNodeImporter::VisitTypeAliasDecl(TypeAliasDecl *D) { 2375162e1c1b487352434552147967c3dd296ebee2f7Richard Smith return VisitTypedefNameDecl(D, /*IsAlias=*/true); 2376162e1c1b487352434552147967c3dd296ebee2f7Richard Smith} 2377162e1c1b487352434552147967c3dd296ebee2f7Richard Smith 237836ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas GregorDecl *ASTNodeImporter::VisitEnumDecl(EnumDecl *D) { 237936ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas Gregor // Import the major distinguishing characteristics of this enum. 238036ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas Gregor DeclContext *DC, *LexicalDC; 238136ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas Gregor DeclarationName Name; 238236ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas Gregor SourceLocation Loc; 238336ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas Gregor if (ImportDeclParts(D, DC, LexicalDC, Name, Loc)) 23846bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return nullptr; 23856bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 238636ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas Gregor // Figure out what enum name we're looking for. 238736ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas Gregor unsigned IDNS = Decl::IDNS_Tag; 238836ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas Gregor DeclarationName SearchName = Name; 2389162e1c1b487352434552147967c3dd296ebee2f7Richard Smith if (!SearchName && D->getTypedefNameForAnonDecl()) { 2390162e1c1b487352434552147967c3dd296ebee2f7Richard Smith SearchName = Importer.Import(D->getTypedefNameForAnonDecl()->getDeclName()); 239136ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas Gregor IDNS = Decl::IDNS_Ordinary; 23924e4d08403ca5cfd4d558fa2936215d3a4e5a528dDavid Blaikie } else if (Importer.getToContext().getLangOpts().CPlusPlus) 239336ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas Gregor IDNS |= Decl::IDNS_Ordinary; 239436ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas Gregor 239536ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas Gregor // We may already have an enum of the same name; try to find and match it. 239636ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas Gregor if (!DC->isFunctionOrMethod() && SearchName) { 23975f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner SmallVector<NamedDecl *, 4> ConflictingDecls; 2398cfa88f893915ceb8ae4ce2f17c46c24a4d67502fDmitri Gribenko SmallVector<NamedDecl *, 2> FoundDecls; 2399b75a3451bcae1301875282e73a13934c90b6574cDouglas Gregor DC->localUncachedLookup(SearchName, FoundDecls); 2400b75a3451bcae1301875282e73a13934c90b6574cDouglas Gregor for (unsigned I = 0, N = FoundDecls.size(); I != N; ++I) { 2401b75a3451bcae1301875282e73a13934c90b6574cDouglas Gregor if (!FoundDecls[I]->isInIdentifierNamespace(IDNS)) 240236ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas Gregor continue; 240336ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas Gregor 2404b75a3451bcae1301875282e73a13934c90b6574cDouglas Gregor Decl *Found = FoundDecls[I]; 2405162e1c1b487352434552147967c3dd296ebee2f7Richard Smith if (TypedefNameDecl *Typedef = dyn_cast<TypedefNameDecl>(Found)) { 240636ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas Gregor if (const TagType *Tag = Typedef->getUnderlyingType()->getAs<TagType>()) 240736ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas Gregor Found = Tag->getDecl(); 240836ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas Gregor } 240936ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas Gregor 241036ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas Gregor if (EnumDecl *FoundEnum = dyn_cast<EnumDecl>(Found)) { 24115ce5dab3c30e4255b8f62b148b6a86f09a444aaaDouglas Gregor if (IsStructuralMatch(D, FoundEnum)) 24125ce5dab3c30e4255b8f62b148b6a86f09a444aaaDouglas Gregor return Importer.Imported(D, FoundEnum); 241336ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas Gregor } 241436ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas Gregor 2415b75a3451bcae1301875282e73a13934c90b6574cDouglas Gregor ConflictingDecls.push_back(FoundDecls[I]); 241636ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas Gregor } 241736ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas Gregor 241836ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas Gregor if (!ConflictingDecls.empty()) { 241936ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas Gregor Name = Importer.HandleNameConflict(Name, DC, IDNS, 242036ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas Gregor ConflictingDecls.data(), 242136ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas Gregor ConflictingDecls.size()); 242236ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas Gregor } 242336ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas Gregor } 242436ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas Gregor 242536ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas Gregor // Create the enum declaration. 2426ba877adeb49ed6dc17f27fa3a3bcd0cca713fd68Abramo Bagnara EnumDecl *D2 = EnumDecl::Create(Importer.getToContext(), DC, 2427ba877adeb49ed6dc17f27fa3a3bcd0cca713fd68Abramo Bagnara Importer.Import(D->getLocStart()), 24286bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines Loc, Name.getAsIdentifierInfo(), nullptr, 2429a88cefd266c428be33cc06f7e8b00ff8fc97c1ffAbramo Bagnara D->isScoped(), D->isScopedUsingClassTag(), 2430a88cefd266c428be33cc06f7e8b00ff8fc97c1ffAbramo Bagnara D->isFixed()); 2431b6217665c6a987f2d6c8665fd70365d7719ac4dfJohn McCall // Import the qualifier, if any. 2432c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor D2->setQualifierInfo(Importer.Import(D->getQualifierLoc())); 2433325bf177ac0f1db7888e2d7b194515466ba91762Douglas Gregor D2->setAccess(D->getAccess()); 243473dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor D2->setLexicalDeclContext(LexicalDC); 243573dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor Importer.Imported(D, D2); 24369faf810f08132aabb34a478297dfeea89c3bbe17Sean Callanan LexicalDC->addDeclInternal(D2); 243736ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas Gregor 243836ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas Gregor // Import the integer type. 243936ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas Gregor QualType ToIntegerType = Importer.Import(D->getIntegerType()); 244036ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas Gregor if (ToIntegerType.isNull()) 24416bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return nullptr; 244273dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor D2->setIntegerType(ToIntegerType); 244336ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas Gregor 244436ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas Gregor // Import the definition 24455e1cdac63c3d9c9b32fa41fa0b2d242a58a20d49John McCall if (D->isCompleteDefinition() && ImportDefinition(D, D2)) 24466bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return nullptr; 244736ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas Gregor 244873dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor return D2; 244936ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas Gregor} 245036ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas Gregor 245196a01b4acf76fb8fe1e05341a97a27b39fb0b914Douglas GregorDecl *ASTNodeImporter::VisitRecordDecl(RecordDecl *D) { 245296a01b4acf76fb8fe1e05341a97a27b39fb0b914Douglas Gregor // If this record has a definition in the translation unit we're coming from, 245396a01b4acf76fb8fe1e05341a97a27b39fb0b914Douglas Gregor // but this particular declaration is not that definition, import the 245496a01b4acf76fb8fe1e05341a97a27b39fb0b914Douglas Gregor // definition and map to that. 2455952b017601f9c82b51119c3a1600f1312a833db9Douglas Gregor TagDecl *Definition = D->getDefinition(); 245696a01b4acf76fb8fe1e05341a97a27b39fb0b914Douglas Gregor if (Definition && Definition != D) { 245796a01b4acf76fb8fe1e05341a97a27b39fb0b914Douglas Gregor Decl *ImportedDef = Importer.Import(Definition); 24585ce5dab3c30e4255b8f62b148b6a86f09a444aaaDouglas Gregor if (!ImportedDef) 24596bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return nullptr; 24606bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 24615ce5dab3c30e4255b8f62b148b6a86f09a444aaaDouglas Gregor return Importer.Imported(D, ImportedDef); 246296a01b4acf76fb8fe1e05341a97a27b39fb0b914Douglas Gregor } 246396a01b4acf76fb8fe1e05341a97a27b39fb0b914Douglas Gregor 246496a01b4acf76fb8fe1e05341a97a27b39fb0b914Douglas Gregor // Import the major distinguishing characteristics of this record. 246596a01b4acf76fb8fe1e05341a97a27b39fb0b914Douglas Gregor DeclContext *DC, *LexicalDC; 246696a01b4acf76fb8fe1e05341a97a27b39fb0b914Douglas Gregor DeclarationName Name; 246796a01b4acf76fb8fe1e05341a97a27b39fb0b914Douglas Gregor SourceLocation Loc; 246896a01b4acf76fb8fe1e05341a97a27b39fb0b914Douglas Gregor if (ImportDeclParts(D, DC, LexicalDC, Name, Loc)) 24696bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return nullptr; 24706bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 247196a01b4acf76fb8fe1e05341a97a27b39fb0b914Douglas Gregor // Figure out what structure name we're looking for. 247296a01b4acf76fb8fe1e05341a97a27b39fb0b914Douglas Gregor unsigned IDNS = Decl::IDNS_Tag; 247396a01b4acf76fb8fe1e05341a97a27b39fb0b914Douglas Gregor DeclarationName SearchName = Name; 2474162e1c1b487352434552147967c3dd296ebee2f7Richard Smith if (!SearchName && D->getTypedefNameForAnonDecl()) { 2475162e1c1b487352434552147967c3dd296ebee2f7Richard Smith SearchName = Importer.Import(D->getTypedefNameForAnonDecl()->getDeclName()); 247696a01b4acf76fb8fe1e05341a97a27b39fb0b914Douglas Gregor IDNS = Decl::IDNS_Ordinary; 24774e4d08403ca5cfd4d558fa2936215d3a4e5a528dDavid Blaikie } else if (Importer.getToContext().getLangOpts().CPlusPlus) 247896a01b4acf76fb8fe1e05341a97a27b39fb0b914Douglas Gregor IDNS |= Decl::IDNS_Ordinary; 247996a01b4acf76fb8fe1e05341a97a27b39fb0b914Douglas Gregor 248096a01b4acf76fb8fe1e05341a97a27b39fb0b914Douglas Gregor // We may already have a record of the same name; try to find and match it. 24816bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines RecordDecl *AdoptDecl = nullptr; 248293ed7cf05f900b9150dcf59c0e0f37f3bd325f62Douglas Gregor if (!DC->isFunctionOrMethod()) { 24835f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner SmallVector<NamedDecl *, 4> ConflictingDecls; 2484cfa88f893915ceb8ae4ce2f17c46c24a4d67502fDmitri Gribenko SmallVector<NamedDecl *, 2> FoundDecls; 2485b75a3451bcae1301875282e73a13934c90b6574cDouglas Gregor DC->localUncachedLookup(SearchName, FoundDecls); 2486b75a3451bcae1301875282e73a13934c90b6574cDouglas Gregor for (unsigned I = 0, N = FoundDecls.size(); I != N; ++I) { 2487b75a3451bcae1301875282e73a13934c90b6574cDouglas Gregor if (!FoundDecls[I]->isInIdentifierNamespace(IDNS)) 248896a01b4acf76fb8fe1e05341a97a27b39fb0b914Douglas Gregor continue; 248996a01b4acf76fb8fe1e05341a97a27b39fb0b914Douglas Gregor 2490b75a3451bcae1301875282e73a13934c90b6574cDouglas Gregor Decl *Found = FoundDecls[I]; 2491162e1c1b487352434552147967c3dd296ebee2f7Richard Smith if (TypedefNameDecl *Typedef = dyn_cast<TypedefNameDecl>(Found)) { 249296a01b4acf76fb8fe1e05341a97a27b39fb0b914Douglas Gregor if (const TagType *Tag = Typedef->getUnderlyingType()->getAs<TagType>()) 249396a01b4acf76fb8fe1e05341a97a27b39fb0b914Douglas Gregor Found = Tag->getDecl(); 249496a01b4acf76fb8fe1e05341a97a27b39fb0b914Douglas Gregor } 249596a01b4acf76fb8fe1e05341a97a27b39fb0b914Douglas Gregor 249696a01b4acf76fb8fe1e05341a97a27b39fb0b914Douglas Gregor if (RecordDecl *FoundRecord = dyn_cast<RecordDecl>(Found)) { 249711ce5fe7d8dda29f3d093e5759a7476b140e3241Douglas Gregor if (D->isAnonymousStructOrUnion() && 249811ce5fe7d8dda29f3d093e5759a7476b140e3241Douglas Gregor FoundRecord->isAnonymousStructOrUnion()) { 249911ce5fe7d8dda29f3d093e5759a7476b140e3241Douglas Gregor // If both anonymous structs/unions are in a record context, make sure 250011ce5fe7d8dda29f3d093e5759a7476b140e3241Douglas Gregor // they occur in the same location in the context records. 2501dc84cd5efdd3430efb22546b4ac656aa0540b210David Blaikie if (Optional<unsigned> Index1 250211ce5fe7d8dda29f3d093e5759a7476b140e3241Douglas Gregor = findAnonymousStructOrUnionIndex(D)) { 2503dc84cd5efdd3430efb22546b4ac656aa0540b210David Blaikie if (Optional<unsigned> Index2 = 2504dc84cd5efdd3430efb22546b4ac656aa0540b210David Blaikie findAnonymousStructOrUnionIndex(FoundRecord)) { 250511ce5fe7d8dda29f3d093e5759a7476b140e3241Douglas Gregor if (*Index1 != *Index2) 250611ce5fe7d8dda29f3d093e5759a7476b140e3241Douglas Gregor continue; 250711ce5fe7d8dda29f3d093e5759a7476b140e3241Douglas Gregor } 250811ce5fe7d8dda29f3d093e5759a7476b140e3241Douglas Gregor } 250911ce5fe7d8dda29f3d093e5759a7476b140e3241Douglas Gregor } 251011ce5fe7d8dda29f3d093e5759a7476b140e3241Douglas Gregor 2511e72b5dc556805ea4c91f0ae6d8f8404fc341b687Douglas Gregor if (RecordDecl *FoundDef = FoundRecord->getDefinition()) { 251293ed7cf05f900b9150dcf59c0e0f37f3bd325f62Douglas Gregor if ((SearchName && !D->isCompleteDefinition()) 251393ed7cf05f900b9150dcf59c0e0f37f3bd325f62Douglas Gregor || (D->isCompleteDefinition() && 251493ed7cf05f900b9150dcf59c0e0f37f3bd325f62Douglas Gregor D->isAnonymousStructOrUnion() 251593ed7cf05f900b9150dcf59c0e0f37f3bd325f62Douglas Gregor == FoundDef->isAnonymousStructOrUnion() && 251693ed7cf05f900b9150dcf59c0e0f37f3bd325f62Douglas Gregor IsStructuralMatch(D, FoundDef))) { 2517e72b5dc556805ea4c91f0ae6d8f8404fc341b687Douglas Gregor // The record types structurally match, or the "from" translation 2518e72b5dc556805ea4c91f0ae6d8f8404fc341b687Douglas Gregor // unit only had a forward declaration anyway; call it the same 2519e72b5dc556805ea4c91f0ae6d8f8404fc341b687Douglas Gregor // function. 2520e72b5dc556805ea4c91f0ae6d8f8404fc341b687Douglas Gregor // FIXME: For C++, we should also merge methods here. 25215ce5dab3c30e4255b8f62b148b6a86f09a444aaaDouglas Gregor return Importer.Imported(D, FoundDef); 2522e72b5dc556805ea4c91f0ae6d8f8404fc341b687Douglas Gregor } 252393ed7cf05f900b9150dcf59c0e0f37f3bd325f62Douglas Gregor } else if (!D->isCompleteDefinition()) { 2524e72b5dc556805ea4c91f0ae6d8f8404fc341b687Douglas Gregor // We have a forward declaration of this type, so adopt that forward 2525e72b5dc556805ea4c91f0ae6d8f8404fc341b687Douglas Gregor // declaration rather than building a new one. 2526651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 2527651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // If one or both can be completed from external storage then try one 2528651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // last time to complete and compare them before doing this. 2529651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 2530651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines if (FoundRecord->hasExternalLexicalStorage() && 2531651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines !FoundRecord->isCompleteDefinition()) 2532651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines FoundRecord->getASTContext().getExternalSource()->CompleteType(FoundRecord); 2533651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines if (D->hasExternalLexicalStorage()) 2534651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines D->getASTContext().getExternalSource()->CompleteType(D); 2535651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 2536651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines if (FoundRecord->isCompleteDefinition() && 2537651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines D->isCompleteDefinition() && 2538651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines !IsStructuralMatch(D, FoundRecord)) 2539651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines continue; 2540651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 2541e72b5dc556805ea4c91f0ae6d8f8404fc341b687Douglas Gregor AdoptDecl = FoundRecord; 2542e72b5dc556805ea4c91f0ae6d8f8404fc341b687Douglas Gregor continue; 254393ed7cf05f900b9150dcf59c0e0f37f3bd325f62Douglas Gregor } else if (!SearchName) { 254493ed7cf05f900b9150dcf59c0e0f37f3bd325f62Douglas Gregor continue; 254593ed7cf05f900b9150dcf59c0e0f37f3bd325f62Douglas Gregor } 254696a01b4acf76fb8fe1e05341a97a27b39fb0b914Douglas Gregor } 254796a01b4acf76fb8fe1e05341a97a27b39fb0b914Douglas Gregor 2548b75a3451bcae1301875282e73a13934c90b6574cDouglas Gregor ConflictingDecls.push_back(FoundDecls[I]); 254996a01b4acf76fb8fe1e05341a97a27b39fb0b914Douglas Gregor } 255096a01b4acf76fb8fe1e05341a97a27b39fb0b914Douglas Gregor 255193ed7cf05f900b9150dcf59c0e0f37f3bd325f62Douglas Gregor if (!ConflictingDecls.empty() && SearchName) { 255296a01b4acf76fb8fe1e05341a97a27b39fb0b914Douglas Gregor Name = Importer.HandleNameConflict(Name, DC, IDNS, 255396a01b4acf76fb8fe1e05341a97a27b39fb0b914Douglas Gregor ConflictingDecls.data(), 255496a01b4acf76fb8fe1e05341a97a27b39fb0b914Douglas Gregor ConflictingDecls.size()); 255596a01b4acf76fb8fe1e05341a97a27b39fb0b914Douglas Gregor } 255696a01b4acf76fb8fe1e05341a97a27b39fb0b914Douglas Gregor } 255796a01b4acf76fb8fe1e05341a97a27b39fb0b914Douglas Gregor 255896a01b4acf76fb8fe1e05341a97a27b39fb0b914Douglas Gregor // Create the record declaration. 255973dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor RecordDecl *D2 = AdoptDecl; 2560ba877adeb49ed6dc17f27fa3a3bcd0cca713fd68Abramo Bagnara SourceLocation StartLoc = Importer.Import(D->getLocStart()); 256173dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor if (!D2) { 25625250f27420386452a21692a6292c99ee7febdac4John McCall if (isa<CXXRecordDecl>(D)) { 256373dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor CXXRecordDecl *D2CXX = CXXRecordDecl::Create(Importer.getToContext(), 2564e72b5dc556805ea4c91f0ae6d8f8404fc341b687Douglas Gregor D->getTagKind(), 2565ba877adeb49ed6dc17f27fa3a3bcd0cca713fd68Abramo Bagnara DC, StartLoc, Loc, 2566ba877adeb49ed6dc17f27fa3a3bcd0cca713fd68Abramo Bagnara Name.getAsIdentifierInfo()); 256773dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor D2 = D2CXX; 2568325bf177ac0f1db7888e2d7b194515466ba91762Douglas Gregor D2->setAccess(D->getAccess()); 2569e72b5dc556805ea4c91f0ae6d8f8404fc341b687Douglas Gregor } else { 257073dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor D2 = RecordDecl::Create(Importer.getToContext(), D->getTagKind(), 2571ba877adeb49ed6dc17f27fa3a3bcd0cca713fd68Abramo Bagnara DC, StartLoc, Loc, Name.getAsIdentifierInfo()); 257296a01b4acf76fb8fe1e05341a97a27b39fb0b914Douglas Gregor } 2573c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor 2574c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor D2->setQualifierInfo(Importer.Import(D->getQualifierLoc())); 257573dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor D2->setLexicalDeclContext(LexicalDC); 25769faf810f08132aabb34a478297dfeea89c3bbe17Sean Callanan LexicalDC->addDeclInternal(D2); 257793ed7cf05f900b9150dcf59c0e0f37f3bd325f62Douglas Gregor if (D->isAnonymousStructOrUnion()) 257893ed7cf05f900b9150dcf59c0e0f37f3bd325f62Douglas Gregor D2->setAnonymousStructOrUnion(true); 257996a01b4acf76fb8fe1e05341a97a27b39fb0b914Douglas Gregor } 25805ce5dab3c30e4255b8f62b148b6a86f09a444aaaDouglas Gregor 258173dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor Importer.Imported(D, D2); 2582e72b5dc556805ea4c91f0ae6d8f8404fc341b687Douglas Gregor 2583cd0d56a523f877ffd1fe1575caf758b4357f1661Douglas Gregor if (D->isCompleteDefinition() && ImportDefinition(D, D2, IDK_Default)) 25846bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return nullptr; 25856bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 258673dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor return D2; 258796a01b4acf76fb8fe1e05341a97a27b39fb0b914Douglas Gregor} 258896a01b4acf76fb8fe1e05341a97a27b39fb0b914Douglas Gregor 258936ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas GregorDecl *ASTNodeImporter::VisitEnumConstantDecl(EnumConstantDecl *D) { 259036ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas Gregor // Import the major distinguishing characteristics of this enumerator. 259136ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas Gregor DeclContext *DC, *LexicalDC; 259236ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas Gregor DeclarationName Name; 259336ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas Gregor SourceLocation Loc; 2594ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor if (ImportDeclParts(D, DC, LexicalDC, Name, Loc)) 25956bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return nullptr; 2596ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor 2597ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor QualType T = Importer.Import(D->getType()); 2598ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor if (T.isNull()) 25996bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return nullptr; 2600ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor 260136ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas Gregor // Determine whether there are any other declarations with the same name and 260236ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas Gregor // in the same context. 260336ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas Gregor if (!LexicalDC->isFunctionOrMethod()) { 26045f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner SmallVector<NamedDecl *, 4> ConflictingDecls; 260536ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas Gregor unsigned IDNS = Decl::IDNS_Ordinary; 2606cfa88f893915ceb8ae4ce2f17c46c24a4d67502fDmitri Gribenko SmallVector<NamedDecl *, 2> FoundDecls; 2607b75a3451bcae1301875282e73a13934c90b6574cDouglas Gregor DC->localUncachedLookup(Name, FoundDecls); 2608b75a3451bcae1301875282e73a13934c90b6574cDouglas Gregor for (unsigned I = 0, N = FoundDecls.size(); I != N; ++I) { 2609b75a3451bcae1301875282e73a13934c90b6574cDouglas Gregor if (!FoundDecls[I]->isInIdentifierNamespace(IDNS)) 261036ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas Gregor continue; 26111cef45955d87dde48c78b6878dc0ee67a3404b6cDouglas Gregor 26121cef45955d87dde48c78b6878dc0ee67a3404b6cDouglas Gregor if (EnumConstantDecl *FoundEnumConstant 26131cef45955d87dde48c78b6878dc0ee67a3404b6cDouglas Gregor = dyn_cast<EnumConstantDecl>(FoundDecls[I])) { 26141cef45955d87dde48c78b6878dc0ee67a3404b6cDouglas Gregor if (IsStructuralMatch(D, FoundEnumConstant)) 26151cef45955d87dde48c78b6878dc0ee67a3404b6cDouglas Gregor return Importer.Imported(D, FoundEnumConstant); 26161cef45955d87dde48c78b6878dc0ee67a3404b6cDouglas Gregor } 26171cef45955d87dde48c78b6878dc0ee67a3404b6cDouglas Gregor 2618b75a3451bcae1301875282e73a13934c90b6574cDouglas Gregor ConflictingDecls.push_back(FoundDecls[I]); 261936ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas Gregor } 262036ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas Gregor 262136ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas Gregor if (!ConflictingDecls.empty()) { 262236ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas Gregor Name = Importer.HandleNameConflict(Name, DC, IDNS, 262336ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas Gregor ConflictingDecls.data(), 262436ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas Gregor ConflictingDecls.size()); 262536ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas Gregor if (!Name) 26266bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return nullptr; 262736ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas Gregor } 262836ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas Gregor } 262936ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas Gregor 263036ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas Gregor Expr *Init = Importer.Import(D->getInitExpr()); 263136ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas Gregor if (D->getInitExpr() && !Init) 26326bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return nullptr; 26336bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 263436ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas Gregor EnumConstantDecl *ToEnumerator 263536ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas Gregor = EnumConstantDecl::Create(Importer.getToContext(), cast<EnumDecl>(DC), Loc, 263636ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas Gregor Name.getAsIdentifierInfo(), T, 263736ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas Gregor Init, D->getInitVal()); 2638325bf177ac0f1db7888e2d7b194515466ba91762Douglas Gregor ToEnumerator->setAccess(D->getAccess()); 263936ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas Gregor ToEnumerator->setLexicalDeclContext(LexicalDC); 26405ce5dab3c30e4255b8f62b148b6a86f09a444aaaDouglas Gregor Importer.Imported(D, ToEnumerator); 26419faf810f08132aabb34a478297dfeea89c3bbe17Sean Callanan LexicalDC->addDeclInternal(ToEnumerator); 264236ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas Gregor return ToEnumerator; 264336ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas Gregor} 264496a01b4acf76fb8fe1e05341a97a27b39fb0b914Douglas Gregor 2645a404ea673cbee5e74af710a5f1ab571e71580b67Douglas GregorDecl *ASTNodeImporter::VisitFunctionDecl(FunctionDecl *D) { 2646a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor // Import the major distinguishing characteristics of this function. 2647a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor DeclContext *DC, *LexicalDC; 2648a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor DeclarationName Name; 2649a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor SourceLocation Loc; 2650ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor if (ImportDeclParts(D, DC, LexicalDC, Name, Loc)) 26516bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return nullptr; 26522577743c5650c646fb705df01403707e94f2df04Abramo Bagnara 2653a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor // Try to find a function in our own ("to") context with the same name, same 2654a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor // type, and in the same context as the function we're importing. 2655a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor if (!LexicalDC->isFunctionOrMethod()) { 26565f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner SmallVector<NamedDecl *, 4> ConflictingDecls; 2657a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor unsigned IDNS = Decl::IDNS_Ordinary; 2658cfa88f893915ceb8ae4ce2f17c46c24a4d67502fDmitri Gribenko SmallVector<NamedDecl *, 2> FoundDecls; 2659b75a3451bcae1301875282e73a13934c90b6574cDouglas Gregor DC->localUncachedLookup(Name, FoundDecls); 2660b75a3451bcae1301875282e73a13934c90b6574cDouglas Gregor for (unsigned I = 0, N = FoundDecls.size(); I != N; ++I) { 2661b75a3451bcae1301875282e73a13934c90b6574cDouglas Gregor if (!FoundDecls[I]->isInIdentifierNamespace(IDNS)) 2662a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor continue; 2663a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor 2664b75a3451bcae1301875282e73a13934c90b6574cDouglas Gregor if (FunctionDecl *FoundFunction = dyn_cast<FunctionDecl>(FoundDecls[I])) { 2665181e3ecc0907ae0103586a9f4db52241995a8267Rafael Espindola if (FoundFunction->hasExternalFormalLinkage() && 2666181e3ecc0907ae0103586a9f4db52241995a8267Rafael Espindola D->hasExternalFormalLinkage()) { 2667ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor if (Importer.IsStructurallyEquivalent(D->getType(), 2668ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor FoundFunction->getType())) { 2669a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor // FIXME: Actually try to merge the body and other attributes. 26705ce5dab3c30e4255b8f62b148b6a86f09a444aaaDouglas Gregor return Importer.Imported(D, FoundFunction); 2671a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor } 2672a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor 2673a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor // FIXME: Check for overloading more carefully, e.g., by boosting 2674a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor // Sema::IsOverload out to the AST library. 2675a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor 2676a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor // Function overloading is okay in C++. 26774e4d08403ca5cfd4d558fa2936215d3a4e5a528dDavid Blaikie if (Importer.getToContext().getLangOpts().CPlusPlus) 2678a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor continue; 2679a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor 2680a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor // Complain about inconsistent function types. 2681a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor Importer.ToDiag(Loc, diag::err_odr_function_type_inconsistent) 2682ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor << Name << D->getType() << FoundFunction->getType(); 2683a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor Importer.ToDiag(FoundFunction->getLocation(), 2684a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor diag::note_odr_value_here) 2685a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor << FoundFunction->getType(); 2686a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor } 2687a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor } 2688a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor 2689b75a3451bcae1301875282e73a13934c90b6574cDouglas Gregor ConflictingDecls.push_back(FoundDecls[I]); 2690a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor } 2691a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor 2692a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor if (!ConflictingDecls.empty()) { 2693a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor Name = Importer.HandleNameConflict(Name, DC, IDNS, 2694a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor ConflictingDecls.data(), 2695a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor ConflictingDecls.size()); 2696a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor if (!Name) 26976bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return nullptr; 2698a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor } 2699a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor } 2700ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor 27012577743c5650c646fb705df01403707e94f2df04Abramo Bagnara DeclarationNameInfo NameInfo(Name, Loc); 27022577743c5650c646fb705df01403707e94f2df04Abramo Bagnara // Import additional name location/type info. 27032577743c5650c646fb705df01403707e94f2df04Abramo Bagnara ImportDeclarationNameLoc(D->getNameInfo(), NameInfo); 27042577743c5650c646fb705df01403707e94f2df04Abramo Bagnara 2705d498f384d154e154e939a9c764054cd4a8d76819Argyrios Kyrtzidis QualType FromTy = D->getType(); 2706d498f384d154e154e939a9c764054cd4a8d76819Argyrios Kyrtzidis bool usedDifferentExceptionSpec = false; 2707d498f384d154e154e939a9c764054cd4a8d76819Argyrios Kyrtzidis 2708d498f384d154e154e939a9c764054cd4a8d76819Argyrios Kyrtzidis if (const FunctionProtoType * 2709d498f384d154e154e939a9c764054cd4a8d76819Argyrios Kyrtzidis FromFPT = D->getType()->getAs<FunctionProtoType>()) { 2710d498f384d154e154e939a9c764054cd4a8d76819Argyrios Kyrtzidis FunctionProtoType::ExtProtoInfo FromEPI = FromFPT->getExtProtoInfo(); 2711d498f384d154e154e939a9c764054cd4a8d76819Argyrios Kyrtzidis // FunctionProtoType::ExtProtoInfo's ExceptionSpecDecl can point to the 2712d498f384d154e154e939a9c764054cd4a8d76819Argyrios Kyrtzidis // FunctionDecl that we are importing the FunctionProtoType for. 2713d498f384d154e154e939a9c764054cd4a8d76819Argyrios Kyrtzidis // To avoid an infinite recursion when importing, create the FunctionDecl 2714d498f384d154e154e939a9c764054cd4a8d76819Argyrios Kyrtzidis // with a simplified function type and update it afterwards. 2715d498f384d154e154e939a9c764054cd4a8d76819Argyrios Kyrtzidis if (FromEPI.ExceptionSpecDecl || FromEPI.ExceptionSpecTemplate || 2716d498f384d154e154e939a9c764054cd4a8d76819Argyrios Kyrtzidis FromEPI.NoexceptExpr) { 2717d498f384d154e154e939a9c764054cd4a8d76819Argyrios Kyrtzidis FunctionProtoType::ExtProtoInfo DefaultEPI; 2718d498f384d154e154e939a9c764054cd4a8d76819Argyrios Kyrtzidis FromTy = Importer.getFromContext().getFunctionType( 2719651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines FromFPT->getReturnType(), FromFPT->getParamTypes(), DefaultEPI); 2720d498f384d154e154e939a9c764054cd4a8d76819Argyrios Kyrtzidis usedDifferentExceptionSpec = true; 2721d498f384d154e154e939a9c764054cd4a8d76819Argyrios Kyrtzidis } 2722d498f384d154e154e939a9c764054cd4a8d76819Argyrios Kyrtzidis } 2723d498f384d154e154e939a9c764054cd4a8d76819Argyrios Kyrtzidis 2724ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor // Import the type. 2725d498f384d154e154e939a9c764054cd4a8d76819Argyrios Kyrtzidis QualType T = Importer.Import(FromTy); 2726ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor if (T.isNull()) 27276bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return nullptr; 27286bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 2729a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor // Import the function parameters. 27305f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner SmallVector<ParmVarDecl *, 8> Parameters; 2731651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines for (auto P : D->params()) { 2732651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines ParmVarDecl *ToP = cast_or_null<ParmVarDecl>(Importer.Import(P)); 2733a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor if (!ToP) 27346bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return nullptr; 27356bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 2736a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor Parameters.push_back(ToP); 2737a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor } 2738a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor 2739a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor // Create the imported function. 2740a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor TypeSourceInfo *TInfo = Importer.Import(D->getTypeSourceInfo()); 27416bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines FunctionDecl *ToFunction = nullptr; 2742c144f3534e2f7a70ea9ebf8dd83090a2883d61fbDouglas Gregor if (CXXConstructorDecl *FromConstructor = dyn_cast<CXXConstructorDecl>(D)) { 2743c144f3534e2f7a70ea9ebf8dd83090a2883d61fbDouglas Gregor ToFunction = CXXConstructorDecl::Create(Importer.getToContext(), 2744c144f3534e2f7a70ea9ebf8dd83090a2883d61fbDouglas Gregor cast<CXXRecordDecl>(DC), 2745ff676cb48fe8bf7be2feaa251dc7c5fb15af4730Abramo Bagnara D->getInnerLocStart(), 27462577743c5650c646fb705df01403707e94f2df04Abramo Bagnara NameInfo, T, TInfo, 2747c144f3534e2f7a70ea9ebf8dd83090a2883d61fbDouglas Gregor FromConstructor->isExplicit(), 2748c144f3534e2f7a70ea9ebf8dd83090a2883d61fbDouglas Gregor D->isInlineSpecified(), 2749af1fc7af351758b0ea0d285bdfe5640128109a4eRichard Smith D->isImplicit(), 2750af1fc7af351758b0ea0d285bdfe5640128109a4eRichard Smith D->isConstexpr()); 2751c144f3534e2f7a70ea9ebf8dd83090a2883d61fbDouglas Gregor } else if (isa<CXXDestructorDecl>(D)) { 2752c144f3534e2f7a70ea9ebf8dd83090a2883d61fbDouglas Gregor ToFunction = CXXDestructorDecl::Create(Importer.getToContext(), 2753c144f3534e2f7a70ea9ebf8dd83090a2883d61fbDouglas Gregor cast<CXXRecordDecl>(DC), 2754ff676cb48fe8bf7be2feaa251dc7c5fb15af4730Abramo Bagnara D->getInnerLocStart(), 2755b41d899a6023385c00a61eb9dd3e44db9dc7994eCraig Silverstein NameInfo, T, TInfo, 2756c144f3534e2f7a70ea9ebf8dd83090a2883d61fbDouglas Gregor D->isInlineSpecified(), 2757c144f3534e2f7a70ea9ebf8dd83090a2883d61fbDouglas Gregor D->isImplicit()); 2758c144f3534e2f7a70ea9ebf8dd83090a2883d61fbDouglas Gregor } else if (CXXConversionDecl *FromConversion 2759c144f3534e2f7a70ea9ebf8dd83090a2883d61fbDouglas Gregor = dyn_cast<CXXConversionDecl>(D)) { 2760c144f3534e2f7a70ea9ebf8dd83090a2883d61fbDouglas Gregor ToFunction = CXXConversionDecl::Create(Importer.getToContext(), 2761c144f3534e2f7a70ea9ebf8dd83090a2883d61fbDouglas Gregor cast<CXXRecordDecl>(DC), 2762ff676cb48fe8bf7be2feaa251dc7c5fb15af4730Abramo Bagnara D->getInnerLocStart(), 27632577743c5650c646fb705df01403707e94f2df04Abramo Bagnara NameInfo, T, TInfo, 2764c144f3534e2f7a70ea9ebf8dd83090a2883d61fbDouglas Gregor D->isInlineSpecified(), 2765f52516038ab5d0b1b90a6dd32f46b7d6dabd04c8Douglas Gregor FromConversion->isExplicit(), 2766af1fc7af351758b0ea0d285bdfe5640128109a4eRichard Smith D->isConstexpr(), 2767f52516038ab5d0b1b90a6dd32f46b7d6dabd04c8Douglas Gregor Importer.Import(D->getLocEnd())); 27680629cbe86b6d890076548778ed8597ee298adcbaDouglas Gregor } else if (CXXMethodDecl *Method = dyn_cast<CXXMethodDecl>(D)) { 27690629cbe86b6d890076548778ed8597ee298adcbaDouglas Gregor ToFunction = CXXMethodDecl::Create(Importer.getToContext(), 27700629cbe86b6d890076548778ed8597ee298adcbaDouglas Gregor cast<CXXRecordDecl>(DC), 2771ff676cb48fe8bf7be2feaa251dc7c5fb15af4730Abramo Bagnara D->getInnerLocStart(), 27720629cbe86b6d890076548778ed8597ee298adcbaDouglas Gregor NameInfo, T, TInfo, 2773d2615cc53b916e8aae45783ca7113b93de515ce3Rafael Espindola Method->getStorageClass(), 2774f52516038ab5d0b1b90a6dd32f46b7d6dabd04c8Douglas Gregor Method->isInlineSpecified(), 2775af1fc7af351758b0ea0d285bdfe5640128109a4eRichard Smith D->isConstexpr(), 2776f52516038ab5d0b1b90a6dd32f46b7d6dabd04c8Douglas Gregor Importer.Import(D->getLocEnd())); 2777c144f3534e2f7a70ea9ebf8dd83090a2883d61fbDouglas Gregor } else { 27782577743c5650c646fb705df01403707e94f2df04Abramo Bagnara ToFunction = FunctionDecl::Create(Importer.getToContext(), DC, 2779ff676cb48fe8bf7be2feaa251dc7c5fb15af4730Abramo Bagnara D->getInnerLocStart(), 27802577743c5650c646fb705df01403707e94f2df04Abramo Bagnara NameInfo, T, TInfo, D->getStorageClass(), 2781c144f3534e2f7a70ea9ebf8dd83090a2883d61fbDouglas Gregor D->isInlineSpecified(), 2782af1fc7af351758b0ea0d285bdfe5640128109a4eRichard Smith D->hasWrittenPrototype(), 2783af1fc7af351758b0ea0d285bdfe5640128109a4eRichard Smith D->isConstexpr()); 2784c144f3534e2f7a70ea9ebf8dd83090a2883d61fbDouglas Gregor } 2785b6217665c6a987f2d6c8665fd70365d7719ac4dfJohn McCall 2786b6217665c6a987f2d6c8665fd70365d7719ac4dfJohn McCall // Import the qualifier, if any. 2787c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor ToFunction->setQualifierInfo(Importer.Import(D->getQualifierLoc())); 2788325bf177ac0f1db7888e2d7b194515466ba91762Douglas Gregor ToFunction->setAccess(D->getAccess()); 2789c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor ToFunction->setLexicalDeclContext(LexicalDC); 2790f2eca2cf302c50b79891f24b3861d64ea9263831John McCall ToFunction->setVirtualAsWritten(D->isVirtualAsWritten()); 2791f2eca2cf302c50b79891f24b3861d64ea9263831John McCall ToFunction->setTrivial(D->isTrivial()); 2792f2eca2cf302c50b79891f24b3861d64ea9263831John McCall ToFunction->setPure(D->isPure()); 2793c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor Importer.Imported(D, ToFunction); 2794a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor 2795a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor // Set the parameters. 2796a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor for (unsigned I = 0, N = Parameters.size(); I != N; ++I) { 2797c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor Parameters[I]->setOwningFunction(ToFunction); 27989faf810f08132aabb34a478297dfeea89c3bbe17Sean Callanan ToFunction->addDeclInternal(Parameters[I]); 2799a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor } 28004278c654b645402554eb52a48e9c7097c9f1233aDavid Blaikie ToFunction->setParams(Parameters); 2801a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor 2802d498f384d154e154e939a9c764054cd4a8d76819Argyrios Kyrtzidis if (usedDifferentExceptionSpec) { 2803d498f384d154e154e939a9c764054cd4a8d76819Argyrios Kyrtzidis // Update FunctionProtoType::ExtProtoInfo. 2804d498f384d154e154e939a9c764054cd4a8d76819Argyrios Kyrtzidis QualType T = Importer.Import(D->getType()); 2805d498f384d154e154e939a9c764054cd4a8d76819Argyrios Kyrtzidis if (T.isNull()) 28066bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return nullptr; 2807d498f384d154e154e939a9c764054cd4a8d76819Argyrios Kyrtzidis ToFunction->setType(T); 2808f0fdefc13a58db2a8b32bb47ac23bc16efad6fdaArgyrios Kyrtzidis } 2809f0fdefc13a58db2a8b32bb47ac23bc16efad6fdaArgyrios Kyrtzidis 2810a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor // FIXME: Other bits to merge? 281181134ad7a056e45b7cb4ee1b562ab8c8413d65b7Douglas Gregor 281281134ad7a056e45b7cb4ee1b562ab8c8413d65b7Douglas Gregor // Add this function to the lexical context. 28139faf810f08132aabb34a478297dfeea89c3bbe17Sean Callanan LexicalDC->addDeclInternal(ToFunction); 281481134ad7a056e45b7cb4ee1b562ab8c8413d65b7Douglas Gregor 2815c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor return ToFunction; 2816a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor} 2817a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor 2818c144f3534e2f7a70ea9ebf8dd83090a2883d61fbDouglas GregorDecl *ASTNodeImporter::VisitCXXMethodDecl(CXXMethodDecl *D) { 2819c144f3534e2f7a70ea9ebf8dd83090a2883d61fbDouglas Gregor return VisitFunctionDecl(D); 2820c144f3534e2f7a70ea9ebf8dd83090a2883d61fbDouglas Gregor} 2821c144f3534e2f7a70ea9ebf8dd83090a2883d61fbDouglas Gregor 2822c144f3534e2f7a70ea9ebf8dd83090a2883d61fbDouglas GregorDecl *ASTNodeImporter::VisitCXXConstructorDecl(CXXConstructorDecl *D) { 2823c144f3534e2f7a70ea9ebf8dd83090a2883d61fbDouglas Gregor return VisitCXXMethodDecl(D); 2824c144f3534e2f7a70ea9ebf8dd83090a2883d61fbDouglas Gregor} 2825c144f3534e2f7a70ea9ebf8dd83090a2883d61fbDouglas Gregor 2826c144f3534e2f7a70ea9ebf8dd83090a2883d61fbDouglas GregorDecl *ASTNodeImporter::VisitCXXDestructorDecl(CXXDestructorDecl *D) { 2827c144f3534e2f7a70ea9ebf8dd83090a2883d61fbDouglas Gregor return VisitCXXMethodDecl(D); 2828c144f3534e2f7a70ea9ebf8dd83090a2883d61fbDouglas Gregor} 2829c144f3534e2f7a70ea9ebf8dd83090a2883d61fbDouglas Gregor 2830c144f3534e2f7a70ea9ebf8dd83090a2883d61fbDouglas GregorDecl *ASTNodeImporter::VisitCXXConversionDecl(CXXConversionDecl *D) { 2831c144f3534e2f7a70ea9ebf8dd83090a2883d61fbDouglas Gregor return VisitCXXMethodDecl(D); 2832c144f3534e2f7a70ea9ebf8dd83090a2883d61fbDouglas Gregor} 2833c144f3534e2f7a70ea9ebf8dd83090a2883d61fbDouglas Gregor 283411ce5fe7d8dda29f3d093e5759a7476b140e3241Douglas Gregorstatic unsigned getFieldIndex(Decl *F) { 283511ce5fe7d8dda29f3d093e5759a7476b140e3241Douglas Gregor RecordDecl *Owner = dyn_cast<RecordDecl>(F->getDeclContext()); 283611ce5fe7d8dda29f3d093e5759a7476b140e3241Douglas Gregor if (!Owner) 283711ce5fe7d8dda29f3d093e5759a7476b140e3241Douglas Gregor return 0; 283811ce5fe7d8dda29f3d093e5759a7476b140e3241Douglas Gregor 283911ce5fe7d8dda29f3d093e5759a7476b140e3241Douglas Gregor unsigned Index = 1; 2840651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines for (const auto *D : Owner->noload_decls()) { 2841651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines if (D == F) 284211ce5fe7d8dda29f3d093e5759a7476b140e3241Douglas Gregor return Index; 284311ce5fe7d8dda29f3d093e5759a7476b140e3241Douglas Gregor 284411ce5fe7d8dda29f3d093e5759a7476b140e3241Douglas Gregor if (isa<FieldDecl>(*D) || isa<IndirectFieldDecl>(*D)) 284511ce5fe7d8dda29f3d093e5759a7476b140e3241Douglas Gregor ++Index; 284611ce5fe7d8dda29f3d093e5759a7476b140e3241Douglas Gregor } 284711ce5fe7d8dda29f3d093e5759a7476b140e3241Douglas Gregor 284811ce5fe7d8dda29f3d093e5759a7476b140e3241Douglas Gregor return Index; 284911ce5fe7d8dda29f3d093e5759a7476b140e3241Douglas Gregor} 285011ce5fe7d8dda29f3d093e5759a7476b140e3241Douglas Gregor 285196a01b4acf76fb8fe1e05341a97a27b39fb0b914Douglas GregorDecl *ASTNodeImporter::VisitFieldDecl(FieldDecl *D) { 285296a01b4acf76fb8fe1e05341a97a27b39fb0b914Douglas Gregor // Import the major distinguishing characteristics of a variable. 285396a01b4acf76fb8fe1e05341a97a27b39fb0b914Douglas Gregor DeclContext *DC, *LexicalDC; 285496a01b4acf76fb8fe1e05341a97a27b39fb0b914Douglas Gregor DeclarationName Name; 285596a01b4acf76fb8fe1e05341a97a27b39fb0b914Douglas Gregor SourceLocation Loc; 2856ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor if (ImportDeclParts(D, DC, LexicalDC, Name, Loc)) 28576bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return nullptr; 28586bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 28597c9412cdad37146e6d1eee15eaa0d7a1d93e6ee1Douglas Gregor // Determine whether we've already imported this field. 2860cfa88f893915ceb8ae4ce2f17c46c24a4d67502fDmitri Gribenko SmallVector<NamedDecl *, 2> FoundDecls; 2861b75a3451bcae1301875282e73a13934c90b6574cDouglas Gregor DC->localUncachedLookup(Name, FoundDecls); 2862b75a3451bcae1301875282e73a13934c90b6574cDouglas Gregor for (unsigned I = 0, N = FoundDecls.size(); I != N; ++I) { 2863b75a3451bcae1301875282e73a13934c90b6574cDouglas Gregor if (FieldDecl *FoundField = dyn_cast<FieldDecl>(FoundDecls[I])) { 286411ce5fe7d8dda29f3d093e5759a7476b140e3241Douglas Gregor // For anonymous fields, match up by index. 286511ce5fe7d8dda29f3d093e5759a7476b140e3241Douglas Gregor if (!Name && getFieldIndex(D) != getFieldIndex(FoundField)) 286611ce5fe7d8dda29f3d093e5759a7476b140e3241Douglas Gregor continue; 286711ce5fe7d8dda29f3d093e5759a7476b140e3241Douglas Gregor 28687c9412cdad37146e6d1eee15eaa0d7a1d93e6ee1Douglas Gregor if (Importer.IsStructurallyEquivalent(D->getType(), 28697c9412cdad37146e6d1eee15eaa0d7a1d93e6ee1Douglas Gregor FoundField->getType())) { 28707c9412cdad37146e6d1eee15eaa0d7a1d93e6ee1Douglas Gregor Importer.Imported(D, FoundField); 28717c9412cdad37146e6d1eee15eaa0d7a1d93e6ee1Douglas Gregor return FoundField; 28727c9412cdad37146e6d1eee15eaa0d7a1d93e6ee1Douglas Gregor } 28737c9412cdad37146e6d1eee15eaa0d7a1d93e6ee1Douglas Gregor 28747c9412cdad37146e6d1eee15eaa0d7a1d93e6ee1Douglas Gregor Importer.ToDiag(Loc, diag::err_odr_field_type_inconsistent) 28757c9412cdad37146e6d1eee15eaa0d7a1d93e6ee1Douglas Gregor << Name << D->getType() << FoundField->getType(); 28767c9412cdad37146e6d1eee15eaa0d7a1d93e6ee1Douglas Gregor Importer.ToDiag(FoundField->getLocation(), diag::note_odr_value_here) 28777c9412cdad37146e6d1eee15eaa0d7a1d93e6ee1Douglas Gregor << FoundField->getType(); 28786bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return nullptr; 28797c9412cdad37146e6d1eee15eaa0d7a1d93e6ee1Douglas Gregor } 28807c9412cdad37146e6d1eee15eaa0d7a1d93e6ee1Douglas Gregor } 28817c9412cdad37146e6d1eee15eaa0d7a1d93e6ee1Douglas Gregor 2882ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor // Import the type. 2883ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor QualType T = Importer.Import(D->getType()); 2884ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor if (T.isNull()) 28856bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return nullptr; 28866bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 288796a01b4acf76fb8fe1e05341a97a27b39fb0b914Douglas Gregor TypeSourceInfo *TInfo = Importer.Import(D->getTypeSourceInfo()); 288896a01b4acf76fb8fe1e05341a97a27b39fb0b914Douglas Gregor Expr *BitWidth = Importer.Import(D->getBitWidth()); 288996a01b4acf76fb8fe1e05341a97a27b39fb0b914Douglas Gregor if (!BitWidth && D->getBitWidth()) 28906bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return nullptr; 28916bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 2892ff676cb48fe8bf7be2feaa251dc7c5fb15af4730Abramo Bagnara FieldDecl *ToField = FieldDecl::Create(Importer.getToContext(), DC, 2893ff676cb48fe8bf7be2feaa251dc7c5fb15af4730Abramo Bagnara Importer.Import(D->getInnerLocStart()), 289496a01b4acf76fb8fe1e05341a97a27b39fb0b914Douglas Gregor Loc, Name.getAsIdentifierInfo(), 28957a614d8380297fcd2bc23986241905d97222948cRichard Smith T, TInfo, BitWidth, D->isMutable(), 2896ca5233044ef679840d1ad1c46a36b16e2ee8a6e1Richard Smith D->getInClassInitStyle()); 2897325bf177ac0f1db7888e2d7b194515466ba91762Douglas Gregor ToField->setAccess(D->getAccess()); 289896a01b4acf76fb8fe1e05341a97a27b39fb0b914Douglas Gregor ToField->setLexicalDeclContext(LexicalDC); 28997a614d8380297fcd2bc23986241905d97222948cRichard Smith if (ToField->hasInClassInitializer()) 29007a614d8380297fcd2bc23986241905d97222948cRichard Smith ToField->setInClassInitializer(D->getInClassInitializer()); 290111ce5fe7d8dda29f3d093e5759a7476b140e3241Douglas Gregor ToField->setImplicit(D->isImplicit()); 29025ce5dab3c30e4255b8f62b148b6a86f09a444aaaDouglas Gregor Importer.Imported(D, ToField); 29039faf810f08132aabb34a478297dfeea89c3bbe17Sean Callanan LexicalDC->addDeclInternal(ToField); 290496a01b4acf76fb8fe1e05341a97a27b39fb0b914Douglas Gregor return ToField; 290596a01b4acf76fb8fe1e05341a97a27b39fb0b914Douglas Gregor} 290696a01b4acf76fb8fe1e05341a97a27b39fb0b914Douglas Gregor 290787c2e121cf0522fc266efe2922b58091cd2e0182Francois PichetDecl *ASTNodeImporter::VisitIndirectFieldDecl(IndirectFieldDecl *D) { 290887c2e121cf0522fc266efe2922b58091cd2e0182Francois Pichet // Import the major distinguishing characteristics of a variable. 290987c2e121cf0522fc266efe2922b58091cd2e0182Francois Pichet DeclContext *DC, *LexicalDC; 291087c2e121cf0522fc266efe2922b58091cd2e0182Francois Pichet DeclarationName Name; 291187c2e121cf0522fc266efe2922b58091cd2e0182Francois Pichet SourceLocation Loc; 291287c2e121cf0522fc266efe2922b58091cd2e0182Francois Pichet if (ImportDeclParts(D, DC, LexicalDC, Name, Loc)) 29136bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return nullptr; 291487c2e121cf0522fc266efe2922b58091cd2e0182Francois Pichet 29157c9412cdad37146e6d1eee15eaa0d7a1d93e6ee1Douglas Gregor // Determine whether we've already imported this field. 2916cfa88f893915ceb8ae4ce2f17c46c24a4d67502fDmitri Gribenko SmallVector<NamedDecl *, 2> FoundDecls; 2917b75a3451bcae1301875282e73a13934c90b6574cDouglas Gregor DC->localUncachedLookup(Name, FoundDecls); 2918b75a3451bcae1301875282e73a13934c90b6574cDouglas Gregor for (unsigned I = 0, N = FoundDecls.size(); I != N; ++I) { 29197c9412cdad37146e6d1eee15eaa0d7a1d93e6ee1Douglas Gregor if (IndirectFieldDecl *FoundField 2920b75a3451bcae1301875282e73a13934c90b6574cDouglas Gregor = dyn_cast<IndirectFieldDecl>(FoundDecls[I])) { 292111ce5fe7d8dda29f3d093e5759a7476b140e3241Douglas Gregor // For anonymous indirect fields, match up by index. 292211ce5fe7d8dda29f3d093e5759a7476b140e3241Douglas Gregor if (!Name && getFieldIndex(D) != getFieldIndex(FoundField)) 292311ce5fe7d8dda29f3d093e5759a7476b140e3241Douglas Gregor continue; 292411ce5fe7d8dda29f3d093e5759a7476b140e3241Douglas Gregor 29257c9412cdad37146e6d1eee15eaa0d7a1d93e6ee1Douglas Gregor if (Importer.IsStructurallyEquivalent(D->getType(), 292693ed7cf05f900b9150dcf59c0e0f37f3bd325f62Douglas Gregor FoundField->getType(), 29277247c88d1e41514a41085f83ebf03dd5220e054aDavid Blaikie !Name.isEmpty())) { 29287c9412cdad37146e6d1eee15eaa0d7a1d93e6ee1Douglas Gregor Importer.Imported(D, FoundField); 29297c9412cdad37146e6d1eee15eaa0d7a1d93e6ee1Douglas Gregor return FoundField; 29307c9412cdad37146e6d1eee15eaa0d7a1d93e6ee1Douglas Gregor } 293193ed7cf05f900b9150dcf59c0e0f37f3bd325f62Douglas Gregor 293293ed7cf05f900b9150dcf59c0e0f37f3bd325f62Douglas Gregor // If there are more anonymous fields to check, continue. 293393ed7cf05f900b9150dcf59c0e0f37f3bd325f62Douglas Gregor if (!Name && I < N-1) 293493ed7cf05f900b9150dcf59c0e0f37f3bd325f62Douglas Gregor continue; 293593ed7cf05f900b9150dcf59c0e0f37f3bd325f62Douglas Gregor 29367c9412cdad37146e6d1eee15eaa0d7a1d93e6ee1Douglas Gregor Importer.ToDiag(Loc, diag::err_odr_field_type_inconsistent) 29377c9412cdad37146e6d1eee15eaa0d7a1d93e6ee1Douglas Gregor << Name << D->getType() << FoundField->getType(); 29387c9412cdad37146e6d1eee15eaa0d7a1d93e6ee1Douglas Gregor Importer.ToDiag(FoundField->getLocation(), diag::note_odr_value_here) 29397c9412cdad37146e6d1eee15eaa0d7a1d93e6ee1Douglas Gregor << FoundField->getType(); 29406bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return nullptr; 29417c9412cdad37146e6d1eee15eaa0d7a1d93e6ee1Douglas Gregor } 29427c9412cdad37146e6d1eee15eaa0d7a1d93e6ee1Douglas Gregor } 29437c9412cdad37146e6d1eee15eaa0d7a1d93e6ee1Douglas Gregor 294487c2e121cf0522fc266efe2922b58091cd2e0182Francois Pichet // Import the type. 294587c2e121cf0522fc266efe2922b58091cd2e0182Francois Pichet QualType T = Importer.Import(D->getType()); 294687c2e121cf0522fc266efe2922b58091cd2e0182Francois Pichet if (T.isNull()) 29476bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return nullptr; 294887c2e121cf0522fc266efe2922b58091cd2e0182Francois Pichet 294987c2e121cf0522fc266efe2922b58091cd2e0182Francois Pichet NamedDecl **NamedChain = 295087c2e121cf0522fc266efe2922b58091cd2e0182Francois Pichet new (Importer.getToContext())NamedDecl*[D->getChainingSize()]; 295187c2e121cf0522fc266efe2922b58091cd2e0182Francois Pichet 295287c2e121cf0522fc266efe2922b58091cd2e0182Francois Pichet unsigned i = 0; 2953651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines for (auto *PI : D->chain()) { 2954651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines Decl *D = Importer.Import(PI); 295587c2e121cf0522fc266efe2922b58091cd2e0182Francois Pichet if (!D) 29566bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return nullptr; 295787c2e121cf0522fc266efe2922b58091cd2e0182Francois Pichet NamedChain[i++] = cast<NamedDecl>(D); 295887c2e121cf0522fc266efe2922b58091cd2e0182Francois Pichet } 295987c2e121cf0522fc266efe2922b58091cd2e0182Francois Pichet 296087c2e121cf0522fc266efe2922b58091cd2e0182Francois Pichet IndirectFieldDecl *ToIndirectField = IndirectFieldDecl::Create( 296187c2e121cf0522fc266efe2922b58091cd2e0182Francois Pichet Importer.getToContext(), DC, 296287c2e121cf0522fc266efe2922b58091cd2e0182Francois Pichet Loc, Name.getAsIdentifierInfo(), T, 296387c2e121cf0522fc266efe2922b58091cd2e0182Francois Pichet NamedChain, D->getChainingSize()); 296487c2e121cf0522fc266efe2922b58091cd2e0182Francois Pichet ToIndirectField->setAccess(D->getAccess()); 296587c2e121cf0522fc266efe2922b58091cd2e0182Francois Pichet ToIndirectField->setLexicalDeclContext(LexicalDC); 296687c2e121cf0522fc266efe2922b58091cd2e0182Francois Pichet Importer.Imported(D, ToIndirectField); 29679faf810f08132aabb34a478297dfeea89c3bbe17Sean Callanan LexicalDC->addDeclInternal(ToIndirectField); 296887c2e121cf0522fc266efe2922b58091cd2e0182Francois Pichet return ToIndirectField; 296987c2e121cf0522fc266efe2922b58091cd2e0182Francois Pichet} 297087c2e121cf0522fc266efe2922b58091cd2e0182Francois Pichet 29712e55e3af2f6d6c0509495357fade95105dd144cdDouglas GregorDecl *ASTNodeImporter::VisitObjCIvarDecl(ObjCIvarDecl *D) { 29722e55e3af2f6d6c0509495357fade95105dd144cdDouglas Gregor // Import the major distinguishing characteristics of an ivar. 29732e55e3af2f6d6c0509495357fade95105dd144cdDouglas Gregor DeclContext *DC, *LexicalDC; 29742e55e3af2f6d6c0509495357fade95105dd144cdDouglas Gregor DeclarationName Name; 29752e55e3af2f6d6c0509495357fade95105dd144cdDouglas Gregor SourceLocation Loc; 29762e55e3af2f6d6c0509495357fade95105dd144cdDouglas Gregor if (ImportDeclParts(D, DC, LexicalDC, Name, Loc)) 29776bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return nullptr; 29786bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 29792e55e3af2f6d6c0509495357fade95105dd144cdDouglas Gregor // Determine whether we've already imported this ivar 2980cfa88f893915ceb8ae4ce2f17c46c24a4d67502fDmitri Gribenko SmallVector<NamedDecl *, 2> FoundDecls; 2981b75a3451bcae1301875282e73a13934c90b6574cDouglas Gregor DC->localUncachedLookup(Name, FoundDecls); 2982b75a3451bcae1301875282e73a13934c90b6574cDouglas Gregor for (unsigned I = 0, N = FoundDecls.size(); I != N; ++I) { 2983b75a3451bcae1301875282e73a13934c90b6574cDouglas Gregor if (ObjCIvarDecl *FoundIvar = dyn_cast<ObjCIvarDecl>(FoundDecls[I])) { 29842e55e3af2f6d6c0509495357fade95105dd144cdDouglas Gregor if (Importer.IsStructurallyEquivalent(D->getType(), 29852e55e3af2f6d6c0509495357fade95105dd144cdDouglas Gregor FoundIvar->getType())) { 29862e55e3af2f6d6c0509495357fade95105dd144cdDouglas Gregor Importer.Imported(D, FoundIvar); 29872e55e3af2f6d6c0509495357fade95105dd144cdDouglas Gregor return FoundIvar; 29882e55e3af2f6d6c0509495357fade95105dd144cdDouglas Gregor } 29892e55e3af2f6d6c0509495357fade95105dd144cdDouglas Gregor 29902e55e3af2f6d6c0509495357fade95105dd144cdDouglas Gregor Importer.ToDiag(Loc, diag::err_odr_ivar_type_inconsistent) 29912e55e3af2f6d6c0509495357fade95105dd144cdDouglas Gregor << Name << D->getType() << FoundIvar->getType(); 29922e55e3af2f6d6c0509495357fade95105dd144cdDouglas Gregor Importer.ToDiag(FoundIvar->getLocation(), diag::note_odr_value_here) 29932e55e3af2f6d6c0509495357fade95105dd144cdDouglas Gregor << FoundIvar->getType(); 29946bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return nullptr; 29952e55e3af2f6d6c0509495357fade95105dd144cdDouglas Gregor } 29962e55e3af2f6d6c0509495357fade95105dd144cdDouglas Gregor } 29972e55e3af2f6d6c0509495357fade95105dd144cdDouglas Gregor 29982e55e3af2f6d6c0509495357fade95105dd144cdDouglas Gregor // Import the type. 29992e55e3af2f6d6c0509495357fade95105dd144cdDouglas Gregor QualType T = Importer.Import(D->getType()); 30002e55e3af2f6d6c0509495357fade95105dd144cdDouglas Gregor if (T.isNull()) 30016bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return nullptr; 30026bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 30032e55e3af2f6d6c0509495357fade95105dd144cdDouglas Gregor TypeSourceInfo *TInfo = Importer.Import(D->getTypeSourceInfo()); 30042e55e3af2f6d6c0509495357fade95105dd144cdDouglas Gregor Expr *BitWidth = Importer.Import(D->getBitWidth()); 30052e55e3af2f6d6c0509495357fade95105dd144cdDouglas Gregor if (!BitWidth && D->getBitWidth()) 30066bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return nullptr; 30076bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 3008a06549226f45d5b72169a3d054415616dd1014a2Daniel Dunbar ObjCIvarDecl *ToIvar = ObjCIvarDecl::Create(Importer.getToContext(), 3009a06549226f45d5b72169a3d054415616dd1014a2Daniel Dunbar cast<ObjCContainerDecl>(DC), 3010ff676cb48fe8bf7be2feaa251dc7c5fb15af4730Abramo Bagnara Importer.Import(D->getInnerLocStart()), 30112e55e3af2f6d6c0509495357fade95105dd144cdDouglas Gregor Loc, Name.getAsIdentifierInfo(), 30122e55e3af2f6d6c0509495357fade95105dd144cdDouglas Gregor T, TInfo, D->getAccessControl(), 3013651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines BitWidth, D->getSynthesize()); 30142e55e3af2f6d6c0509495357fade95105dd144cdDouglas Gregor ToIvar->setLexicalDeclContext(LexicalDC); 30152e55e3af2f6d6c0509495357fade95105dd144cdDouglas Gregor Importer.Imported(D, ToIvar); 30169faf810f08132aabb34a478297dfeea89c3bbe17Sean Callanan LexicalDC->addDeclInternal(ToIvar); 30172e55e3af2f6d6c0509495357fade95105dd144cdDouglas Gregor return ToIvar; 30182e55e3af2f6d6c0509495357fade95105dd144cdDouglas Gregor 30192e55e3af2f6d6c0509495357fade95105dd144cdDouglas Gregor} 30202e55e3af2f6d6c0509495357fade95105dd144cdDouglas Gregor 3021a404ea673cbee5e74af710a5f1ab571e71580b67Douglas GregorDecl *ASTNodeImporter::VisitVarDecl(VarDecl *D) { 3022a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor // Import the major distinguishing characteristics of a variable. 3023a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor DeclContext *DC, *LexicalDC; 3024a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor DeclarationName Name; 3025a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor SourceLocation Loc; 3026ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor if (ImportDeclParts(D, DC, LexicalDC, Name, Loc)) 30276bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return nullptr; 30286bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 3029089459a16bf7e9cd10617d1fac5ec0240a0a1ee6Douglas Gregor // Try to find a variable in our own ("to") context with the same name and 3030089459a16bf7e9cd10617d1fac5ec0240a0a1ee6Douglas Gregor // in the same context as the variable we're importing. 30319bed8798964d9f07599c2c9199701f86fbc70e20Douglas Gregor if (D->isFileVarDecl()) { 30326bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines VarDecl *MergeWithVar = nullptr; 30335f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner SmallVector<NamedDecl *, 4> ConflictingDecls; 3034089459a16bf7e9cd10617d1fac5ec0240a0a1ee6Douglas Gregor unsigned IDNS = Decl::IDNS_Ordinary; 3035cfa88f893915ceb8ae4ce2f17c46c24a4d67502fDmitri Gribenko SmallVector<NamedDecl *, 2> FoundDecls; 3036b75a3451bcae1301875282e73a13934c90b6574cDouglas Gregor DC->localUncachedLookup(Name, FoundDecls); 3037b75a3451bcae1301875282e73a13934c90b6574cDouglas Gregor for (unsigned I = 0, N = FoundDecls.size(); I != N; ++I) { 3038b75a3451bcae1301875282e73a13934c90b6574cDouglas Gregor if (!FoundDecls[I]->isInIdentifierNamespace(IDNS)) 3039089459a16bf7e9cd10617d1fac5ec0240a0a1ee6Douglas Gregor continue; 3040089459a16bf7e9cd10617d1fac5ec0240a0a1ee6Douglas Gregor 3041b75a3451bcae1301875282e73a13934c90b6574cDouglas Gregor if (VarDecl *FoundVar = dyn_cast<VarDecl>(FoundDecls[I])) { 3042089459a16bf7e9cd10617d1fac5ec0240a0a1ee6Douglas Gregor // We have found a variable that we may need to merge with. Check it. 3043181e3ecc0907ae0103586a9f4db52241995a8267Rafael Espindola if (FoundVar->hasExternalFormalLinkage() && 3044181e3ecc0907ae0103586a9f4db52241995a8267Rafael Espindola D->hasExternalFormalLinkage()) { 3045ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor if (Importer.IsStructurallyEquivalent(D->getType(), 3046ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor FoundVar->getType())) { 3047089459a16bf7e9cd10617d1fac5ec0240a0a1ee6Douglas Gregor MergeWithVar = FoundVar; 3048089459a16bf7e9cd10617d1fac5ec0240a0a1ee6Douglas Gregor break; 3049089459a16bf7e9cd10617d1fac5ec0240a0a1ee6Douglas Gregor } 3050089459a16bf7e9cd10617d1fac5ec0240a0a1ee6Douglas Gregor 3051d014542e1c6710d2c230b65b0cfcb8302a596b21Douglas Gregor const ArrayType *FoundArray 3052d014542e1c6710d2c230b65b0cfcb8302a596b21Douglas Gregor = Importer.getToContext().getAsArrayType(FoundVar->getType()); 3053d014542e1c6710d2c230b65b0cfcb8302a596b21Douglas Gregor const ArrayType *TArray 3054ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor = Importer.getToContext().getAsArrayType(D->getType()); 3055d014542e1c6710d2c230b65b0cfcb8302a596b21Douglas Gregor if (FoundArray && TArray) { 3056d014542e1c6710d2c230b65b0cfcb8302a596b21Douglas Gregor if (isa<IncompleteArrayType>(FoundArray) && 3057d014542e1c6710d2c230b65b0cfcb8302a596b21Douglas Gregor isa<ConstantArrayType>(TArray)) { 3058ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor // Import the type. 3059ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor QualType T = Importer.Import(D->getType()); 3060ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor if (T.isNull()) 30616bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return nullptr; 30626bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 3063d014542e1c6710d2c230b65b0cfcb8302a596b21Douglas Gregor FoundVar->setType(T); 3064d014542e1c6710d2c230b65b0cfcb8302a596b21Douglas Gregor MergeWithVar = FoundVar; 3065d014542e1c6710d2c230b65b0cfcb8302a596b21Douglas Gregor break; 3066d014542e1c6710d2c230b65b0cfcb8302a596b21Douglas Gregor } else if (isa<IncompleteArrayType>(TArray) && 3067d014542e1c6710d2c230b65b0cfcb8302a596b21Douglas Gregor isa<ConstantArrayType>(FoundArray)) { 3068d014542e1c6710d2c230b65b0cfcb8302a596b21Douglas Gregor MergeWithVar = FoundVar; 3069d014542e1c6710d2c230b65b0cfcb8302a596b21Douglas Gregor break; 30700f962a8e61e1c094a89df17f9d3ad947d31c4e5cDouglas Gregor } 30710f962a8e61e1c094a89df17f9d3ad947d31c4e5cDouglas Gregor } 30720f962a8e61e1c094a89df17f9d3ad947d31c4e5cDouglas Gregor 3073089459a16bf7e9cd10617d1fac5ec0240a0a1ee6Douglas Gregor Importer.ToDiag(Loc, diag::err_odr_variable_type_inconsistent) 3074ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor << Name << D->getType() << FoundVar->getType(); 3075089459a16bf7e9cd10617d1fac5ec0240a0a1ee6Douglas Gregor Importer.ToDiag(FoundVar->getLocation(), diag::note_odr_value_here) 3076089459a16bf7e9cd10617d1fac5ec0240a0a1ee6Douglas Gregor << FoundVar->getType(); 3077089459a16bf7e9cd10617d1fac5ec0240a0a1ee6Douglas Gregor } 3078089459a16bf7e9cd10617d1fac5ec0240a0a1ee6Douglas Gregor } 3079089459a16bf7e9cd10617d1fac5ec0240a0a1ee6Douglas Gregor 3080b75a3451bcae1301875282e73a13934c90b6574cDouglas Gregor ConflictingDecls.push_back(FoundDecls[I]); 3081089459a16bf7e9cd10617d1fac5ec0240a0a1ee6Douglas Gregor } 3082089459a16bf7e9cd10617d1fac5ec0240a0a1ee6Douglas Gregor 3083089459a16bf7e9cd10617d1fac5ec0240a0a1ee6Douglas Gregor if (MergeWithVar) { 3084089459a16bf7e9cd10617d1fac5ec0240a0a1ee6Douglas Gregor // An equivalent variable with external linkage has been found. Link 3085089459a16bf7e9cd10617d1fac5ec0240a0a1ee6Douglas Gregor // the two declarations, then merge them. 30865ce5dab3c30e4255b8f62b148b6a86f09a444aaaDouglas Gregor Importer.Imported(D, MergeWithVar); 3087089459a16bf7e9cd10617d1fac5ec0240a0a1ee6Douglas Gregor 3088089459a16bf7e9cd10617d1fac5ec0240a0a1ee6Douglas Gregor if (VarDecl *DDef = D->getDefinition()) { 3089089459a16bf7e9cd10617d1fac5ec0240a0a1ee6Douglas Gregor if (VarDecl *ExistingDef = MergeWithVar->getDefinition()) { 3090089459a16bf7e9cd10617d1fac5ec0240a0a1ee6Douglas Gregor Importer.ToDiag(ExistingDef->getLocation(), 3091089459a16bf7e9cd10617d1fac5ec0240a0a1ee6Douglas Gregor diag::err_odr_variable_multiple_def) 3092089459a16bf7e9cd10617d1fac5ec0240a0a1ee6Douglas Gregor << Name; 3093089459a16bf7e9cd10617d1fac5ec0240a0a1ee6Douglas Gregor Importer.FromDiag(DDef->getLocation(), diag::note_odr_defined_here); 3094089459a16bf7e9cd10617d1fac5ec0240a0a1ee6Douglas Gregor } else { 3095089459a16bf7e9cd10617d1fac5ec0240a0a1ee6Douglas Gregor Expr *Init = Importer.Import(DDef->getInit()); 3096838db383b69b9fb55f55c8e9546477df198a4faaDouglas Gregor MergeWithVar->setInit(Init); 3097099e7f647ccda915513f2b2ec53352dc756082d3Richard Smith if (DDef->isInitKnownICE()) { 3098099e7f647ccda915513f2b2ec53352dc756082d3Richard Smith EvaluatedStmt *Eval = MergeWithVar->ensureEvaluatedStmt(); 3099099e7f647ccda915513f2b2ec53352dc756082d3Richard Smith Eval->CheckedICE = true; 3100099e7f647ccda915513f2b2ec53352dc756082d3Richard Smith Eval->IsICE = DDef->isInitICE(); 3101099e7f647ccda915513f2b2ec53352dc756082d3Richard Smith } 3102089459a16bf7e9cd10617d1fac5ec0240a0a1ee6Douglas Gregor } 3103089459a16bf7e9cd10617d1fac5ec0240a0a1ee6Douglas Gregor } 3104089459a16bf7e9cd10617d1fac5ec0240a0a1ee6Douglas Gregor 3105089459a16bf7e9cd10617d1fac5ec0240a0a1ee6Douglas Gregor return MergeWithVar; 3106089459a16bf7e9cd10617d1fac5ec0240a0a1ee6Douglas Gregor } 3107089459a16bf7e9cd10617d1fac5ec0240a0a1ee6Douglas Gregor 3108089459a16bf7e9cd10617d1fac5ec0240a0a1ee6Douglas Gregor if (!ConflictingDecls.empty()) { 3109089459a16bf7e9cd10617d1fac5ec0240a0a1ee6Douglas Gregor Name = Importer.HandleNameConflict(Name, DC, IDNS, 3110089459a16bf7e9cd10617d1fac5ec0240a0a1ee6Douglas Gregor ConflictingDecls.data(), 3111089459a16bf7e9cd10617d1fac5ec0240a0a1ee6Douglas Gregor ConflictingDecls.size()); 3112089459a16bf7e9cd10617d1fac5ec0240a0a1ee6Douglas Gregor if (!Name) 31136bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return nullptr; 3114089459a16bf7e9cd10617d1fac5ec0240a0a1ee6Douglas Gregor } 3115089459a16bf7e9cd10617d1fac5ec0240a0a1ee6Douglas Gregor } 311682fc4bfa6f8ea35488b9038dd83d40766c3645cfDouglas Gregor 3117ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor // Import the type. 3118ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor QualType T = Importer.Import(D->getType()); 3119ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor if (T.isNull()) 31206bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return nullptr; 31216bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 3122089459a16bf7e9cd10617d1fac5ec0240a0a1ee6Douglas Gregor // Create the imported variable. 312382fc4bfa6f8ea35488b9038dd83d40766c3645cfDouglas Gregor TypeSourceInfo *TInfo = Importer.Import(D->getTypeSourceInfo()); 3124ff676cb48fe8bf7be2feaa251dc7c5fb15af4730Abramo Bagnara VarDecl *ToVar = VarDecl::Create(Importer.getToContext(), DC, 3125ff676cb48fe8bf7be2feaa251dc7c5fb15af4730Abramo Bagnara Importer.Import(D->getInnerLocStart()), 3126ff676cb48fe8bf7be2feaa251dc7c5fb15af4730Abramo Bagnara Loc, Name.getAsIdentifierInfo(), 3127ff676cb48fe8bf7be2feaa251dc7c5fb15af4730Abramo Bagnara T, TInfo, 3128d2615cc53b916e8aae45783ca7113b93de515ce3Rafael Espindola D->getStorageClass()); 3129c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor ToVar->setQualifierInfo(Importer.Import(D->getQualifierLoc())); 3130325bf177ac0f1db7888e2d7b194515466ba91762Douglas Gregor ToVar->setAccess(D->getAccess()); 31319bed8798964d9f07599c2c9199701f86fbc70e20Douglas Gregor ToVar->setLexicalDeclContext(LexicalDC); 31325ce5dab3c30e4255b8f62b148b6a86f09a444aaaDouglas Gregor Importer.Imported(D, ToVar); 31339faf810f08132aabb34a478297dfeea89c3bbe17Sean Callanan LexicalDC->addDeclInternal(ToVar); 31349bed8798964d9f07599c2c9199701f86fbc70e20Douglas Gregor 3135089459a16bf7e9cd10617d1fac5ec0240a0a1ee6Douglas Gregor // Merge the initializer. 3136ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo if (ImportDefinition(D, ToVar)) 31376bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return nullptr; 3138089459a16bf7e9cd10617d1fac5ec0240a0a1ee6Douglas Gregor 3139089459a16bf7e9cd10617d1fac5ec0240a0a1ee6Douglas Gregor return ToVar; 3140089459a16bf7e9cd10617d1fac5ec0240a0a1ee6Douglas Gregor} 3141089459a16bf7e9cd10617d1fac5ec0240a0a1ee6Douglas Gregor 31422cd00932b9b5403047139ce8cfaa3ae47966f894Douglas GregorDecl *ASTNodeImporter::VisitImplicitParamDecl(ImplicitParamDecl *D) { 31432cd00932b9b5403047139ce8cfaa3ae47966f894Douglas Gregor // Parameters are created in the translation unit's context, then moved 31442cd00932b9b5403047139ce8cfaa3ae47966f894Douglas Gregor // into the function declaration's context afterward. 31452cd00932b9b5403047139ce8cfaa3ae47966f894Douglas Gregor DeclContext *DC = Importer.getToContext().getTranslationUnitDecl(); 31462cd00932b9b5403047139ce8cfaa3ae47966f894Douglas Gregor 31472cd00932b9b5403047139ce8cfaa3ae47966f894Douglas Gregor // Import the name of this declaration. 31482cd00932b9b5403047139ce8cfaa3ae47966f894Douglas Gregor DeclarationName Name = Importer.Import(D->getDeclName()); 31492cd00932b9b5403047139ce8cfaa3ae47966f894Douglas Gregor if (D->getDeclName() && !Name) 31506bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return nullptr; 31516bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 31522cd00932b9b5403047139ce8cfaa3ae47966f894Douglas Gregor // Import the location of this declaration. 31532cd00932b9b5403047139ce8cfaa3ae47966f894Douglas Gregor SourceLocation Loc = Importer.Import(D->getLocation()); 31542cd00932b9b5403047139ce8cfaa3ae47966f894Douglas Gregor 31552cd00932b9b5403047139ce8cfaa3ae47966f894Douglas Gregor // Import the parameter's type. 31562cd00932b9b5403047139ce8cfaa3ae47966f894Douglas Gregor QualType T = Importer.Import(D->getType()); 31572cd00932b9b5403047139ce8cfaa3ae47966f894Douglas Gregor if (T.isNull()) 31586bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return nullptr; 31596bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 31602cd00932b9b5403047139ce8cfaa3ae47966f894Douglas Gregor // Create the imported parameter. 31612cd00932b9b5403047139ce8cfaa3ae47966f894Douglas Gregor ImplicitParamDecl *ToParm 31622cd00932b9b5403047139ce8cfaa3ae47966f894Douglas Gregor = ImplicitParamDecl::Create(Importer.getToContext(), DC, 31632cd00932b9b5403047139ce8cfaa3ae47966f894Douglas Gregor Loc, Name.getAsIdentifierInfo(), 31642cd00932b9b5403047139ce8cfaa3ae47966f894Douglas Gregor T); 31652cd00932b9b5403047139ce8cfaa3ae47966f894Douglas Gregor return Importer.Imported(D, ToParm); 31662cd00932b9b5403047139ce8cfaa3ae47966f894Douglas Gregor} 31672cd00932b9b5403047139ce8cfaa3ae47966f894Douglas Gregor 3168a404ea673cbee5e74af710a5f1ab571e71580b67Douglas GregorDecl *ASTNodeImporter::VisitParmVarDecl(ParmVarDecl *D) { 3169a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor // Parameters are created in the translation unit's context, then moved 3170a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor // into the function declaration's context afterward. 3171a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor DeclContext *DC = Importer.getToContext().getTranslationUnitDecl(); 3172a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor 317382fc4bfa6f8ea35488b9038dd83d40766c3645cfDouglas Gregor // Import the name of this declaration. 317482fc4bfa6f8ea35488b9038dd83d40766c3645cfDouglas Gregor DeclarationName Name = Importer.Import(D->getDeclName()); 317582fc4bfa6f8ea35488b9038dd83d40766c3645cfDouglas Gregor if (D->getDeclName() && !Name) 31766bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return nullptr; 31776bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 3178a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor // Import the location of this declaration. 3179a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor SourceLocation Loc = Importer.Import(D->getLocation()); 3180a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor 3181a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor // Import the parameter's type. 3182a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor QualType T = Importer.Import(D->getType()); 318382fc4bfa6f8ea35488b9038dd83d40766c3645cfDouglas Gregor if (T.isNull()) 31846bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return nullptr; 31856bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 3186a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor // Create the imported parameter. 3187a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor TypeSourceInfo *TInfo = Importer.Import(D->getTypeSourceInfo()); 3188a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor ParmVarDecl *ToParm = ParmVarDecl::Create(Importer.getToContext(), DC, 3189ff676cb48fe8bf7be2feaa251dc7c5fb15af4730Abramo Bagnara Importer.Import(D->getInnerLocStart()), 3190a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor Loc, Name.getAsIdentifierInfo(), 3191a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor T, TInfo, D->getStorageClass(), 31926bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines /*FIXME: Default argument*/nullptr); 3193bf73b352acb7a2d041ce8b50171dd7f8e2b2c1bbJohn McCall ToParm->setHasInheritedDefaultArg(D->hasInheritedDefaultArg()); 31945ce5dab3c30e4255b8f62b148b6a86f09a444aaaDouglas Gregor return Importer.Imported(D, ToParm); 3195a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor} 319682fc4bfa6f8ea35488b9038dd83d40766c3645cfDouglas Gregor 3197c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas GregorDecl *ASTNodeImporter::VisitObjCMethodDecl(ObjCMethodDecl *D) { 3198c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor // Import the major distinguishing characteristics of a method. 3199c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor DeclContext *DC, *LexicalDC; 3200c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor DeclarationName Name; 3201c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor SourceLocation Loc; 3202c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor if (ImportDeclParts(D, DC, LexicalDC, Name, Loc)) 32036bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return nullptr; 32046bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 3205cfa88f893915ceb8ae4ce2f17c46c24a4d67502fDmitri Gribenko SmallVector<NamedDecl *, 2> FoundDecls; 3206b75a3451bcae1301875282e73a13934c90b6574cDouglas Gregor DC->localUncachedLookup(Name, FoundDecls); 3207b75a3451bcae1301875282e73a13934c90b6574cDouglas Gregor for (unsigned I = 0, N = FoundDecls.size(); I != N; ++I) { 3208b75a3451bcae1301875282e73a13934c90b6574cDouglas Gregor if (ObjCMethodDecl *FoundMethod = dyn_cast<ObjCMethodDecl>(FoundDecls[I])) { 3209c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor if (FoundMethod->isInstanceMethod() != D->isInstanceMethod()) 3210c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor continue; 3211c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor 3212c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor // Check return types. 3213651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines if (!Importer.IsStructurallyEquivalent(D->getReturnType(), 3214651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines FoundMethod->getReturnType())) { 3215c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor Importer.ToDiag(Loc, diag::err_odr_objc_method_result_type_inconsistent) 3216651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines << D->isInstanceMethod() << Name << D->getReturnType() 3217651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines << FoundMethod->getReturnType(); 3218c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor Importer.ToDiag(FoundMethod->getLocation(), 3219c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor diag::note_odr_objc_method_here) 3220c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor << D->isInstanceMethod() << Name; 32216bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return nullptr; 3222c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor } 3223c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor 3224c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor // Check the number of parameters. 3225c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor if (D->param_size() != FoundMethod->param_size()) { 3226c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor Importer.ToDiag(Loc, diag::err_odr_objc_method_num_params_inconsistent) 3227c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor << D->isInstanceMethod() << Name 3228c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor << D->param_size() << FoundMethod->param_size(); 3229c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor Importer.ToDiag(FoundMethod->getLocation(), 3230c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor diag::note_odr_objc_method_here) 3231c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor << D->isInstanceMethod() << Name; 32326bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return nullptr; 3233c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor } 3234c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor 3235c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor // Check parameter types. 3236c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor for (ObjCMethodDecl::param_iterator P = D->param_begin(), 3237c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor PEnd = D->param_end(), FoundP = FoundMethod->param_begin(); 3238c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor P != PEnd; ++P, ++FoundP) { 3239c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor if (!Importer.IsStructurallyEquivalent((*P)->getType(), 3240c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor (*FoundP)->getType())) { 3241c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor Importer.FromDiag((*P)->getLocation(), 3242c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor diag::err_odr_objc_method_param_type_inconsistent) 3243c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor << D->isInstanceMethod() << Name 3244c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor << (*P)->getType() << (*FoundP)->getType(); 3245c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor Importer.ToDiag((*FoundP)->getLocation(), diag::note_odr_value_here) 3246c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor << (*FoundP)->getType(); 32476bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return nullptr; 3248c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor } 3249c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor } 3250c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor 3251c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor // Check variadic/non-variadic. 3252c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor // Check the number of parameters. 3253c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor if (D->isVariadic() != FoundMethod->isVariadic()) { 3254c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor Importer.ToDiag(Loc, diag::err_odr_objc_method_variadic_inconsistent) 3255c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor << D->isInstanceMethod() << Name; 3256c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor Importer.ToDiag(FoundMethod->getLocation(), 3257c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor diag::note_odr_objc_method_here) 3258c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor << D->isInstanceMethod() << Name; 32596bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return nullptr; 3260c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor } 3261c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor 3262c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor // FIXME: Any other bits we need to merge? 3263c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor return Importer.Imported(D, FoundMethod); 3264c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor } 3265c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor } 3266c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor 3267c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor // Import the result type. 3268651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines QualType ResultTy = Importer.Import(D->getReturnType()); 3269c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor if (ResultTy.isNull()) 32706bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return nullptr; 3271c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor 3272651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines TypeSourceInfo *ReturnTInfo = Importer.Import(D->getReturnTypeSourceInfo()); 3273651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 3274651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines ObjCMethodDecl *ToMethod = ObjCMethodDecl::Create( 3275651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines Importer.getToContext(), Loc, Importer.Import(D->getLocEnd()), 3276651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines Name.getObjCSelector(), ResultTy, ReturnTInfo, DC, D->isInstanceMethod(), 3277651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines D->isVariadic(), D->isPropertyAccessor(), D->isImplicit(), D->isDefined(), 3278651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines D->getImplementationControl(), D->hasRelatedResultType()); 3279c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor 3280c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor // FIXME: When we decide to merge method definitions, we'll need to 3281c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor // deal with implicit parameters. 3282c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor 3283c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor // Import the parameters 32845f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner SmallVector<ParmVarDecl *, 5> ToParams; 3285651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines for (auto *FromP : D->params()) { 3286651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines ParmVarDecl *ToP = cast_or_null<ParmVarDecl>(Importer.Import(FromP)); 3287c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor if (!ToP) 32886bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return nullptr; 32896bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 3290c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor ToParams.push_back(ToP); 3291c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor } 3292c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor 3293c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor // Set the parameters. 3294c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor for (unsigned I = 0, N = ToParams.size(); I != N; ++I) { 3295c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor ToParams[I]->setOwningFunction(ToMethod); 32969faf810f08132aabb34a478297dfeea89c3bbe17Sean Callanan ToMethod->addDeclInternal(ToParams[I]); 3297c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor } 3298491306a83c4f0f49f95a3bcbca8580cb98a91c7aArgyrios Kyrtzidis SmallVector<SourceLocation, 12> SelLocs; 3299491306a83c4f0f49f95a3bcbca8580cb98a91c7aArgyrios Kyrtzidis D->getSelectorLocs(SelLocs); 3300491306a83c4f0f49f95a3bcbca8580cb98a91c7aArgyrios Kyrtzidis ToMethod->setMethodParams(Importer.getToContext(), ToParams, SelLocs); 3301c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor 3302c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor ToMethod->setLexicalDeclContext(LexicalDC); 3303c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor Importer.Imported(D, ToMethod); 33049faf810f08132aabb34a478297dfeea89c3bbe17Sean Callanan LexicalDC->addDeclInternal(ToMethod); 3305c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor return ToMethod; 3306c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor} 3307c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor 3308b4677b62a8e9bba0913dfe1456bd9d689cdbccacDouglas GregorDecl *ASTNodeImporter::VisitObjCCategoryDecl(ObjCCategoryDecl *D) { 3309b4677b62a8e9bba0913dfe1456bd9d689cdbccacDouglas Gregor // Import the major distinguishing characteristics of a category. 3310b4677b62a8e9bba0913dfe1456bd9d689cdbccacDouglas Gregor DeclContext *DC, *LexicalDC; 3311b4677b62a8e9bba0913dfe1456bd9d689cdbccacDouglas Gregor DeclarationName Name; 3312b4677b62a8e9bba0913dfe1456bd9d689cdbccacDouglas Gregor SourceLocation Loc; 3313b4677b62a8e9bba0913dfe1456bd9d689cdbccacDouglas Gregor if (ImportDeclParts(D, DC, LexicalDC, Name, Loc)) 33146bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return nullptr; 33156bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 3316b4677b62a8e9bba0913dfe1456bd9d689cdbccacDouglas Gregor ObjCInterfaceDecl *ToInterface 3317b4677b62a8e9bba0913dfe1456bd9d689cdbccacDouglas Gregor = cast_or_null<ObjCInterfaceDecl>(Importer.Import(D->getClassInterface())); 3318b4677b62a8e9bba0913dfe1456bd9d689cdbccacDouglas Gregor if (!ToInterface) 33196bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return nullptr; 33206bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 3321b4677b62a8e9bba0913dfe1456bd9d689cdbccacDouglas Gregor // Determine if we've already encountered this category. 3322b4677b62a8e9bba0913dfe1456bd9d689cdbccacDouglas Gregor ObjCCategoryDecl *MergeWithCategory 3323b4677b62a8e9bba0913dfe1456bd9d689cdbccacDouglas Gregor = ToInterface->FindCategoryDeclaration(Name.getAsIdentifierInfo()); 3324b4677b62a8e9bba0913dfe1456bd9d689cdbccacDouglas Gregor ObjCCategoryDecl *ToCategory = MergeWithCategory; 3325b4677b62a8e9bba0913dfe1456bd9d689cdbccacDouglas Gregor if (!ToCategory) { 3326b4677b62a8e9bba0913dfe1456bd9d689cdbccacDouglas Gregor ToCategory = ObjCCategoryDecl::Create(Importer.getToContext(), DC, 33271711fc91efb36d131f7ba771f73f0154dc1abd1fArgyrios Kyrtzidis Importer.Import(D->getAtStartLoc()), 3328b4677b62a8e9bba0913dfe1456bd9d689cdbccacDouglas Gregor Loc, 3329b4677b62a8e9bba0913dfe1456bd9d689cdbccacDouglas Gregor Importer.Import(D->getCategoryNameLoc()), 3330955fadbdfecfa24a590febe66a86519096787f2dArgyrios Kyrtzidis Name.getAsIdentifierInfo(), 3331af300298ab86752fa64e339ba34195888a830756Fariborz Jahanian ToInterface, 3332af300298ab86752fa64e339ba34195888a830756Fariborz Jahanian Importer.Import(D->getIvarLBraceLoc()), 3333af300298ab86752fa64e339ba34195888a830756Fariborz Jahanian Importer.Import(D->getIvarRBraceLoc())); 3334b4677b62a8e9bba0913dfe1456bd9d689cdbccacDouglas Gregor ToCategory->setLexicalDeclContext(LexicalDC); 33359faf810f08132aabb34a478297dfeea89c3bbe17Sean Callanan LexicalDC->addDeclInternal(ToCategory); 3336b4677b62a8e9bba0913dfe1456bd9d689cdbccacDouglas Gregor Importer.Imported(D, ToCategory); 3337b4677b62a8e9bba0913dfe1456bd9d689cdbccacDouglas Gregor 3338b4677b62a8e9bba0913dfe1456bd9d689cdbccacDouglas Gregor // Import protocols 33395f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner SmallVector<ObjCProtocolDecl *, 4> Protocols; 33405f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner SmallVector<SourceLocation, 4> ProtocolLocs; 3341b4677b62a8e9bba0913dfe1456bd9d689cdbccacDouglas Gregor ObjCCategoryDecl::protocol_loc_iterator FromProtoLoc 3342b4677b62a8e9bba0913dfe1456bd9d689cdbccacDouglas Gregor = D->protocol_loc_begin(); 3343b4677b62a8e9bba0913dfe1456bd9d689cdbccacDouglas Gregor for (ObjCCategoryDecl::protocol_iterator FromProto = D->protocol_begin(), 3344b4677b62a8e9bba0913dfe1456bd9d689cdbccacDouglas Gregor FromProtoEnd = D->protocol_end(); 3345b4677b62a8e9bba0913dfe1456bd9d689cdbccacDouglas Gregor FromProto != FromProtoEnd; 3346b4677b62a8e9bba0913dfe1456bd9d689cdbccacDouglas Gregor ++FromProto, ++FromProtoLoc) { 3347b4677b62a8e9bba0913dfe1456bd9d689cdbccacDouglas Gregor ObjCProtocolDecl *ToProto 3348b4677b62a8e9bba0913dfe1456bd9d689cdbccacDouglas Gregor = cast_or_null<ObjCProtocolDecl>(Importer.Import(*FromProto)); 3349b4677b62a8e9bba0913dfe1456bd9d689cdbccacDouglas Gregor if (!ToProto) 33506bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return nullptr; 3351b4677b62a8e9bba0913dfe1456bd9d689cdbccacDouglas Gregor Protocols.push_back(ToProto); 3352b4677b62a8e9bba0913dfe1456bd9d689cdbccacDouglas Gregor ProtocolLocs.push_back(Importer.Import(*FromProtoLoc)); 3353b4677b62a8e9bba0913dfe1456bd9d689cdbccacDouglas Gregor } 3354b4677b62a8e9bba0913dfe1456bd9d689cdbccacDouglas Gregor 3355b4677b62a8e9bba0913dfe1456bd9d689cdbccacDouglas Gregor // FIXME: If we're merging, make sure that the protocol list is the same. 3356b4677b62a8e9bba0913dfe1456bd9d689cdbccacDouglas Gregor ToCategory->setProtocolList(Protocols.data(), Protocols.size(), 3357b4677b62a8e9bba0913dfe1456bd9d689cdbccacDouglas Gregor ProtocolLocs.data(), Importer.getToContext()); 3358b4677b62a8e9bba0913dfe1456bd9d689cdbccacDouglas Gregor 3359b4677b62a8e9bba0913dfe1456bd9d689cdbccacDouglas Gregor } else { 3360b4677b62a8e9bba0913dfe1456bd9d689cdbccacDouglas Gregor Importer.Imported(D, ToCategory); 3361b4677b62a8e9bba0913dfe1456bd9d689cdbccacDouglas Gregor } 3362b4677b62a8e9bba0913dfe1456bd9d689cdbccacDouglas Gregor 3363b4677b62a8e9bba0913dfe1456bd9d689cdbccacDouglas Gregor // Import all of the members of this category. 3364083a821bbd02bbc521275a2f144abe39a6c2745cDouglas Gregor ImportDeclContext(D); 3365b4677b62a8e9bba0913dfe1456bd9d689cdbccacDouglas Gregor 3366b4677b62a8e9bba0913dfe1456bd9d689cdbccacDouglas Gregor // If we have an implementation, import it as well. 3367b4677b62a8e9bba0913dfe1456bd9d689cdbccacDouglas Gregor if (D->getImplementation()) { 3368b4677b62a8e9bba0913dfe1456bd9d689cdbccacDouglas Gregor ObjCCategoryImplDecl *Impl 3369cad2c59b0c087edea83d0fbf6eabde4a7960c778Douglas Gregor = cast_or_null<ObjCCategoryImplDecl>( 3370cad2c59b0c087edea83d0fbf6eabde4a7960c778Douglas Gregor Importer.Import(D->getImplementation())); 3371b4677b62a8e9bba0913dfe1456bd9d689cdbccacDouglas Gregor if (!Impl) 33726bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return nullptr; 33736bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 3374b4677b62a8e9bba0913dfe1456bd9d689cdbccacDouglas Gregor ToCategory->setImplementation(Impl); 3375b4677b62a8e9bba0913dfe1456bd9d689cdbccacDouglas Gregor } 3376b4677b62a8e9bba0913dfe1456bd9d689cdbccacDouglas Gregor 3377b4677b62a8e9bba0913dfe1456bd9d689cdbccacDouglas Gregor return ToCategory; 3378b4677b62a8e9bba0913dfe1456bd9d689cdbccacDouglas Gregor} 3379b4677b62a8e9bba0913dfe1456bd9d689cdbccacDouglas Gregor 33805602f7e77e975d780f84079532408c0064566c3bDouglas Gregorbool ASTNodeImporter::ImportDefinition(ObjCProtocolDecl *From, 33815602f7e77e975d780f84079532408c0064566c3bDouglas Gregor ObjCProtocolDecl *To, 3382ac32ff9812e7d6bc31573b5499bfd005fc8b8f39Douglas Gregor ImportDefinitionKind Kind) { 33835602f7e77e975d780f84079532408c0064566c3bDouglas Gregor if (To->getDefinition()) { 3384ac32ff9812e7d6bc31573b5499bfd005fc8b8f39Douglas Gregor if (shouldForceImportDeclContext(Kind)) 3385ac32ff9812e7d6bc31573b5499bfd005fc8b8f39Douglas Gregor ImportDeclContext(From); 33865602f7e77e975d780f84079532408c0064566c3bDouglas Gregor return false; 33875602f7e77e975d780f84079532408c0064566c3bDouglas Gregor } 33885602f7e77e975d780f84079532408c0064566c3bDouglas Gregor 33895602f7e77e975d780f84079532408c0064566c3bDouglas Gregor // Start the protocol definition 33905602f7e77e975d780f84079532408c0064566c3bDouglas Gregor To->startDefinition(); 33915602f7e77e975d780f84079532408c0064566c3bDouglas Gregor 33925602f7e77e975d780f84079532408c0064566c3bDouglas Gregor // Import protocols 33935602f7e77e975d780f84079532408c0064566c3bDouglas Gregor SmallVector<ObjCProtocolDecl *, 4> Protocols; 33945602f7e77e975d780f84079532408c0064566c3bDouglas Gregor SmallVector<SourceLocation, 4> ProtocolLocs; 33955602f7e77e975d780f84079532408c0064566c3bDouglas Gregor ObjCProtocolDecl::protocol_loc_iterator 33965602f7e77e975d780f84079532408c0064566c3bDouglas Gregor FromProtoLoc = From->protocol_loc_begin(); 33975602f7e77e975d780f84079532408c0064566c3bDouglas Gregor for (ObjCProtocolDecl::protocol_iterator FromProto = From->protocol_begin(), 33985602f7e77e975d780f84079532408c0064566c3bDouglas Gregor FromProtoEnd = From->protocol_end(); 33995602f7e77e975d780f84079532408c0064566c3bDouglas Gregor FromProto != FromProtoEnd; 34005602f7e77e975d780f84079532408c0064566c3bDouglas Gregor ++FromProto, ++FromProtoLoc) { 34015602f7e77e975d780f84079532408c0064566c3bDouglas Gregor ObjCProtocolDecl *ToProto 34025602f7e77e975d780f84079532408c0064566c3bDouglas Gregor = cast_or_null<ObjCProtocolDecl>(Importer.Import(*FromProto)); 34035602f7e77e975d780f84079532408c0064566c3bDouglas Gregor if (!ToProto) 34045602f7e77e975d780f84079532408c0064566c3bDouglas Gregor return true; 34055602f7e77e975d780f84079532408c0064566c3bDouglas Gregor Protocols.push_back(ToProto); 34065602f7e77e975d780f84079532408c0064566c3bDouglas Gregor ProtocolLocs.push_back(Importer.Import(*FromProtoLoc)); 34075602f7e77e975d780f84079532408c0064566c3bDouglas Gregor } 34085602f7e77e975d780f84079532408c0064566c3bDouglas Gregor 34095602f7e77e975d780f84079532408c0064566c3bDouglas Gregor // FIXME: If we're merging, make sure that the protocol list is the same. 34105602f7e77e975d780f84079532408c0064566c3bDouglas Gregor To->setProtocolList(Protocols.data(), Protocols.size(), 34115602f7e77e975d780f84079532408c0064566c3bDouglas Gregor ProtocolLocs.data(), Importer.getToContext()); 34125602f7e77e975d780f84079532408c0064566c3bDouglas Gregor 3413ac32ff9812e7d6bc31573b5499bfd005fc8b8f39Douglas Gregor if (shouldForceImportDeclContext(Kind)) { 3414ac32ff9812e7d6bc31573b5499bfd005fc8b8f39Douglas Gregor // Import all of the members of this protocol. 3415ac32ff9812e7d6bc31573b5499bfd005fc8b8f39Douglas Gregor ImportDeclContext(From, /*ForceImport=*/true); 3416ac32ff9812e7d6bc31573b5499bfd005fc8b8f39Douglas Gregor } 34175602f7e77e975d780f84079532408c0064566c3bDouglas Gregor return false; 34185602f7e77e975d780f84079532408c0064566c3bDouglas Gregor} 34195602f7e77e975d780f84079532408c0064566c3bDouglas Gregor 34202e2a400383c7a64a927f61eeed596b08928e1d4bDouglas GregorDecl *ASTNodeImporter::VisitObjCProtocolDecl(ObjCProtocolDecl *D) { 34215602f7e77e975d780f84079532408c0064566c3bDouglas Gregor // If this protocol has a definition in the translation unit we're coming 34225602f7e77e975d780f84079532408c0064566c3bDouglas Gregor // from, but this particular declaration is not that definition, import the 34235602f7e77e975d780f84079532408c0064566c3bDouglas Gregor // definition and map to that. 34245602f7e77e975d780f84079532408c0064566c3bDouglas Gregor ObjCProtocolDecl *Definition = D->getDefinition(); 34255602f7e77e975d780f84079532408c0064566c3bDouglas Gregor if (Definition && Definition != D) { 34265602f7e77e975d780f84079532408c0064566c3bDouglas Gregor Decl *ImportedDef = Importer.Import(Definition); 34275602f7e77e975d780f84079532408c0064566c3bDouglas Gregor if (!ImportedDef) 34286bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return nullptr; 34296bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 34305602f7e77e975d780f84079532408c0064566c3bDouglas Gregor return Importer.Imported(D, ImportedDef); 34315602f7e77e975d780f84079532408c0064566c3bDouglas Gregor } 34325602f7e77e975d780f84079532408c0064566c3bDouglas Gregor 3433b4677b62a8e9bba0913dfe1456bd9d689cdbccacDouglas Gregor // Import the major distinguishing characteristics of a protocol. 34342e2a400383c7a64a927f61eeed596b08928e1d4bDouglas Gregor DeclContext *DC, *LexicalDC; 34352e2a400383c7a64a927f61eeed596b08928e1d4bDouglas Gregor DeclarationName Name; 34362e2a400383c7a64a927f61eeed596b08928e1d4bDouglas Gregor SourceLocation Loc; 34372e2a400383c7a64a927f61eeed596b08928e1d4bDouglas Gregor if (ImportDeclParts(D, DC, LexicalDC, Name, Loc)) 34386bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return nullptr; 34392e2a400383c7a64a927f61eeed596b08928e1d4bDouglas Gregor 34406bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines ObjCProtocolDecl *MergeWithProtocol = nullptr; 3441cfa88f893915ceb8ae4ce2f17c46c24a4d67502fDmitri Gribenko SmallVector<NamedDecl *, 2> FoundDecls; 3442b75a3451bcae1301875282e73a13934c90b6574cDouglas Gregor DC->localUncachedLookup(Name, FoundDecls); 3443b75a3451bcae1301875282e73a13934c90b6574cDouglas Gregor for (unsigned I = 0, N = FoundDecls.size(); I != N; ++I) { 3444b75a3451bcae1301875282e73a13934c90b6574cDouglas Gregor if (!FoundDecls[I]->isInIdentifierNamespace(Decl::IDNS_ObjCProtocol)) 34452e2a400383c7a64a927f61eeed596b08928e1d4bDouglas Gregor continue; 34462e2a400383c7a64a927f61eeed596b08928e1d4bDouglas Gregor 3447b75a3451bcae1301875282e73a13934c90b6574cDouglas Gregor if ((MergeWithProtocol = dyn_cast<ObjCProtocolDecl>(FoundDecls[I]))) 34482e2a400383c7a64a927f61eeed596b08928e1d4bDouglas Gregor break; 34492e2a400383c7a64a927f61eeed596b08928e1d4bDouglas Gregor } 34502e2a400383c7a64a927f61eeed596b08928e1d4bDouglas Gregor 34512e2a400383c7a64a927f61eeed596b08928e1d4bDouglas Gregor ObjCProtocolDecl *ToProto = MergeWithProtocol; 34525602f7e77e975d780f84079532408c0064566c3bDouglas Gregor if (!ToProto) { 34535602f7e77e975d780f84079532408c0064566c3bDouglas Gregor ToProto = ObjCProtocolDecl::Create(Importer.getToContext(), DC, 34545602f7e77e975d780f84079532408c0064566c3bDouglas Gregor Name.getAsIdentifierInfo(), Loc, 34555602f7e77e975d780f84079532408c0064566c3bDouglas Gregor Importer.Import(D->getAtStartLoc()), 34566bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines /*PrevDecl=*/nullptr); 34575602f7e77e975d780f84079532408c0064566c3bDouglas Gregor ToProto->setLexicalDeclContext(LexicalDC); 34585602f7e77e975d780f84079532408c0064566c3bDouglas Gregor LexicalDC->addDeclInternal(ToProto); 34595602f7e77e975d780f84079532408c0064566c3bDouglas Gregor } 34605e2a1ff9f28d2eab256d2553e76a9c9d54693875Douglas Gregor 34615602f7e77e975d780f84079532408c0064566c3bDouglas Gregor Importer.Imported(D, ToProto); 34622e2a400383c7a64a927f61eeed596b08928e1d4bDouglas Gregor 34635602f7e77e975d780f84079532408c0064566c3bDouglas Gregor if (D->isThisDeclarationADefinition() && ImportDefinition(D, ToProto)) 34646bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return nullptr; 34656bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 34665602f7e77e975d780f84079532408c0064566c3bDouglas Gregor return ToProto; 34675602f7e77e975d780f84079532408c0064566c3bDouglas Gregor} 34685602f7e77e975d780f84079532408c0064566c3bDouglas Gregor 34695602f7e77e975d780f84079532408c0064566c3bDouglas Gregorbool ASTNodeImporter::ImportDefinition(ObjCInterfaceDecl *From, 34705602f7e77e975d780f84079532408c0064566c3bDouglas Gregor ObjCInterfaceDecl *To, 3471ac32ff9812e7d6bc31573b5499bfd005fc8b8f39Douglas Gregor ImportDefinitionKind Kind) { 34725602f7e77e975d780f84079532408c0064566c3bDouglas Gregor if (To->getDefinition()) { 34735602f7e77e975d780f84079532408c0064566c3bDouglas Gregor // Check consistency of superclass. 34745602f7e77e975d780f84079532408c0064566c3bDouglas Gregor ObjCInterfaceDecl *FromSuper = From->getSuperClass(); 34755602f7e77e975d780f84079532408c0064566c3bDouglas Gregor if (FromSuper) { 34765602f7e77e975d780f84079532408c0064566c3bDouglas Gregor FromSuper = cast_or_null<ObjCInterfaceDecl>(Importer.Import(FromSuper)); 34775602f7e77e975d780f84079532408c0064566c3bDouglas Gregor if (!FromSuper) 34785602f7e77e975d780f84079532408c0064566c3bDouglas Gregor return true; 34792e2a400383c7a64a927f61eeed596b08928e1d4bDouglas Gregor } 34802e2a400383c7a64a927f61eeed596b08928e1d4bDouglas Gregor 34815602f7e77e975d780f84079532408c0064566c3bDouglas Gregor ObjCInterfaceDecl *ToSuper = To->getSuperClass(); 34825602f7e77e975d780f84079532408c0064566c3bDouglas Gregor if ((bool)FromSuper != (bool)ToSuper || 34835602f7e77e975d780f84079532408c0064566c3bDouglas Gregor (FromSuper && !declaresSameEntity(FromSuper, ToSuper))) { 34845602f7e77e975d780f84079532408c0064566c3bDouglas Gregor Importer.ToDiag(To->getLocation(), 34855602f7e77e975d780f84079532408c0064566c3bDouglas Gregor diag::err_odr_objc_superclass_inconsistent) 34865602f7e77e975d780f84079532408c0064566c3bDouglas Gregor << To->getDeclName(); 34875602f7e77e975d780f84079532408c0064566c3bDouglas Gregor if (ToSuper) 34885602f7e77e975d780f84079532408c0064566c3bDouglas Gregor Importer.ToDiag(To->getSuperClassLoc(), diag::note_odr_objc_superclass) 34895602f7e77e975d780f84079532408c0064566c3bDouglas Gregor << To->getSuperClass()->getDeclName(); 34905602f7e77e975d780f84079532408c0064566c3bDouglas Gregor else 34915602f7e77e975d780f84079532408c0064566c3bDouglas Gregor Importer.ToDiag(To->getLocation(), 34925602f7e77e975d780f84079532408c0064566c3bDouglas Gregor diag::note_odr_objc_missing_superclass); 34935602f7e77e975d780f84079532408c0064566c3bDouglas Gregor if (From->getSuperClass()) 34945602f7e77e975d780f84079532408c0064566c3bDouglas Gregor Importer.FromDiag(From->getSuperClassLoc(), 34955602f7e77e975d780f84079532408c0064566c3bDouglas Gregor diag::note_odr_objc_superclass) 34965602f7e77e975d780f84079532408c0064566c3bDouglas Gregor << From->getSuperClass()->getDeclName(); 34975602f7e77e975d780f84079532408c0064566c3bDouglas Gregor else 34985602f7e77e975d780f84079532408c0064566c3bDouglas Gregor Importer.FromDiag(From->getLocation(), 34995602f7e77e975d780f84079532408c0064566c3bDouglas Gregor diag::note_odr_objc_missing_superclass); 35005602f7e77e975d780f84079532408c0064566c3bDouglas Gregor } 35015602f7e77e975d780f84079532408c0064566c3bDouglas Gregor 3502ac32ff9812e7d6bc31573b5499bfd005fc8b8f39Douglas Gregor if (shouldForceImportDeclContext(Kind)) 3503ac32ff9812e7d6bc31573b5499bfd005fc8b8f39Douglas Gregor ImportDeclContext(From); 35045602f7e77e975d780f84079532408c0064566c3bDouglas Gregor return false; 35055602f7e77e975d780f84079532408c0064566c3bDouglas Gregor } 35065602f7e77e975d780f84079532408c0064566c3bDouglas Gregor 35075602f7e77e975d780f84079532408c0064566c3bDouglas Gregor // Start the definition. 35085602f7e77e975d780f84079532408c0064566c3bDouglas Gregor To->startDefinition(); 35095602f7e77e975d780f84079532408c0064566c3bDouglas Gregor 35105602f7e77e975d780f84079532408c0064566c3bDouglas Gregor // If this class has a superclass, import it. 35115602f7e77e975d780f84079532408c0064566c3bDouglas Gregor if (From->getSuperClass()) { 35125602f7e77e975d780f84079532408c0064566c3bDouglas Gregor ObjCInterfaceDecl *Super = cast_or_null<ObjCInterfaceDecl>( 35135602f7e77e975d780f84079532408c0064566c3bDouglas Gregor Importer.Import(From->getSuperClass())); 35145602f7e77e975d780f84079532408c0064566c3bDouglas Gregor if (!Super) 35155602f7e77e975d780f84079532408c0064566c3bDouglas Gregor return true; 35165602f7e77e975d780f84079532408c0064566c3bDouglas Gregor 35175602f7e77e975d780f84079532408c0064566c3bDouglas Gregor To->setSuperClass(Super); 35185602f7e77e975d780f84079532408c0064566c3bDouglas Gregor To->setSuperClassLoc(Importer.Import(From->getSuperClassLoc())); 35195602f7e77e975d780f84079532408c0064566c3bDouglas Gregor } 35205602f7e77e975d780f84079532408c0064566c3bDouglas Gregor 35215602f7e77e975d780f84079532408c0064566c3bDouglas Gregor // Import protocols 35225602f7e77e975d780f84079532408c0064566c3bDouglas Gregor SmallVector<ObjCProtocolDecl *, 4> Protocols; 35235602f7e77e975d780f84079532408c0064566c3bDouglas Gregor SmallVector<SourceLocation, 4> ProtocolLocs; 35245602f7e77e975d780f84079532408c0064566c3bDouglas Gregor ObjCInterfaceDecl::protocol_loc_iterator 35255602f7e77e975d780f84079532408c0064566c3bDouglas Gregor FromProtoLoc = From->protocol_loc_begin(); 35265602f7e77e975d780f84079532408c0064566c3bDouglas Gregor 35275602f7e77e975d780f84079532408c0064566c3bDouglas Gregor for (ObjCInterfaceDecl::protocol_iterator FromProto = From->protocol_begin(), 35285602f7e77e975d780f84079532408c0064566c3bDouglas Gregor FromProtoEnd = From->protocol_end(); 35295602f7e77e975d780f84079532408c0064566c3bDouglas Gregor FromProto != FromProtoEnd; 35305602f7e77e975d780f84079532408c0064566c3bDouglas Gregor ++FromProto, ++FromProtoLoc) { 35315602f7e77e975d780f84079532408c0064566c3bDouglas Gregor ObjCProtocolDecl *ToProto 35325602f7e77e975d780f84079532408c0064566c3bDouglas Gregor = cast_or_null<ObjCProtocolDecl>(Importer.Import(*FromProto)); 35335602f7e77e975d780f84079532408c0064566c3bDouglas Gregor if (!ToProto) 35345602f7e77e975d780f84079532408c0064566c3bDouglas Gregor return true; 35355602f7e77e975d780f84079532408c0064566c3bDouglas Gregor Protocols.push_back(ToProto); 35365602f7e77e975d780f84079532408c0064566c3bDouglas Gregor ProtocolLocs.push_back(Importer.Import(*FromProtoLoc)); 35372e2a400383c7a64a927f61eeed596b08928e1d4bDouglas Gregor } 35385602f7e77e975d780f84079532408c0064566c3bDouglas Gregor 35395602f7e77e975d780f84079532408c0064566c3bDouglas Gregor // FIXME: If we're merging, make sure that the protocol list is the same. 35405602f7e77e975d780f84079532408c0064566c3bDouglas Gregor To->setProtocolList(Protocols.data(), Protocols.size(), 35415602f7e77e975d780f84079532408c0064566c3bDouglas Gregor ProtocolLocs.data(), Importer.getToContext()); 35425602f7e77e975d780f84079532408c0064566c3bDouglas Gregor 35435602f7e77e975d780f84079532408c0064566c3bDouglas Gregor // Import categories. When the categories themselves are imported, they'll 35445602f7e77e975d780f84079532408c0064566c3bDouglas Gregor // hook themselves into this interface. 3545651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines for (auto *Cat : From->known_categories()) 3546651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines Importer.Import(Cat); 3547d329724745b49f894b768d47275b7c2713106e89Douglas Gregor 35485602f7e77e975d780f84079532408c0064566c3bDouglas Gregor // If we have an @implementation, import it as well. 35495602f7e77e975d780f84079532408c0064566c3bDouglas Gregor if (From->getImplementation()) { 35505602f7e77e975d780f84079532408c0064566c3bDouglas Gregor ObjCImplementationDecl *Impl = cast_or_null<ObjCImplementationDecl>( 35515602f7e77e975d780f84079532408c0064566c3bDouglas Gregor Importer.Import(From->getImplementation())); 35525602f7e77e975d780f84079532408c0064566c3bDouglas Gregor if (!Impl) 35535602f7e77e975d780f84079532408c0064566c3bDouglas Gregor return true; 35545602f7e77e975d780f84079532408c0064566c3bDouglas Gregor 35555602f7e77e975d780f84079532408c0064566c3bDouglas Gregor To->setImplementation(Impl); 35565602f7e77e975d780f84079532408c0064566c3bDouglas Gregor } 35572e2a400383c7a64a927f61eeed596b08928e1d4bDouglas Gregor 3558ac32ff9812e7d6bc31573b5499bfd005fc8b8f39Douglas Gregor if (shouldForceImportDeclContext(Kind)) { 3559ac32ff9812e7d6bc31573b5499bfd005fc8b8f39Douglas Gregor // Import all of the members of this class. 3560ac32ff9812e7d6bc31573b5499bfd005fc8b8f39Douglas Gregor ImportDeclContext(From, /*ForceImport=*/true); 3561ac32ff9812e7d6bc31573b5499bfd005fc8b8f39Douglas Gregor } 35625602f7e77e975d780f84079532408c0064566c3bDouglas Gregor return false; 35632e2a400383c7a64a927f61eeed596b08928e1d4bDouglas Gregor} 35642e2a400383c7a64a927f61eeed596b08928e1d4bDouglas Gregor 3565a12d294db5bd59cd8836b9bd0dafadaaa2e3dd8aDouglas GregorDecl *ASTNodeImporter::VisitObjCInterfaceDecl(ObjCInterfaceDecl *D) { 35665602f7e77e975d780f84079532408c0064566c3bDouglas Gregor // If this class has a definition in the translation unit we're coming from, 35675602f7e77e975d780f84079532408c0064566c3bDouglas Gregor // but this particular declaration is not that definition, import the 35685602f7e77e975d780f84079532408c0064566c3bDouglas Gregor // definition and map to that. 35695602f7e77e975d780f84079532408c0064566c3bDouglas Gregor ObjCInterfaceDecl *Definition = D->getDefinition(); 35705602f7e77e975d780f84079532408c0064566c3bDouglas Gregor if (Definition && Definition != D) { 35715602f7e77e975d780f84079532408c0064566c3bDouglas Gregor Decl *ImportedDef = Importer.Import(Definition); 35725602f7e77e975d780f84079532408c0064566c3bDouglas Gregor if (!ImportedDef) 35736bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return nullptr; 35746bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 35755602f7e77e975d780f84079532408c0064566c3bDouglas Gregor return Importer.Imported(D, ImportedDef); 35765602f7e77e975d780f84079532408c0064566c3bDouglas Gregor } 35775602f7e77e975d780f84079532408c0064566c3bDouglas Gregor 3578a12d294db5bd59cd8836b9bd0dafadaaa2e3dd8aDouglas Gregor // Import the major distinguishing characteristics of an @interface. 3579a12d294db5bd59cd8836b9bd0dafadaaa2e3dd8aDouglas Gregor DeclContext *DC, *LexicalDC; 3580a12d294db5bd59cd8836b9bd0dafadaaa2e3dd8aDouglas Gregor DeclarationName Name; 3581a12d294db5bd59cd8836b9bd0dafadaaa2e3dd8aDouglas Gregor SourceLocation Loc; 3582a12d294db5bd59cd8836b9bd0dafadaaa2e3dd8aDouglas Gregor if (ImportDeclParts(D, DC, LexicalDC, Name, Loc)) 35836bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return nullptr; 3584a12d294db5bd59cd8836b9bd0dafadaaa2e3dd8aDouglas Gregor 35855602f7e77e975d780f84079532408c0064566c3bDouglas Gregor // Look for an existing interface with the same name. 35866bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines ObjCInterfaceDecl *MergeWithIface = nullptr; 3587cfa88f893915ceb8ae4ce2f17c46c24a4d67502fDmitri Gribenko SmallVector<NamedDecl *, 2> FoundDecls; 3588b75a3451bcae1301875282e73a13934c90b6574cDouglas Gregor DC->localUncachedLookup(Name, FoundDecls); 3589b75a3451bcae1301875282e73a13934c90b6574cDouglas Gregor for (unsigned I = 0, N = FoundDecls.size(); I != N; ++I) { 3590b75a3451bcae1301875282e73a13934c90b6574cDouglas Gregor if (!FoundDecls[I]->isInIdentifierNamespace(Decl::IDNS_Ordinary)) 3591a12d294db5bd59cd8836b9bd0dafadaaa2e3dd8aDouglas Gregor continue; 3592a12d294db5bd59cd8836b9bd0dafadaaa2e3dd8aDouglas Gregor 3593b75a3451bcae1301875282e73a13934c90b6574cDouglas Gregor if ((MergeWithIface = dyn_cast<ObjCInterfaceDecl>(FoundDecls[I]))) 3594a12d294db5bd59cd8836b9bd0dafadaaa2e3dd8aDouglas Gregor break; 3595a12d294db5bd59cd8836b9bd0dafadaaa2e3dd8aDouglas Gregor } 3596a12d294db5bd59cd8836b9bd0dafadaaa2e3dd8aDouglas Gregor 35975602f7e77e975d780f84079532408c0064566c3bDouglas Gregor // Create an interface declaration, if one does not already exist. 3598a12d294db5bd59cd8836b9bd0dafadaaa2e3dd8aDouglas Gregor ObjCInterfaceDecl *ToIface = MergeWithIface; 35995602f7e77e975d780f84079532408c0064566c3bDouglas Gregor if (!ToIface) { 36005602f7e77e975d780f84079532408c0064566c3bDouglas Gregor ToIface = ObjCInterfaceDecl::Create(Importer.getToContext(), DC, 36015602f7e77e975d780f84079532408c0064566c3bDouglas Gregor Importer.Import(D->getAtStartLoc()), 36025602f7e77e975d780f84079532408c0064566c3bDouglas Gregor Name.getAsIdentifierInfo(), 36036bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines /*PrevDecl=*/nullptr, Loc, 36045602f7e77e975d780f84079532408c0064566c3bDouglas Gregor D->isImplicitInterfaceDecl()); 36055602f7e77e975d780f84079532408c0064566c3bDouglas Gregor ToIface->setLexicalDeclContext(LexicalDC); 36065602f7e77e975d780f84079532408c0064566c3bDouglas Gregor LexicalDC->addDeclInternal(ToIface); 3607a12d294db5bd59cd8836b9bd0dafadaaa2e3dd8aDouglas Gregor } 36085602f7e77e975d780f84079532408c0064566c3bDouglas Gregor Importer.Imported(D, ToIface); 3609a12d294db5bd59cd8836b9bd0dafadaaa2e3dd8aDouglas Gregor 36105602f7e77e975d780f84079532408c0064566c3bDouglas Gregor if (D->isThisDeclarationADefinition() && ImportDefinition(D, ToIface)) 36116bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return nullptr; 36126bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 36132e2a400383c7a64a927f61eeed596b08928e1d4bDouglas Gregor return ToIface; 3614a12d294db5bd59cd8836b9bd0dafadaaa2e3dd8aDouglas Gregor} 3615a12d294db5bd59cd8836b9bd0dafadaaa2e3dd8aDouglas Gregor 36163daef29bf390dbdb3603748280afd5827d1811daDouglas GregorDecl *ASTNodeImporter::VisitObjCCategoryImplDecl(ObjCCategoryImplDecl *D) { 36173daef29bf390dbdb3603748280afd5827d1811daDouglas Gregor ObjCCategoryDecl *Category = cast_or_null<ObjCCategoryDecl>( 36183daef29bf390dbdb3603748280afd5827d1811daDouglas Gregor Importer.Import(D->getCategoryDecl())); 36193daef29bf390dbdb3603748280afd5827d1811daDouglas Gregor if (!Category) 36206bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return nullptr; 36216bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 36223daef29bf390dbdb3603748280afd5827d1811daDouglas Gregor ObjCCategoryImplDecl *ToImpl = Category->getImplementation(); 36233daef29bf390dbdb3603748280afd5827d1811daDouglas Gregor if (!ToImpl) { 36243daef29bf390dbdb3603748280afd5827d1811daDouglas Gregor DeclContext *DC = Importer.ImportContext(D->getDeclContext()); 36253daef29bf390dbdb3603748280afd5827d1811daDouglas Gregor if (!DC) 36266bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return nullptr; 36276bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 3628c6994005dc9f677c831b8e90bdab483cc2197c29Argyrios Kyrtzidis SourceLocation CategoryNameLoc = Importer.Import(D->getCategoryNameLoc()); 36293daef29bf390dbdb3603748280afd5827d1811daDouglas Gregor ToImpl = ObjCCategoryImplDecl::Create(Importer.getToContext(), DC, 36303daef29bf390dbdb3603748280afd5827d1811daDouglas Gregor Importer.Import(D->getIdentifier()), 36311711fc91efb36d131f7ba771f73f0154dc1abd1fArgyrios Kyrtzidis Category->getClassInterface(), 36321711fc91efb36d131f7ba771f73f0154dc1abd1fArgyrios Kyrtzidis Importer.Import(D->getLocation()), 3633c6994005dc9f677c831b8e90bdab483cc2197c29Argyrios Kyrtzidis Importer.Import(D->getAtStartLoc()), 3634c6994005dc9f677c831b8e90bdab483cc2197c29Argyrios Kyrtzidis CategoryNameLoc); 36353daef29bf390dbdb3603748280afd5827d1811daDouglas Gregor 36363daef29bf390dbdb3603748280afd5827d1811daDouglas Gregor DeclContext *LexicalDC = DC; 36373daef29bf390dbdb3603748280afd5827d1811daDouglas Gregor if (D->getDeclContext() != D->getLexicalDeclContext()) { 36383daef29bf390dbdb3603748280afd5827d1811daDouglas Gregor LexicalDC = Importer.ImportContext(D->getLexicalDeclContext()); 36393daef29bf390dbdb3603748280afd5827d1811daDouglas Gregor if (!LexicalDC) 36406bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return nullptr; 36416bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 36423daef29bf390dbdb3603748280afd5827d1811daDouglas Gregor ToImpl->setLexicalDeclContext(LexicalDC); 36433daef29bf390dbdb3603748280afd5827d1811daDouglas Gregor } 36443daef29bf390dbdb3603748280afd5827d1811daDouglas Gregor 36459faf810f08132aabb34a478297dfeea89c3bbe17Sean Callanan LexicalDC->addDeclInternal(ToImpl); 36463daef29bf390dbdb3603748280afd5827d1811daDouglas Gregor Category->setImplementation(ToImpl); 36473daef29bf390dbdb3603748280afd5827d1811daDouglas Gregor } 36483daef29bf390dbdb3603748280afd5827d1811daDouglas Gregor 36493daef29bf390dbdb3603748280afd5827d1811daDouglas Gregor Importer.Imported(D, ToImpl); 3650cad2c59b0c087edea83d0fbf6eabde4a7960c778Douglas Gregor ImportDeclContext(D); 36513daef29bf390dbdb3603748280afd5827d1811daDouglas Gregor return ToImpl; 36523daef29bf390dbdb3603748280afd5827d1811daDouglas Gregor} 36533daef29bf390dbdb3603748280afd5827d1811daDouglas Gregor 3654dd182ff10b9145e432dea1fd2fb67100ccca3b10Douglas GregorDecl *ASTNodeImporter::VisitObjCImplementationDecl(ObjCImplementationDecl *D) { 3655dd182ff10b9145e432dea1fd2fb67100ccca3b10Douglas Gregor // Find the corresponding interface. 3656dd182ff10b9145e432dea1fd2fb67100ccca3b10Douglas Gregor ObjCInterfaceDecl *Iface = cast_or_null<ObjCInterfaceDecl>( 3657dd182ff10b9145e432dea1fd2fb67100ccca3b10Douglas Gregor Importer.Import(D->getClassInterface())); 3658dd182ff10b9145e432dea1fd2fb67100ccca3b10Douglas Gregor if (!Iface) 36596bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return nullptr; 3660dd182ff10b9145e432dea1fd2fb67100ccca3b10Douglas Gregor 3661dd182ff10b9145e432dea1fd2fb67100ccca3b10Douglas Gregor // Import the superclass, if any. 36626bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines ObjCInterfaceDecl *Super = nullptr; 3663dd182ff10b9145e432dea1fd2fb67100ccca3b10Douglas Gregor if (D->getSuperClass()) { 3664dd182ff10b9145e432dea1fd2fb67100ccca3b10Douglas Gregor Super = cast_or_null<ObjCInterfaceDecl>( 3665dd182ff10b9145e432dea1fd2fb67100ccca3b10Douglas Gregor Importer.Import(D->getSuperClass())); 3666dd182ff10b9145e432dea1fd2fb67100ccca3b10Douglas Gregor if (!Super) 36676bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return nullptr; 3668dd182ff10b9145e432dea1fd2fb67100ccca3b10Douglas Gregor } 3669dd182ff10b9145e432dea1fd2fb67100ccca3b10Douglas Gregor 3670dd182ff10b9145e432dea1fd2fb67100ccca3b10Douglas Gregor ObjCImplementationDecl *Impl = Iface->getImplementation(); 3671dd182ff10b9145e432dea1fd2fb67100ccca3b10Douglas Gregor if (!Impl) { 3672dd182ff10b9145e432dea1fd2fb67100ccca3b10Douglas Gregor // We haven't imported an implementation yet. Create a new @implementation 3673dd182ff10b9145e432dea1fd2fb67100ccca3b10Douglas Gregor // now. 3674dd182ff10b9145e432dea1fd2fb67100ccca3b10Douglas Gregor Impl = ObjCImplementationDecl::Create(Importer.getToContext(), 3675dd182ff10b9145e432dea1fd2fb67100ccca3b10Douglas Gregor Importer.ImportContext(D->getDeclContext()), 36761711fc91efb36d131f7ba771f73f0154dc1abd1fArgyrios Kyrtzidis Iface, Super, 3677dd182ff10b9145e432dea1fd2fb67100ccca3b10Douglas Gregor Importer.Import(D->getLocation()), 3678af300298ab86752fa64e339ba34195888a830756Fariborz Jahanian Importer.Import(D->getAtStartLoc()), 36792f729009067e6aff6198719ec9f8220d88cfea09Argyrios Kyrtzidis Importer.Import(D->getSuperClassLoc()), 3680af300298ab86752fa64e339ba34195888a830756Fariborz Jahanian Importer.Import(D->getIvarLBraceLoc()), 3681af300298ab86752fa64e339ba34195888a830756Fariborz Jahanian Importer.Import(D->getIvarRBraceLoc())); 3682dd182ff10b9145e432dea1fd2fb67100ccca3b10Douglas Gregor 3683dd182ff10b9145e432dea1fd2fb67100ccca3b10Douglas Gregor if (D->getDeclContext() != D->getLexicalDeclContext()) { 3684dd182ff10b9145e432dea1fd2fb67100ccca3b10Douglas Gregor DeclContext *LexicalDC 3685dd182ff10b9145e432dea1fd2fb67100ccca3b10Douglas Gregor = Importer.ImportContext(D->getLexicalDeclContext()); 3686dd182ff10b9145e432dea1fd2fb67100ccca3b10Douglas Gregor if (!LexicalDC) 36876bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return nullptr; 3688dd182ff10b9145e432dea1fd2fb67100ccca3b10Douglas Gregor Impl->setLexicalDeclContext(LexicalDC); 3689dd182ff10b9145e432dea1fd2fb67100ccca3b10Douglas Gregor } 3690dd182ff10b9145e432dea1fd2fb67100ccca3b10Douglas Gregor 3691dd182ff10b9145e432dea1fd2fb67100ccca3b10Douglas Gregor // Associate the implementation with the class it implements. 3692dd182ff10b9145e432dea1fd2fb67100ccca3b10Douglas Gregor Iface->setImplementation(Impl); 3693dd182ff10b9145e432dea1fd2fb67100ccca3b10Douglas Gregor Importer.Imported(D, Iface->getImplementation()); 3694dd182ff10b9145e432dea1fd2fb67100ccca3b10Douglas Gregor } else { 3695dd182ff10b9145e432dea1fd2fb67100ccca3b10Douglas Gregor Importer.Imported(D, Iface->getImplementation()); 3696dd182ff10b9145e432dea1fd2fb67100ccca3b10Douglas Gregor 3697dd182ff10b9145e432dea1fd2fb67100ccca3b10Douglas Gregor // Verify that the existing @implementation has the same superclass. 3698dd182ff10b9145e432dea1fd2fb67100ccca3b10Douglas Gregor if ((Super && !Impl->getSuperClass()) || 3699dd182ff10b9145e432dea1fd2fb67100ccca3b10Douglas Gregor (!Super && Impl->getSuperClass()) || 37006bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines (Super && Impl->getSuperClass() && 37016bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines !declaresSameEntity(Super->getCanonicalDecl(), 37026bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines Impl->getSuperClass()))) { 37036bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines Importer.ToDiag(Impl->getLocation(), 37046bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines diag::err_odr_objc_superclass_inconsistent) 37056bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines << Iface->getDeclName(); 37066bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines // FIXME: It would be nice to have the location of the superclass 37076bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines // below. 37086bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines if (Impl->getSuperClass()) 37096bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines Importer.ToDiag(Impl->getLocation(), 37106bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines diag::note_odr_objc_superclass) 37116bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines << Impl->getSuperClass()->getDeclName(); 37126bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines else 37136bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines Importer.ToDiag(Impl->getLocation(), 37146bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines diag::note_odr_objc_missing_superclass); 37156bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines if (D->getSuperClass()) 37166bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines Importer.FromDiag(D->getLocation(), 3717dd182ff10b9145e432dea1fd2fb67100ccca3b10Douglas Gregor diag::note_odr_objc_superclass) 37186bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines << D->getSuperClass()->getDeclName(); 37196bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines else 37206bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines Importer.FromDiag(D->getLocation(), 3721dd182ff10b9145e432dea1fd2fb67100ccca3b10Douglas Gregor diag::note_odr_objc_missing_superclass); 37226bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return nullptr; 3723dd182ff10b9145e432dea1fd2fb67100ccca3b10Douglas Gregor } 3724dd182ff10b9145e432dea1fd2fb67100ccca3b10Douglas Gregor } 3725dd182ff10b9145e432dea1fd2fb67100ccca3b10Douglas Gregor 3726dd182ff10b9145e432dea1fd2fb67100ccca3b10Douglas Gregor // Import all of the members of this @implementation. 3727dd182ff10b9145e432dea1fd2fb67100ccca3b10Douglas Gregor ImportDeclContext(D); 3728dd182ff10b9145e432dea1fd2fb67100ccca3b10Douglas Gregor 3729dd182ff10b9145e432dea1fd2fb67100ccca3b10Douglas Gregor return Impl; 3730dd182ff10b9145e432dea1fd2fb67100ccca3b10Douglas Gregor} 3731dd182ff10b9145e432dea1fd2fb67100ccca3b10Douglas Gregor 3732e3261624c1870e52d7efc2ac83e647713361ac6cDouglas GregorDecl *ASTNodeImporter::VisitObjCPropertyDecl(ObjCPropertyDecl *D) { 3733e3261624c1870e52d7efc2ac83e647713361ac6cDouglas Gregor // Import the major distinguishing characteristics of an @property. 3734e3261624c1870e52d7efc2ac83e647713361ac6cDouglas Gregor DeclContext *DC, *LexicalDC; 3735e3261624c1870e52d7efc2ac83e647713361ac6cDouglas Gregor DeclarationName Name; 3736e3261624c1870e52d7efc2ac83e647713361ac6cDouglas Gregor SourceLocation Loc; 3737e3261624c1870e52d7efc2ac83e647713361ac6cDouglas Gregor if (ImportDeclParts(D, DC, LexicalDC, Name, Loc)) 37386bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return nullptr; 3739e3261624c1870e52d7efc2ac83e647713361ac6cDouglas Gregor 3740e3261624c1870e52d7efc2ac83e647713361ac6cDouglas Gregor // Check whether we have already imported this property. 3741cfa88f893915ceb8ae4ce2f17c46c24a4d67502fDmitri Gribenko SmallVector<NamedDecl *, 2> FoundDecls; 3742b75a3451bcae1301875282e73a13934c90b6574cDouglas Gregor DC->localUncachedLookup(Name, FoundDecls); 3743b75a3451bcae1301875282e73a13934c90b6574cDouglas Gregor for (unsigned I = 0, N = FoundDecls.size(); I != N; ++I) { 3744e3261624c1870e52d7efc2ac83e647713361ac6cDouglas Gregor if (ObjCPropertyDecl *FoundProp 3745b75a3451bcae1301875282e73a13934c90b6574cDouglas Gregor = dyn_cast<ObjCPropertyDecl>(FoundDecls[I])) { 3746e3261624c1870e52d7efc2ac83e647713361ac6cDouglas Gregor // Check property types. 3747e3261624c1870e52d7efc2ac83e647713361ac6cDouglas Gregor if (!Importer.IsStructurallyEquivalent(D->getType(), 3748e3261624c1870e52d7efc2ac83e647713361ac6cDouglas Gregor FoundProp->getType())) { 3749e3261624c1870e52d7efc2ac83e647713361ac6cDouglas Gregor Importer.ToDiag(Loc, diag::err_odr_objc_property_type_inconsistent) 3750e3261624c1870e52d7efc2ac83e647713361ac6cDouglas Gregor << Name << D->getType() << FoundProp->getType(); 3751e3261624c1870e52d7efc2ac83e647713361ac6cDouglas Gregor Importer.ToDiag(FoundProp->getLocation(), diag::note_odr_value_here) 3752e3261624c1870e52d7efc2ac83e647713361ac6cDouglas Gregor << FoundProp->getType(); 37536bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return nullptr; 3754e3261624c1870e52d7efc2ac83e647713361ac6cDouglas Gregor } 3755e3261624c1870e52d7efc2ac83e647713361ac6cDouglas Gregor 3756e3261624c1870e52d7efc2ac83e647713361ac6cDouglas Gregor // FIXME: Check property attributes, getters, setters, etc.? 3757e3261624c1870e52d7efc2ac83e647713361ac6cDouglas Gregor 3758e3261624c1870e52d7efc2ac83e647713361ac6cDouglas Gregor // Consider these properties to be equivalent. 3759e3261624c1870e52d7efc2ac83e647713361ac6cDouglas Gregor Importer.Imported(D, FoundProp); 3760e3261624c1870e52d7efc2ac83e647713361ac6cDouglas Gregor return FoundProp; 3761e3261624c1870e52d7efc2ac83e647713361ac6cDouglas Gregor } 3762e3261624c1870e52d7efc2ac83e647713361ac6cDouglas Gregor } 3763e3261624c1870e52d7efc2ac83e647713361ac6cDouglas Gregor 3764e3261624c1870e52d7efc2ac83e647713361ac6cDouglas Gregor // Import the type. 376583a230c83a54190366138c1a4f4310ef838b88fcJohn McCall TypeSourceInfo *T = Importer.Import(D->getTypeSourceInfo()); 376683a230c83a54190366138c1a4f4310ef838b88fcJohn McCall if (!T) 37676bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return nullptr; 3768e3261624c1870e52d7efc2ac83e647713361ac6cDouglas Gregor 3769e3261624c1870e52d7efc2ac83e647713361ac6cDouglas Gregor // Create the new property. 3770e3261624c1870e52d7efc2ac83e647713361ac6cDouglas Gregor ObjCPropertyDecl *ToProperty 3771e3261624c1870e52d7efc2ac83e647713361ac6cDouglas Gregor = ObjCPropertyDecl::Create(Importer.getToContext(), DC, Loc, 3772e3261624c1870e52d7efc2ac83e647713361ac6cDouglas Gregor Name.getAsIdentifierInfo(), 3773e3261624c1870e52d7efc2ac83e647713361ac6cDouglas Gregor Importer.Import(D->getAtLoc()), 377477bfb8b43ec3f7dee3a71f6e854b03ad29dab84fFariborz Jahanian Importer.Import(D->getLParenLoc()), 3775e3261624c1870e52d7efc2ac83e647713361ac6cDouglas Gregor T, 3776e3261624c1870e52d7efc2ac83e647713361ac6cDouglas Gregor D->getPropertyImplementation()); 3777e3261624c1870e52d7efc2ac83e647713361ac6cDouglas Gregor Importer.Imported(D, ToProperty); 3778e3261624c1870e52d7efc2ac83e647713361ac6cDouglas Gregor ToProperty->setLexicalDeclContext(LexicalDC); 37799faf810f08132aabb34a478297dfeea89c3bbe17Sean Callanan LexicalDC->addDeclInternal(ToProperty); 3780e3261624c1870e52d7efc2ac83e647713361ac6cDouglas Gregor 3781e3261624c1870e52d7efc2ac83e647713361ac6cDouglas Gregor ToProperty->setPropertyAttributes(D->getPropertyAttributes()); 378280aa1cd7973561889e51c1c152c8990a8de9c953Fariborz Jahanian ToProperty->setPropertyAttributesAsWritten( 378380aa1cd7973561889e51c1c152c8990a8de9c953Fariborz Jahanian D->getPropertyAttributesAsWritten()); 3784e3261624c1870e52d7efc2ac83e647713361ac6cDouglas Gregor ToProperty->setGetterName(Importer.Import(D->getGetterName())); 3785e3261624c1870e52d7efc2ac83e647713361ac6cDouglas Gregor ToProperty->setSetterName(Importer.Import(D->getSetterName())); 3786e3261624c1870e52d7efc2ac83e647713361ac6cDouglas Gregor ToProperty->setGetterMethodDecl( 3787e3261624c1870e52d7efc2ac83e647713361ac6cDouglas Gregor cast_or_null<ObjCMethodDecl>(Importer.Import(D->getGetterMethodDecl()))); 3788e3261624c1870e52d7efc2ac83e647713361ac6cDouglas Gregor ToProperty->setSetterMethodDecl( 3789e3261624c1870e52d7efc2ac83e647713361ac6cDouglas Gregor cast_or_null<ObjCMethodDecl>(Importer.Import(D->getSetterMethodDecl()))); 3790e3261624c1870e52d7efc2ac83e647713361ac6cDouglas Gregor ToProperty->setPropertyIvarDecl( 3791e3261624c1870e52d7efc2ac83e647713361ac6cDouglas Gregor cast_or_null<ObjCIvarDecl>(Importer.Import(D->getPropertyIvarDecl()))); 3792e3261624c1870e52d7efc2ac83e647713361ac6cDouglas Gregor return ToProperty; 3793e3261624c1870e52d7efc2ac83e647713361ac6cDouglas Gregor} 3794e3261624c1870e52d7efc2ac83e647713361ac6cDouglas Gregor 3795954e0c75c42f321945aff8b9ee96da43cd90c752Douglas GregorDecl *ASTNodeImporter::VisitObjCPropertyImplDecl(ObjCPropertyImplDecl *D) { 3796954e0c75c42f321945aff8b9ee96da43cd90c752Douglas Gregor ObjCPropertyDecl *Property = cast_or_null<ObjCPropertyDecl>( 3797954e0c75c42f321945aff8b9ee96da43cd90c752Douglas Gregor Importer.Import(D->getPropertyDecl())); 3798954e0c75c42f321945aff8b9ee96da43cd90c752Douglas Gregor if (!Property) 37996bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return nullptr; 3800954e0c75c42f321945aff8b9ee96da43cd90c752Douglas Gregor 3801954e0c75c42f321945aff8b9ee96da43cd90c752Douglas Gregor DeclContext *DC = Importer.ImportContext(D->getDeclContext()); 3802954e0c75c42f321945aff8b9ee96da43cd90c752Douglas Gregor if (!DC) 38036bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return nullptr; 38046bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 3805954e0c75c42f321945aff8b9ee96da43cd90c752Douglas Gregor // Import the lexical declaration context. 3806954e0c75c42f321945aff8b9ee96da43cd90c752Douglas Gregor DeclContext *LexicalDC = DC; 3807954e0c75c42f321945aff8b9ee96da43cd90c752Douglas Gregor if (D->getDeclContext() != D->getLexicalDeclContext()) { 3808954e0c75c42f321945aff8b9ee96da43cd90c752Douglas Gregor LexicalDC = Importer.ImportContext(D->getLexicalDeclContext()); 3809954e0c75c42f321945aff8b9ee96da43cd90c752Douglas Gregor if (!LexicalDC) 38106bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return nullptr; 3811954e0c75c42f321945aff8b9ee96da43cd90c752Douglas Gregor } 3812954e0c75c42f321945aff8b9ee96da43cd90c752Douglas Gregor 3813954e0c75c42f321945aff8b9ee96da43cd90c752Douglas Gregor ObjCImplDecl *InImpl = dyn_cast<ObjCImplDecl>(LexicalDC); 3814954e0c75c42f321945aff8b9ee96da43cd90c752Douglas Gregor if (!InImpl) 38156bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return nullptr; 3816954e0c75c42f321945aff8b9ee96da43cd90c752Douglas Gregor 3817954e0c75c42f321945aff8b9ee96da43cd90c752Douglas Gregor // Import the ivar (for an @synthesize). 38186bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines ObjCIvarDecl *Ivar = nullptr; 3819954e0c75c42f321945aff8b9ee96da43cd90c752Douglas Gregor if (D->getPropertyIvarDecl()) { 3820954e0c75c42f321945aff8b9ee96da43cd90c752Douglas Gregor Ivar = cast_or_null<ObjCIvarDecl>( 3821954e0c75c42f321945aff8b9ee96da43cd90c752Douglas Gregor Importer.Import(D->getPropertyIvarDecl())); 3822954e0c75c42f321945aff8b9ee96da43cd90c752Douglas Gregor if (!Ivar) 38236bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return nullptr; 3824954e0c75c42f321945aff8b9ee96da43cd90c752Douglas Gregor } 3825954e0c75c42f321945aff8b9ee96da43cd90c752Douglas Gregor 3826954e0c75c42f321945aff8b9ee96da43cd90c752Douglas Gregor ObjCPropertyImplDecl *ToImpl 3827954e0c75c42f321945aff8b9ee96da43cd90c752Douglas Gregor = InImpl->FindPropertyImplDecl(Property->getIdentifier()); 3828954e0c75c42f321945aff8b9ee96da43cd90c752Douglas Gregor if (!ToImpl) { 3829954e0c75c42f321945aff8b9ee96da43cd90c752Douglas Gregor ToImpl = ObjCPropertyImplDecl::Create(Importer.getToContext(), DC, 3830954e0c75c42f321945aff8b9ee96da43cd90c752Douglas Gregor Importer.Import(D->getLocStart()), 3831954e0c75c42f321945aff8b9ee96da43cd90c752Douglas Gregor Importer.Import(D->getLocation()), 3832954e0c75c42f321945aff8b9ee96da43cd90c752Douglas Gregor Property, 3833954e0c75c42f321945aff8b9ee96da43cd90c752Douglas Gregor D->getPropertyImplementation(), 3834954e0c75c42f321945aff8b9ee96da43cd90c752Douglas Gregor Ivar, 3835954e0c75c42f321945aff8b9ee96da43cd90c752Douglas Gregor Importer.Import(D->getPropertyIvarDeclLoc())); 3836954e0c75c42f321945aff8b9ee96da43cd90c752Douglas Gregor ToImpl->setLexicalDeclContext(LexicalDC); 3837954e0c75c42f321945aff8b9ee96da43cd90c752Douglas Gregor Importer.Imported(D, ToImpl); 38389faf810f08132aabb34a478297dfeea89c3bbe17Sean Callanan LexicalDC->addDeclInternal(ToImpl); 3839954e0c75c42f321945aff8b9ee96da43cd90c752Douglas Gregor } else { 3840954e0c75c42f321945aff8b9ee96da43cd90c752Douglas Gregor // Check that we have the same kind of property implementation (@synthesize 3841954e0c75c42f321945aff8b9ee96da43cd90c752Douglas Gregor // vs. @dynamic). 3842954e0c75c42f321945aff8b9ee96da43cd90c752Douglas Gregor if (D->getPropertyImplementation() != ToImpl->getPropertyImplementation()) { 3843954e0c75c42f321945aff8b9ee96da43cd90c752Douglas Gregor Importer.ToDiag(ToImpl->getLocation(), 3844954e0c75c42f321945aff8b9ee96da43cd90c752Douglas Gregor diag::err_odr_objc_property_impl_kind_inconsistent) 3845954e0c75c42f321945aff8b9ee96da43cd90c752Douglas Gregor << Property->getDeclName() 3846954e0c75c42f321945aff8b9ee96da43cd90c752Douglas Gregor << (ToImpl->getPropertyImplementation() 3847954e0c75c42f321945aff8b9ee96da43cd90c752Douglas Gregor == ObjCPropertyImplDecl::Dynamic); 3848954e0c75c42f321945aff8b9ee96da43cd90c752Douglas Gregor Importer.FromDiag(D->getLocation(), 3849954e0c75c42f321945aff8b9ee96da43cd90c752Douglas Gregor diag::note_odr_objc_property_impl_kind) 3850954e0c75c42f321945aff8b9ee96da43cd90c752Douglas Gregor << D->getPropertyDecl()->getDeclName() 3851954e0c75c42f321945aff8b9ee96da43cd90c752Douglas Gregor << (D->getPropertyImplementation() == ObjCPropertyImplDecl::Dynamic); 38526bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return nullptr; 3853954e0c75c42f321945aff8b9ee96da43cd90c752Douglas Gregor } 3854954e0c75c42f321945aff8b9ee96da43cd90c752Douglas Gregor 3855954e0c75c42f321945aff8b9ee96da43cd90c752Douglas Gregor // For @synthesize, check that we have the same 3856954e0c75c42f321945aff8b9ee96da43cd90c752Douglas Gregor if (D->getPropertyImplementation() == ObjCPropertyImplDecl::Synthesize && 3857954e0c75c42f321945aff8b9ee96da43cd90c752Douglas Gregor Ivar != ToImpl->getPropertyIvarDecl()) { 3858954e0c75c42f321945aff8b9ee96da43cd90c752Douglas Gregor Importer.ToDiag(ToImpl->getPropertyIvarDeclLoc(), 3859954e0c75c42f321945aff8b9ee96da43cd90c752Douglas Gregor diag::err_odr_objc_synthesize_ivar_inconsistent) 3860954e0c75c42f321945aff8b9ee96da43cd90c752Douglas Gregor << Property->getDeclName() 3861954e0c75c42f321945aff8b9ee96da43cd90c752Douglas Gregor << ToImpl->getPropertyIvarDecl()->getDeclName() 3862954e0c75c42f321945aff8b9ee96da43cd90c752Douglas Gregor << Ivar->getDeclName(); 3863954e0c75c42f321945aff8b9ee96da43cd90c752Douglas Gregor Importer.FromDiag(D->getPropertyIvarDeclLoc(), 3864954e0c75c42f321945aff8b9ee96da43cd90c752Douglas Gregor diag::note_odr_objc_synthesize_ivar_here) 3865954e0c75c42f321945aff8b9ee96da43cd90c752Douglas Gregor << D->getPropertyIvarDecl()->getDeclName(); 38666bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return nullptr; 3867954e0c75c42f321945aff8b9ee96da43cd90c752Douglas Gregor } 3868954e0c75c42f321945aff8b9ee96da43cd90c752Douglas Gregor 3869954e0c75c42f321945aff8b9ee96da43cd90c752Douglas Gregor // Merge the existing implementation with the new implementation. 3870954e0c75c42f321945aff8b9ee96da43cd90c752Douglas Gregor Importer.Imported(D, ToImpl); 3871954e0c75c42f321945aff8b9ee96da43cd90c752Douglas Gregor } 3872954e0c75c42f321945aff8b9ee96da43cd90c752Douglas Gregor 3873954e0c75c42f321945aff8b9ee96da43cd90c752Douglas Gregor return ToImpl; 3874954e0c75c42f321945aff8b9ee96da43cd90c752Douglas Gregor} 3875954e0c75c42f321945aff8b9ee96da43cd90c752Douglas Gregor 3876040afaeea2313dc69fd532995ac88cccdd62da56Douglas GregorDecl *ASTNodeImporter::VisitTemplateTypeParmDecl(TemplateTypeParmDecl *D) { 3877040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor // For template arguments, we adopt the translation unit as our declaration 3878040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor // context. This context will be fixed when the actual template declaration 3879040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor // is created. 3880040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor 3881040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor // FIXME: Import default argument. 3882040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor return TemplateTypeParmDecl::Create(Importer.getToContext(), 3883040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor Importer.getToContext().getTranslationUnitDecl(), 3884344577e6b58f42d18dc8118c8903b49a85dc005eAbramo Bagnara Importer.Import(D->getLocStart()), 3885040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor Importer.Import(D->getLocation()), 3886040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor D->getDepth(), 3887040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor D->getIndex(), 3888040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor Importer.Import(D->getIdentifier()), 3889040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor D->wasDeclaredWithTypename(), 3890040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor D->isParameterPack()); 3891040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor} 3892040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor 3893040afaeea2313dc69fd532995ac88cccdd62da56Douglas GregorDecl * 3894040afaeea2313dc69fd532995ac88cccdd62da56Douglas GregorASTNodeImporter::VisitNonTypeTemplateParmDecl(NonTypeTemplateParmDecl *D) { 3895040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor // Import the name of this declaration. 3896040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor DeclarationName Name = Importer.Import(D->getDeclName()); 3897040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor if (D->getDeclName() && !Name) 38986bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return nullptr; 38996bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 3900040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor // Import the location of this declaration. 3901040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor SourceLocation Loc = Importer.Import(D->getLocation()); 3902040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor 3903040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor // Import the type of this declaration. 3904040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor QualType T = Importer.Import(D->getType()); 3905040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor if (T.isNull()) 39066bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return nullptr; 39076bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 3908040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor // Import type-source information. 3909040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor TypeSourceInfo *TInfo = Importer.Import(D->getTypeSourceInfo()); 3910040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor if (D->getTypeSourceInfo() && !TInfo) 39116bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return nullptr; 39126bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 3913040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor // FIXME: Import default argument. 3914040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor 3915040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor return NonTypeTemplateParmDecl::Create(Importer.getToContext(), 3916040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor Importer.getToContext().getTranslationUnitDecl(), 3917ff676cb48fe8bf7be2feaa251dc7c5fb15af4730Abramo Bagnara Importer.Import(D->getInnerLocStart()), 3918040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor Loc, D->getDepth(), D->getPosition(), 3919040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor Name.getAsIdentifierInfo(), 392010738d36b150aa65206890c1c845cdba076e4200Douglas Gregor T, D->isParameterPack(), TInfo); 3921040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor} 3922040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor 3923040afaeea2313dc69fd532995ac88cccdd62da56Douglas GregorDecl * 3924040afaeea2313dc69fd532995ac88cccdd62da56Douglas GregorASTNodeImporter::VisitTemplateTemplateParmDecl(TemplateTemplateParmDecl *D) { 3925040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor // Import the name of this declaration. 3926040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor DeclarationName Name = Importer.Import(D->getDeclName()); 3927040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor if (D->getDeclName() && !Name) 39286bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return nullptr; 39296bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 3930040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor // Import the location of this declaration. 3931040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor SourceLocation Loc = Importer.Import(D->getLocation()); 3932040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor 3933040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor // Import template parameters. 3934040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor TemplateParameterList *TemplateParams 3935040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor = ImportTemplateParameterList(D->getTemplateParameters()); 3936040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor if (!TemplateParams) 39376bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return nullptr; 39386bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 3939040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor // FIXME: Import default argument. 3940040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor 3941040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor return TemplateTemplateParmDecl::Create(Importer.getToContext(), 3942040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor Importer.getToContext().getTranslationUnitDecl(), 3943040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor Loc, D->getDepth(), D->getPosition(), 394461c4d28e36cd3f1be392cb77f07436d1fa6b0f9fDouglas Gregor D->isParameterPack(), 3945040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor Name.getAsIdentifierInfo(), 3946040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor TemplateParams); 3947040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor} 3948040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor 3949040afaeea2313dc69fd532995ac88cccdd62da56Douglas GregorDecl *ASTNodeImporter::VisitClassTemplateDecl(ClassTemplateDecl *D) { 3950040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor // If this record has a definition in the translation unit we're coming from, 3951040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor // but this particular declaration is not that definition, import the 3952040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor // definition and map to that. 3953040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor CXXRecordDecl *Definition 3954040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor = cast_or_null<CXXRecordDecl>(D->getTemplatedDecl()->getDefinition()); 3955040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor if (Definition && Definition != D->getTemplatedDecl()) { 3956040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor Decl *ImportedDef 3957040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor = Importer.Import(Definition->getDescribedClassTemplate()); 3958040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor if (!ImportedDef) 39596bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return nullptr; 39606bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 3961040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor return Importer.Imported(D, ImportedDef); 3962040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor } 3963040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor 3964040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor // Import the major distinguishing characteristics of this class template. 3965040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor DeclContext *DC, *LexicalDC; 3966040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor DeclarationName Name; 3967040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor SourceLocation Loc; 3968040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor if (ImportDeclParts(D, DC, LexicalDC, Name, Loc)) 39696bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return nullptr; 39706bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 3971040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor // We may already have a template of the same name; try to find and match it. 3972040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor if (!DC->isFunctionOrMethod()) { 39735f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner SmallVector<NamedDecl *, 4> ConflictingDecls; 3974cfa88f893915ceb8ae4ce2f17c46c24a4d67502fDmitri Gribenko SmallVector<NamedDecl *, 2> FoundDecls; 3975b75a3451bcae1301875282e73a13934c90b6574cDouglas Gregor DC->localUncachedLookup(Name, FoundDecls); 3976b75a3451bcae1301875282e73a13934c90b6574cDouglas Gregor for (unsigned I = 0, N = FoundDecls.size(); I != N; ++I) { 3977b75a3451bcae1301875282e73a13934c90b6574cDouglas Gregor if (!FoundDecls[I]->isInIdentifierNamespace(Decl::IDNS_Ordinary)) 3978040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor continue; 3979040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor 3980b75a3451bcae1301875282e73a13934c90b6574cDouglas Gregor Decl *Found = FoundDecls[I]; 3981040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor if (ClassTemplateDecl *FoundTemplate 3982040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor = dyn_cast<ClassTemplateDecl>(Found)) { 3983040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor if (IsStructuralMatch(D, FoundTemplate)) { 3984040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor // The class templates structurally match; call it the same template. 3985040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor // FIXME: We may be filling in a forward declaration here. Handle 3986040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor // this case! 3987040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor Importer.Imported(D->getTemplatedDecl(), 3988040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor FoundTemplate->getTemplatedDecl()); 3989040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor return Importer.Imported(D, FoundTemplate); 3990040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor } 3991040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor } 3992040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor 3993b75a3451bcae1301875282e73a13934c90b6574cDouglas Gregor ConflictingDecls.push_back(FoundDecls[I]); 3994040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor } 3995040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor 3996040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor if (!ConflictingDecls.empty()) { 3997040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor Name = Importer.HandleNameConflict(Name, DC, Decl::IDNS_Ordinary, 3998040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor ConflictingDecls.data(), 3999040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor ConflictingDecls.size()); 4000040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor } 4001040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor 4002040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor if (!Name) 40036bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return nullptr; 4004040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor } 4005040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor 4006040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor CXXRecordDecl *DTemplated = D->getTemplatedDecl(); 4007040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor 4008040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor // Create the declaration that is being templated. 4009ba877adeb49ed6dc17f27fa3a3bcd0cca713fd68Abramo Bagnara SourceLocation StartLoc = Importer.Import(DTemplated->getLocStart()); 4010ba877adeb49ed6dc17f27fa3a3bcd0cca713fd68Abramo Bagnara SourceLocation IdLoc = Importer.Import(DTemplated->getLocation()); 4011040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor CXXRecordDecl *D2Templated = CXXRecordDecl::Create(Importer.getToContext(), 4012040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor DTemplated->getTagKind(), 4013ba877adeb49ed6dc17f27fa3a3bcd0cca713fd68Abramo Bagnara DC, StartLoc, IdLoc, 4014ba877adeb49ed6dc17f27fa3a3bcd0cca713fd68Abramo Bagnara Name.getAsIdentifierInfo()); 4015040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor D2Templated->setAccess(DTemplated->getAccess()); 4016c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor D2Templated->setQualifierInfo(Importer.Import(DTemplated->getQualifierLoc())); 4017040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor D2Templated->setLexicalDeclContext(LexicalDC); 4018040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor 4019040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor // Create the class template declaration itself. 4020040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor TemplateParameterList *TemplateParams 4021040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor = ImportTemplateParameterList(D->getTemplateParameters()); 4022040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor if (!TemplateParams) 40236bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return nullptr; 40246bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 4025040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor ClassTemplateDecl *D2 = ClassTemplateDecl::Create(Importer.getToContext(), DC, 4026040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor Loc, Name, TemplateParams, 4027040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor D2Templated, 40286bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines /*PrevDecl=*/nullptr); 4029040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor D2Templated->setDescribedClassTemplate(D2); 4030040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor 4031040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor D2->setAccess(D->getAccess()); 4032040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor D2->setLexicalDeclContext(LexicalDC); 40339faf810f08132aabb34a478297dfeea89c3bbe17Sean Callanan LexicalDC->addDeclInternal(D2); 4034040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor 4035040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor // Note the relationship between the class templates. 4036040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor Importer.Imported(D, D2); 4037040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor Importer.Imported(DTemplated, D2Templated); 4038040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor 40395e1cdac63c3d9c9b32fa41fa0b2d242a58a20d49John McCall if (DTemplated->isCompleteDefinition() && 40405e1cdac63c3d9c9b32fa41fa0b2d242a58a20d49John McCall !D2Templated->isCompleteDefinition()) { 4041040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor // FIXME: Import definition! 4042040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor } 4043040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor 4044040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor return D2; 4045040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor} 4046040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor 4047d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas GregorDecl *ASTNodeImporter::VisitClassTemplateSpecializationDecl( 4048d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor ClassTemplateSpecializationDecl *D) { 4049d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor // If this record has a definition in the translation unit we're coming from, 4050d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor // but this particular declaration is not that definition, import the 4051d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor // definition and map to that. 4052d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor TagDecl *Definition = D->getDefinition(); 4053d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor if (Definition && Definition != D) { 4054d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor Decl *ImportedDef = Importer.Import(Definition); 4055d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor if (!ImportedDef) 40566bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return nullptr; 40576bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 4058d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor return Importer.Imported(D, ImportedDef); 4059d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor } 4060d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor 4061d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor ClassTemplateDecl *ClassTemplate 4062d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor = cast_or_null<ClassTemplateDecl>(Importer.Import( 4063d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor D->getSpecializedTemplate())); 4064d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor if (!ClassTemplate) 40656bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return nullptr; 40666bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 4067d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor // Import the context of this declaration. 4068d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor DeclContext *DC = ClassTemplate->getDeclContext(); 4069d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor if (!DC) 40706bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return nullptr; 40716bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 4072d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor DeclContext *LexicalDC = DC; 4073d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor if (D->getDeclContext() != D->getLexicalDeclContext()) { 4074d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor LexicalDC = Importer.ImportContext(D->getLexicalDeclContext()); 4075d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor if (!LexicalDC) 40766bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return nullptr; 4077d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor } 4078d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor 4079d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor // Import the location of this declaration. 4080ba877adeb49ed6dc17f27fa3a3bcd0cca713fd68Abramo Bagnara SourceLocation StartLoc = Importer.Import(D->getLocStart()); 4081ba877adeb49ed6dc17f27fa3a3bcd0cca713fd68Abramo Bagnara SourceLocation IdLoc = Importer.Import(D->getLocation()); 4082d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor 4083d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor // Import template arguments. 40845f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner SmallVector<TemplateArgument, 2> TemplateArgs; 4085d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor if (ImportTemplateArguments(D->getTemplateArgs().data(), 4086d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor D->getTemplateArgs().size(), 4087d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor TemplateArgs)) 40886bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return nullptr; 40896bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 4090d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor // Try to find an existing specialization with these template arguments. 40916bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines void *InsertPos = nullptr; 4092d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor ClassTemplateSpecializationDecl *D2 4093ef8225444452a1486bd721f3285301fe84643b00Stephen Hines = ClassTemplate->findSpecialization(TemplateArgs, InsertPos); 4094d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor if (D2) { 4095d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor // We already have a class template specialization with these template 4096d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor // arguments. 4097d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor 4098d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor // FIXME: Check for specialization vs. instantiation errors. 4099d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor 4100d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor if (RecordDecl *FoundDef = D2->getDefinition()) { 41015e1cdac63c3d9c9b32fa41fa0b2d242a58a20d49John McCall if (!D->isCompleteDefinition() || IsStructuralMatch(D, FoundDef)) { 4102d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor // The record types structurally match, or the "from" translation 4103d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor // unit only had a forward declaration anyway; call it the same 4104d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor // function. 4105d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor return Importer.Imported(D, FoundDef); 4106d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor } 4107d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor } 4108d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor } else { 4109d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor // Create a new specialization. 4110d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor D2 = ClassTemplateSpecializationDecl::Create(Importer.getToContext(), 4111d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor D->getTagKind(), DC, 4112ba877adeb49ed6dc17f27fa3a3bcd0cca713fd68Abramo Bagnara StartLoc, IdLoc, 4113ba877adeb49ed6dc17f27fa3a3bcd0cca713fd68Abramo Bagnara ClassTemplate, 4114d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor TemplateArgs.data(), 4115d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor TemplateArgs.size(), 41166bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines /*PrevDecl=*/nullptr); 4117d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor D2->setSpecializationKind(D->getSpecializationKind()); 4118d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor 4119d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor // Add this specialization to the class template. 4120d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor ClassTemplate->AddSpecialization(D2, InsertPos); 4121d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor 4122d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor // Import the qualifier, if any. 4123c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor D2->setQualifierInfo(Importer.Import(D->getQualifierLoc())); 4124d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor 4125d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor // Add the specialization to this context. 4126d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor D2->setLexicalDeclContext(LexicalDC); 41279faf810f08132aabb34a478297dfeea89c3bbe17Sean Callanan LexicalDC->addDeclInternal(D2); 4128d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor } 4129d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor Importer.Imported(D, D2); 4130d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor 41315e1cdac63c3d9c9b32fa41fa0b2d242a58a20d49John McCall if (D->isCompleteDefinition() && ImportDefinition(D, D2)) 41326bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return nullptr; 41336bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 4134d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor return D2; 4135d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor} 4136d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor 4137ef4579cda09b73e3d4d98af48201da25adc29326Larisse VoufoDecl *ASTNodeImporter::VisitVarTemplateDecl(VarTemplateDecl *D) { 4138ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo // If this variable has a definition in the translation unit we're coming 4139ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo // from, 4140ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo // but this particular declaration is not that definition, import the 4141ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo // definition and map to that. 4142ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo VarDecl *Definition = 4143ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo cast_or_null<VarDecl>(D->getTemplatedDecl()->getDefinition()); 4144ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo if (Definition && Definition != D->getTemplatedDecl()) { 4145ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo Decl *ImportedDef = Importer.Import(Definition->getDescribedVarTemplate()); 4146ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo if (!ImportedDef) 41476bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return nullptr; 4148ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo 4149ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo return Importer.Imported(D, ImportedDef); 4150ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo } 4151ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo 4152ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo // Import the major distinguishing characteristics of this variable template. 4153ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo DeclContext *DC, *LexicalDC; 4154ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo DeclarationName Name; 4155ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo SourceLocation Loc; 4156ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo if (ImportDeclParts(D, DC, LexicalDC, Name, Loc)) 41576bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return nullptr; 4158ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo 4159ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo // We may already have a template of the same name; try to find and match it. 4160ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo assert(!DC->isFunctionOrMethod() && 4161ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo "Variable templates cannot be declared at function scope"); 4162ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo SmallVector<NamedDecl *, 4> ConflictingDecls; 4163ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo SmallVector<NamedDecl *, 2> FoundDecls; 4164ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo DC->localUncachedLookup(Name, FoundDecls); 4165ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo for (unsigned I = 0, N = FoundDecls.size(); I != N; ++I) { 4166ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo if (!FoundDecls[I]->isInIdentifierNamespace(Decl::IDNS_Ordinary)) 4167ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo continue; 4168ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo 4169ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo Decl *Found = FoundDecls[I]; 4170ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo if (VarTemplateDecl *FoundTemplate = dyn_cast<VarTemplateDecl>(Found)) { 4171ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo if (IsStructuralMatch(D, FoundTemplate)) { 4172ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo // The variable templates structurally match; call it the same template. 4173ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo Importer.Imported(D->getTemplatedDecl(), 4174ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo FoundTemplate->getTemplatedDecl()); 4175ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo return Importer.Imported(D, FoundTemplate); 4176ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo } 4177ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo } 4178ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo 4179ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo ConflictingDecls.push_back(FoundDecls[I]); 4180ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo } 4181ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo 4182ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo if (!ConflictingDecls.empty()) { 4183ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo Name = Importer.HandleNameConflict(Name, DC, Decl::IDNS_Ordinary, 4184ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo ConflictingDecls.data(), 4185ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo ConflictingDecls.size()); 4186ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo } 4187ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo 4188ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo if (!Name) 41896bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return nullptr; 4190ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo 4191ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo VarDecl *DTemplated = D->getTemplatedDecl(); 4192ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo 4193ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo // Import the type. 4194ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo QualType T = Importer.Import(DTemplated->getType()); 4195ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo if (T.isNull()) 41966bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return nullptr; 4197ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo 4198ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo // Create the declaration that is being templated. 4199ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo SourceLocation StartLoc = Importer.Import(DTemplated->getLocStart()); 4200ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo SourceLocation IdLoc = Importer.Import(DTemplated->getLocation()); 4201ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo TypeSourceInfo *TInfo = Importer.Import(DTemplated->getTypeSourceInfo()); 4202ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo VarDecl *D2Templated = VarDecl::Create(Importer.getToContext(), DC, StartLoc, 4203ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo IdLoc, Name.getAsIdentifierInfo(), T, 4204ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo TInfo, DTemplated->getStorageClass()); 4205ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo D2Templated->setAccess(DTemplated->getAccess()); 4206ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo D2Templated->setQualifierInfo(Importer.Import(DTemplated->getQualifierLoc())); 4207ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo D2Templated->setLexicalDeclContext(LexicalDC); 4208ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo 4209ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo // Importer.Imported(DTemplated, D2Templated); 4210ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo // LexicalDC->addDeclInternal(D2Templated); 4211ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo 4212ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo // Merge the initializer. 4213ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo if (ImportDefinition(DTemplated, D2Templated)) 42146bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return nullptr; 4215ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo 4216ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo // Create the variable template declaration itself. 4217ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo TemplateParameterList *TemplateParams = 4218ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo ImportTemplateParameterList(D->getTemplateParameters()); 4219ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo if (!TemplateParams) 42206bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return nullptr; 4221ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo 4222ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo VarTemplateDecl *D2 = VarTemplateDecl::Create( 4223651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines Importer.getToContext(), DC, Loc, Name, TemplateParams, D2Templated); 4224ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo D2Templated->setDescribedVarTemplate(D2); 4225ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo 4226ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo D2->setAccess(D->getAccess()); 4227ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo D2->setLexicalDeclContext(LexicalDC); 4228ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo LexicalDC->addDeclInternal(D2); 4229ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo 4230ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo // Note the relationship between the variable templates. 4231ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo Importer.Imported(D, D2); 4232ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo Importer.Imported(DTemplated, D2Templated); 4233ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo 4234ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo if (DTemplated->isThisDeclarationADefinition() && 4235ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo !D2Templated->isThisDeclarationADefinition()) { 4236ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo // FIXME: Import definition! 4237ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo } 4238ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo 4239ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo return D2; 4240ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo} 4241ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo 4242ef4579cda09b73e3d4d98af48201da25adc29326Larisse VoufoDecl *ASTNodeImporter::VisitVarTemplateSpecializationDecl( 4243ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo VarTemplateSpecializationDecl *D) { 4244ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo // If this record has a definition in the translation unit we're coming from, 4245ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo // but this particular declaration is not that definition, import the 4246ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo // definition and map to that. 4247ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo VarDecl *Definition = D->getDefinition(); 4248ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo if (Definition && Definition != D) { 4249ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo Decl *ImportedDef = Importer.Import(Definition); 4250ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo if (!ImportedDef) 42516bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return nullptr; 4252ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo 4253ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo return Importer.Imported(D, ImportedDef); 4254ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo } 4255ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo 4256ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo VarTemplateDecl *VarTemplate = cast_or_null<VarTemplateDecl>( 4257ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo Importer.Import(D->getSpecializedTemplate())); 4258ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo if (!VarTemplate) 42596bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return nullptr; 4260ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo 4261ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo // Import the context of this declaration. 4262ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo DeclContext *DC = VarTemplate->getDeclContext(); 4263ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo if (!DC) 42646bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return nullptr; 4265ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo 4266ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo DeclContext *LexicalDC = DC; 4267ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo if (D->getDeclContext() != D->getLexicalDeclContext()) { 4268ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo LexicalDC = Importer.ImportContext(D->getLexicalDeclContext()); 4269ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo if (!LexicalDC) 42706bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return nullptr; 4271ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo } 4272ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo 4273ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo // Import the location of this declaration. 4274ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo SourceLocation StartLoc = Importer.Import(D->getLocStart()); 4275ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo SourceLocation IdLoc = Importer.Import(D->getLocation()); 4276ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo 4277ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo // Import template arguments. 4278ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo SmallVector<TemplateArgument, 2> TemplateArgs; 4279ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo if (ImportTemplateArguments(D->getTemplateArgs().data(), 4280ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo D->getTemplateArgs().size(), TemplateArgs)) 42816bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return nullptr; 4282ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo 4283ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo // Try to find an existing specialization with these template arguments. 42846bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines void *InsertPos = nullptr; 4285ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo VarTemplateSpecializationDecl *D2 = VarTemplate->findSpecialization( 4286ef8225444452a1486bd721f3285301fe84643b00Stephen Hines TemplateArgs, InsertPos); 4287ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo if (D2) { 4288ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo // We already have a variable template specialization with these template 4289ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo // arguments. 4290ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo 4291ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo // FIXME: Check for specialization vs. instantiation errors. 4292ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo 4293ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo if (VarDecl *FoundDef = D2->getDefinition()) { 4294ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo if (!D->isThisDeclarationADefinition() || 4295ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo IsStructuralMatch(D, FoundDef)) { 4296ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo // The record types structurally match, or the "from" translation 4297ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo // unit only had a forward declaration anyway; call it the same 4298ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo // variable. 4299ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo return Importer.Imported(D, FoundDef); 4300ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo } 4301ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo } 4302ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo } else { 4303ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo 4304ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo // Import the type. 4305ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo QualType T = Importer.Import(D->getType()); 4306ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo if (T.isNull()) 43076bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return nullptr; 4308ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo TypeSourceInfo *TInfo = Importer.Import(D->getTypeSourceInfo()); 4309ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo 4310ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo // Create a new specialization. 4311ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo D2 = VarTemplateSpecializationDecl::Create( 4312ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo Importer.getToContext(), DC, StartLoc, IdLoc, VarTemplate, T, TInfo, 4313ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo D->getStorageClass(), TemplateArgs.data(), TemplateArgs.size()); 4314ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo D2->setSpecializationKind(D->getSpecializationKind()); 4315ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo D2->setTemplateArgsInfo(D->getTemplateArgsInfo()); 4316ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo 4317ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo // Add this specialization to the class template. 4318ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo VarTemplate->AddSpecialization(D2, InsertPos); 4319ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo 4320ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo // Import the qualifier, if any. 4321ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo D2->setQualifierInfo(Importer.Import(D->getQualifierLoc())); 4322ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo 4323ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo // Add the specialization to this context. 4324ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo D2->setLexicalDeclContext(LexicalDC); 4325ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo LexicalDC->addDeclInternal(D2); 4326ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo } 4327ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo Importer.Imported(D, D2); 4328ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo 4329ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo if (D->isThisDeclarationADefinition() && ImportDefinition(D, D2)) 43306bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return nullptr; 4331ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo 4332ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo return D2; 4333ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo} 4334ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo 43354800d95d28b20eca5d57c108ae3d2e6e312c1182Douglas Gregor//---------------------------------------------------------------------------- 43364800d95d28b20eca5d57c108ae3d2e6e312c1182Douglas Gregor// Import Statements 43374800d95d28b20eca5d57c108ae3d2e6e312c1182Douglas Gregor//---------------------------------------------------------------------------- 43384800d95d28b20eca5d57c108ae3d2e6e312c1182Douglas Gregor 43394800d95d28b20eca5d57c108ae3d2e6e312c1182Douglas GregorStmt *ASTNodeImporter::VisitStmt(Stmt *S) { 43404800d95d28b20eca5d57c108ae3d2e6e312c1182Douglas Gregor Importer.FromDiag(S->getLocStart(), diag::err_unsupported_ast_node) 43414800d95d28b20eca5d57c108ae3d2e6e312c1182Douglas Gregor << S->getStmtClassName(); 43426bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return nullptr; 43434800d95d28b20eca5d57c108ae3d2e6e312c1182Douglas Gregor} 43444800d95d28b20eca5d57c108ae3d2e6e312c1182Douglas Gregor 43454800d95d28b20eca5d57c108ae3d2e6e312c1182Douglas Gregor//---------------------------------------------------------------------------- 43464800d95d28b20eca5d57c108ae3d2e6e312c1182Douglas Gregor// Import Expressions 43474800d95d28b20eca5d57c108ae3d2e6e312c1182Douglas Gregor//---------------------------------------------------------------------------- 43484800d95d28b20eca5d57c108ae3d2e6e312c1182Douglas GregorExpr *ASTNodeImporter::VisitExpr(Expr *E) { 43494800d95d28b20eca5d57c108ae3d2e6e312c1182Douglas Gregor Importer.FromDiag(E->getLocStart(), diag::err_unsupported_ast_node) 43504800d95d28b20eca5d57c108ae3d2e6e312c1182Douglas Gregor << E->getStmtClassName(); 43516bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return nullptr; 43524800d95d28b20eca5d57c108ae3d2e6e312c1182Douglas Gregor} 43534800d95d28b20eca5d57c108ae3d2e6e312c1182Douglas Gregor 4354440806306674e23ad74726208cbdc6f37849dd9dDouglas GregorExpr *ASTNodeImporter::VisitDeclRefExpr(DeclRefExpr *E) { 4355440806306674e23ad74726208cbdc6f37849dd9dDouglas Gregor ValueDecl *ToD = cast_or_null<ValueDecl>(Importer.Import(E->getDecl())); 4356440806306674e23ad74726208cbdc6f37849dd9dDouglas Gregor if (!ToD) 43576bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return nullptr; 43583aa8140bde5b9bedf13e46ec0a668daa54814196Chandler Carruth 43596bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines NamedDecl *FoundD = nullptr; 43603aa8140bde5b9bedf13e46ec0a668daa54814196Chandler Carruth if (E->getDecl() != E->getFoundDecl()) { 43613aa8140bde5b9bedf13e46ec0a668daa54814196Chandler Carruth FoundD = cast_or_null<NamedDecl>(Importer.Import(E->getFoundDecl())); 43623aa8140bde5b9bedf13e46ec0a668daa54814196Chandler Carruth if (!FoundD) 43636bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return nullptr; 43643aa8140bde5b9bedf13e46ec0a668daa54814196Chandler Carruth } 4365440806306674e23ad74726208cbdc6f37849dd9dDouglas Gregor 4366440806306674e23ad74726208cbdc6f37849dd9dDouglas Gregor QualType T = Importer.Import(E->getType()); 4367440806306674e23ad74726208cbdc6f37849dd9dDouglas Gregor if (T.isNull()) 43686bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return nullptr; 43697cc58b4c927fca539d43eaa58e00dca95946eb7cAbramo Bagnara 43707cc58b4c927fca539d43eaa58e00dca95946eb7cAbramo Bagnara DeclRefExpr *DRE = DeclRefExpr::Create(Importer.getToContext(), 43717cc58b4c927fca539d43eaa58e00dca95946eb7cAbramo Bagnara Importer.Import(E->getQualifierLoc()), 4372e4b92761b43ced611c417ae478568610f1ad7b1eAbramo Bagnara Importer.Import(E->getTemplateKeywordLoc()), 43737cc58b4c927fca539d43eaa58e00dca95946eb7cAbramo Bagnara ToD, 4374f4b88a45902af1802a1cb42ba48b1c474474f228John McCall E->refersToEnclosingLocal(), 43757cc58b4c927fca539d43eaa58e00dca95946eb7cAbramo Bagnara Importer.Import(E->getLocation()), 43767cc58b4c927fca539d43eaa58e00dca95946eb7cAbramo Bagnara T, E->getValueKind(), 43777cc58b4c927fca539d43eaa58e00dca95946eb7cAbramo Bagnara FoundD, 43786bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines /*FIXME:TemplateArgs=*/nullptr); 43797cc58b4c927fca539d43eaa58e00dca95946eb7cAbramo Bagnara if (E->hadMultipleCandidates()) 43807cc58b4c927fca539d43eaa58e00dca95946eb7cAbramo Bagnara DRE->setHadMultipleCandidates(true); 43817cc58b4c927fca539d43eaa58e00dca95946eb7cAbramo Bagnara return DRE; 4382440806306674e23ad74726208cbdc6f37849dd9dDouglas Gregor} 4383440806306674e23ad74726208cbdc6f37849dd9dDouglas Gregor 43844800d95d28b20eca5d57c108ae3d2e6e312c1182Douglas GregorExpr *ASTNodeImporter::VisitIntegerLiteral(IntegerLiteral *E) { 43854800d95d28b20eca5d57c108ae3d2e6e312c1182Douglas Gregor QualType T = Importer.Import(E->getType()); 43864800d95d28b20eca5d57c108ae3d2e6e312c1182Douglas Gregor if (T.isNull()) 43876bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return nullptr; 43884800d95d28b20eca5d57c108ae3d2e6e312c1182Douglas Gregor 43899996a7f06a3c5b4554692e7177930cf4e8ef09afArgyrios Kyrtzidis return IntegerLiteral::Create(Importer.getToContext(), 43909996a7f06a3c5b4554692e7177930cf4e8ef09afArgyrios Kyrtzidis E->getValue(), T, 43919996a7f06a3c5b4554692e7177930cf4e8ef09afArgyrios Kyrtzidis Importer.Import(E->getLocation())); 43924800d95d28b20eca5d57c108ae3d2e6e312c1182Douglas Gregor} 43934800d95d28b20eca5d57c108ae3d2e6e312c1182Douglas Gregor 4394b2e400aae8c62c4e1616016f40618baace0da065Douglas GregorExpr *ASTNodeImporter::VisitCharacterLiteral(CharacterLiteral *E) { 4395b2e400aae8c62c4e1616016f40618baace0da065Douglas Gregor QualType T = Importer.Import(E->getType()); 4396b2e400aae8c62c4e1616016f40618baace0da065Douglas Gregor if (T.isNull()) 43976bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return nullptr; 43986bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 43995cee1195584fa8672253139c86e922daeda69b9eDouglas Gregor return new (Importer.getToContext()) CharacterLiteral(E->getValue(), 44005cee1195584fa8672253139c86e922daeda69b9eDouglas Gregor E->getKind(), T, 4401b2e400aae8c62c4e1616016f40618baace0da065Douglas Gregor Importer.Import(E->getLocation())); 4402b2e400aae8c62c4e1616016f40618baace0da065Douglas Gregor} 4403b2e400aae8c62c4e1616016f40618baace0da065Douglas Gregor 4404f638f9580ba0da99a66668f00e1a1d4987067bddDouglas GregorExpr *ASTNodeImporter::VisitParenExpr(ParenExpr *E) { 4405f638f9580ba0da99a66668f00e1a1d4987067bddDouglas Gregor Expr *SubExpr = Importer.Import(E->getSubExpr()); 4406f638f9580ba0da99a66668f00e1a1d4987067bddDouglas Gregor if (!SubExpr) 44076bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return nullptr; 44086bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 4409f638f9580ba0da99a66668f00e1a1d4987067bddDouglas Gregor return new (Importer.getToContext()) 4410f638f9580ba0da99a66668f00e1a1d4987067bddDouglas Gregor ParenExpr(Importer.Import(E->getLParen()), 4411f638f9580ba0da99a66668f00e1a1d4987067bddDouglas Gregor Importer.Import(E->getRParen()), 4412f638f9580ba0da99a66668f00e1a1d4987067bddDouglas Gregor SubExpr); 4413f638f9580ba0da99a66668f00e1a1d4987067bddDouglas Gregor} 4414f638f9580ba0da99a66668f00e1a1d4987067bddDouglas Gregor 4415f638f9580ba0da99a66668f00e1a1d4987067bddDouglas GregorExpr *ASTNodeImporter::VisitUnaryOperator(UnaryOperator *E) { 4416f638f9580ba0da99a66668f00e1a1d4987067bddDouglas Gregor QualType T = Importer.Import(E->getType()); 4417f638f9580ba0da99a66668f00e1a1d4987067bddDouglas Gregor if (T.isNull()) 44186bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return nullptr; 4419f638f9580ba0da99a66668f00e1a1d4987067bddDouglas Gregor 4420f638f9580ba0da99a66668f00e1a1d4987067bddDouglas Gregor Expr *SubExpr = Importer.Import(E->getSubExpr()); 4421f638f9580ba0da99a66668f00e1a1d4987067bddDouglas Gregor if (!SubExpr) 44226bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return nullptr; 44236bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 4424f638f9580ba0da99a66668f00e1a1d4987067bddDouglas Gregor return new (Importer.getToContext()) UnaryOperator(SubExpr, E->getOpcode(), 4425f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall T, E->getValueKind(), 4426f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall E->getObjectKind(), 4427f638f9580ba0da99a66668f00e1a1d4987067bddDouglas Gregor Importer.Import(E->getOperatorLoc())); 4428f638f9580ba0da99a66668f00e1a1d4987067bddDouglas Gregor} 4429f638f9580ba0da99a66668f00e1a1d4987067bddDouglas Gregor 4430f4e3cfbe8abd124be6341ef5d714819b4fbd9082Peter CollingbourneExpr *ASTNodeImporter::VisitUnaryExprOrTypeTraitExpr( 4431f4e3cfbe8abd124be6341ef5d714819b4fbd9082Peter Collingbourne UnaryExprOrTypeTraitExpr *E) { 4432bd249a542878a626192746c1e0c0b21f164e6df7Douglas Gregor QualType ResultType = Importer.Import(E->getType()); 4433bd249a542878a626192746c1e0c0b21f164e6df7Douglas Gregor 4434bd249a542878a626192746c1e0c0b21f164e6df7Douglas Gregor if (E->isArgumentType()) { 4435bd249a542878a626192746c1e0c0b21f164e6df7Douglas Gregor TypeSourceInfo *TInfo = Importer.Import(E->getArgumentTypeInfo()); 4436bd249a542878a626192746c1e0c0b21f164e6df7Douglas Gregor if (!TInfo) 44376bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return nullptr; 44386bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 4439f4e3cfbe8abd124be6341ef5d714819b4fbd9082Peter Collingbourne return new (Importer.getToContext()) UnaryExprOrTypeTraitExpr(E->getKind(), 4440f4e3cfbe8abd124be6341ef5d714819b4fbd9082Peter Collingbourne TInfo, ResultType, 4441bd249a542878a626192746c1e0c0b21f164e6df7Douglas Gregor Importer.Import(E->getOperatorLoc()), 4442bd249a542878a626192746c1e0c0b21f164e6df7Douglas Gregor Importer.Import(E->getRParenLoc())); 4443bd249a542878a626192746c1e0c0b21f164e6df7Douglas Gregor } 4444bd249a542878a626192746c1e0c0b21f164e6df7Douglas Gregor 4445bd249a542878a626192746c1e0c0b21f164e6df7Douglas Gregor Expr *SubExpr = Importer.Import(E->getArgumentExpr()); 4446bd249a542878a626192746c1e0c0b21f164e6df7Douglas Gregor if (!SubExpr) 44476bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return nullptr; 44486bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 4449f4e3cfbe8abd124be6341ef5d714819b4fbd9082Peter Collingbourne return new (Importer.getToContext()) UnaryExprOrTypeTraitExpr(E->getKind(), 4450f4e3cfbe8abd124be6341ef5d714819b4fbd9082Peter Collingbourne SubExpr, ResultType, 4451bd249a542878a626192746c1e0c0b21f164e6df7Douglas Gregor Importer.Import(E->getOperatorLoc()), 4452bd249a542878a626192746c1e0c0b21f164e6df7Douglas Gregor Importer.Import(E->getRParenLoc())); 4453bd249a542878a626192746c1e0c0b21f164e6df7Douglas Gregor} 4454bd249a542878a626192746c1e0c0b21f164e6df7Douglas Gregor 4455f638f9580ba0da99a66668f00e1a1d4987067bddDouglas GregorExpr *ASTNodeImporter::VisitBinaryOperator(BinaryOperator *E) { 4456f638f9580ba0da99a66668f00e1a1d4987067bddDouglas Gregor QualType T = Importer.Import(E->getType()); 4457f638f9580ba0da99a66668f00e1a1d4987067bddDouglas Gregor if (T.isNull()) 44586bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return nullptr; 4459f638f9580ba0da99a66668f00e1a1d4987067bddDouglas Gregor 4460f638f9580ba0da99a66668f00e1a1d4987067bddDouglas Gregor Expr *LHS = Importer.Import(E->getLHS()); 4461f638f9580ba0da99a66668f00e1a1d4987067bddDouglas Gregor if (!LHS) 44626bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return nullptr; 44636bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 4464f638f9580ba0da99a66668f00e1a1d4987067bddDouglas Gregor Expr *RHS = Importer.Import(E->getRHS()); 4465f638f9580ba0da99a66668f00e1a1d4987067bddDouglas Gregor if (!RHS) 44666bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return nullptr; 44676bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 4468f638f9580ba0da99a66668f00e1a1d4987067bddDouglas Gregor return new (Importer.getToContext()) BinaryOperator(LHS, RHS, E->getOpcode(), 4469f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall T, E->getValueKind(), 4470f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall E->getObjectKind(), 4471be9af1288881110e406b87914162eaa59f1e5918Lang Hames Importer.Import(E->getOperatorLoc()), 4472be9af1288881110e406b87914162eaa59f1e5918Lang Hames E->isFPContractable()); 4473f638f9580ba0da99a66668f00e1a1d4987067bddDouglas Gregor} 4474f638f9580ba0da99a66668f00e1a1d4987067bddDouglas Gregor 4475f638f9580ba0da99a66668f00e1a1d4987067bddDouglas GregorExpr *ASTNodeImporter::VisitCompoundAssignOperator(CompoundAssignOperator *E) { 4476f638f9580ba0da99a66668f00e1a1d4987067bddDouglas Gregor QualType T = Importer.Import(E->getType()); 4477f638f9580ba0da99a66668f00e1a1d4987067bddDouglas Gregor if (T.isNull()) 44786bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return nullptr; 44796bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 4480f638f9580ba0da99a66668f00e1a1d4987067bddDouglas Gregor QualType CompLHSType = Importer.Import(E->getComputationLHSType()); 4481f638f9580ba0da99a66668f00e1a1d4987067bddDouglas Gregor if (CompLHSType.isNull()) 44826bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return nullptr; 44836bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 4484f638f9580ba0da99a66668f00e1a1d4987067bddDouglas Gregor QualType CompResultType = Importer.Import(E->getComputationResultType()); 4485f638f9580ba0da99a66668f00e1a1d4987067bddDouglas Gregor if (CompResultType.isNull()) 44866bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return nullptr; 44876bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 4488f638f9580ba0da99a66668f00e1a1d4987067bddDouglas Gregor Expr *LHS = Importer.Import(E->getLHS()); 4489f638f9580ba0da99a66668f00e1a1d4987067bddDouglas Gregor if (!LHS) 44906bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return nullptr; 44916bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 4492f638f9580ba0da99a66668f00e1a1d4987067bddDouglas Gregor Expr *RHS = Importer.Import(E->getRHS()); 4493f638f9580ba0da99a66668f00e1a1d4987067bddDouglas Gregor if (!RHS) 44946bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return nullptr; 44956bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 4496f638f9580ba0da99a66668f00e1a1d4987067bddDouglas Gregor return new (Importer.getToContext()) 4497f638f9580ba0da99a66668f00e1a1d4987067bddDouglas Gregor CompoundAssignOperator(LHS, RHS, E->getOpcode(), 4498f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall T, E->getValueKind(), 4499f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall E->getObjectKind(), 4500f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall CompLHSType, CompResultType, 4501be9af1288881110e406b87914162eaa59f1e5918Lang Hames Importer.Import(E->getOperatorLoc()), 4502be9af1288881110e406b87914162eaa59f1e5918Lang Hames E->isFPContractable()); 4503f638f9580ba0da99a66668f00e1a1d4987067bddDouglas Gregor} 4504f638f9580ba0da99a66668f00e1a1d4987067bddDouglas Gregor 4505da57f3eeab7b7f7f6e6788956f0a0d9adf196a7dBenjamin Kramerstatic bool ImportCastPath(CastExpr *E, CXXCastPath &Path) { 4506f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall if (E->path_empty()) return false; 4507f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall 4508f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall // TODO: import cast paths 4509f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall return true; 4510f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall} 4511f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall 451236ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas GregorExpr *ASTNodeImporter::VisitImplicitCastExpr(ImplicitCastExpr *E) { 451336ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas Gregor QualType T = Importer.Import(E->getType()); 451436ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas Gregor if (T.isNull()) 45156bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return nullptr; 451636ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas Gregor 451736ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas Gregor Expr *SubExpr = Importer.Import(E->getSubExpr()); 451836ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas Gregor if (!SubExpr) 45196bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return nullptr; 4520f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall 4521f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall CXXCastPath BasePath; 4522f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall if (ImportCastPath(E, BasePath)) 45236bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return nullptr; 4524f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall 4525f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall return ImplicitCastExpr::Create(Importer.getToContext(), T, E->getCastKind(), 45265baba9d98364a3525d6afa15a04cdad82fd6dd30John McCall SubExpr, &BasePath, E->getValueKind()); 452736ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas Gregor} 452836ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas Gregor 4529008847a70ab122a99911149199855060fb3753b4Douglas GregorExpr *ASTNodeImporter::VisitCStyleCastExpr(CStyleCastExpr *E) { 4530008847a70ab122a99911149199855060fb3753b4Douglas Gregor QualType T = Importer.Import(E->getType()); 4531008847a70ab122a99911149199855060fb3753b4Douglas Gregor if (T.isNull()) 45326bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return nullptr; 45336bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 4534008847a70ab122a99911149199855060fb3753b4Douglas Gregor Expr *SubExpr = Importer.Import(E->getSubExpr()); 4535008847a70ab122a99911149199855060fb3753b4Douglas Gregor if (!SubExpr) 45366bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return nullptr; 4537008847a70ab122a99911149199855060fb3753b4Douglas Gregor 4538008847a70ab122a99911149199855060fb3753b4Douglas Gregor TypeSourceInfo *TInfo = Importer.Import(E->getTypeInfoAsWritten()); 4539008847a70ab122a99911149199855060fb3753b4Douglas Gregor if (!TInfo && E->getTypeInfoAsWritten()) 45406bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return nullptr; 45416bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 4542f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall CXXCastPath BasePath; 4543f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall if (ImportCastPath(E, BasePath)) 45446bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return nullptr; 4545f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall 4546f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall return CStyleCastExpr::Create(Importer.getToContext(), T, 4547f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall E->getValueKind(), E->getCastKind(), 4548f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall SubExpr, &BasePath, TInfo, 4549f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall Importer.Import(E->getLParenLoc()), 4550f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall Importer.Import(E->getRParenLoc())); 4551008847a70ab122a99911149199855060fb3753b4Douglas Gregor} 4552008847a70ab122a99911149199855060fb3753b4Douglas Gregor 455333e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios KyrtzidisASTImporter::ASTImporter(ASTContext &ToContext, FileManager &ToFileManager, 4554d8868a634d4fd362243dc646e58c3cf956c81dcdDouglas Gregor ASTContext &FromContext, FileManager &FromFileManager, 4555d8868a634d4fd362243dc646e58c3cf956c81dcdDouglas Gregor bool MinimalImport) 45561b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor : ToContext(ToContext), FromContext(FromContext), 4557d8868a634d4fd362243dc646e58c3cf956c81dcdDouglas Gregor ToFileManager(ToFileManager), FromFileManager(FromFileManager), 45585b9268f26ac53a74d2c504279fe577d988d5615dRichard Smith Minimal(MinimalImport), LastDiagFromFrom(false) 4559d8868a634d4fd362243dc646e58c3cf956c81dcdDouglas Gregor{ 45609bed8798964d9f07599c2c9199701f86fbc70e20Douglas Gregor ImportedDecls[FromContext.getTranslationUnitDecl()] 45619bed8798964d9f07599c2c9199701f86fbc70e20Douglas Gregor = ToContext.getTranslationUnitDecl(); 45629bed8798964d9f07599c2c9199701f86fbc70e20Douglas Gregor} 45639bed8798964d9f07599c2c9199701f86fbc70e20Douglas Gregor 45649bed8798964d9f07599c2c9199701f86fbc70e20Douglas GregorASTImporter::~ASTImporter() { } 45651b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor 45661b2949d27ec72894dec017c330c0548af4bb2476Douglas GregorQualType ASTImporter::Import(QualType FromT) { 45671b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor if (FromT.isNull()) 45681b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor return QualType(); 4569f4c7371fb1d3cebcfb40abad4537bb82515704eaJohn McCall 4570f4c7371fb1d3cebcfb40abad4537bb82515704eaJohn McCall const Type *fromTy = FromT.getTypePtr(); 45711b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor 4572169fba50da76d71723cd1d91629cabb310f8bf9eDouglas Gregor // Check whether we've already imported this type. 4573f4c7371fb1d3cebcfb40abad4537bb82515704eaJohn McCall llvm::DenseMap<const Type *, const Type *>::iterator Pos 4574f4c7371fb1d3cebcfb40abad4537bb82515704eaJohn McCall = ImportedTypes.find(fromTy); 4575169fba50da76d71723cd1d91629cabb310f8bf9eDouglas Gregor if (Pos != ImportedTypes.end()) 4576f4c7371fb1d3cebcfb40abad4537bb82515704eaJohn McCall return ToContext.getQualifiedType(Pos->second, FromT.getLocalQualifiers()); 45771b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor 4578169fba50da76d71723cd1d91629cabb310f8bf9eDouglas Gregor // Import the type 45791b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor ASTNodeImporter Importer(*this); 4580f4c7371fb1d3cebcfb40abad4537bb82515704eaJohn McCall QualType ToT = Importer.Visit(fromTy); 45811b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor if (ToT.isNull()) 45821b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor return ToT; 45831b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor 4584169fba50da76d71723cd1d91629cabb310f8bf9eDouglas Gregor // Record the imported type. 4585f4c7371fb1d3cebcfb40abad4537bb82515704eaJohn McCall ImportedTypes[fromTy] = ToT.getTypePtr(); 4586169fba50da76d71723cd1d91629cabb310f8bf9eDouglas Gregor 4587f4c7371fb1d3cebcfb40abad4537bb82515704eaJohn McCall return ToContext.getQualifiedType(ToT, FromT.getLocalQualifiers()); 45881b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor} 45891b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor 45909bed8798964d9f07599c2c9199701f86fbc70e20Douglas GregorTypeSourceInfo *ASTImporter::Import(TypeSourceInfo *FromTSI) { 459182fc4bfa6f8ea35488b9038dd83d40766c3645cfDouglas Gregor if (!FromTSI) 459282fc4bfa6f8ea35488b9038dd83d40766c3645cfDouglas Gregor return FromTSI; 459382fc4bfa6f8ea35488b9038dd83d40766c3645cfDouglas Gregor 459482fc4bfa6f8ea35488b9038dd83d40766c3645cfDouglas Gregor // FIXME: For now we just create a "trivial" type source info based 45955606220447c7901ba8d80147ddab893bb7949dd5Nick Lewycky // on the type and a single location. Implement a real version of this. 459682fc4bfa6f8ea35488b9038dd83d40766c3645cfDouglas Gregor QualType T = Import(FromTSI->getType()); 459782fc4bfa6f8ea35488b9038dd83d40766c3645cfDouglas Gregor if (T.isNull()) 45986bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return nullptr; 459982fc4bfa6f8ea35488b9038dd83d40766c3645cfDouglas Gregor 460082fc4bfa6f8ea35488b9038dd83d40766c3645cfDouglas Gregor return ToContext.getTrivialTypeSourceInfo(T, 460196a0014f9b963d8a987f1cccd48808a47f9c6331Daniel Dunbar FromTSI->getTypeLoc().getLocStart()); 46029bed8798964d9f07599c2c9199701f86fbc70e20Douglas Gregor} 46039bed8798964d9f07599c2c9199701f86fbc70e20Douglas Gregor 46049bed8798964d9f07599c2c9199701f86fbc70e20Douglas GregorDecl *ASTImporter::Import(Decl *FromD) { 46059bed8798964d9f07599c2c9199701f86fbc70e20Douglas Gregor if (!FromD) 46066bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return nullptr; 46079bed8798964d9f07599c2c9199701f86fbc70e20Douglas Gregor 46081cf038c516c5e1f56ea9cff61aac7f7841744a91Douglas Gregor ASTNodeImporter Importer(*this); 46091cf038c516c5e1f56ea9cff61aac7f7841744a91Douglas Gregor 46109bed8798964d9f07599c2c9199701f86fbc70e20Douglas Gregor // Check whether we've already imported this declaration. 46119bed8798964d9f07599c2c9199701f86fbc70e20Douglas Gregor llvm::DenseMap<Decl *, Decl *>::iterator Pos = ImportedDecls.find(FromD); 46121cf038c516c5e1f56ea9cff61aac7f7841744a91Douglas Gregor if (Pos != ImportedDecls.end()) { 46131cf038c516c5e1f56ea9cff61aac7f7841744a91Douglas Gregor Decl *ToD = Pos->second; 46141cf038c516c5e1f56ea9cff61aac7f7841744a91Douglas Gregor Importer.ImportDefinitionIfNeeded(FromD, ToD); 46151cf038c516c5e1f56ea9cff61aac7f7841744a91Douglas Gregor return ToD; 46161cf038c516c5e1f56ea9cff61aac7f7841744a91Douglas Gregor } 46179bed8798964d9f07599c2c9199701f86fbc70e20Douglas Gregor 46189bed8798964d9f07599c2c9199701f86fbc70e20Douglas Gregor // Import the type 46199bed8798964d9f07599c2c9199701f86fbc70e20Douglas Gregor Decl *ToD = Importer.Visit(FromD); 46209bed8798964d9f07599c2c9199701f86fbc70e20Douglas Gregor if (!ToD) 46216bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return nullptr; 46226bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 46239bed8798964d9f07599c2c9199701f86fbc70e20Douglas Gregor // Record the imported declaration. 46249bed8798964d9f07599c2c9199701f86fbc70e20Douglas Gregor ImportedDecls[FromD] = ToD; 4625ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor 4626ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor if (TagDecl *FromTag = dyn_cast<TagDecl>(FromD)) { 4627ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor // Keep track of anonymous tags that have an associated typedef. 4628162e1c1b487352434552147967c3dd296ebee2f7Richard Smith if (FromTag->getTypedefNameForAnonDecl()) 4629ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor AnonTagsWithPendingTypedefs.push_back(FromTag); 4630162e1c1b487352434552147967c3dd296ebee2f7Richard Smith } else if (TypedefNameDecl *FromTypedef = dyn_cast<TypedefNameDecl>(FromD)) { 4631ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor // When we've finished transforming a typedef, see whether it was the 4632ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor // typedef for an anonymous tag. 463309d19efaa147762f84aed55efa7930bb3616a4e5Craig Topper for (SmallVectorImpl<TagDecl *>::iterator 4634ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor FromTag = AnonTagsWithPendingTypedefs.begin(), 4635ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor FromTagEnd = AnonTagsWithPendingTypedefs.end(); 4636ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor FromTag != FromTagEnd; ++FromTag) { 4637162e1c1b487352434552147967c3dd296ebee2f7Richard Smith if ((*FromTag)->getTypedefNameForAnonDecl() == FromTypedef) { 4638ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor if (TagDecl *ToTag = cast_or_null<TagDecl>(Import(*FromTag))) { 4639ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor // We found the typedef for an anonymous tag; link them. 4640162e1c1b487352434552147967c3dd296ebee2f7Richard Smith ToTag->setTypedefNameForAnonDecl(cast<TypedefNameDecl>(ToD)); 4641ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor AnonTagsWithPendingTypedefs.erase(FromTag); 4642ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor break; 4643ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor } 4644ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor } 4645ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor } 4646ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor } 4647ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor 46489bed8798964d9f07599c2c9199701f86fbc70e20Douglas Gregor return ToD; 46499bed8798964d9f07599c2c9199701f86fbc70e20Douglas Gregor} 46509bed8798964d9f07599c2c9199701f86fbc70e20Douglas Gregor 46519bed8798964d9f07599c2c9199701f86fbc70e20Douglas GregorDeclContext *ASTImporter::ImportContext(DeclContext *FromDC) { 46529bed8798964d9f07599c2c9199701f86fbc70e20Douglas Gregor if (!FromDC) 46539bed8798964d9f07599c2c9199701f86fbc70e20Douglas Gregor return FromDC; 46549bed8798964d9f07599c2c9199701f86fbc70e20Douglas Gregor 4655cd0d56a523f877ffd1fe1575caf758b4357f1661Douglas Gregor DeclContext *ToDC = cast_or_null<DeclContext>(Import(cast<Decl>(FromDC))); 4656ac32ff9812e7d6bc31573b5499bfd005fc8b8f39Douglas Gregor if (!ToDC) 46576bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return nullptr; 46586bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 4659ac32ff9812e7d6bc31573b5499bfd005fc8b8f39Douglas Gregor // When we're using a record/enum/Objective-C class/protocol as a context, we 4660ac32ff9812e7d6bc31573b5499bfd005fc8b8f39Douglas Gregor // need it to have a definition. 4661ac32ff9812e7d6bc31573b5499bfd005fc8b8f39Douglas Gregor if (RecordDecl *ToRecord = dyn_cast<RecordDecl>(ToDC)) { 4662568991b62a29c1919e67438e0ac8216715b2c760Douglas Gregor RecordDecl *FromRecord = cast<RecordDecl>(FromDC); 4663ac32ff9812e7d6bc31573b5499bfd005fc8b8f39Douglas Gregor if (ToRecord->isCompleteDefinition()) { 4664ac32ff9812e7d6bc31573b5499bfd005fc8b8f39Douglas Gregor // Do nothing. 4665ac32ff9812e7d6bc31573b5499bfd005fc8b8f39Douglas Gregor } else if (FromRecord->isCompleteDefinition()) { 4666ac32ff9812e7d6bc31573b5499bfd005fc8b8f39Douglas Gregor ASTNodeImporter(*this).ImportDefinition(FromRecord, ToRecord, 4667ac32ff9812e7d6bc31573b5499bfd005fc8b8f39Douglas Gregor ASTNodeImporter::IDK_Basic); 4668ac32ff9812e7d6bc31573b5499bfd005fc8b8f39Douglas Gregor } else { 4669ac32ff9812e7d6bc31573b5499bfd005fc8b8f39Douglas Gregor CompleteDecl(ToRecord); 4670ac32ff9812e7d6bc31573b5499bfd005fc8b8f39Douglas Gregor } 4671ac32ff9812e7d6bc31573b5499bfd005fc8b8f39Douglas Gregor } else if (EnumDecl *ToEnum = dyn_cast<EnumDecl>(ToDC)) { 4672ac32ff9812e7d6bc31573b5499bfd005fc8b8f39Douglas Gregor EnumDecl *FromEnum = cast<EnumDecl>(FromDC); 4673ac32ff9812e7d6bc31573b5499bfd005fc8b8f39Douglas Gregor if (ToEnum->isCompleteDefinition()) { 4674ac32ff9812e7d6bc31573b5499bfd005fc8b8f39Douglas Gregor // Do nothing. 4675ac32ff9812e7d6bc31573b5499bfd005fc8b8f39Douglas Gregor } else if (FromEnum->isCompleteDefinition()) { 4676ac32ff9812e7d6bc31573b5499bfd005fc8b8f39Douglas Gregor ASTNodeImporter(*this).ImportDefinition(FromEnum, ToEnum, 4677ac32ff9812e7d6bc31573b5499bfd005fc8b8f39Douglas Gregor ASTNodeImporter::IDK_Basic); 4678ac32ff9812e7d6bc31573b5499bfd005fc8b8f39Douglas Gregor } else { 4679ac32ff9812e7d6bc31573b5499bfd005fc8b8f39Douglas Gregor CompleteDecl(ToEnum); 4680ac32ff9812e7d6bc31573b5499bfd005fc8b8f39Douglas Gregor } 4681ac32ff9812e7d6bc31573b5499bfd005fc8b8f39Douglas Gregor } else if (ObjCInterfaceDecl *ToClass = dyn_cast<ObjCInterfaceDecl>(ToDC)) { 4682ac32ff9812e7d6bc31573b5499bfd005fc8b8f39Douglas Gregor ObjCInterfaceDecl *FromClass = cast<ObjCInterfaceDecl>(FromDC); 4683ac32ff9812e7d6bc31573b5499bfd005fc8b8f39Douglas Gregor if (ToClass->getDefinition()) { 4684ac32ff9812e7d6bc31573b5499bfd005fc8b8f39Douglas Gregor // Do nothing. 4685ac32ff9812e7d6bc31573b5499bfd005fc8b8f39Douglas Gregor } else if (ObjCInterfaceDecl *FromDef = FromClass->getDefinition()) { 4686ac32ff9812e7d6bc31573b5499bfd005fc8b8f39Douglas Gregor ASTNodeImporter(*this).ImportDefinition(FromDef, ToClass, 4687ac32ff9812e7d6bc31573b5499bfd005fc8b8f39Douglas Gregor ASTNodeImporter::IDK_Basic); 4688ac32ff9812e7d6bc31573b5499bfd005fc8b8f39Douglas Gregor } else { 4689ac32ff9812e7d6bc31573b5499bfd005fc8b8f39Douglas Gregor CompleteDecl(ToClass); 4690ac32ff9812e7d6bc31573b5499bfd005fc8b8f39Douglas Gregor } 4691ac32ff9812e7d6bc31573b5499bfd005fc8b8f39Douglas Gregor } else if (ObjCProtocolDecl *ToProto = dyn_cast<ObjCProtocolDecl>(ToDC)) { 4692ac32ff9812e7d6bc31573b5499bfd005fc8b8f39Douglas Gregor ObjCProtocolDecl *FromProto = cast<ObjCProtocolDecl>(FromDC); 4693ac32ff9812e7d6bc31573b5499bfd005fc8b8f39Douglas Gregor if (ToProto->getDefinition()) { 4694ac32ff9812e7d6bc31573b5499bfd005fc8b8f39Douglas Gregor // Do nothing. 4695ac32ff9812e7d6bc31573b5499bfd005fc8b8f39Douglas Gregor } else if (ObjCProtocolDecl *FromDef = FromProto->getDefinition()) { 4696ac32ff9812e7d6bc31573b5499bfd005fc8b8f39Douglas Gregor ASTNodeImporter(*this).ImportDefinition(FromDef, ToProto, 4697ac32ff9812e7d6bc31573b5499bfd005fc8b8f39Douglas Gregor ASTNodeImporter::IDK_Basic); 4698ac32ff9812e7d6bc31573b5499bfd005fc8b8f39Douglas Gregor } else { 4699ac32ff9812e7d6bc31573b5499bfd005fc8b8f39Douglas Gregor CompleteDecl(ToProto); 4700ac32ff9812e7d6bc31573b5499bfd005fc8b8f39Douglas Gregor } 4701cd0d56a523f877ffd1fe1575caf758b4357f1661Douglas Gregor } 4702cd0d56a523f877ffd1fe1575caf758b4357f1661Douglas Gregor 4703cd0d56a523f877ffd1fe1575caf758b4357f1661Douglas Gregor return ToDC; 47049bed8798964d9f07599c2c9199701f86fbc70e20Douglas Gregor} 47059bed8798964d9f07599c2c9199701f86fbc70e20Douglas Gregor 47069bed8798964d9f07599c2c9199701f86fbc70e20Douglas GregorExpr *ASTImporter::Import(Expr *FromE) { 47079bed8798964d9f07599c2c9199701f86fbc70e20Douglas Gregor if (!FromE) 47086bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return nullptr; 47099bed8798964d9f07599c2c9199701f86fbc70e20Douglas Gregor 47109bed8798964d9f07599c2c9199701f86fbc70e20Douglas Gregor return cast_or_null<Expr>(Import(cast<Stmt>(FromE))); 47119bed8798964d9f07599c2c9199701f86fbc70e20Douglas Gregor} 47129bed8798964d9f07599c2c9199701f86fbc70e20Douglas Gregor 47139bed8798964d9f07599c2c9199701f86fbc70e20Douglas GregorStmt *ASTImporter::Import(Stmt *FromS) { 47149bed8798964d9f07599c2c9199701f86fbc70e20Douglas Gregor if (!FromS) 47156bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return nullptr; 47169bed8798964d9f07599c2c9199701f86fbc70e20Douglas Gregor 47174800d95d28b20eca5d57c108ae3d2e6e312c1182Douglas Gregor // Check whether we've already imported this declaration. 47184800d95d28b20eca5d57c108ae3d2e6e312c1182Douglas Gregor llvm::DenseMap<Stmt *, Stmt *>::iterator Pos = ImportedStmts.find(FromS); 47194800d95d28b20eca5d57c108ae3d2e6e312c1182Douglas Gregor if (Pos != ImportedStmts.end()) 47204800d95d28b20eca5d57c108ae3d2e6e312c1182Douglas Gregor return Pos->second; 47214800d95d28b20eca5d57c108ae3d2e6e312c1182Douglas Gregor 47224800d95d28b20eca5d57c108ae3d2e6e312c1182Douglas Gregor // Import the type 47234800d95d28b20eca5d57c108ae3d2e6e312c1182Douglas Gregor ASTNodeImporter Importer(*this); 47244800d95d28b20eca5d57c108ae3d2e6e312c1182Douglas Gregor Stmt *ToS = Importer.Visit(FromS); 47254800d95d28b20eca5d57c108ae3d2e6e312c1182Douglas Gregor if (!ToS) 47266bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return nullptr; 47276bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 47284800d95d28b20eca5d57c108ae3d2e6e312c1182Douglas Gregor // Record the imported declaration. 47294800d95d28b20eca5d57c108ae3d2e6e312c1182Douglas Gregor ImportedStmts[FromS] = ToS; 47304800d95d28b20eca5d57c108ae3d2e6e312c1182Douglas Gregor return ToS; 47319bed8798964d9f07599c2c9199701f86fbc70e20Douglas Gregor} 47329bed8798964d9f07599c2c9199701f86fbc70e20Douglas Gregor 47339bed8798964d9f07599c2c9199701f86fbc70e20Douglas GregorNestedNameSpecifier *ASTImporter::Import(NestedNameSpecifier *FromNNS) { 47349bed8798964d9f07599c2c9199701f86fbc70e20Douglas Gregor if (!FromNNS) 47356bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return nullptr; 47369bed8798964d9f07599c2c9199701f86fbc70e20Douglas Gregor 47378703b1c8f95a43c0208ae8acc6b209d99c11f386Douglas Gregor NestedNameSpecifier *prefix = Import(FromNNS->getPrefix()); 47388703b1c8f95a43c0208ae8acc6b209d99c11f386Douglas Gregor 47398703b1c8f95a43c0208ae8acc6b209d99c11f386Douglas Gregor switch (FromNNS->getKind()) { 47408703b1c8f95a43c0208ae8acc6b209d99c11f386Douglas Gregor case NestedNameSpecifier::Identifier: 47418703b1c8f95a43c0208ae8acc6b209d99c11f386Douglas Gregor if (IdentifierInfo *II = Import(FromNNS->getAsIdentifier())) { 47428703b1c8f95a43c0208ae8acc6b209d99c11f386Douglas Gregor return NestedNameSpecifier::Create(ToContext, prefix, II); 47438703b1c8f95a43c0208ae8acc6b209d99c11f386Douglas Gregor } 47446bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return nullptr; 47458703b1c8f95a43c0208ae8acc6b209d99c11f386Douglas Gregor 47468703b1c8f95a43c0208ae8acc6b209d99c11f386Douglas Gregor case NestedNameSpecifier::Namespace: 47478703b1c8f95a43c0208ae8acc6b209d99c11f386Douglas Gregor if (NamespaceDecl *NS = 47488703b1c8f95a43c0208ae8acc6b209d99c11f386Douglas Gregor cast<NamespaceDecl>(Import(FromNNS->getAsNamespace()))) { 47498703b1c8f95a43c0208ae8acc6b209d99c11f386Douglas Gregor return NestedNameSpecifier::Create(ToContext, prefix, NS); 47508703b1c8f95a43c0208ae8acc6b209d99c11f386Douglas Gregor } 47516bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return nullptr; 47528703b1c8f95a43c0208ae8acc6b209d99c11f386Douglas Gregor 47538703b1c8f95a43c0208ae8acc6b209d99c11f386Douglas Gregor case NestedNameSpecifier::NamespaceAlias: 47548703b1c8f95a43c0208ae8acc6b209d99c11f386Douglas Gregor if (NamespaceAliasDecl *NSAD = 47558703b1c8f95a43c0208ae8acc6b209d99c11f386Douglas Gregor cast<NamespaceAliasDecl>(Import(FromNNS->getAsNamespaceAlias()))) { 47568703b1c8f95a43c0208ae8acc6b209d99c11f386Douglas Gregor return NestedNameSpecifier::Create(ToContext, prefix, NSAD); 47578703b1c8f95a43c0208ae8acc6b209d99c11f386Douglas Gregor } 47586bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return nullptr; 47598703b1c8f95a43c0208ae8acc6b209d99c11f386Douglas Gregor 47608703b1c8f95a43c0208ae8acc6b209d99c11f386Douglas Gregor case NestedNameSpecifier::Global: 47618703b1c8f95a43c0208ae8acc6b209d99c11f386Douglas Gregor return NestedNameSpecifier::GlobalSpecifier(ToContext); 47628703b1c8f95a43c0208ae8acc6b209d99c11f386Douglas Gregor 47638703b1c8f95a43c0208ae8acc6b209d99c11f386Douglas Gregor case NestedNameSpecifier::TypeSpec: 47648703b1c8f95a43c0208ae8acc6b209d99c11f386Douglas Gregor case NestedNameSpecifier::TypeSpecWithTemplate: { 47658703b1c8f95a43c0208ae8acc6b209d99c11f386Douglas Gregor QualType T = Import(QualType(FromNNS->getAsType(), 0u)); 47668703b1c8f95a43c0208ae8acc6b209d99c11f386Douglas Gregor if (!T.isNull()) { 47678703b1c8f95a43c0208ae8acc6b209d99c11f386Douglas Gregor bool bTemplate = FromNNS->getKind() == 47688703b1c8f95a43c0208ae8acc6b209d99c11f386Douglas Gregor NestedNameSpecifier::TypeSpecWithTemplate; 47698703b1c8f95a43c0208ae8acc6b209d99c11f386Douglas Gregor return NestedNameSpecifier::Create(ToContext, prefix, 47708703b1c8f95a43c0208ae8acc6b209d99c11f386Douglas Gregor bTemplate, T.getTypePtr()); 47718703b1c8f95a43c0208ae8acc6b209d99c11f386Douglas Gregor } 47728703b1c8f95a43c0208ae8acc6b209d99c11f386Douglas Gregor } 47736bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return nullptr; 47748703b1c8f95a43c0208ae8acc6b209d99c11f386Douglas Gregor } 47758703b1c8f95a43c0208ae8acc6b209d99c11f386Douglas Gregor 47768703b1c8f95a43c0208ae8acc6b209d99c11f386Douglas Gregor llvm_unreachable("Invalid nested name specifier kind"); 47779bed8798964d9f07599c2c9199701f86fbc70e20Douglas Gregor} 47789bed8798964d9f07599c2c9199701f86fbc70e20Douglas Gregor 4779c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas GregorNestedNameSpecifierLoc ASTImporter::Import(NestedNameSpecifierLoc FromNNS) { 4780c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor // FIXME: Implement! 4781c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor return NestedNameSpecifierLoc(); 4782c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor} 4783c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor 4784d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas GregorTemplateName ASTImporter::Import(TemplateName From) { 4785d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor switch (From.getKind()) { 4786d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor case TemplateName::Template: 4787d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor if (TemplateDecl *ToTemplate 4788d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor = cast_or_null<TemplateDecl>(Import(From.getAsTemplateDecl()))) 4789d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor return TemplateName(ToTemplate); 4790d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor 4791d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor return TemplateName(); 4792d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor 4793d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor case TemplateName::OverloadedTemplate: { 4794d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor OverloadedTemplateStorage *FromStorage = From.getAsOverloadedTemplate(); 4795d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor UnresolvedSet<2> ToTemplates; 4796d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor for (OverloadedTemplateStorage::iterator I = FromStorage->begin(), 4797d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor E = FromStorage->end(); 4798d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor I != E; ++I) { 4799d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor if (NamedDecl *To = cast_or_null<NamedDecl>(Import(*I))) 4800d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor ToTemplates.addDecl(To); 4801d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor else 4802d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor return TemplateName(); 4803d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor } 4804d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor return ToContext.getOverloadedTemplateName(ToTemplates.begin(), 4805d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor ToTemplates.end()); 4806d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor } 4807d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor 4808d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor case TemplateName::QualifiedTemplate: { 4809d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor QualifiedTemplateName *QTN = From.getAsQualifiedTemplateName(); 4810d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor NestedNameSpecifier *Qualifier = Import(QTN->getQualifier()); 4811d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor if (!Qualifier) 4812d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor return TemplateName(); 4813d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor 4814d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor if (TemplateDecl *ToTemplate 4815d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor = cast_or_null<TemplateDecl>(Import(From.getAsTemplateDecl()))) 4816d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor return ToContext.getQualifiedTemplateName(Qualifier, 4817d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor QTN->hasTemplateKeyword(), 4818d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor ToTemplate); 4819d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor 4820d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor return TemplateName(); 4821d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor } 4822d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor 4823d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor case TemplateName::DependentTemplate: { 4824d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor DependentTemplateName *DTN = From.getAsDependentTemplateName(); 4825d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor NestedNameSpecifier *Qualifier = Import(DTN->getQualifier()); 4826d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor if (!Qualifier) 4827d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor return TemplateName(); 4828d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor 4829d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor if (DTN->isIdentifier()) { 4830d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor return ToContext.getDependentTemplateName(Qualifier, 4831d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor Import(DTN->getIdentifier())); 4832d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor } 4833d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor 4834d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor return ToContext.getDependentTemplateName(Qualifier, DTN->getOperator()); 4835d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor } 4836146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall 4837146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall case TemplateName::SubstTemplateTemplateParm: { 4838146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall SubstTemplateTemplateParmStorage *subst 4839146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall = From.getAsSubstTemplateTemplateParm(); 4840146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall TemplateTemplateParmDecl *param 4841146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall = cast_or_null<TemplateTemplateParmDecl>(Import(subst->getParameter())); 4842146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall if (!param) 4843146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall return TemplateName(); 4844146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall 4845146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall TemplateName replacement = Import(subst->getReplacement()); 4846146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall if (replacement.isNull()) return TemplateName(); 4847146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall 4848146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall return ToContext.getSubstTemplateTemplateParm(param, replacement); 4849146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall } 48501aee05d08b2184acadeb36de300e216390780d6cDouglas Gregor 48511aee05d08b2184acadeb36de300e216390780d6cDouglas Gregor case TemplateName::SubstTemplateTemplateParmPack: { 48521aee05d08b2184acadeb36de300e216390780d6cDouglas Gregor SubstTemplateTemplateParmPackStorage *SubstPack 48531aee05d08b2184acadeb36de300e216390780d6cDouglas Gregor = From.getAsSubstTemplateTemplateParmPack(); 48541aee05d08b2184acadeb36de300e216390780d6cDouglas Gregor TemplateTemplateParmDecl *Param 48551aee05d08b2184acadeb36de300e216390780d6cDouglas Gregor = cast_or_null<TemplateTemplateParmDecl>( 48561aee05d08b2184acadeb36de300e216390780d6cDouglas Gregor Import(SubstPack->getParameterPack())); 48571aee05d08b2184acadeb36de300e216390780d6cDouglas Gregor if (!Param) 48581aee05d08b2184acadeb36de300e216390780d6cDouglas Gregor return TemplateName(); 48591aee05d08b2184acadeb36de300e216390780d6cDouglas Gregor 48601aee05d08b2184acadeb36de300e216390780d6cDouglas Gregor ASTNodeImporter Importer(*this); 48611aee05d08b2184acadeb36de300e216390780d6cDouglas Gregor TemplateArgument ArgPack 48621aee05d08b2184acadeb36de300e216390780d6cDouglas Gregor = Importer.ImportTemplateArgument(SubstPack->getArgumentPack()); 48631aee05d08b2184acadeb36de300e216390780d6cDouglas Gregor if (ArgPack.isNull()) 48641aee05d08b2184acadeb36de300e216390780d6cDouglas Gregor return TemplateName(); 48651aee05d08b2184acadeb36de300e216390780d6cDouglas Gregor 48661aee05d08b2184acadeb36de300e216390780d6cDouglas Gregor return ToContext.getSubstTemplateTemplateParmPack(Param, ArgPack); 48671aee05d08b2184acadeb36de300e216390780d6cDouglas Gregor } 4868d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor } 4869d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor 4870d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor llvm_unreachable("Invalid template name kind"); 4871d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor} 4872d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor 48739bed8798964d9f07599c2c9199701f86fbc70e20Douglas GregorSourceLocation ASTImporter::Import(SourceLocation FromLoc) { 48749bed8798964d9f07599c2c9199701f86fbc70e20Douglas Gregor if (FromLoc.isInvalid()) 48759bed8798964d9f07599c2c9199701f86fbc70e20Douglas Gregor return SourceLocation(); 48769bed8798964d9f07599c2c9199701f86fbc70e20Douglas Gregor 4877885237354fd902998c6ae9d7cc3dc8de96b123dcDouglas Gregor SourceManager &FromSM = FromContext.getSourceManager(); 4878885237354fd902998c6ae9d7cc3dc8de96b123dcDouglas Gregor 4879885237354fd902998c6ae9d7cc3dc8de96b123dcDouglas Gregor // For now, map everything down to its spelling location, so that we 4880b10aa3e3a26f84d1a0dda6e4c057f83a11a3076cChandler Carruth // don't have to import macro expansions. 4881b10aa3e3a26f84d1a0dda6e4c057f83a11a3076cChandler Carruth // FIXME: Import macro expansions! 4882885237354fd902998c6ae9d7cc3dc8de96b123dcDouglas Gregor FromLoc = FromSM.getSpellingLoc(FromLoc); 4883885237354fd902998c6ae9d7cc3dc8de96b123dcDouglas Gregor std::pair<FileID, unsigned> Decomposed = FromSM.getDecomposedLoc(FromLoc); 4884885237354fd902998c6ae9d7cc3dc8de96b123dcDouglas Gregor SourceManager &ToSM = ToContext.getSourceManager(); 4885885237354fd902998c6ae9d7cc3dc8de96b123dcDouglas Gregor return ToSM.getLocForStartOfFile(Import(Decomposed.first)) 4886a64ccefdf0ea4e03ec88805d71b0af74950c7472Argyrios Kyrtzidis .getLocWithOffset(Decomposed.second); 48879bed8798964d9f07599c2c9199701f86fbc70e20Douglas Gregor} 48889bed8798964d9f07599c2c9199701f86fbc70e20Douglas Gregor 48899bed8798964d9f07599c2c9199701f86fbc70e20Douglas GregorSourceRange ASTImporter::Import(SourceRange FromRange) { 48909bed8798964d9f07599c2c9199701f86fbc70e20Douglas Gregor return SourceRange(Import(FromRange.getBegin()), Import(FromRange.getEnd())); 48919bed8798964d9f07599c2c9199701f86fbc70e20Douglas Gregor} 48929bed8798964d9f07599c2c9199701f86fbc70e20Douglas Gregor 4893885237354fd902998c6ae9d7cc3dc8de96b123dcDouglas GregorFileID ASTImporter::Import(FileID FromID) { 4894535a3e20104461c136654d59fb833ae80644ae79Sebastian Redl llvm::DenseMap<FileID, FileID>::iterator Pos 4895535a3e20104461c136654d59fb833ae80644ae79Sebastian Redl = ImportedFileIDs.find(FromID); 4896885237354fd902998c6ae9d7cc3dc8de96b123dcDouglas Gregor if (Pos != ImportedFileIDs.end()) 4897885237354fd902998c6ae9d7cc3dc8de96b123dcDouglas Gregor return Pos->second; 4898885237354fd902998c6ae9d7cc3dc8de96b123dcDouglas Gregor 4899885237354fd902998c6ae9d7cc3dc8de96b123dcDouglas Gregor SourceManager &FromSM = FromContext.getSourceManager(); 4900885237354fd902998c6ae9d7cc3dc8de96b123dcDouglas Gregor SourceManager &ToSM = ToContext.getSourceManager(); 4901885237354fd902998c6ae9d7cc3dc8de96b123dcDouglas Gregor const SrcMgr::SLocEntry &FromSLoc = FromSM.getSLocEntry(FromID); 4902b10aa3e3a26f84d1a0dda6e4c057f83a11a3076cChandler Carruth assert(FromSLoc.isFile() && "Cannot handle macro expansions yet"); 4903885237354fd902998c6ae9d7cc3dc8de96b123dcDouglas Gregor 4904885237354fd902998c6ae9d7cc3dc8de96b123dcDouglas Gregor // Include location of this file. 4905885237354fd902998c6ae9d7cc3dc8de96b123dcDouglas Gregor SourceLocation ToIncludeLoc = Import(FromSLoc.getFile().getIncludeLoc()); 4906885237354fd902998c6ae9d7cc3dc8de96b123dcDouglas Gregor 4907885237354fd902998c6ae9d7cc3dc8de96b123dcDouglas Gregor // Map the FileID for to the "to" source manager. 4908885237354fd902998c6ae9d7cc3dc8de96b123dcDouglas Gregor FileID ToID; 4909885237354fd902998c6ae9d7cc3dc8de96b123dcDouglas Gregor const SrcMgr::ContentCache *Cache = FromSLoc.getFile().getContentCache(); 4910b1c86492f9a9bef01a4567408c22f961bbd604feArgyrios Kyrtzidis if (Cache->OrigEntry) { 4911885237354fd902998c6ae9d7cc3dc8de96b123dcDouglas Gregor // FIXME: We probably want to use getVirtualFile(), so we don't hit the 4912885237354fd902998c6ae9d7cc3dc8de96b123dcDouglas Gregor // disk again 4913885237354fd902998c6ae9d7cc3dc8de96b123dcDouglas Gregor // FIXME: We definitely want to re-use the existing MemoryBuffer, rather 4914885237354fd902998c6ae9d7cc3dc8de96b123dcDouglas Gregor // than mmap the files several times. 4915b1c86492f9a9bef01a4567408c22f961bbd604feArgyrios Kyrtzidis const FileEntry *Entry = ToFileManager.getFile(Cache->OrigEntry->getName()); 4916885237354fd902998c6ae9d7cc3dc8de96b123dcDouglas Gregor ToID = ToSM.createFileID(Entry, ToIncludeLoc, 4917885237354fd902998c6ae9d7cc3dc8de96b123dcDouglas Gregor FromSLoc.getFile().getFileCharacteristic()); 4918885237354fd902998c6ae9d7cc3dc8de96b123dcDouglas Gregor } else { 4919885237354fd902998c6ae9d7cc3dc8de96b123dcDouglas Gregor // FIXME: We want to re-use the existing MemoryBuffer! 492033e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis const llvm::MemoryBuffer * 492133e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis FromBuf = Cache->getBuffer(FromContext.getDiagnostics(), FromSM); 4922885237354fd902998c6ae9d7cc3dc8de96b123dcDouglas Gregor llvm::MemoryBuffer *ToBuf 4923a0a270c0f1c0a4e3482438bdc5f4a7bd3d25f0a6Chris Lattner = llvm::MemoryBuffer::getMemBufferCopy(FromBuf->getBuffer(), 4924885237354fd902998c6ae9d7cc3dc8de96b123dcDouglas Gregor FromBuf->getBufferIdentifier()); 49256bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines ToID = ToSM.createFileID(ToBuf, FromSLoc.getFile().getFileCharacteristic()); 4926885237354fd902998c6ae9d7cc3dc8de96b123dcDouglas Gregor } 4927885237354fd902998c6ae9d7cc3dc8de96b123dcDouglas Gregor 4928885237354fd902998c6ae9d7cc3dc8de96b123dcDouglas Gregor 4929535a3e20104461c136654d59fb833ae80644ae79Sebastian Redl ImportedFileIDs[FromID] = ToID; 4930885237354fd902998c6ae9d7cc3dc8de96b123dcDouglas Gregor return ToID; 4931885237354fd902998c6ae9d7cc3dc8de96b123dcDouglas Gregor} 4932885237354fd902998c6ae9d7cc3dc8de96b123dcDouglas Gregor 4933d8868a634d4fd362243dc646e58c3cf956c81dcdDouglas Gregorvoid ASTImporter::ImportDefinition(Decl *From) { 4934d8868a634d4fd362243dc646e58c3cf956c81dcdDouglas Gregor Decl *To = Import(From); 4935d8868a634d4fd362243dc646e58c3cf956c81dcdDouglas Gregor if (!To) 4936d8868a634d4fd362243dc646e58c3cf956c81dcdDouglas Gregor return; 4937d8868a634d4fd362243dc646e58c3cf956c81dcdDouglas Gregor 4938d8868a634d4fd362243dc646e58c3cf956c81dcdDouglas Gregor if (DeclContext *FromDC = cast<DeclContext>(From)) { 4939d8868a634d4fd362243dc646e58c3cf956c81dcdDouglas Gregor ASTNodeImporter Importer(*this); 4940673e775beba71a69dbab4fcd733a84f4cfe2ebfcSean Callanan 4941673e775beba71a69dbab4fcd733a84f4cfe2ebfcSean Callanan if (RecordDecl *ToRecord = dyn_cast<RecordDecl>(To)) { 4942673e775beba71a69dbab4fcd733a84f4cfe2ebfcSean Callanan if (!ToRecord->getDefinition()) { 4943673e775beba71a69dbab4fcd733a84f4cfe2ebfcSean Callanan Importer.ImportDefinition(cast<RecordDecl>(FromDC), ToRecord, 4944cd0d56a523f877ffd1fe1575caf758b4357f1661Douglas Gregor ASTNodeImporter::IDK_Everything); 4945673e775beba71a69dbab4fcd733a84f4cfe2ebfcSean Callanan return; 4946673e775beba71a69dbab4fcd733a84f4cfe2ebfcSean Callanan } 4947673e775beba71a69dbab4fcd733a84f4cfe2ebfcSean Callanan } 49481cf038c516c5e1f56ea9cff61aac7f7841744a91Douglas Gregor 49491cf038c516c5e1f56ea9cff61aac7f7841744a91Douglas Gregor if (EnumDecl *ToEnum = dyn_cast<EnumDecl>(To)) { 49501cf038c516c5e1f56ea9cff61aac7f7841744a91Douglas Gregor if (!ToEnum->getDefinition()) { 49511cf038c516c5e1f56ea9cff61aac7f7841744a91Douglas Gregor Importer.ImportDefinition(cast<EnumDecl>(FromDC), ToEnum, 4952ac32ff9812e7d6bc31573b5499bfd005fc8b8f39Douglas Gregor ASTNodeImporter::IDK_Everything); 49531cf038c516c5e1f56ea9cff61aac7f7841744a91Douglas Gregor return; 49541cf038c516c5e1f56ea9cff61aac7f7841744a91Douglas Gregor } 49551cf038c516c5e1f56ea9cff61aac7f7841744a91Douglas Gregor } 49565602f7e77e975d780f84079532408c0064566c3bDouglas Gregor 49575602f7e77e975d780f84079532408c0064566c3bDouglas Gregor if (ObjCInterfaceDecl *ToIFace = dyn_cast<ObjCInterfaceDecl>(To)) { 49585602f7e77e975d780f84079532408c0064566c3bDouglas Gregor if (!ToIFace->getDefinition()) { 49595602f7e77e975d780f84079532408c0064566c3bDouglas Gregor Importer.ImportDefinition(cast<ObjCInterfaceDecl>(FromDC), ToIFace, 4960ac32ff9812e7d6bc31573b5499bfd005fc8b8f39Douglas Gregor ASTNodeImporter::IDK_Everything); 49615602f7e77e975d780f84079532408c0064566c3bDouglas Gregor return; 49625602f7e77e975d780f84079532408c0064566c3bDouglas Gregor } 49635602f7e77e975d780f84079532408c0064566c3bDouglas Gregor } 49641cf038c516c5e1f56ea9cff61aac7f7841744a91Douglas Gregor 49655602f7e77e975d780f84079532408c0064566c3bDouglas Gregor if (ObjCProtocolDecl *ToProto = dyn_cast<ObjCProtocolDecl>(To)) { 49665602f7e77e975d780f84079532408c0064566c3bDouglas Gregor if (!ToProto->getDefinition()) { 49675602f7e77e975d780f84079532408c0064566c3bDouglas Gregor Importer.ImportDefinition(cast<ObjCProtocolDecl>(FromDC), ToProto, 4968ac32ff9812e7d6bc31573b5499bfd005fc8b8f39Douglas Gregor ASTNodeImporter::IDK_Everything); 49695602f7e77e975d780f84079532408c0064566c3bDouglas Gregor return; 49705602f7e77e975d780f84079532408c0064566c3bDouglas Gregor } 49715602f7e77e975d780f84079532408c0064566c3bDouglas Gregor } 49725602f7e77e975d780f84079532408c0064566c3bDouglas Gregor 4973d8868a634d4fd362243dc646e58c3cf956c81dcdDouglas Gregor Importer.ImportDeclContext(FromDC, true); 4974d8868a634d4fd362243dc646e58c3cf956c81dcdDouglas Gregor } 4975d8868a634d4fd362243dc646e58c3cf956c81dcdDouglas Gregor} 4976d8868a634d4fd362243dc646e58c3cf956c81dcdDouglas Gregor 49771b2949d27ec72894dec017c330c0548af4bb2476Douglas GregorDeclarationName ASTImporter::Import(DeclarationName FromName) { 49781b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor if (!FromName) 49791b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor return DeclarationName(); 49801b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor 49811b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor switch (FromName.getNameKind()) { 49821b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor case DeclarationName::Identifier: 49831b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor return Import(FromName.getAsIdentifierInfo()); 49841b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor 49851b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor case DeclarationName::ObjCZeroArgSelector: 49861b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor case DeclarationName::ObjCOneArgSelector: 49871b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor case DeclarationName::ObjCMultiArgSelector: 49881b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor return Import(FromName.getObjCSelector()); 49891b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor 49901b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor case DeclarationName::CXXConstructorName: { 49911b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor QualType T = Import(FromName.getCXXNameType()); 49921b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor if (T.isNull()) 49931b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor return DeclarationName(); 49941b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor 49951b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor return ToContext.DeclarationNames.getCXXConstructorName( 49961b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor ToContext.getCanonicalType(T)); 49971b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor } 49981b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor 49991b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor case DeclarationName::CXXDestructorName: { 50001b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor QualType T = Import(FromName.getCXXNameType()); 50011b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor if (T.isNull()) 50021b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor return DeclarationName(); 50031b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor 50041b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor return ToContext.DeclarationNames.getCXXDestructorName( 50051b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor ToContext.getCanonicalType(T)); 50061b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor } 50071b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor 50081b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor case DeclarationName::CXXConversionFunctionName: { 50091b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor QualType T = Import(FromName.getCXXNameType()); 50101b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor if (T.isNull()) 50111b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor return DeclarationName(); 50121b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor 50131b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor return ToContext.DeclarationNames.getCXXConversionFunctionName( 50141b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor ToContext.getCanonicalType(T)); 50151b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor } 50161b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor 50171b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor case DeclarationName::CXXOperatorName: 50181b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor return ToContext.DeclarationNames.getCXXOperatorName( 50191b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor FromName.getCXXOverloadedOperator()); 50201b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor 50211b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor case DeclarationName::CXXLiteralOperatorName: 50221b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor return ToContext.DeclarationNames.getCXXLiteralOperatorName( 50231b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor Import(FromName.getCXXLiteralIdentifier())); 50241b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor 50251b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor case DeclarationName::CXXUsingDirective: 50261b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor // FIXME: STATICS! 50271b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor return DeclarationName::getUsingDirectiveName(); 50281b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor } 50291b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor 50303026348bd4c13a0f83b59839f64065e0fcbea253David Blaikie llvm_unreachable("Invalid DeclarationName Kind!"); 50311b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor} 50321b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor 5033d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas GregorIdentifierInfo *ASTImporter::Import(const IdentifierInfo *FromId) { 50341b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor if (!FromId) 50356bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return nullptr; 50361b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor 50371b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor return &ToContext.Idents.get(FromId->getName()); 50381b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor} 5039089459a16bf7e9cd10617d1fac5ec0240a0a1ee6Douglas Gregor 5040c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas GregorSelector ASTImporter::Import(Selector FromSel) { 5041c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor if (FromSel.isNull()) 5042c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor return Selector(); 5043c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor 50445f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner SmallVector<IdentifierInfo *, 4> Idents; 5045c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor Idents.push_back(Import(FromSel.getIdentifierInfoForSlot(0))); 5046c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor for (unsigned I = 1, N = FromSel.getNumArgs(); I < N; ++I) 5047c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor Idents.push_back(Import(FromSel.getIdentifierInfoForSlot(I))); 5048c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor return ToContext.Selectors.getSelector(FromSel.getNumArgs(), Idents.data()); 5049c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor} 5050c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor 5051089459a16bf7e9cd10617d1fac5ec0240a0a1ee6Douglas GregorDeclarationName ASTImporter::HandleNameConflict(DeclarationName Name, 5052089459a16bf7e9cd10617d1fac5ec0240a0a1ee6Douglas Gregor DeclContext *DC, 5053089459a16bf7e9cd10617d1fac5ec0240a0a1ee6Douglas Gregor unsigned IDNS, 5054089459a16bf7e9cd10617d1fac5ec0240a0a1ee6Douglas Gregor NamedDecl **Decls, 5055089459a16bf7e9cd10617d1fac5ec0240a0a1ee6Douglas Gregor unsigned NumDecls) { 5056089459a16bf7e9cd10617d1fac5ec0240a0a1ee6Douglas Gregor return Name; 5057089459a16bf7e9cd10617d1fac5ec0240a0a1ee6Douglas Gregor} 5058089459a16bf7e9cd10617d1fac5ec0240a0a1ee6Douglas Gregor 5059089459a16bf7e9cd10617d1fac5ec0240a0a1ee6Douglas GregorDiagnosticBuilder ASTImporter::ToDiag(SourceLocation Loc, unsigned DiagID) { 50605b9268f26ac53a74d2c504279fe577d988d5615dRichard Smith if (LastDiagFromFrom) 50615b9268f26ac53a74d2c504279fe577d988d5615dRichard Smith ToContext.getDiagnostics().notePriorDiagnosticFrom( 50625b9268f26ac53a74d2c504279fe577d988d5615dRichard Smith FromContext.getDiagnostics()); 50635b9268f26ac53a74d2c504279fe577d988d5615dRichard Smith LastDiagFromFrom = false; 506433e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis return ToContext.getDiagnostics().Report(Loc, DiagID); 5065089459a16bf7e9cd10617d1fac5ec0240a0a1ee6Douglas Gregor} 5066089459a16bf7e9cd10617d1fac5ec0240a0a1ee6Douglas Gregor 5067089459a16bf7e9cd10617d1fac5ec0240a0a1ee6Douglas GregorDiagnosticBuilder ASTImporter::FromDiag(SourceLocation Loc, unsigned DiagID) { 50685b9268f26ac53a74d2c504279fe577d988d5615dRichard Smith if (!LastDiagFromFrom) 50695b9268f26ac53a74d2c504279fe577d988d5615dRichard Smith FromContext.getDiagnostics().notePriorDiagnosticFrom( 50705b9268f26ac53a74d2c504279fe577d988d5615dRichard Smith ToContext.getDiagnostics()); 50715b9268f26ac53a74d2c504279fe577d988d5615dRichard Smith LastDiagFromFrom = true; 507233e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis return FromContext.getDiagnostics().Report(Loc, DiagID); 5073089459a16bf7e9cd10617d1fac5ec0240a0a1ee6Douglas Gregor} 50745ce5dab3c30e4255b8f62b148b6a86f09a444aaaDouglas Gregor 5075ac32ff9812e7d6bc31573b5499bfd005fc8b8f39Douglas Gregorvoid ASTImporter::CompleteDecl (Decl *D) { 5076ac32ff9812e7d6bc31573b5499bfd005fc8b8f39Douglas Gregor if (ObjCInterfaceDecl *ID = dyn_cast<ObjCInterfaceDecl>(D)) { 5077ac32ff9812e7d6bc31573b5499bfd005fc8b8f39Douglas Gregor if (!ID->getDefinition()) 5078ac32ff9812e7d6bc31573b5499bfd005fc8b8f39Douglas Gregor ID->startDefinition(); 5079ac32ff9812e7d6bc31573b5499bfd005fc8b8f39Douglas Gregor } 5080ac32ff9812e7d6bc31573b5499bfd005fc8b8f39Douglas Gregor else if (ObjCProtocolDecl *PD = dyn_cast<ObjCProtocolDecl>(D)) { 5081ac32ff9812e7d6bc31573b5499bfd005fc8b8f39Douglas Gregor if (!PD->getDefinition()) 5082ac32ff9812e7d6bc31573b5499bfd005fc8b8f39Douglas Gregor PD->startDefinition(); 5083ac32ff9812e7d6bc31573b5499bfd005fc8b8f39Douglas Gregor } 5084ac32ff9812e7d6bc31573b5499bfd005fc8b8f39Douglas Gregor else if (TagDecl *TD = dyn_cast<TagDecl>(D)) { 5085ac32ff9812e7d6bc31573b5499bfd005fc8b8f39Douglas Gregor if (!TD->getDefinition() && !TD->isBeingDefined()) { 5086ac32ff9812e7d6bc31573b5499bfd005fc8b8f39Douglas Gregor TD->startDefinition(); 5087ac32ff9812e7d6bc31573b5499bfd005fc8b8f39Douglas Gregor TD->setCompleteDefinition(true); 5088ac32ff9812e7d6bc31573b5499bfd005fc8b8f39Douglas Gregor } 5089ac32ff9812e7d6bc31573b5499bfd005fc8b8f39Douglas Gregor } 5090ac32ff9812e7d6bc31573b5499bfd005fc8b8f39Douglas Gregor else { 5091ac32ff9812e7d6bc31573b5499bfd005fc8b8f39Douglas Gregor assert (0 && "CompleteDecl called on a Decl that can't be completed"); 5092ac32ff9812e7d6bc31573b5499bfd005fc8b8f39Douglas Gregor } 5093ac32ff9812e7d6bc31573b5499bfd005fc8b8f39Douglas Gregor} 5094ac32ff9812e7d6bc31573b5499bfd005fc8b8f39Douglas Gregor 50955ce5dab3c30e4255b8f62b148b6a86f09a444aaaDouglas GregorDecl *ASTImporter::Imported(Decl *From, Decl *To) { 50965ce5dab3c30e4255b8f62b148b6a86f09a444aaaDouglas Gregor ImportedDecls[From] = To; 50975ce5dab3c30e4255b8f62b148b6a86f09a444aaaDouglas Gregor return To; 5098af667588d53de22795c5304f1496ccaac2a71402Daniel Dunbar} 5099ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor 510093ed7cf05f900b9150dcf59c0e0f37f3bd325f62Douglas Gregorbool ASTImporter::IsStructurallyEquivalent(QualType From, QualType To, 510193ed7cf05f900b9150dcf59c0e0f37f3bd325f62Douglas Gregor bool Complain) { 5102f4c7371fb1d3cebcfb40abad4537bb82515704eaJohn McCall llvm::DenseMap<const Type *, const Type *>::iterator Pos 5103ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor = ImportedTypes.find(From.getTypePtr()); 5104ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor if (Pos != ImportedTypes.end() && ToContext.hasSameType(Import(From), To)) 5105ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor return true; 5106ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor 510793ed7cf05f900b9150dcf59c0e0f37f3bd325f62Douglas Gregor StructuralEquivalenceContext Ctx(FromContext, ToContext, NonEquivalentDecls, 510893ed7cf05f900b9150dcf59c0e0f37f3bd325f62Douglas Gregor false, Complain); 5109bb2d176c4f434e9e73f63f2f9d128f63ce3e10d0Benjamin Kramer return Ctx.IsStructurallyEquivalent(From, To); 5110ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor} 5111