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; 324967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar 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); 674967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar QualType VisitInjectedClassNameType(const InjectedClassNameType *T); 681b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor // FIXME: DependentDecltypeType 69f4c7371fb1d3cebcfb40abad4537bb82515704eaJohn McCall QualType VisitRecordType(const RecordType *T); 70f4c7371fb1d3cebcfb40abad4537bb82515704eaJohn McCall QualType VisitEnumType(const EnumType *T); 7158878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar QualType VisitAttributedType(const AttributedType *T); 724967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar QualType VisitTemplateTypeParmType(const TemplateTypeParmType *T); 731b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor // FIXME: SubstTemplateTypeParmType 74f4c7371fb1d3cebcfb40abad4537bb82515704eaJohn McCall QualType VisitTemplateSpecializationType(const TemplateSpecializationType *T); 75f4c7371fb1d3cebcfb40abad4537bb82515704eaJohn McCall QualType VisitElaboratedType(const ElaboratedType *T); 764714c12a1ab759156b78be8f109ea4c12213af57Douglas Gregor // FIXME: DependentNameType 7733500955d731c73717af52088b7fc0e7a85681e7John McCall // FIXME: DependentTemplateSpecializationType 78f4c7371fb1d3cebcfb40abad4537bb82515704eaJohn McCall QualType VisitObjCInterfaceType(const ObjCInterfaceType *T); 79f4c7371fb1d3cebcfb40abad4537bb82515704eaJohn McCall QualType VisitObjCObjectType(const ObjCObjectType *T); 80f4c7371fb1d3cebcfb40abad4537bb82515704eaJohn McCall QualType VisitObjCObjectPointerType(const ObjCObjectPointerType *T); 81089459a16bf7e9cd10617d1fac5ec0240a0a1ee6Douglas Gregor 82cd0d56a523f877ffd1fe1575caf758b4357f1661Douglas Gregor // Importing declarations 83a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor bool ImportDeclParts(NamedDecl *D, DeclContext *&DC, 84a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor DeclContext *&LexicalDC, DeclarationName &Name, 85b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar NamedDecl *&ToD, SourceLocation &Loc); 866bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines void ImportDefinitionIfNeeded(Decl *FromD, Decl *ToD = nullptr); 872577743c5650c646fb705df01403707e94f2df04Abramo Bagnara void ImportDeclarationNameLoc(const DeclarationNameInfo &From, 882577743c5650c646fb705df01403707e94f2df04Abramo Bagnara DeclarationNameInfo& To); 89d8868a634d4fd362243dc646e58c3cf956c81dcdDouglas Gregor void ImportDeclContext(DeclContext *FromDC, bool ForceImport = false); 904967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar 914967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar typedef DesignatedInitExpr::Designator Designator; 924967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Designator ImportDesignator(const Designator &D); 934967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar 94ac32ff9812e7d6bc31573b5499bfd005fc8b8f39Douglas Gregor 95cd0d56a523f877ffd1fe1575caf758b4357f1661Douglas Gregor /// \brief What we should import from the definition. 96cd0d56a523f877ffd1fe1575caf758b4357f1661Douglas Gregor enum ImportDefinitionKind { 97cd0d56a523f877ffd1fe1575caf758b4357f1661Douglas Gregor /// \brief Import the default subset of the definition, which might be 98cd0d56a523f877ffd1fe1575caf758b4357f1661Douglas Gregor /// nothing (if minimal import is set) or might be everything (if minimal 99cd0d56a523f877ffd1fe1575caf758b4357f1661Douglas Gregor /// import is not set). 100cd0d56a523f877ffd1fe1575caf758b4357f1661Douglas Gregor IDK_Default, 101cd0d56a523f877ffd1fe1575caf758b4357f1661Douglas Gregor /// \brief Import everything. 102cd0d56a523f877ffd1fe1575caf758b4357f1661Douglas Gregor IDK_Everything, 103cd0d56a523f877ffd1fe1575caf758b4357f1661Douglas Gregor /// \brief Import only the bare bones needed to establish a valid 104cd0d56a523f877ffd1fe1575caf758b4357f1661Douglas Gregor /// DeclContext. 105cd0d56a523f877ffd1fe1575caf758b4357f1661Douglas Gregor IDK_Basic 106cd0d56a523f877ffd1fe1575caf758b4357f1661Douglas Gregor }; 107cd0d56a523f877ffd1fe1575caf758b4357f1661Douglas Gregor 108ac32ff9812e7d6bc31573b5499bfd005fc8b8f39Douglas Gregor bool shouldForceImportDeclContext(ImportDefinitionKind IDK) { 109ac32ff9812e7d6bc31573b5499bfd005fc8b8f39Douglas Gregor return IDK == IDK_Everything || 110ac32ff9812e7d6bc31573b5499bfd005fc8b8f39Douglas Gregor (IDK == IDK_Default && !Importer.isMinimalImport()); 111ac32ff9812e7d6bc31573b5499bfd005fc8b8f39Douglas Gregor } 112ac32ff9812e7d6bc31573b5499bfd005fc8b8f39Douglas Gregor 1131cf038c516c5e1f56ea9cff61aac7f7841744a91Douglas Gregor bool ImportDefinition(RecordDecl *From, RecordDecl *To, 114cd0d56a523f877ffd1fe1575caf758b4357f1661Douglas Gregor ImportDefinitionKind Kind = IDK_Default); 115ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo bool ImportDefinition(VarDecl *From, VarDecl *To, 116ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo ImportDefinitionKind Kind = IDK_Default); 1171cf038c516c5e1f56ea9cff61aac7f7841744a91Douglas Gregor bool ImportDefinition(EnumDecl *From, EnumDecl *To, 118ac32ff9812e7d6bc31573b5499bfd005fc8b8f39Douglas Gregor ImportDefinitionKind Kind = IDK_Default); 1195602f7e77e975d780f84079532408c0064566c3bDouglas Gregor bool ImportDefinition(ObjCInterfaceDecl *From, ObjCInterfaceDecl *To, 120ac32ff9812e7d6bc31573b5499bfd005fc8b8f39Douglas Gregor ImportDefinitionKind Kind = IDK_Default); 1215602f7e77e975d780f84079532408c0064566c3bDouglas Gregor bool ImportDefinition(ObjCProtocolDecl *From, ObjCProtocolDecl *To, 122ac32ff9812e7d6bc31573b5499bfd005fc8b8f39Douglas Gregor ImportDefinitionKind Kind = IDK_Default); 123040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor TemplateParameterList *ImportTemplateParameterList( 124040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor TemplateParameterList *Params); 125d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor TemplateArgument ImportTemplateArgument(const TemplateArgument &From); 126d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor bool ImportTemplateArguments(const TemplateArgument *FromArgs, 127d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor unsigned NumFromArgs, 1285f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner SmallVectorImpl<TemplateArgument> &ToArgs); 12993ed7cf05f900b9150dcf59c0e0f37f3bd325f62Douglas Gregor bool IsStructuralMatch(RecordDecl *FromRecord, RecordDecl *ToRecord, 13093ed7cf05f900b9150dcf59c0e0f37f3bd325f62Douglas Gregor bool Complain = true); 131ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo bool IsStructuralMatch(VarDecl *FromVar, VarDecl *ToVar, 132ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo bool Complain = true); 13373dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor bool IsStructuralMatch(EnumDecl *FromEnum, EnumDecl *ToRecord); 1341cef45955d87dde48c78b6878dc0ee67a3404b6cDouglas Gregor bool IsStructuralMatch(EnumConstantDecl *FromEC, EnumConstantDecl *ToEC); 135040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor bool IsStructuralMatch(ClassTemplateDecl *From, ClassTemplateDecl *To); 136ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo bool IsStructuralMatch(VarTemplateDecl *From, VarTemplateDecl *To); 13789cc9d6e2aaf794fbd2c228a3755c19062ca0ba0Douglas Gregor Decl *VisitDecl(Decl *D); 1384967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Decl *VisitAccessSpecDecl(AccessSpecDecl *D); 139f1b69466146cda83936fae66839c446602e05133Sean Callanan Decl *VisitTranslationUnitDecl(TranslationUnitDecl *D); 140788c62d1e87bfb596078817237f672a5f000999aDouglas Gregor Decl *VisitNamespaceDecl(NamespaceDecl *D); 141162e1c1b487352434552147967c3dd296ebee2f7Richard Smith Decl *VisitTypedefNameDecl(TypedefNameDecl *D, bool IsAlias); 1429e5d996444e40fdf5cce44ee82bec0d4e3df3d56Douglas Gregor Decl *VisitTypedefDecl(TypedefDecl *D); 143162e1c1b487352434552147967c3dd296ebee2f7Richard Smith Decl *VisitTypeAliasDecl(TypeAliasDecl *D); 1444967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Decl *VisitLabelDecl(LabelDecl *D); 14536ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas Gregor Decl *VisitEnumDecl(EnumDecl *D); 14696a01b4acf76fb8fe1e05341a97a27b39fb0b914Douglas Gregor Decl *VisitRecordDecl(RecordDecl *D); 14736ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas Gregor Decl *VisitEnumConstantDecl(EnumConstantDecl *D); 148a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor Decl *VisitFunctionDecl(FunctionDecl *D); 149c144f3534e2f7a70ea9ebf8dd83090a2883d61fbDouglas Gregor Decl *VisitCXXMethodDecl(CXXMethodDecl *D); 150c144f3534e2f7a70ea9ebf8dd83090a2883d61fbDouglas Gregor Decl *VisitCXXConstructorDecl(CXXConstructorDecl *D); 151c144f3534e2f7a70ea9ebf8dd83090a2883d61fbDouglas Gregor Decl *VisitCXXDestructorDecl(CXXDestructorDecl *D); 152c144f3534e2f7a70ea9ebf8dd83090a2883d61fbDouglas Gregor Decl *VisitCXXConversionDecl(CXXConversionDecl *D); 15396a01b4acf76fb8fe1e05341a97a27b39fb0b914Douglas Gregor Decl *VisitFieldDecl(FieldDecl *D); 15487c2e121cf0522fc266efe2922b58091cd2e0182Francois Pichet Decl *VisitIndirectFieldDecl(IndirectFieldDecl *D); 1552e55e3af2f6d6c0509495357fade95105dd144cdDouglas Gregor Decl *VisitObjCIvarDecl(ObjCIvarDecl *D); 156089459a16bf7e9cd10617d1fac5ec0240a0a1ee6Douglas Gregor Decl *VisitVarDecl(VarDecl *D); 1572cd00932b9b5403047139ce8cfaa3ae47966f894Douglas Gregor Decl *VisitImplicitParamDecl(ImplicitParamDecl *D); 158a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor Decl *VisitParmVarDecl(ParmVarDecl *D); 159c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor Decl *VisitObjCMethodDecl(ObjCMethodDecl *D); 16087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar Decl *VisitObjCTypeParamDecl(ObjCTypeParamDecl *D); 161b4677b62a8e9bba0913dfe1456bd9d689cdbccacDouglas Gregor Decl *VisitObjCCategoryDecl(ObjCCategoryDecl *D); 1622e2a400383c7a64a927f61eeed596b08928e1d4bDouglas Gregor Decl *VisitObjCProtocolDecl(ObjCProtocolDecl *D); 1630e2c34f92f00628d48968dfea096d36381f494cbStephen Hines Decl *VisitLinkageSpecDecl(LinkageSpecDecl *D); 16487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar 16587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar ObjCTypeParamList *ImportObjCTypeParamList(ObjCTypeParamList *list); 166a12d294db5bd59cd8836b9bd0dafadaaa2e3dd8aDouglas Gregor Decl *VisitObjCInterfaceDecl(ObjCInterfaceDecl *D); 1673daef29bf390dbdb3603748280afd5827d1811daDouglas Gregor Decl *VisitObjCCategoryImplDecl(ObjCCategoryImplDecl *D); 168dd182ff10b9145e432dea1fd2fb67100ccca3b10Douglas Gregor Decl *VisitObjCImplementationDecl(ObjCImplementationDecl *D); 169e3261624c1870e52d7efc2ac83e647713361ac6cDouglas Gregor Decl *VisitObjCPropertyDecl(ObjCPropertyDecl *D); 170954e0c75c42f321945aff8b9ee96da43cd90c752Douglas Gregor Decl *VisitObjCPropertyImplDecl(ObjCPropertyImplDecl *D); 171040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor Decl *VisitTemplateTypeParmDecl(TemplateTypeParmDecl *D); 172040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor Decl *VisitNonTypeTemplateParmDecl(NonTypeTemplateParmDecl *D); 173040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor Decl *VisitTemplateTemplateParmDecl(TemplateTemplateParmDecl *D); 174040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor Decl *VisitClassTemplateDecl(ClassTemplateDecl *D); 175d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor Decl *VisitClassTemplateSpecializationDecl( 176d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor ClassTemplateSpecializationDecl *D); 177ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo Decl *VisitVarTemplateDecl(VarTemplateDecl *D); 178ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo Decl *VisitVarTemplateSpecializationDecl(VarTemplateSpecializationDecl *D); 179ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo 1804800d95d28b20eca5d57c108ae3d2e6e312c1182Douglas Gregor // Importing statements 181b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar DeclGroupRef ImportDeclGroup(DeclGroupRef DG); 182b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar 1834800d95d28b20eca5d57c108ae3d2e6e312c1182Douglas Gregor Stmt *VisitStmt(Stmt *S); 1844967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Stmt *VisitGCCAsmStmt(GCCAsmStmt *S); 185b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar Stmt *VisitDeclStmt(DeclStmt *S); 186b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar Stmt *VisitNullStmt(NullStmt *S); 187b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar Stmt *VisitCompoundStmt(CompoundStmt *S); 188b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar Stmt *VisitCaseStmt(CaseStmt *S); 189b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar Stmt *VisitDefaultStmt(DefaultStmt *S); 190b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar Stmt *VisitLabelStmt(LabelStmt *S); 191b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar Stmt *VisitAttributedStmt(AttributedStmt *S); 192b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar Stmt *VisitIfStmt(IfStmt *S); 193b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar Stmt *VisitSwitchStmt(SwitchStmt *S); 194b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar Stmt *VisitWhileStmt(WhileStmt *S); 195b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar Stmt *VisitDoStmt(DoStmt *S); 196b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar Stmt *VisitForStmt(ForStmt *S); 197b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar Stmt *VisitGotoStmt(GotoStmt *S); 198b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar Stmt *VisitIndirectGotoStmt(IndirectGotoStmt *S); 199b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar Stmt *VisitContinueStmt(ContinueStmt *S); 200b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar Stmt *VisitBreakStmt(BreakStmt *S); 201b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar Stmt *VisitReturnStmt(ReturnStmt *S); 202b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar // FIXME: MSAsmStmt 203b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar // FIXME: SEHExceptStmt 204b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar // FIXME: SEHFinallyStmt 205b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar // FIXME: SEHTryStmt 206b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar // FIXME: SEHLeaveStmt 207b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar // FIXME: CapturedStmt 208b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar Stmt *VisitCXXCatchStmt(CXXCatchStmt *S); 209b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar Stmt *VisitCXXTryStmt(CXXTryStmt *S); 210b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar Stmt *VisitCXXForRangeStmt(CXXForRangeStmt *S); 211b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar // FIXME: MSDependentExistsStmt 212b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar Stmt *VisitObjCForCollectionStmt(ObjCForCollectionStmt *S); 213b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar Stmt *VisitObjCAtCatchStmt(ObjCAtCatchStmt *S); 214b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar Stmt *VisitObjCAtFinallyStmt(ObjCAtFinallyStmt *S); 215b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar Stmt *VisitObjCAtTryStmt(ObjCAtTryStmt *S); 216b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar Stmt *VisitObjCAtSynchronizedStmt(ObjCAtSynchronizedStmt *S); 217b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar Stmt *VisitObjCAtThrowStmt(ObjCAtThrowStmt *S); 218b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar Stmt *VisitObjCAutoreleasePoolStmt(ObjCAutoreleasePoolStmt *S); 2194800d95d28b20eca5d57c108ae3d2e6e312c1182Douglas Gregor 2204800d95d28b20eca5d57c108ae3d2e6e312c1182Douglas Gregor // Importing expressions 2214800d95d28b20eca5d57c108ae3d2e6e312c1182Douglas Gregor Expr *VisitExpr(Expr *E); 2224967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Expr *VisitVAArgExpr(VAArgExpr *E); 2234967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Expr *VisitGNUNullExpr(GNUNullExpr *E); 2244967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Expr *VisitPredefinedExpr(PredefinedExpr *E); 225440806306674e23ad74726208cbdc6f37849dd9dDouglas Gregor Expr *VisitDeclRefExpr(DeclRefExpr *E); 2264967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Expr *VisitImplicitValueInitExpr(ImplicitValueInitExpr *ILE); 2274967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Expr *VisitDesignatedInitExpr(DesignatedInitExpr *E); 2284967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Expr *VisitCXXNullPtrLiteralExpr(CXXNullPtrLiteralExpr *E); 2294800d95d28b20eca5d57c108ae3d2e6e312c1182Douglas Gregor Expr *VisitIntegerLiteral(IntegerLiteral *E); 2304967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Expr *VisitFloatingLiteral(FloatingLiteral *E); 231b2e400aae8c62c4e1616016f40618baace0da065Douglas Gregor Expr *VisitCharacterLiteral(CharacterLiteral *E); 2324967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Expr *VisitStringLiteral(StringLiteral *E); 2334967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Expr *VisitCompoundLiteralExpr(CompoundLiteralExpr *E); 2344967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Expr *VisitAtomicExpr(AtomicExpr *E); 2354967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Expr *VisitAddrLabelExpr(AddrLabelExpr *E); 236f638f9580ba0da99a66668f00e1a1d4987067bddDouglas Gregor Expr *VisitParenExpr(ParenExpr *E); 2374967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Expr *VisitParenListExpr(ParenListExpr *E); 2384967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Expr *VisitStmtExpr(StmtExpr *E); 239f638f9580ba0da99a66668f00e1a1d4987067bddDouglas Gregor Expr *VisitUnaryOperator(UnaryOperator *E); 240f4e3cfbe8abd124be6341ef5d714819b4fbd9082Peter Collingbourne Expr *VisitUnaryExprOrTypeTraitExpr(UnaryExprOrTypeTraitExpr *E); 241f638f9580ba0da99a66668f00e1a1d4987067bddDouglas Gregor Expr *VisitBinaryOperator(BinaryOperator *E); 2424967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Expr *VisitConditionalOperator(ConditionalOperator *E); 2434967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Expr *VisitBinaryConditionalOperator(BinaryConditionalOperator *E); 2444967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Expr *VisitOpaqueValueExpr(OpaqueValueExpr *E); 245f638f9580ba0da99a66668f00e1a1d4987067bddDouglas Gregor Expr *VisitCompoundAssignOperator(CompoundAssignOperator *E); 24636ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas Gregor Expr *VisitImplicitCastExpr(ImplicitCastExpr *E); 247008847a70ab122a99911149199855060fb3753b4Douglas Gregor Expr *VisitCStyleCastExpr(CStyleCastExpr *E); 248b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar Expr *VisitCXXConstructExpr(CXXConstructExpr *E); 2494967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Expr *VisitCXXMemberCallExpr(CXXMemberCallExpr *E); 2504967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Expr *VisitCXXThisExpr(CXXThisExpr *E); 2514967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Expr *VisitCXXBoolLiteralExpr(CXXBoolLiteralExpr *E); 252b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar Expr *VisitMemberExpr(MemberExpr *E); 253b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar Expr *VisitCallExpr(CallExpr *E); 2544967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Expr *VisitInitListExpr(InitListExpr *E); 2554967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Expr *VisitCXXDefaultInitExpr(CXXDefaultInitExpr *E); 2564967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Expr *VisitCXXNamedCastExpr(CXXNamedCastExpr *E); 2574967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar 2584967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar template<typename IIter, typename OIter> 2594967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar void ImportArray(IIter Ibegin, IIter Iend, OIter Obegin) { 2604967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar typedef typename std::remove_reference<decltype(*Obegin)>::type ItemT; 2614967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar ASTImporter &ImporterRef = Importer; 2624967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar std::transform(Ibegin, Iend, Obegin, 2634967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar [&ImporterRef](ItemT From) -> ItemT { 2644967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar return ImporterRef.Import(From); 2654967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar }); 2664967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar } 2674967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar 2684967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar template<typename IIter, typename OIter> 2694967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar bool ImportArrayChecked(IIter Ibegin, IIter Iend, OIter Obegin) { 2704967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar typedef typename std::remove_reference<decltype(**Obegin)>::type ItemT; 2714967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar ASTImporter &ImporterRef = Importer; 2724967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar bool Failed = false; 2734967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar std::transform(Ibegin, Iend, Obegin, 2744967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar [&ImporterRef, &Failed](ItemT *From) -> ItemT * { 2754967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar ItemT *To = ImporterRef.Import(From); 2764967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar if (!To && From) 2774967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Failed = true; 2784967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar return To; 2794967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar }); 2804967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar return Failed; 2814967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar } 2821b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor }; 2831b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor} 2844967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar 28527c72d8ca8bbb2861959c71f737e2560a7bf9991Douglas Gregorusing namespace clang; 2861b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor 2871b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor//---------------------------------------------------------------------------- 28873dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor// Structural Equivalence 28973dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor//---------------------------------------------------------------------------- 29073dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor 29173dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregornamespace { 29273dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor struct StructuralEquivalenceContext { 29373dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor /// \brief AST contexts for which we are checking structural equivalence. 29473dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor ASTContext &C1, &C2; 29573dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor 29673dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor /// \brief The set of "tentative" equivalences between two canonical 29773dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor /// declarations, mapping from a declaration in the first context to the 29873dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor /// declaration in the second context that we believe to be equivalent. 29973dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor llvm::DenseMap<Decl *, Decl *> TentativeEquivalences; 30073dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor 30173dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor /// \brief Queue of declarations in the first context whose equivalence 30273dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor /// with a declaration in the second context still needs to be verified. 30373dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor std::deque<Decl *> DeclsToCheck; 30473dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor 305ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor /// \brief Declaration (from, to) pairs that are known not to be equivalent 306ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor /// (which we have already complained about). 307ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor llvm::DenseSet<std::pair<Decl *, Decl *> > &NonEquivalentDecls; 308ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor 30973dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor /// \brief Whether we're being strict about the spelling of types when 31073dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor /// unifying two types. 31173dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor bool StrictTypeSpelling; 31293ed7cf05f900b9150dcf59c0e0f37f3bd325f62Douglas Gregor 31393ed7cf05f900b9150dcf59c0e0f37f3bd325f62Douglas Gregor /// \brief Whether to complain about failures. 31493ed7cf05f900b9150dcf59c0e0f37f3bd325f62Douglas Gregor bool Complain; 31593ed7cf05f900b9150dcf59c0e0f37f3bd325f62Douglas Gregor 3165b9268f26ac53a74d2c504279fe577d988d5615dRichard Smith /// \brief \c true if the last diagnostic came from C2. 3175b9268f26ac53a74d2c504279fe577d988d5615dRichard Smith bool LastDiagFromC2; 3185b9268f26ac53a74d2c504279fe577d988d5615dRichard Smith 31973dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor StructuralEquivalenceContext(ASTContext &C1, ASTContext &C2, 320ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor llvm::DenseSet<std::pair<Decl *, Decl *> > &NonEquivalentDecls, 32193ed7cf05f900b9150dcf59c0e0f37f3bd325f62Douglas Gregor bool StrictTypeSpelling = false, 32293ed7cf05f900b9150dcf59c0e0f37f3bd325f62Douglas Gregor bool Complain = true) 32333e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis : C1(C1), C2(C2), NonEquivalentDecls(NonEquivalentDecls), 3245b9268f26ac53a74d2c504279fe577d988d5615dRichard Smith StrictTypeSpelling(StrictTypeSpelling), Complain(Complain), 3255b9268f26ac53a74d2c504279fe577d988d5615dRichard Smith LastDiagFromC2(false) {} 32673dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor 32773dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor /// \brief Determine whether the two declarations are structurally 32873dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor /// equivalent. 32973dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor bool IsStructurallyEquivalent(Decl *D1, Decl *D2); 33073dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor 33173dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor /// \brief Determine whether the two types are structurally equivalent. 33273dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor bool IsStructurallyEquivalent(QualType T1, QualType T2); 33373dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor 33473dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor private: 33573dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor /// \brief Finish checking all of the structural equivalences. 33673dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor /// 33773dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor /// \returns true if an error occurred, false otherwise. 33873dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor bool Finish(); 33973dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor 34073dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor public: 34173dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor DiagnosticBuilder Diag1(SourceLocation Loc, unsigned DiagID) { 342347f64feb4f144c97757b4d8469030e793dbb36eDouglas Gregor assert(Complain && "Not allowed to complain"); 3435b9268f26ac53a74d2c504279fe577d988d5615dRichard Smith if (LastDiagFromC2) 3445b9268f26ac53a74d2c504279fe577d988d5615dRichard Smith C1.getDiagnostics().notePriorDiagnosticFrom(C2.getDiagnostics()); 3455b9268f26ac53a74d2c504279fe577d988d5615dRichard Smith LastDiagFromC2 = false; 34633e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis return C1.getDiagnostics().Report(Loc, DiagID); 34773dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor } 34873dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor 34973dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor DiagnosticBuilder Diag2(SourceLocation Loc, unsigned DiagID) { 350347f64feb4f144c97757b4d8469030e793dbb36eDouglas Gregor assert(Complain && "Not allowed to complain"); 3515b9268f26ac53a74d2c504279fe577d988d5615dRichard Smith if (!LastDiagFromC2) 3525b9268f26ac53a74d2c504279fe577d988d5615dRichard Smith C2.getDiagnostics().notePriorDiagnosticFrom(C1.getDiagnostics()); 3535b9268f26ac53a74d2c504279fe577d988d5615dRichard Smith LastDiagFromC2 = true; 35433e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis return C2.getDiagnostics().Report(Loc, DiagID); 35573dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor } 35673dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor }; 35773dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor} 35873dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor 35973dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregorstatic bool IsStructurallyEquivalent(StructuralEquivalenceContext &Context, 36073dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor QualType T1, QualType T2); 36173dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregorstatic bool IsStructurallyEquivalent(StructuralEquivalenceContext &Context, 36273dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor Decl *D1, Decl *D2); 36373dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor 36473dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor/// \brief Determine structural equivalence of two expressions. 36573dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregorstatic bool IsStructurallyEquivalent(StructuralEquivalenceContext &Context, 36673dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor Expr *E1, Expr *E2) { 36773dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor if (!E1 || !E2) 36873dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor return E1 == E2; 36973dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor 37073dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor // FIXME: Actually perform a structural comparison! 37173dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor return true; 37273dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor} 37373dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor 37473dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor/// \brief Determine whether two identifiers are equivalent. 37573dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregorstatic bool IsStructurallyEquivalent(const IdentifierInfo *Name1, 37673dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor const IdentifierInfo *Name2) { 37773dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor if (!Name1 || !Name2) 37873dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor return Name1 == Name2; 37973dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor 38073dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor return Name1->getName() == Name2->getName(); 38173dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor} 38273dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor 38373dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor/// \brief Determine whether two nested-name-specifiers are equivalent. 38473dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregorstatic bool IsStructurallyEquivalent(StructuralEquivalenceContext &Context, 38573dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor NestedNameSpecifier *NNS1, 38673dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor NestedNameSpecifier *NNS2) { 38773dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor // FIXME: Implement! 38873dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor return true; 38973dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor} 39073dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor 39173dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor/// \brief Determine whether two template arguments are equivalent. 39273dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregorstatic bool IsStructurallyEquivalent(StructuralEquivalenceContext &Context, 39373dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor const TemplateArgument &Arg1, 39473dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor const TemplateArgument &Arg2) { 395d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor if (Arg1.getKind() != Arg2.getKind()) 396d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor return false; 397d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor 398d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor switch (Arg1.getKind()) { 399d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor case TemplateArgument::Null: 400d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor return true; 401d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor 402d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor case TemplateArgument::Type: 403d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor return Context.IsStructurallyEquivalent(Arg1.getAsType(), Arg2.getAsType()); 404d7a6b1640e565487d163023a6a2e83f55476ae96Eli Friedman 405d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor case TemplateArgument::Integral: 406d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor if (!Context.IsStructurallyEquivalent(Arg1.getIntegralType(), 407d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor Arg2.getIntegralType())) 408d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor return false; 409d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor 41081695fa3a4772a62131eca45f8582cff72b1b9dbEric Christopher return llvm::APSInt::isSameValue(Arg1.getAsIntegral(), Arg2.getAsIntegral()); 411d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor 412d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor case TemplateArgument::Declaration: 413d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor return Context.IsStructurallyEquivalent(Arg1.getAsDecl(), Arg2.getAsDecl()); 414d7a6b1640e565487d163023a6a2e83f55476ae96Eli Friedman 415d7a6b1640e565487d163023a6a2e83f55476ae96Eli Friedman case TemplateArgument::NullPtr: 416d7a6b1640e565487d163023a6a2e83f55476ae96Eli Friedman return true; // FIXME: Is this correct? 417d7a6b1640e565487d163023a6a2e83f55476ae96Eli Friedman 418d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor case TemplateArgument::Template: 419d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor return IsStructurallyEquivalent(Context, 420d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor Arg1.getAsTemplate(), 421d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor Arg2.getAsTemplate()); 422a7fc901a2e39bfe55bfcff5934b2d9fdf9656491Douglas Gregor 423a7fc901a2e39bfe55bfcff5934b2d9fdf9656491Douglas Gregor case TemplateArgument::TemplateExpansion: 424a7fc901a2e39bfe55bfcff5934b2d9fdf9656491Douglas Gregor return IsStructurallyEquivalent(Context, 425a7fc901a2e39bfe55bfcff5934b2d9fdf9656491Douglas Gregor Arg1.getAsTemplateOrTemplatePattern(), 426a7fc901a2e39bfe55bfcff5934b2d9fdf9656491Douglas Gregor Arg2.getAsTemplateOrTemplatePattern()); 427a7fc901a2e39bfe55bfcff5934b2d9fdf9656491Douglas Gregor 428d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor case TemplateArgument::Expression: 429d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor return IsStructurallyEquivalent(Context, 430d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor Arg1.getAsExpr(), Arg2.getAsExpr()); 431d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor 432d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor case TemplateArgument::Pack: 433d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor if (Arg1.pack_size() != Arg2.pack_size()) 434d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor return false; 435d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor 436d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor for (unsigned I = 0, N = Arg1.pack_size(); I != N; ++I) 437d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor if (!IsStructurallyEquivalent(Context, 438d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor Arg1.pack_begin()[I], 439d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor Arg2.pack_begin()[I])) 440d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor return false; 441d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor 442d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor return true; 443d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor } 444d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor 445d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor llvm_unreachable("Invalid template argument kind"); 44673dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor} 44773dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor 44873dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor/// \brief Determine structural equivalence for the common part of array 44973dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor/// types. 45073dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregorstatic bool IsArrayStructurallyEquivalent(StructuralEquivalenceContext &Context, 45173dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor const ArrayType *Array1, 45273dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor const ArrayType *Array2) { 45373dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor if (!IsStructurallyEquivalent(Context, 45473dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor Array1->getElementType(), 45573dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor Array2->getElementType())) 45673dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor return false; 45773dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor if (Array1->getSizeModifier() != Array2->getSizeModifier()) 45873dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor return false; 45973dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor if (Array1->getIndexTypeQualifiers() != Array2->getIndexTypeQualifiers()) 46073dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor return false; 46173dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor 46273dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor return true; 46373dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor} 46473dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor 46573dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor/// \brief Determine structural equivalence of two types. 46673dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregorstatic bool IsStructurallyEquivalent(StructuralEquivalenceContext &Context, 46773dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor QualType T1, QualType T2) { 46873dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor if (T1.isNull() || T2.isNull()) 46973dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor return T1.isNull() && T2.isNull(); 47073dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor 47173dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor if (!Context.StrictTypeSpelling) { 47273dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor // We aren't being strict about token-to-token equivalence of types, 47373dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor // so map down to the canonical type. 47473dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor T1 = Context.C1.getCanonicalType(T1); 47573dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor T2 = Context.C2.getCanonicalType(T2); 47673dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor } 47773dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor 47873dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor if (T1.getQualifiers() != T2.getQualifiers()) 47973dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor return false; 48073dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor 481ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor Type::TypeClass TC = T1->getTypeClass(); 482ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor 483ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor if (T1->getTypeClass() != T2->getTypeClass()) { 484ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor // Compare function types with prototypes vs. without prototypes as if 485ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor // both did not have prototypes. 486ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor if (T1->getTypeClass() == Type::FunctionProto && 487ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor T2->getTypeClass() == Type::FunctionNoProto) 488ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor TC = Type::FunctionNoProto; 489ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor else if (T1->getTypeClass() == Type::FunctionNoProto && 490ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor T2->getTypeClass() == Type::FunctionProto) 491ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor TC = Type::FunctionNoProto; 492ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor else 493ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor return false; 494ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor } 49573dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor 496ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor switch (TC) { 497ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor case Type::Builtin: 49873dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor // FIXME: Deal with Char_S/Char_U. 49973dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor if (cast<BuiltinType>(T1)->getKind() != cast<BuiltinType>(T2)->getKind()) 50073dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor return false; 50173dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor break; 50273dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor 50373dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor case Type::Complex: 50473dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor if (!IsStructurallyEquivalent(Context, 50573dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor cast<ComplexType>(T1)->getElementType(), 50673dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor cast<ComplexType>(T2)->getElementType())) 50773dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor return false; 50873dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor break; 50973dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor 510651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines case Type::Adjusted: 51112df246d6dea2ee1f92c186f922f1afcf499647aReid Kleckner case Type::Decayed: 51212df246d6dea2ee1f92c186f922f1afcf499647aReid Kleckner if (!IsStructurallyEquivalent(Context, 513651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines cast<AdjustedType>(T1)->getOriginalType(), 514651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines cast<AdjustedType>(T2)->getOriginalType())) 51512df246d6dea2ee1f92c186f922f1afcf499647aReid Kleckner return false; 51612df246d6dea2ee1f92c186f922f1afcf499647aReid Kleckner break; 51712df246d6dea2ee1f92c186f922f1afcf499647aReid Kleckner 51873dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor case Type::Pointer: 51973dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor if (!IsStructurallyEquivalent(Context, 52073dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor cast<PointerType>(T1)->getPointeeType(), 52173dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor cast<PointerType>(T2)->getPointeeType())) 52273dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor return false; 52373dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor break; 52473dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor 52573dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor case Type::BlockPointer: 52673dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor if (!IsStructurallyEquivalent(Context, 52773dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor cast<BlockPointerType>(T1)->getPointeeType(), 52873dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor cast<BlockPointerType>(T2)->getPointeeType())) 52973dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor return false; 53073dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor break; 53173dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor 53273dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor case Type::LValueReference: 53373dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor case Type::RValueReference: { 53473dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor const ReferenceType *Ref1 = cast<ReferenceType>(T1); 53573dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor const ReferenceType *Ref2 = cast<ReferenceType>(T2); 53673dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor if (Ref1->isSpelledAsLValue() != Ref2->isSpelledAsLValue()) 53773dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor return false; 53873dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor if (Ref1->isInnerRef() != Ref2->isInnerRef()) 53973dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor return false; 54073dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor if (!IsStructurallyEquivalent(Context, 54173dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor Ref1->getPointeeTypeAsWritten(), 54273dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor Ref2->getPointeeTypeAsWritten())) 54373dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor return false; 54473dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor break; 54573dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor } 54673dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor 54773dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor case Type::MemberPointer: { 54873dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor const MemberPointerType *MemPtr1 = cast<MemberPointerType>(T1); 54973dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor const MemberPointerType *MemPtr2 = cast<MemberPointerType>(T2); 55073dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor if (!IsStructurallyEquivalent(Context, 55173dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor MemPtr1->getPointeeType(), 55273dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor MemPtr2->getPointeeType())) 55373dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor return false; 55473dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor if (!IsStructurallyEquivalent(Context, 55573dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor QualType(MemPtr1->getClass(), 0), 55673dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor QualType(MemPtr2->getClass(), 0))) 55773dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor return false; 55873dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor break; 55973dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor } 56073dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor 56173dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor case Type::ConstantArray: { 56273dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor const ConstantArrayType *Array1 = cast<ConstantArrayType>(T1); 56373dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor const ConstantArrayType *Array2 = cast<ConstantArrayType>(T2); 56481695fa3a4772a62131eca45f8582cff72b1b9dbEric Christopher if (!llvm::APInt::isSameValue(Array1->getSize(), Array2->getSize())) 56573dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor return false; 56673dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor 56773dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor if (!IsArrayStructurallyEquivalent(Context, Array1, Array2)) 56873dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor return false; 56973dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor break; 57073dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor } 57173dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor 57273dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor case Type::IncompleteArray: 57373dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor if (!IsArrayStructurallyEquivalent(Context, 57473dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor cast<ArrayType>(T1), 57573dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor cast<ArrayType>(T2))) 57673dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor return false; 57773dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor break; 57873dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor 57973dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor case Type::VariableArray: { 58073dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor const VariableArrayType *Array1 = cast<VariableArrayType>(T1); 58173dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor const VariableArrayType *Array2 = cast<VariableArrayType>(T2); 58273dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor if (!IsStructurallyEquivalent(Context, 58373dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor Array1->getSizeExpr(), Array2->getSizeExpr())) 58473dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor return false; 58573dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor 58673dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor if (!IsArrayStructurallyEquivalent(Context, Array1, Array2)) 58773dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor return false; 58873dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor 58973dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor break; 59073dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor } 59173dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor 59273dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor case Type::DependentSizedArray: { 59373dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor const DependentSizedArrayType *Array1 = cast<DependentSizedArrayType>(T1); 59473dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor const DependentSizedArrayType *Array2 = cast<DependentSizedArrayType>(T2); 59573dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor if (!IsStructurallyEquivalent(Context, 59673dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor Array1->getSizeExpr(), Array2->getSizeExpr())) 59773dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor return false; 59873dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor 59973dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor if (!IsArrayStructurallyEquivalent(Context, Array1, Array2)) 60073dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor return false; 60173dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor 60273dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor break; 60373dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor } 60473dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor 60573dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor case Type::DependentSizedExtVector: { 60673dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor const DependentSizedExtVectorType *Vec1 60773dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor = cast<DependentSizedExtVectorType>(T1); 60873dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor const DependentSizedExtVectorType *Vec2 60973dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor = cast<DependentSizedExtVectorType>(T2); 61073dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor if (!IsStructurallyEquivalent(Context, 61173dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor Vec1->getSizeExpr(), Vec2->getSizeExpr())) 61273dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor return false; 61373dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor if (!IsStructurallyEquivalent(Context, 61473dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor Vec1->getElementType(), 61573dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor Vec2->getElementType())) 61673dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor return false; 61773dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor break; 61873dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor } 61973dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor 62073dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor case Type::Vector: 62173dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor case Type::ExtVector: { 62273dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor const VectorType *Vec1 = cast<VectorType>(T1); 62373dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor const VectorType *Vec2 = cast<VectorType>(T2); 62473dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor if (!IsStructurallyEquivalent(Context, 62573dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor Vec1->getElementType(), 62673dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor Vec2->getElementType())) 62773dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor return false; 62873dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor if (Vec1->getNumElements() != Vec2->getNumElements()) 62973dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor return false; 630e86d78cf4754a6aef2cf9a33d847aa15338e276fBob Wilson if (Vec1->getVectorKind() != Vec2->getVectorKind()) 63173dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor return false; 6320e12b44081c6395a6d60a05a85a6012f7bb23b16Douglas Gregor break; 63373dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor } 63473dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor 63573dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor case Type::FunctionProto: { 63673dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor const FunctionProtoType *Proto1 = cast<FunctionProtoType>(T1); 63773dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor const FunctionProtoType *Proto2 = cast<FunctionProtoType>(T2); 638651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines if (Proto1->getNumParams() != Proto2->getNumParams()) 63973dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor return false; 640651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines for (unsigned I = 0, N = Proto1->getNumParams(); I != N; ++I) { 641651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines if (!IsStructurallyEquivalent(Context, Proto1->getParamType(I), 642651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines Proto2->getParamType(I))) 64373dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor return false; 64473dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor } 64573dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor if (Proto1->isVariadic() != Proto2->isVariadic()) 64673dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor return false; 64760618fa7f88d5162bb5b40988b6b38d4d75d6fc6Sebastian Redl if (Proto1->getExceptionSpecType() != Proto2->getExceptionSpecType()) 64873dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor return false; 64960618fa7f88d5162bb5b40988b6b38d4d75d6fc6Sebastian Redl if (Proto1->getExceptionSpecType() == EST_Dynamic) { 65060618fa7f88d5162bb5b40988b6b38d4d75d6fc6Sebastian Redl if (Proto1->getNumExceptions() != Proto2->getNumExceptions()) 65160618fa7f88d5162bb5b40988b6b38d4d75d6fc6Sebastian Redl return false; 65260618fa7f88d5162bb5b40988b6b38d4d75d6fc6Sebastian Redl for (unsigned I = 0, N = Proto1->getNumExceptions(); I != N; ++I) { 65360618fa7f88d5162bb5b40988b6b38d4d75d6fc6Sebastian Redl if (!IsStructurallyEquivalent(Context, 65460618fa7f88d5162bb5b40988b6b38d4d75d6fc6Sebastian Redl Proto1->getExceptionType(I), 65560618fa7f88d5162bb5b40988b6b38d4d75d6fc6Sebastian Redl Proto2->getExceptionType(I))) 65660618fa7f88d5162bb5b40988b6b38d4d75d6fc6Sebastian Redl return false; 65760618fa7f88d5162bb5b40988b6b38d4d75d6fc6Sebastian Redl } 65860618fa7f88d5162bb5b40988b6b38d4d75d6fc6Sebastian Redl } else if (Proto1->getExceptionSpecType() == EST_ComputedNoexcept) { 65973dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor if (!IsStructurallyEquivalent(Context, 66060618fa7f88d5162bb5b40988b6b38d4d75d6fc6Sebastian Redl Proto1->getNoexceptExpr(), 66160618fa7f88d5162bb5b40988b6b38d4d75d6fc6Sebastian Redl Proto2->getNoexceptExpr())) 66273dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor return false; 66373dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor } 66473dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor if (Proto1->getTypeQuals() != Proto2->getTypeQuals()) 66573dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor return false; 66673dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor 66773dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor // Fall through to check the bits common with FunctionNoProtoType. 66873dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor } 66973dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor 67073dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor case Type::FunctionNoProto: { 67173dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor const FunctionType *Function1 = cast<FunctionType>(T1); 67273dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor const FunctionType *Function2 = cast<FunctionType>(T2); 673651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines if (!IsStructurallyEquivalent(Context, Function1->getReturnType(), 674651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines Function2->getReturnType())) 67573dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor return false; 6764967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar if (Function1->getExtInfo() != Function2->getExtInfo()) 6774967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar return false; 67873dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor break; 67973dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor } 68073dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor 68173dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor case Type::UnresolvedUsing: 68273dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor if (!IsStructurallyEquivalent(Context, 68373dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor cast<UnresolvedUsingType>(T1)->getDecl(), 68473dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor cast<UnresolvedUsingType>(T2)->getDecl())) 68573dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor return false; 68673dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor 68773dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor break; 6889d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall 6899d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall case Type::Attributed: 6909d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall if (!IsStructurallyEquivalent(Context, 6919d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall cast<AttributedType>(T1)->getModifiedType(), 6929d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall cast<AttributedType>(T2)->getModifiedType())) 6939d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall return false; 6949d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall if (!IsStructurallyEquivalent(Context, 6959d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall cast<AttributedType>(T1)->getEquivalentType(), 6969d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall cast<AttributedType>(T2)->getEquivalentType())) 6979d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall return false; 6989d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall break; 69973dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor 700075f8f1b6bed4d1b224c74f87508534cc6392ce6Abramo Bagnara case Type::Paren: 701075f8f1b6bed4d1b224c74f87508534cc6392ce6Abramo Bagnara if (!IsStructurallyEquivalent(Context, 702075f8f1b6bed4d1b224c74f87508534cc6392ce6Abramo Bagnara cast<ParenType>(T1)->getInnerType(), 703075f8f1b6bed4d1b224c74f87508534cc6392ce6Abramo Bagnara cast<ParenType>(T2)->getInnerType())) 704075f8f1b6bed4d1b224c74f87508534cc6392ce6Abramo Bagnara return false; 705075f8f1b6bed4d1b224c74f87508534cc6392ce6Abramo Bagnara break; 706075f8f1b6bed4d1b224c74f87508534cc6392ce6Abramo Bagnara 70773dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor case Type::Typedef: 70873dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor if (!IsStructurallyEquivalent(Context, 70973dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor cast<TypedefType>(T1)->getDecl(), 71073dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor cast<TypedefType>(T2)->getDecl())) 71173dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor return false; 71273dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor break; 71373dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor 71473dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor case Type::TypeOfExpr: 71573dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor if (!IsStructurallyEquivalent(Context, 71673dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor cast<TypeOfExprType>(T1)->getUnderlyingExpr(), 71773dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor cast<TypeOfExprType>(T2)->getUnderlyingExpr())) 71873dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor return false; 71973dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor break; 72073dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor 72173dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor case Type::TypeOf: 72273dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor if (!IsStructurallyEquivalent(Context, 72373dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor cast<TypeOfType>(T1)->getUnderlyingType(), 72473dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor cast<TypeOfType>(T2)->getUnderlyingType())) 72573dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor return false; 72673dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor break; 727ca63c200346c0ca9e00194ec6e34a5a7b0ed9321Sean Hunt 728ca63c200346c0ca9e00194ec6e34a5a7b0ed9321Sean Hunt case Type::UnaryTransform: 729ca63c200346c0ca9e00194ec6e34a5a7b0ed9321Sean Hunt if (!IsStructurallyEquivalent(Context, 730ca63c200346c0ca9e00194ec6e34a5a7b0ed9321Sean Hunt cast<UnaryTransformType>(T1)->getUnderlyingType(), 731ca63c200346c0ca9e00194ec6e34a5a7b0ed9321Sean Hunt cast<UnaryTransformType>(T1)->getUnderlyingType())) 732ca63c200346c0ca9e00194ec6e34a5a7b0ed9321Sean Hunt return false; 733ca63c200346c0ca9e00194ec6e34a5a7b0ed9321Sean Hunt break; 734ca63c200346c0ca9e00194ec6e34a5a7b0ed9321Sean Hunt 73573dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor case Type::Decltype: 73673dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor if (!IsStructurallyEquivalent(Context, 73773dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor cast<DecltypeType>(T1)->getUnderlyingExpr(), 73873dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor cast<DecltypeType>(T2)->getUnderlyingExpr())) 73973dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor return false; 74073dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor break; 74173dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor 74234b41d939a1328f484511c6002ba2456db879a29Richard Smith case Type::Auto: 74334b41d939a1328f484511c6002ba2456db879a29Richard Smith if (!IsStructurallyEquivalent(Context, 74434b41d939a1328f484511c6002ba2456db879a29Richard Smith cast<AutoType>(T1)->getDeducedType(), 74534b41d939a1328f484511c6002ba2456db879a29Richard Smith cast<AutoType>(T2)->getDeducedType())) 74634b41d939a1328f484511c6002ba2456db879a29Richard Smith return false; 74734b41d939a1328f484511c6002ba2456db879a29Richard Smith break; 74834b41d939a1328f484511c6002ba2456db879a29Richard Smith 74973dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor case Type::Record: 75073dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor case Type::Enum: 75173dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor if (!IsStructurallyEquivalent(Context, 75273dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor cast<TagType>(T1)->getDecl(), 75373dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor cast<TagType>(T2)->getDecl())) 75473dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor return false; 75573dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor break; 756465d41b92b2c862f3062c412a0538db65c6a2661Abramo Bagnara 75773dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor case Type::TemplateTypeParm: { 75873dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor const TemplateTypeParmType *Parm1 = cast<TemplateTypeParmType>(T1); 75973dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor const TemplateTypeParmType *Parm2 = cast<TemplateTypeParmType>(T2); 76073dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor if (Parm1->getDepth() != Parm2->getDepth()) 76173dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor return false; 76273dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor if (Parm1->getIndex() != Parm2->getIndex()) 76373dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor return false; 76473dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor if (Parm1->isParameterPack() != Parm2->isParameterPack()) 76573dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor return false; 76673dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor 76773dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor // Names of template type parameters are never significant. 76873dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor break; 76973dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor } 77073dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor 77173dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor case Type::SubstTemplateTypeParm: { 77273dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor const SubstTemplateTypeParmType *Subst1 77373dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor = cast<SubstTemplateTypeParmType>(T1); 77473dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor const SubstTemplateTypeParmType *Subst2 77573dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor = cast<SubstTemplateTypeParmType>(T2); 77673dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor if (!IsStructurallyEquivalent(Context, 77773dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor QualType(Subst1->getReplacedParameter(), 0), 77873dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor QualType(Subst2->getReplacedParameter(), 0))) 77973dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor return false; 78073dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor if (!IsStructurallyEquivalent(Context, 78173dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor Subst1->getReplacementType(), 78273dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor Subst2->getReplacementType())) 78373dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor return false; 78473dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor break; 78573dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor } 78673dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor 7870bc15d92bf98cd01e7904d7fca9895dacc237618Douglas Gregor case Type::SubstTemplateTypeParmPack: { 7880bc15d92bf98cd01e7904d7fca9895dacc237618Douglas Gregor const SubstTemplateTypeParmPackType *Subst1 7890bc15d92bf98cd01e7904d7fca9895dacc237618Douglas Gregor = cast<SubstTemplateTypeParmPackType>(T1); 7900bc15d92bf98cd01e7904d7fca9895dacc237618Douglas Gregor const SubstTemplateTypeParmPackType *Subst2 7910bc15d92bf98cd01e7904d7fca9895dacc237618Douglas Gregor = cast<SubstTemplateTypeParmPackType>(T2); 7920bc15d92bf98cd01e7904d7fca9895dacc237618Douglas Gregor if (!IsStructurallyEquivalent(Context, 7930bc15d92bf98cd01e7904d7fca9895dacc237618Douglas Gregor QualType(Subst1->getReplacedParameter(), 0), 7940bc15d92bf98cd01e7904d7fca9895dacc237618Douglas Gregor QualType(Subst2->getReplacedParameter(), 0))) 7950bc15d92bf98cd01e7904d7fca9895dacc237618Douglas Gregor return false; 7960bc15d92bf98cd01e7904d7fca9895dacc237618Douglas Gregor if (!IsStructurallyEquivalent(Context, 7970bc15d92bf98cd01e7904d7fca9895dacc237618Douglas Gregor Subst1->getArgumentPack(), 7980bc15d92bf98cd01e7904d7fca9895dacc237618Douglas Gregor Subst2->getArgumentPack())) 7990bc15d92bf98cd01e7904d7fca9895dacc237618Douglas Gregor return false; 8000bc15d92bf98cd01e7904d7fca9895dacc237618Douglas Gregor break; 8010bc15d92bf98cd01e7904d7fca9895dacc237618Douglas Gregor } 80273dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor case Type::TemplateSpecialization: { 80373dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor const TemplateSpecializationType *Spec1 80473dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor = cast<TemplateSpecializationType>(T1); 80573dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor const TemplateSpecializationType *Spec2 80673dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor = cast<TemplateSpecializationType>(T2); 80773dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor if (!IsStructurallyEquivalent(Context, 80873dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor Spec1->getTemplateName(), 80973dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor Spec2->getTemplateName())) 81073dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor return false; 81173dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor if (Spec1->getNumArgs() != Spec2->getNumArgs()) 81273dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor return false; 81373dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor for (unsigned I = 0, N = Spec1->getNumArgs(); I != N; ++I) { 81473dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor if (!IsStructurallyEquivalent(Context, 81573dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor Spec1->getArg(I), Spec2->getArg(I))) 81673dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor return false; 81773dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor } 81873dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor break; 81973dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor } 82073dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor 821465d41b92b2c862f3062c412a0538db65c6a2661Abramo Bagnara case Type::Elaborated: { 822465d41b92b2c862f3062c412a0538db65c6a2661Abramo Bagnara const ElaboratedType *Elab1 = cast<ElaboratedType>(T1); 823465d41b92b2c862f3062c412a0538db65c6a2661Abramo Bagnara const ElaboratedType *Elab2 = cast<ElaboratedType>(T2); 824465d41b92b2c862f3062c412a0538db65c6a2661Abramo Bagnara // CHECKME: what if a keyword is ETK_None or ETK_typename ? 825465d41b92b2c862f3062c412a0538db65c6a2661Abramo Bagnara if (Elab1->getKeyword() != Elab2->getKeyword()) 826465d41b92b2c862f3062c412a0538db65c6a2661Abramo Bagnara return false; 82773dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor if (!IsStructurallyEquivalent(Context, 828465d41b92b2c862f3062c412a0538db65c6a2661Abramo Bagnara Elab1->getQualifier(), 829465d41b92b2c862f3062c412a0538db65c6a2661Abramo Bagnara Elab2->getQualifier())) 83073dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor return false; 83173dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor if (!IsStructurallyEquivalent(Context, 832465d41b92b2c862f3062c412a0538db65c6a2661Abramo Bagnara Elab1->getNamedType(), 833465d41b92b2c862f3062c412a0538db65c6a2661Abramo Bagnara Elab2->getNamedType())) 83473dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor return false; 83573dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor break; 83673dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor } 83773dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor 8383cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall case Type::InjectedClassName: { 8393cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall const InjectedClassNameType *Inj1 = cast<InjectedClassNameType>(T1); 8403cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall const InjectedClassNameType *Inj2 = cast<InjectedClassNameType>(T2); 8413cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall if (!IsStructurallyEquivalent(Context, 84231f17ecbef57b5679c017c375db330546b7b5145John McCall Inj1->getInjectedSpecializationType(), 84331f17ecbef57b5679c017c375db330546b7b5145John McCall Inj2->getInjectedSpecializationType())) 8443cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall return false; 8453cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall break; 8463cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall } 8473cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall 8484714c12a1ab759156b78be8f109ea4c12213af57Douglas Gregor case Type::DependentName: { 8494714c12a1ab759156b78be8f109ea4c12213af57Douglas Gregor const DependentNameType *Typename1 = cast<DependentNameType>(T1); 8504714c12a1ab759156b78be8f109ea4c12213af57Douglas Gregor const DependentNameType *Typename2 = cast<DependentNameType>(T2); 85173dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor if (!IsStructurallyEquivalent(Context, 85273dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor Typename1->getQualifier(), 85373dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor Typename2->getQualifier())) 85473dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor return false; 85573dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor if (!IsStructurallyEquivalent(Typename1->getIdentifier(), 85673dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor Typename2->getIdentifier())) 85773dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor return false; 85873dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor 85973dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor break; 86073dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor } 86173dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor 86233500955d731c73717af52088b7fc0e7a85681e7John McCall case Type::DependentTemplateSpecialization: { 86333500955d731c73717af52088b7fc0e7a85681e7John McCall const DependentTemplateSpecializationType *Spec1 = 86433500955d731c73717af52088b7fc0e7a85681e7John McCall cast<DependentTemplateSpecializationType>(T1); 86533500955d731c73717af52088b7fc0e7a85681e7John McCall const DependentTemplateSpecializationType *Spec2 = 86633500955d731c73717af52088b7fc0e7a85681e7John McCall cast<DependentTemplateSpecializationType>(T2); 86733500955d731c73717af52088b7fc0e7a85681e7John McCall if (!IsStructurallyEquivalent(Context, 86833500955d731c73717af52088b7fc0e7a85681e7John McCall Spec1->getQualifier(), 86933500955d731c73717af52088b7fc0e7a85681e7John McCall Spec2->getQualifier())) 87033500955d731c73717af52088b7fc0e7a85681e7John McCall return false; 87133500955d731c73717af52088b7fc0e7a85681e7John McCall if (!IsStructurallyEquivalent(Spec1->getIdentifier(), 87233500955d731c73717af52088b7fc0e7a85681e7John McCall Spec2->getIdentifier())) 87333500955d731c73717af52088b7fc0e7a85681e7John McCall return false; 87433500955d731c73717af52088b7fc0e7a85681e7John McCall if (Spec1->getNumArgs() != Spec2->getNumArgs()) 87533500955d731c73717af52088b7fc0e7a85681e7John McCall return false; 87633500955d731c73717af52088b7fc0e7a85681e7John McCall for (unsigned I = 0, N = Spec1->getNumArgs(); I != N; ++I) { 87733500955d731c73717af52088b7fc0e7a85681e7John McCall if (!IsStructurallyEquivalent(Context, 87833500955d731c73717af52088b7fc0e7a85681e7John McCall Spec1->getArg(I), Spec2->getArg(I))) 87933500955d731c73717af52088b7fc0e7a85681e7John McCall return false; 88033500955d731c73717af52088b7fc0e7a85681e7John McCall } 88133500955d731c73717af52088b7fc0e7a85681e7John McCall break; 88233500955d731c73717af52088b7fc0e7a85681e7John McCall } 8837536dd5e6c99584481b7dab68b7e7d8df9c54054Douglas Gregor 8847536dd5e6c99584481b7dab68b7e7d8df9c54054Douglas Gregor case Type::PackExpansion: 8857536dd5e6c99584481b7dab68b7e7d8df9c54054Douglas Gregor if (!IsStructurallyEquivalent(Context, 8867536dd5e6c99584481b7dab68b7e7d8df9c54054Douglas Gregor cast<PackExpansionType>(T1)->getPattern(), 8877536dd5e6c99584481b7dab68b7e7d8df9c54054Douglas Gregor cast<PackExpansionType>(T2)->getPattern())) 8887536dd5e6c99584481b7dab68b7e7d8df9c54054Douglas Gregor return false; 8897536dd5e6c99584481b7dab68b7e7d8df9c54054Douglas Gregor break; 8907536dd5e6c99584481b7dab68b7e7d8df9c54054Douglas Gregor 89173dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor case Type::ObjCInterface: { 89273dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor const ObjCInterfaceType *Iface1 = cast<ObjCInterfaceType>(T1); 89373dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor const ObjCInterfaceType *Iface2 = cast<ObjCInterfaceType>(T2); 89473dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor if (!IsStructurallyEquivalent(Context, 89573dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor Iface1->getDecl(), Iface2->getDecl())) 89673dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor return false; 897c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall break; 898c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall } 899c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall 900c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall case Type::ObjCObject: { 901c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall const ObjCObjectType *Obj1 = cast<ObjCObjectType>(T1); 902c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall const ObjCObjectType *Obj2 = cast<ObjCObjectType>(T2); 903c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall if (!IsStructurallyEquivalent(Context, 904c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall Obj1->getBaseType(), 905c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall Obj2->getBaseType())) 906c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall return false; 907c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall if (Obj1->getNumProtocols() != Obj2->getNumProtocols()) 90873dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor return false; 909c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall for (unsigned I = 0, N = Obj1->getNumProtocols(); I != N; ++I) { 91073dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor if (!IsStructurallyEquivalent(Context, 911c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall Obj1->getProtocol(I), 912c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall Obj2->getProtocol(I))) 91373dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor return false; 91473dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor } 91573dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor break; 91673dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor } 91773dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor 91873dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor case Type::ObjCObjectPointer: { 91973dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor const ObjCObjectPointerType *Ptr1 = cast<ObjCObjectPointerType>(T1); 92073dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor const ObjCObjectPointerType *Ptr2 = cast<ObjCObjectPointerType>(T2); 92173dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor if (!IsStructurallyEquivalent(Context, 92273dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor Ptr1->getPointeeType(), 92373dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor Ptr2->getPointeeType())) 92473dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor return false; 92573dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor break; 92673dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor } 927b001de7458d17c17e6d8b8034c7cfcefd3b70c00Eli Friedman 928b001de7458d17c17e6d8b8034c7cfcefd3b70c00Eli Friedman case Type::Atomic: { 929b001de7458d17c17e6d8b8034c7cfcefd3b70c00Eli Friedman if (!IsStructurallyEquivalent(Context, 930b001de7458d17c17e6d8b8034c7cfcefd3b70c00Eli Friedman cast<AtomicType>(T1)->getValueType(), 931b001de7458d17c17e6d8b8034c7cfcefd3b70c00Eli Friedman cast<AtomicType>(T2)->getValueType())) 932b001de7458d17c17e6d8b8034c7cfcefd3b70c00Eli Friedman return false; 933b001de7458d17c17e6d8b8034c7cfcefd3b70c00Eli Friedman break; 934b001de7458d17c17e6d8b8034c7cfcefd3b70c00Eli Friedman } 935b001de7458d17c17e6d8b8034c7cfcefd3b70c00Eli Friedman 9364967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar case Type::Pipe: { 9374967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar if (!IsStructurallyEquivalent(Context, 9384967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar cast<PipeType>(T1)->getElementType(), 9394967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar cast<PipeType>(T2)->getElementType())) 9404967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar return false; 9414967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar break; 9424967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar } 9434967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar 94473dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor } // end switch 94573dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor 94673dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor return true; 94773dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor} 94873dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor 9497c9412cdad37146e6d1eee15eaa0d7a1d93e6ee1Douglas Gregor/// \brief Determine structural equivalence of two fields. 9507c9412cdad37146e6d1eee15eaa0d7a1d93e6ee1Douglas Gregorstatic bool IsStructurallyEquivalent(StructuralEquivalenceContext &Context, 9517c9412cdad37146e6d1eee15eaa0d7a1d93e6ee1Douglas Gregor FieldDecl *Field1, FieldDecl *Field2) { 9527c9412cdad37146e6d1eee15eaa0d7a1d93e6ee1Douglas Gregor RecordDecl *Owner2 = cast<RecordDecl>(Field2->getDeclContext()); 95311ce5fe7d8dda29f3d093e5759a7476b140e3241Douglas Gregor 95411ce5fe7d8dda29f3d093e5759a7476b140e3241Douglas Gregor // For anonymous structs/unions, match up the anonymous struct/union type 95511ce5fe7d8dda29f3d093e5759a7476b140e3241Douglas Gregor // declarations directly, so that we don't go off searching for anonymous 95611ce5fe7d8dda29f3d093e5759a7476b140e3241Douglas Gregor // types 95711ce5fe7d8dda29f3d093e5759a7476b140e3241Douglas Gregor if (Field1->isAnonymousStructOrUnion() && 95811ce5fe7d8dda29f3d093e5759a7476b140e3241Douglas Gregor Field2->isAnonymousStructOrUnion()) { 95911ce5fe7d8dda29f3d093e5759a7476b140e3241Douglas Gregor RecordDecl *D1 = Field1->getType()->castAs<RecordType>()->getDecl(); 96011ce5fe7d8dda29f3d093e5759a7476b140e3241Douglas Gregor RecordDecl *D2 = Field2->getType()->castAs<RecordType>()->getDecl(); 96111ce5fe7d8dda29f3d093e5759a7476b140e3241Douglas Gregor return IsStructurallyEquivalent(Context, D1, D2); 96211ce5fe7d8dda29f3d093e5759a7476b140e3241Douglas Gregor } 963fff418b1abea921685a1175a8ee0b597594bddc1Sean Callanan 964fff418b1abea921685a1175a8ee0b597594bddc1Sean Callanan // Check for equivalent field names. 965fff418b1abea921685a1175a8ee0b597594bddc1Sean Callanan IdentifierInfo *Name1 = Field1->getIdentifier(); 966fff418b1abea921685a1175a8ee0b597594bddc1Sean Callanan IdentifierInfo *Name2 = Field2->getIdentifier(); 967fff418b1abea921685a1175a8ee0b597594bddc1Sean Callanan if (!::IsStructurallyEquivalent(Name1, Name2)) 968fff418b1abea921685a1175a8ee0b597594bddc1Sean Callanan return false; 96911ce5fe7d8dda29f3d093e5759a7476b140e3241Douglas Gregor 97011ce5fe7d8dda29f3d093e5759a7476b140e3241Douglas Gregor if (!IsStructurallyEquivalent(Context, 9717c9412cdad37146e6d1eee15eaa0d7a1d93e6ee1Douglas Gregor Field1->getType(), Field2->getType())) { 972347f64feb4f144c97757b4d8469030e793dbb36eDouglas Gregor if (Context.Complain) { 973347f64feb4f144c97757b4d8469030e793dbb36eDouglas Gregor Context.Diag2(Owner2->getLocation(), diag::warn_odr_tag_type_inconsistent) 974347f64feb4f144c97757b4d8469030e793dbb36eDouglas Gregor << Context.C2.getTypeDeclType(Owner2); 975347f64feb4f144c97757b4d8469030e793dbb36eDouglas Gregor Context.Diag2(Field2->getLocation(), diag::note_odr_field) 976347f64feb4f144c97757b4d8469030e793dbb36eDouglas Gregor << Field2->getDeclName() << Field2->getType(); 977347f64feb4f144c97757b4d8469030e793dbb36eDouglas Gregor Context.Diag1(Field1->getLocation(), diag::note_odr_field) 978347f64feb4f144c97757b4d8469030e793dbb36eDouglas Gregor << Field1->getDeclName() << Field1->getType(); 979347f64feb4f144c97757b4d8469030e793dbb36eDouglas Gregor } 9807c9412cdad37146e6d1eee15eaa0d7a1d93e6ee1Douglas Gregor return false; 9817c9412cdad37146e6d1eee15eaa0d7a1d93e6ee1Douglas Gregor } 9827c9412cdad37146e6d1eee15eaa0d7a1d93e6ee1Douglas Gregor 9837c9412cdad37146e6d1eee15eaa0d7a1d93e6ee1Douglas Gregor if (Field1->isBitField() != Field2->isBitField()) { 984347f64feb4f144c97757b4d8469030e793dbb36eDouglas Gregor if (Context.Complain) { 985347f64feb4f144c97757b4d8469030e793dbb36eDouglas Gregor Context.Diag2(Owner2->getLocation(), diag::warn_odr_tag_type_inconsistent) 986347f64feb4f144c97757b4d8469030e793dbb36eDouglas Gregor << Context.C2.getTypeDeclType(Owner2); 987347f64feb4f144c97757b4d8469030e793dbb36eDouglas Gregor if (Field1->isBitField()) { 988347f64feb4f144c97757b4d8469030e793dbb36eDouglas Gregor Context.Diag1(Field1->getLocation(), diag::note_odr_bit_field) 989347f64feb4f144c97757b4d8469030e793dbb36eDouglas Gregor << Field1->getDeclName() << Field1->getType() 990347f64feb4f144c97757b4d8469030e793dbb36eDouglas Gregor << Field1->getBitWidthValue(Context.C1); 991347f64feb4f144c97757b4d8469030e793dbb36eDouglas Gregor Context.Diag2(Field2->getLocation(), diag::note_odr_not_bit_field) 992347f64feb4f144c97757b4d8469030e793dbb36eDouglas Gregor << Field2->getDeclName(); 993347f64feb4f144c97757b4d8469030e793dbb36eDouglas Gregor } else { 994347f64feb4f144c97757b4d8469030e793dbb36eDouglas Gregor Context.Diag2(Field2->getLocation(), diag::note_odr_bit_field) 995347f64feb4f144c97757b4d8469030e793dbb36eDouglas Gregor << Field2->getDeclName() << Field2->getType() 996347f64feb4f144c97757b4d8469030e793dbb36eDouglas Gregor << Field2->getBitWidthValue(Context.C2); 997347f64feb4f144c97757b4d8469030e793dbb36eDouglas Gregor Context.Diag1(Field1->getLocation(), diag::note_odr_not_bit_field) 998347f64feb4f144c97757b4d8469030e793dbb36eDouglas Gregor << Field1->getDeclName(); 999347f64feb4f144c97757b4d8469030e793dbb36eDouglas Gregor } 10007c9412cdad37146e6d1eee15eaa0d7a1d93e6ee1Douglas Gregor } 10017c9412cdad37146e6d1eee15eaa0d7a1d93e6ee1Douglas Gregor return false; 10027c9412cdad37146e6d1eee15eaa0d7a1d93e6ee1Douglas Gregor } 10037c9412cdad37146e6d1eee15eaa0d7a1d93e6ee1Douglas Gregor 10047c9412cdad37146e6d1eee15eaa0d7a1d93e6ee1Douglas Gregor if (Field1->isBitField()) { 10057c9412cdad37146e6d1eee15eaa0d7a1d93e6ee1Douglas Gregor // Make sure that the bit-fields are the same length. 10067c9412cdad37146e6d1eee15eaa0d7a1d93e6ee1Douglas Gregor unsigned Bits1 = Field1->getBitWidthValue(Context.C1); 10077c9412cdad37146e6d1eee15eaa0d7a1d93e6ee1Douglas Gregor unsigned Bits2 = Field2->getBitWidthValue(Context.C2); 10087c9412cdad37146e6d1eee15eaa0d7a1d93e6ee1Douglas Gregor 10097c9412cdad37146e6d1eee15eaa0d7a1d93e6ee1Douglas Gregor if (Bits1 != Bits2) { 1010347f64feb4f144c97757b4d8469030e793dbb36eDouglas Gregor if (Context.Complain) { 1011347f64feb4f144c97757b4d8469030e793dbb36eDouglas Gregor Context.Diag2(Owner2->getLocation(), diag::warn_odr_tag_type_inconsistent) 1012347f64feb4f144c97757b4d8469030e793dbb36eDouglas Gregor << Context.C2.getTypeDeclType(Owner2); 1013347f64feb4f144c97757b4d8469030e793dbb36eDouglas Gregor Context.Diag2(Field2->getLocation(), diag::note_odr_bit_field) 1014347f64feb4f144c97757b4d8469030e793dbb36eDouglas Gregor << Field2->getDeclName() << Field2->getType() << Bits2; 1015347f64feb4f144c97757b4d8469030e793dbb36eDouglas Gregor Context.Diag1(Field1->getLocation(), diag::note_odr_bit_field) 1016347f64feb4f144c97757b4d8469030e793dbb36eDouglas Gregor << Field1->getDeclName() << Field1->getType() << Bits1; 1017347f64feb4f144c97757b4d8469030e793dbb36eDouglas Gregor } 10187c9412cdad37146e6d1eee15eaa0d7a1d93e6ee1Douglas Gregor return false; 10197c9412cdad37146e6d1eee15eaa0d7a1d93e6ee1Douglas Gregor } 10207c9412cdad37146e6d1eee15eaa0d7a1d93e6ee1Douglas Gregor } 10217c9412cdad37146e6d1eee15eaa0d7a1d93e6ee1Douglas Gregor 10227c9412cdad37146e6d1eee15eaa0d7a1d93e6ee1Douglas Gregor return true; 10237c9412cdad37146e6d1eee15eaa0d7a1d93e6ee1Douglas Gregor} 10247c9412cdad37146e6d1eee15eaa0d7a1d93e6ee1Douglas Gregor 102511ce5fe7d8dda29f3d093e5759a7476b140e3241Douglas Gregor/// \brief Find the index of the given anonymous struct/union within its 102611ce5fe7d8dda29f3d093e5759a7476b140e3241Douglas Gregor/// context. 102711ce5fe7d8dda29f3d093e5759a7476b140e3241Douglas Gregor/// 102811ce5fe7d8dda29f3d093e5759a7476b140e3241Douglas Gregor/// \returns Returns the index of this anonymous struct/union in its context, 102911ce5fe7d8dda29f3d093e5759a7476b140e3241Douglas Gregor/// including the next assigned index (if none of them match). Returns an 103011ce5fe7d8dda29f3d093e5759a7476b140e3241Douglas Gregor/// empty option if the context is not a record, i.e.. if the anonymous 103111ce5fe7d8dda29f3d093e5759a7476b140e3241Douglas Gregor/// struct/union is at namespace or block scope. 10324967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainarstatic Optional<unsigned> findUntaggedStructOrUnionIndex(RecordDecl *Anon) { 103311ce5fe7d8dda29f3d093e5759a7476b140e3241Douglas Gregor ASTContext &Context = Anon->getASTContext(); 103411ce5fe7d8dda29f3d093e5759a7476b140e3241Douglas Gregor QualType AnonTy = Context.getRecordType(Anon); 103511ce5fe7d8dda29f3d093e5759a7476b140e3241Douglas Gregor 103611ce5fe7d8dda29f3d093e5759a7476b140e3241Douglas Gregor RecordDecl *Owner = dyn_cast<RecordDecl>(Anon->getDeclContext()); 103711ce5fe7d8dda29f3d093e5759a7476b140e3241Douglas Gregor if (!Owner) 103866874fb18afbffb8b2ca05576851a64534be3352David Blaikie return None; 103911ce5fe7d8dda29f3d093e5759a7476b140e3241Douglas Gregor 104011ce5fe7d8dda29f3d093e5759a7476b140e3241Douglas Gregor unsigned Index = 0; 1041651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines for (const auto *D : Owner->noload_decls()) { 1042651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines const auto *F = dyn_cast<FieldDecl>(D); 10434967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar if (!F) 104411ce5fe7d8dda29f3d093e5759a7476b140e3241Douglas Gregor continue; 104511ce5fe7d8dda29f3d093e5759a7476b140e3241Douglas Gregor 10464967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar if (F->isAnonymousStructOrUnion()) { 10474967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar if (Context.hasSameType(F->getType(), AnonTy)) 10484967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar break; 10494967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar ++Index; 10504967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar continue; 10514967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar } 105211ce5fe7d8dda29f3d093e5759a7476b140e3241Douglas Gregor 10534967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar // If the field looks like this: 10544967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar // struct { ... } A; 10554967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar QualType FieldType = F->getType(); 10564967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar if (const auto *RecType = dyn_cast<RecordType>(FieldType)) { 10574967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar const RecordDecl *RecDecl = RecType->getDecl(); 10584967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar if (RecDecl->getDeclContext() == Owner && 10594967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar !RecDecl->getIdentifier()) { 10604967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar if (Context.hasSameType(FieldType, AnonTy)) 10614967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar break; 10624967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar ++Index; 10634967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar continue; 10644967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar } 10654967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar } 106611ce5fe7d8dda29f3d093e5759a7476b140e3241Douglas Gregor } 106711ce5fe7d8dda29f3d093e5759a7476b140e3241Douglas Gregor 106811ce5fe7d8dda29f3d093e5759a7476b140e3241Douglas Gregor return Index; 106911ce5fe7d8dda29f3d093e5759a7476b140e3241Douglas Gregor} 107011ce5fe7d8dda29f3d093e5759a7476b140e3241Douglas Gregor 107173dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor/// \brief Determine structural equivalence of two records. 107273dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregorstatic bool IsStructurallyEquivalent(StructuralEquivalenceContext &Context, 107373dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor RecordDecl *D1, RecordDecl *D2) { 107473dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor if (D1->isUnion() != D2->isUnion()) { 1075347f64feb4f144c97757b4d8469030e793dbb36eDouglas Gregor if (Context.Complain) { 1076347f64feb4f144c97757b4d8469030e793dbb36eDouglas Gregor Context.Diag2(D2->getLocation(), diag::warn_odr_tag_type_inconsistent) 1077347f64feb4f144c97757b4d8469030e793dbb36eDouglas Gregor << Context.C2.getTypeDeclType(D2); 1078347f64feb4f144c97757b4d8469030e793dbb36eDouglas Gregor Context.Diag1(D1->getLocation(), diag::note_odr_tag_kind_here) 1079347f64feb4f144c97757b4d8469030e793dbb36eDouglas Gregor << D1->getDeclName() << (unsigned)D1->getTagKind(); 1080347f64feb4f144c97757b4d8469030e793dbb36eDouglas Gregor } 108173dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor return false; 108273dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor } 108311ce5fe7d8dda29f3d093e5759a7476b140e3241Douglas Gregor 108411ce5fe7d8dda29f3d093e5759a7476b140e3241Douglas Gregor if (D1->isAnonymousStructOrUnion() && D2->isAnonymousStructOrUnion()) { 108511ce5fe7d8dda29f3d093e5759a7476b140e3241Douglas Gregor // If both anonymous structs/unions are in a record context, make sure 108611ce5fe7d8dda29f3d093e5759a7476b140e3241Douglas Gregor // they occur in the same location in the context records. 10874967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar if (Optional<unsigned> Index1 = findUntaggedStructOrUnionIndex(D1)) { 10884967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar if (Optional<unsigned> Index2 = findUntaggedStructOrUnionIndex(D2)) { 108911ce5fe7d8dda29f3d093e5759a7476b140e3241Douglas Gregor if (*Index1 != *Index2) 109011ce5fe7d8dda29f3d093e5759a7476b140e3241Douglas Gregor return false; 109111ce5fe7d8dda29f3d093e5759a7476b140e3241Douglas Gregor } 109211ce5fe7d8dda29f3d093e5759a7476b140e3241Douglas Gregor } 109311ce5fe7d8dda29f3d093e5759a7476b140e3241Douglas Gregor } 109411ce5fe7d8dda29f3d093e5759a7476b140e3241Douglas Gregor 1095d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor // If both declarations are class template specializations, we know 1096d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor // the ODR applies, so check the template and template arguments. 1097d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor ClassTemplateSpecializationDecl *Spec1 1098d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor = dyn_cast<ClassTemplateSpecializationDecl>(D1); 1099d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor ClassTemplateSpecializationDecl *Spec2 1100d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor = dyn_cast<ClassTemplateSpecializationDecl>(D2); 1101d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor if (Spec1 && Spec2) { 1102d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor // Check that the specialized templates are the same. 1103d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor if (!IsStructurallyEquivalent(Context, Spec1->getSpecializedTemplate(), 1104d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor Spec2->getSpecializedTemplate())) 1105d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor return false; 1106d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor 1107d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor // Check that the template arguments are the same. 1108d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor if (Spec1->getTemplateArgs().size() != Spec2->getTemplateArgs().size()) 1109d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor return false; 1110d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor 1111d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor for (unsigned I = 0, N = Spec1->getTemplateArgs().size(); I != N; ++I) 1112d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor if (!IsStructurallyEquivalent(Context, 1113d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor Spec1->getTemplateArgs().get(I), 1114d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor Spec2->getTemplateArgs().get(I))) 1115d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor return false; 1116d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor } 1117d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor // If one is a class template specialization and the other is not, these 1118fc8f0e14ad142ed811e90fbd9a30e419e301c717Chris Lattner // structures are different. 1119d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor else if (Spec1 || Spec2) 1120d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor return false; 1121d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor 1122ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor // Compare the definitions of these two records. If either or both are 1123ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor // incomplete, we assume that they are equivalent. 1124ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor D1 = D1->getDefinition(); 1125ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor D2 = D2->getDefinition(); 1126ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor if (!D1 || !D2) 1127ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor return true; 1128ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor 112973dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor if (CXXRecordDecl *D1CXX = dyn_cast<CXXRecordDecl>(D1)) { 113073dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor if (CXXRecordDecl *D2CXX = dyn_cast<CXXRecordDecl>(D2)) { 113173dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor if (D1CXX->getNumBases() != D2CXX->getNumBases()) { 1132347f64feb4f144c97757b4d8469030e793dbb36eDouglas Gregor if (Context.Complain) { 1133347f64feb4f144c97757b4d8469030e793dbb36eDouglas Gregor Context.Diag2(D2->getLocation(), diag::warn_odr_tag_type_inconsistent) 1134347f64feb4f144c97757b4d8469030e793dbb36eDouglas Gregor << Context.C2.getTypeDeclType(D2); 1135347f64feb4f144c97757b4d8469030e793dbb36eDouglas Gregor Context.Diag2(D2->getLocation(), diag::note_odr_number_of_bases) 1136347f64feb4f144c97757b4d8469030e793dbb36eDouglas Gregor << D2CXX->getNumBases(); 1137347f64feb4f144c97757b4d8469030e793dbb36eDouglas Gregor Context.Diag1(D1->getLocation(), diag::note_odr_number_of_bases) 1138347f64feb4f144c97757b4d8469030e793dbb36eDouglas Gregor << D1CXX->getNumBases(); 1139347f64feb4f144c97757b4d8469030e793dbb36eDouglas Gregor } 114073dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor return false; 114173dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor } 114273dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor 114373dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor // Check the base classes. 114473dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor for (CXXRecordDecl::base_class_iterator Base1 = D1CXX->bases_begin(), 114573dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor BaseEnd1 = D1CXX->bases_end(), 114673dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor Base2 = D2CXX->bases_begin(); 114773dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor Base1 != BaseEnd1; 114873dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor ++Base1, ++Base2) { 114973dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor if (!IsStructurallyEquivalent(Context, 115073dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor Base1->getType(), Base2->getType())) { 1151347f64feb4f144c97757b4d8469030e793dbb36eDouglas Gregor if (Context.Complain) { 1152347f64feb4f144c97757b4d8469030e793dbb36eDouglas Gregor Context.Diag2(D2->getLocation(), diag::warn_odr_tag_type_inconsistent) 1153347f64feb4f144c97757b4d8469030e793dbb36eDouglas Gregor << Context.C2.getTypeDeclType(D2); 1154347f64feb4f144c97757b4d8469030e793dbb36eDouglas Gregor Context.Diag2(Base2->getLocStart(), diag::note_odr_base) 1155347f64feb4f144c97757b4d8469030e793dbb36eDouglas Gregor << Base2->getType() 1156347f64feb4f144c97757b4d8469030e793dbb36eDouglas Gregor << Base2->getSourceRange(); 1157347f64feb4f144c97757b4d8469030e793dbb36eDouglas Gregor Context.Diag1(Base1->getLocStart(), diag::note_odr_base) 1158347f64feb4f144c97757b4d8469030e793dbb36eDouglas Gregor << Base1->getType() 1159347f64feb4f144c97757b4d8469030e793dbb36eDouglas Gregor << Base1->getSourceRange(); 1160347f64feb4f144c97757b4d8469030e793dbb36eDouglas Gregor } 116173dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor return false; 116273dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor } 116373dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor 116473dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor // Check virtual vs. non-virtual inheritance mismatch. 116573dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor if (Base1->isVirtual() != Base2->isVirtual()) { 1166347f64feb4f144c97757b4d8469030e793dbb36eDouglas Gregor if (Context.Complain) { 1167347f64feb4f144c97757b4d8469030e793dbb36eDouglas Gregor Context.Diag2(D2->getLocation(), diag::warn_odr_tag_type_inconsistent) 1168347f64feb4f144c97757b4d8469030e793dbb36eDouglas Gregor << Context.C2.getTypeDeclType(D2); 1169347f64feb4f144c97757b4d8469030e793dbb36eDouglas Gregor Context.Diag2(Base2->getLocStart(), 1170347f64feb4f144c97757b4d8469030e793dbb36eDouglas Gregor diag::note_odr_virtual_base) 1171347f64feb4f144c97757b4d8469030e793dbb36eDouglas Gregor << Base2->isVirtual() << Base2->getSourceRange(); 1172347f64feb4f144c97757b4d8469030e793dbb36eDouglas Gregor Context.Diag1(Base1->getLocStart(), diag::note_odr_base) 1173347f64feb4f144c97757b4d8469030e793dbb36eDouglas Gregor << Base1->isVirtual() 1174347f64feb4f144c97757b4d8469030e793dbb36eDouglas Gregor << Base1->getSourceRange(); 1175347f64feb4f144c97757b4d8469030e793dbb36eDouglas Gregor } 117673dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor return false; 117773dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor } 117873dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor } 117973dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor } else if (D1CXX->getNumBases() > 0) { 1180347f64feb4f144c97757b4d8469030e793dbb36eDouglas Gregor if (Context.Complain) { 1181347f64feb4f144c97757b4d8469030e793dbb36eDouglas Gregor Context.Diag2(D2->getLocation(), diag::warn_odr_tag_type_inconsistent) 1182347f64feb4f144c97757b4d8469030e793dbb36eDouglas Gregor << Context.C2.getTypeDeclType(D2); 1183347f64feb4f144c97757b4d8469030e793dbb36eDouglas Gregor const CXXBaseSpecifier *Base1 = D1CXX->bases_begin(); 1184347f64feb4f144c97757b4d8469030e793dbb36eDouglas Gregor Context.Diag1(Base1->getLocStart(), diag::note_odr_base) 1185347f64feb4f144c97757b4d8469030e793dbb36eDouglas Gregor << Base1->getType() 1186347f64feb4f144c97757b4d8469030e793dbb36eDouglas Gregor << Base1->getSourceRange(); 1187347f64feb4f144c97757b4d8469030e793dbb36eDouglas Gregor Context.Diag2(D2->getLocation(), diag::note_odr_missing_base); 1188347f64feb4f144c97757b4d8469030e793dbb36eDouglas Gregor } 118973dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor return false; 119073dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor } 119173dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor } 119273dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor 119373dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor // Check the fields for consistency. 11942bd4b60a955d2911af938401708d016eb3acc723Dmitri Gribenko RecordDecl::field_iterator Field2 = D2->field_begin(), 119573dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor Field2End = D2->field_end(); 11962bd4b60a955d2911af938401708d016eb3acc723Dmitri Gribenko for (RecordDecl::field_iterator Field1 = D1->field_begin(), 119773dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor Field1End = D1->field_end(); 119873dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor Field1 != Field1End; 119973dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor ++Field1, ++Field2) { 120073dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor if (Field2 == Field2End) { 1201347f64feb4f144c97757b4d8469030e793dbb36eDouglas Gregor if (Context.Complain) { 1202347f64feb4f144c97757b4d8469030e793dbb36eDouglas Gregor Context.Diag2(D2->getLocation(), diag::warn_odr_tag_type_inconsistent) 1203347f64feb4f144c97757b4d8469030e793dbb36eDouglas Gregor << Context.C2.getTypeDeclType(D2); 1204347f64feb4f144c97757b4d8469030e793dbb36eDouglas Gregor Context.Diag1(Field1->getLocation(), diag::note_odr_field) 1205347f64feb4f144c97757b4d8469030e793dbb36eDouglas Gregor << Field1->getDeclName() << Field1->getType(); 1206347f64feb4f144c97757b4d8469030e793dbb36eDouglas Gregor Context.Diag2(D2->getLocation(), diag::note_odr_missing_field); 1207347f64feb4f144c97757b4d8469030e793dbb36eDouglas Gregor } 120873dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor return false; 120973dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor } 121073dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor 1211581deb3da481053c4993c7600f97acf7768caac5David Blaikie if (!IsStructurallyEquivalent(Context, *Field1, *Field2)) 12127c9412cdad37146e6d1eee15eaa0d7a1d93e6ee1Douglas Gregor return false; 121373dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor } 121473dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor 121573dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor if (Field2 != Field2End) { 1216347f64feb4f144c97757b4d8469030e793dbb36eDouglas Gregor if (Context.Complain) { 1217347f64feb4f144c97757b4d8469030e793dbb36eDouglas Gregor Context.Diag2(D2->getLocation(), diag::warn_odr_tag_type_inconsistent) 1218347f64feb4f144c97757b4d8469030e793dbb36eDouglas Gregor << Context.C2.getTypeDeclType(D2); 1219347f64feb4f144c97757b4d8469030e793dbb36eDouglas Gregor Context.Diag2(Field2->getLocation(), diag::note_odr_field) 1220347f64feb4f144c97757b4d8469030e793dbb36eDouglas Gregor << Field2->getDeclName() << Field2->getType(); 1221347f64feb4f144c97757b4d8469030e793dbb36eDouglas Gregor Context.Diag1(D1->getLocation(), diag::note_odr_missing_field); 1222347f64feb4f144c97757b4d8469030e793dbb36eDouglas Gregor } 122373dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor return false; 122473dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor } 122573dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor 122673dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor return true; 122773dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor} 122873dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor 122973dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor/// \brief Determine structural equivalence of two enums. 123073dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregorstatic bool IsStructurallyEquivalent(StructuralEquivalenceContext &Context, 123173dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor EnumDecl *D1, EnumDecl *D2) { 123273dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor EnumDecl::enumerator_iterator EC2 = D2->enumerator_begin(), 123373dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor EC2End = D2->enumerator_end(); 123473dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor for (EnumDecl::enumerator_iterator EC1 = D1->enumerator_begin(), 123573dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor EC1End = D1->enumerator_end(); 123673dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor EC1 != EC1End; ++EC1, ++EC2) { 123773dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor if (EC2 == EC2End) { 1238347f64feb4f144c97757b4d8469030e793dbb36eDouglas Gregor if (Context.Complain) { 1239347f64feb4f144c97757b4d8469030e793dbb36eDouglas Gregor Context.Diag2(D2->getLocation(), diag::warn_odr_tag_type_inconsistent) 1240347f64feb4f144c97757b4d8469030e793dbb36eDouglas Gregor << Context.C2.getTypeDeclType(D2); 1241347f64feb4f144c97757b4d8469030e793dbb36eDouglas Gregor Context.Diag1(EC1->getLocation(), diag::note_odr_enumerator) 1242347f64feb4f144c97757b4d8469030e793dbb36eDouglas Gregor << EC1->getDeclName() 1243347f64feb4f144c97757b4d8469030e793dbb36eDouglas Gregor << EC1->getInitVal().toString(10); 1244347f64feb4f144c97757b4d8469030e793dbb36eDouglas Gregor Context.Diag2(D2->getLocation(), diag::note_odr_missing_enumerator); 1245347f64feb4f144c97757b4d8469030e793dbb36eDouglas Gregor } 124673dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor return false; 124773dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor } 124873dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor 124973dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor llvm::APSInt Val1 = EC1->getInitVal(); 125073dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor llvm::APSInt Val2 = EC2->getInitVal(); 125181695fa3a4772a62131eca45f8582cff72b1b9dbEric Christopher if (!llvm::APSInt::isSameValue(Val1, Val2) || 125273dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor !IsStructurallyEquivalent(EC1->getIdentifier(), EC2->getIdentifier())) { 1253347f64feb4f144c97757b4d8469030e793dbb36eDouglas Gregor if (Context.Complain) { 1254347f64feb4f144c97757b4d8469030e793dbb36eDouglas Gregor Context.Diag2(D2->getLocation(), diag::warn_odr_tag_type_inconsistent) 1255347f64feb4f144c97757b4d8469030e793dbb36eDouglas Gregor << Context.C2.getTypeDeclType(D2); 1256347f64feb4f144c97757b4d8469030e793dbb36eDouglas Gregor Context.Diag2(EC2->getLocation(), diag::note_odr_enumerator) 1257347f64feb4f144c97757b4d8469030e793dbb36eDouglas Gregor << EC2->getDeclName() 1258347f64feb4f144c97757b4d8469030e793dbb36eDouglas Gregor << EC2->getInitVal().toString(10); 1259347f64feb4f144c97757b4d8469030e793dbb36eDouglas Gregor Context.Diag1(EC1->getLocation(), diag::note_odr_enumerator) 1260347f64feb4f144c97757b4d8469030e793dbb36eDouglas Gregor << EC1->getDeclName() 1261347f64feb4f144c97757b4d8469030e793dbb36eDouglas Gregor << EC1->getInitVal().toString(10); 1262347f64feb4f144c97757b4d8469030e793dbb36eDouglas Gregor } 1263347f64feb4f144c97757b4d8469030e793dbb36eDouglas Gregor return false; 1264347f64feb4f144c97757b4d8469030e793dbb36eDouglas Gregor } 1265347f64feb4f144c97757b4d8469030e793dbb36eDouglas Gregor } 1266347f64feb4f144c97757b4d8469030e793dbb36eDouglas Gregor 1267347f64feb4f144c97757b4d8469030e793dbb36eDouglas Gregor if (EC2 != EC2End) { 1268347f64feb4f144c97757b4d8469030e793dbb36eDouglas Gregor if (Context.Complain) { 126973dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor Context.Diag2(D2->getLocation(), diag::warn_odr_tag_type_inconsistent) 127073dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor << Context.C2.getTypeDeclType(D2); 127173dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor Context.Diag2(EC2->getLocation(), diag::note_odr_enumerator) 127273dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor << EC2->getDeclName() 127373dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor << EC2->getInitVal().toString(10); 1274347f64feb4f144c97757b4d8469030e793dbb36eDouglas Gregor Context.Diag1(D1->getLocation(), diag::note_odr_missing_enumerator); 127573dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor } 127673dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor return false; 127773dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor } 127873dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor 127973dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor return true; 128073dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor} 1281040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor 1282040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregorstatic bool IsStructurallyEquivalent(StructuralEquivalenceContext &Context, 1283040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor TemplateParameterList *Params1, 1284040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor TemplateParameterList *Params2) { 1285040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor if (Params1->size() != Params2->size()) { 1286347f64feb4f144c97757b4d8469030e793dbb36eDouglas Gregor if (Context.Complain) { 1287347f64feb4f144c97757b4d8469030e793dbb36eDouglas Gregor Context.Diag2(Params2->getTemplateLoc(), 1288347f64feb4f144c97757b4d8469030e793dbb36eDouglas Gregor diag::err_odr_different_num_template_parameters) 1289347f64feb4f144c97757b4d8469030e793dbb36eDouglas Gregor << Params1->size() << Params2->size(); 1290347f64feb4f144c97757b4d8469030e793dbb36eDouglas Gregor Context.Diag1(Params1->getTemplateLoc(), 1291347f64feb4f144c97757b4d8469030e793dbb36eDouglas Gregor diag::note_odr_template_parameter_list); 1292347f64feb4f144c97757b4d8469030e793dbb36eDouglas Gregor } 1293040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor return false; 1294040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor } 1295040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor 1296040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor for (unsigned I = 0, N = Params1->size(); I != N; ++I) { 1297040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor if (Params1->getParam(I)->getKind() != Params2->getParam(I)->getKind()) { 1298347f64feb4f144c97757b4d8469030e793dbb36eDouglas Gregor if (Context.Complain) { 1299347f64feb4f144c97757b4d8469030e793dbb36eDouglas Gregor Context.Diag2(Params2->getParam(I)->getLocation(), 1300347f64feb4f144c97757b4d8469030e793dbb36eDouglas Gregor diag::err_odr_different_template_parameter_kind); 1301347f64feb4f144c97757b4d8469030e793dbb36eDouglas Gregor Context.Diag1(Params1->getParam(I)->getLocation(), 1302347f64feb4f144c97757b4d8469030e793dbb36eDouglas Gregor diag::note_odr_template_parameter_here); 1303347f64feb4f144c97757b4d8469030e793dbb36eDouglas Gregor } 1304040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor return false; 1305040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor } 1306040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor 1307040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor if (!Context.IsStructurallyEquivalent(Params1->getParam(I), 1308040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor Params2->getParam(I))) { 1309040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor 1310040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor return false; 1311040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor } 1312040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor } 1313040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor 1314040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor return true; 1315040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor} 1316040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor 1317040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregorstatic bool IsStructurallyEquivalent(StructuralEquivalenceContext &Context, 1318040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor TemplateTypeParmDecl *D1, 1319040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor TemplateTypeParmDecl *D2) { 1320040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor if (D1->isParameterPack() != D2->isParameterPack()) { 1321347f64feb4f144c97757b4d8469030e793dbb36eDouglas Gregor if (Context.Complain) { 1322347f64feb4f144c97757b4d8469030e793dbb36eDouglas Gregor Context.Diag2(D2->getLocation(), diag::err_odr_parameter_pack_non_pack) 1323347f64feb4f144c97757b4d8469030e793dbb36eDouglas Gregor << D2->isParameterPack(); 1324347f64feb4f144c97757b4d8469030e793dbb36eDouglas Gregor Context.Diag1(D1->getLocation(), diag::note_odr_parameter_pack_non_pack) 1325347f64feb4f144c97757b4d8469030e793dbb36eDouglas Gregor << D1->isParameterPack(); 1326347f64feb4f144c97757b4d8469030e793dbb36eDouglas Gregor } 1327040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor return false; 1328040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor } 1329040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor 1330040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor return true; 1331040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor} 1332040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor 1333040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregorstatic bool IsStructurallyEquivalent(StructuralEquivalenceContext &Context, 1334040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor NonTypeTemplateParmDecl *D1, 1335040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor NonTypeTemplateParmDecl *D2) { 1336040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor if (D1->isParameterPack() != D2->isParameterPack()) { 133747395d9360782a854594804aafe13ee877c4c0c4Douglas Gregor if (Context.Complain) { 1338347f64feb4f144c97757b4d8469030e793dbb36eDouglas Gregor Context.Diag2(D2->getLocation(), diag::err_odr_parameter_pack_non_pack) 1339347f64feb4f144c97757b4d8469030e793dbb36eDouglas Gregor << D2->isParameterPack(); 1340347f64feb4f144c97757b4d8469030e793dbb36eDouglas Gregor Context.Diag1(D1->getLocation(), diag::note_odr_parameter_pack_non_pack) 1341347f64feb4f144c97757b4d8469030e793dbb36eDouglas Gregor << D1->isParameterPack(); 1342347f64feb4f144c97757b4d8469030e793dbb36eDouglas Gregor } 1343040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor return false; 1344040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor } 1345040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor 1346040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor // Check types. 1347040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor if (!Context.IsStructurallyEquivalent(D1->getType(), D2->getType())) { 1348347f64feb4f144c97757b4d8469030e793dbb36eDouglas Gregor if (Context.Complain) { 1349347f64feb4f144c97757b4d8469030e793dbb36eDouglas Gregor Context.Diag2(D2->getLocation(), 1350347f64feb4f144c97757b4d8469030e793dbb36eDouglas Gregor diag::err_odr_non_type_parameter_type_inconsistent) 1351347f64feb4f144c97757b4d8469030e793dbb36eDouglas Gregor << D2->getType() << D1->getType(); 1352347f64feb4f144c97757b4d8469030e793dbb36eDouglas Gregor Context.Diag1(D1->getLocation(), diag::note_odr_value_here) 1353347f64feb4f144c97757b4d8469030e793dbb36eDouglas Gregor << D1->getType(); 1354347f64feb4f144c97757b4d8469030e793dbb36eDouglas Gregor } 1355040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor return false; 1356040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor } 1357040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor 1358040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor return true; 1359040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor} 1360040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor 1361040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregorstatic bool IsStructurallyEquivalent(StructuralEquivalenceContext &Context, 1362040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor TemplateTemplateParmDecl *D1, 1363040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor TemplateTemplateParmDecl *D2) { 1364040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor if (D1->isParameterPack() != D2->isParameterPack()) { 1365347f64feb4f144c97757b4d8469030e793dbb36eDouglas Gregor if (Context.Complain) { 1366347f64feb4f144c97757b4d8469030e793dbb36eDouglas Gregor Context.Diag2(D2->getLocation(), diag::err_odr_parameter_pack_non_pack) 1367347f64feb4f144c97757b4d8469030e793dbb36eDouglas Gregor << D2->isParameterPack(); 1368347f64feb4f144c97757b4d8469030e793dbb36eDouglas Gregor Context.Diag1(D1->getLocation(), diag::note_odr_parameter_pack_non_pack) 1369347f64feb4f144c97757b4d8469030e793dbb36eDouglas Gregor << D1->isParameterPack(); 1370347f64feb4f144c97757b4d8469030e793dbb36eDouglas Gregor } 1371040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor return false; 1372040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor } 137347395d9360782a854594804aafe13ee877c4c0c4Douglas Gregor 1374040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor // Check template parameter lists. 1375040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor return IsStructurallyEquivalent(Context, D1->getTemplateParameters(), 1376040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor D2->getTemplateParameters()); 1377040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor} 1378040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor 1379040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregorstatic bool IsStructurallyEquivalent(StructuralEquivalenceContext &Context, 1380040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor ClassTemplateDecl *D1, 1381040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor ClassTemplateDecl *D2) { 1382040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor // Check template parameters. 1383040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor if (!IsStructurallyEquivalent(Context, 1384040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor D1->getTemplateParameters(), 1385040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor D2->getTemplateParameters())) 1386040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor return false; 138773dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor 1388040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor // Check the templated declaration. 1389040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor return Context.IsStructurallyEquivalent(D1->getTemplatedDecl(), 1390040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor D2->getTemplatedDecl()); 1391040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor} 1392040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor 139373dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor/// \brief Determine structural equivalence of two declarations. 139473dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregorstatic bool IsStructurallyEquivalent(StructuralEquivalenceContext &Context, 139573dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor Decl *D1, Decl *D2) { 139673dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor // FIXME: Check for known structural equivalences via a callback of some sort. 139773dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor 1398ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor // Check whether we already know that these two declarations are not 1399ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor // structurally equivalent. 1400ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor if (Context.NonEquivalentDecls.count(std::make_pair(D1->getCanonicalDecl(), 1401ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor D2->getCanonicalDecl()))) 1402ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor return false; 1403ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor 140473dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor // Determine whether we've already produced a tentative equivalence for D1. 140573dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor Decl *&EquivToD1 = Context.TentativeEquivalences[D1->getCanonicalDecl()]; 140673dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor if (EquivToD1) 140773dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor return EquivToD1 == D2->getCanonicalDecl(); 140873dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor 140973dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor // Produce a tentative equivalence D1 <-> D2, which will be checked later. 141073dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor EquivToD1 = D2->getCanonicalDecl(); 141173dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor Context.DeclsToCheck.push_back(D1->getCanonicalDecl()); 141273dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor return true; 141373dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor} 141473dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor 141573dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregorbool StructuralEquivalenceContext::IsStructurallyEquivalent(Decl *D1, 141673dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor Decl *D2) { 141773dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor if (!::IsStructurallyEquivalent(*this, D1, D2)) 141873dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor return false; 141973dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor 142073dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor return !Finish(); 142173dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor} 142273dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor 142373dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregorbool StructuralEquivalenceContext::IsStructurallyEquivalent(QualType T1, 142473dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor QualType T2) { 142573dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor if (!::IsStructurallyEquivalent(*this, T1, T2)) 142673dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor return false; 142773dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor 142873dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor return !Finish(); 142973dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor} 143073dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor 143173dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregorbool StructuralEquivalenceContext::Finish() { 143273dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor while (!DeclsToCheck.empty()) { 143373dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor // Check the next declaration. 143473dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor Decl *D1 = DeclsToCheck.front(); 143573dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor DeclsToCheck.pop_front(); 143673dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor 143773dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor Decl *D2 = TentativeEquivalences[D1]; 143873dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor assert(D2 && "Unrecorded tentative equivalence?"); 143973dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor 1440ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor bool Equivalent = true; 1441ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor 144273dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor // FIXME: Switch on all declaration kinds. For now, we're just going to 144373dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor // check the obvious ones. 144473dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor if (RecordDecl *Record1 = dyn_cast<RecordDecl>(D1)) { 144573dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor if (RecordDecl *Record2 = dyn_cast<RecordDecl>(D2)) { 144673dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor // Check for equivalent structure names. 144773dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor IdentifierInfo *Name1 = Record1->getIdentifier(); 1448162e1c1b487352434552147967c3dd296ebee2f7Richard Smith if (!Name1 && Record1->getTypedefNameForAnonDecl()) 1449162e1c1b487352434552147967c3dd296ebee2f7Richard Smith Name1 = Record1->getTypedefNameForAnonDecl()->getIdentifier(); 145073dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor IdentifierInfo *Name2 = Record2->getIdentifier(); 1451162e1c1b487352434552147967c3dd296ebee2f7Richard Smith if (!Name2 && Record2->getTypedefNameForAnonDecl()) 1452162e1c1b487352434552147967c3dd296ebee2f7Richard Smith Name2 = Record2->getTypedefNameForAnonDecl()->getIdentifier(); 1453ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor if (!::IsStructurallyEquivalent(Name1, Name2) || 1454ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor !::IsStructurallyEquivalent(*this, Record1, Record2)) 1455ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor Equivalent = false; 145673dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor } else { 145773dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor // Record/non-record mismatch. 1458ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor Equivalent = false; 145973dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor } 1460ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor } else if (EnumDecl *Enum1 = dyn_cast<EnumDecl>(D1)) { 146173dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor if (EnumDecl *Enum2 = dyn_cast<EnumDecl>(D2)) { 146273dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor // Check for equivalent enum names. 146373dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor IdentifierInfo *Name1 = Enum1->getIdentifier(); 1464162e1c1b487352434552147967c3dd296ebee2f7Richard Smith if (!Name1 && Enum1->getTypedefNameForAnonDecl()) 1465162e1c1b487352434552147967c3dd296ebee2f7Richard Smith Name1 = Enum1->getTypedefNameForAnonDecl()->getIdentifier(); 146673dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor IdentifierInfo *Name2 = Enum2->getIdentifier(); 1467162e1c1b487352434552147967c3dd296ebee2f7Richard Smith if (!Name2 && Enum2->getTypedefNameForAnonDecl()) 1468162e1c1b487352434552147967c3dd296ebee2f7Richard Smith Name2 = Enum2->getTypedefNameForAnonDecl()->getIdentifier(); 1469ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor if (!::IsStructurallyEquivalent(Name1, Name2) || 1470ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor !::IsStructurallyEquivalent(*this, Enum1, Enum2)) 1471ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor Equivalent = false; 147273dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor } else { 147373dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor // Enum/non-enum mismatch 1474ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor Equivalent = false; 147573dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor } 1476162e1c1b487352434552147967c3dd296ebee2f7Richard Smith } else if (TypedefNameDecl *Typedef1 = dyn_cast<TypedefNameDecl>(D1)) { 1477162e1c1b487352434552147967c3dd296ebee2f7Richard Smith if (TypedefNameDecl *Typedef2 = dyn_cast<TypedefNameDecl>(D2)) { 147873dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor if (!::IsStructurallyEquivalent(Typedef1->getIdentifier(), 1479ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor Typedef2->getIdentifier()) || 1480ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor !::IsStructurallyEquivalent(*this, 148173dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor Typedef1->getUnderlyingType(), 148273dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor Typedef2->getUnderlyingType())) 1483ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor Equivalent = false; 148473dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor } else { 148573dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor // Typedef/non-typedef mismatch. 1486ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor Equivalent = false; 148773dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor } 1488040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor } else if (ClassTemplateDecl *ClassTemplate1 1489040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor = dyn_cast<ClassTemplateDecl>(D1)) { 1490040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor if (ClassTemplateDecl *ClassTemplate2 = dyn_cast<ClassTemplateDecl>(D2)) { 1491040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor if (!::IsStructurallyEquivalent(ClassTemplate1->getIdentifier(), 1492040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor ClassTemplate2->getIdentifier()) || 1493040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor !::IsStructurallyEquivalent(*this, ClassTemplate1, ClassTemplate2)) 1494040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor Equivalent = false; 1495040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor } else { 1496040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor // Class template/non-class-template mismatch. 1497040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor Equivalent = false; 1498040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor } 1499040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor } else if (TemplateTypeParmDecl *TTP1= dyn_cast<TemplateTypeParmDecl>(D1)) { 1500040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor if (TemplateTypeParmDecl *TTP2 = dyn_cast<TemplateTypeParmDecl>(D2)) { 1501040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor if (!::IsStructurallyEquivalent(*this, TTP1, TTP2)) 1502040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor Equivalent = false; 1503040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor } else { 1504040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor // Kind mismatch. 1505040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor Equivalent = false; 1506040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor } 1507040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor } else if (NonTypeTemplateParmDecl *NTTP1 1508040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor = dyn_cast<NonTypeTemplateParmDecl>(D1)) { 1509040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor if (NonTypeTemplateParmDecl *NTTP2 1510040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor = dyn_cast<NonTypeTemplateParmDecl>(D2)) { 1511040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor if (!::IsStructurallyEquivalent(*this, NTTP1, NTTP2)) 1512040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor Equivalent = false; 1513040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor } else { 1514040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor // Kind mismatch. 1515040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor Equivalent = false; 1516040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor } 1517040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor } else if (TemplateTemplateParmDecl *TTP1 1518040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor = dyn_cast<TemplateTemplateParmDecl>(D1)) { 1519040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor if (TemplateTemplateParmDecl *TTP2 1520040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor = dyn_cast<TemplateTemplateParmDecl>(D2)) { 1521040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor if (!::IsStructurallyEquivalent(*this, TTP1, TTP2)) 1522040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor Equivalent = false; 1523040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor } else { 1524040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor // Kind mismatch. 1525040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor Equivalent = false; 1526040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor } 1527040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor } 1528040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor 1529ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor if (!Equivalent) { 1530ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor // Note that these two declarations are not equivalent (and we already 1531ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor // know about it). 1532ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor NonEquivalentDecls.insert(std::make_pair(D1->getCanonicalDecl(), 1533ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor D2->getCanonicalDecl())); 1534ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor return true; 1535ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor } 153673dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor // FIXME: Check other declaration kinds! 153773dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor } 153873dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor 153973dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor return false; 154073dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor} 154173dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor 154273dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor//---------------------------------------------------------------------------- 15431b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor// Import Types 15441b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor//---------------------------------------------------------------------------- 15451b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor 1546f4c7371fb1d3cebcfb40abad4537bb82515704eaJohn McCallQualType ASTNodeImporter::VisitType(const Type *T) { 154789cc9d6e2aaf794fbd2c228a3755c19062ca0ba0Douglas Gregor Importer.FromDiag(SourceLocation(), diag::err_unsupported_ast_node) 154889cc9d6e2aaf794fbd2c228a3755c19062ca0ba0Douglas Gregor << T->getTypeClassName(); 154989cc9d6e2aaf794fbd2c228a3755c19062ca0ba0Douglas Gregor return QualType(); 155089cc9d6e2aaf794fbd2c228a3755c19062ca0ba0Douglas Gregor} 155189cc9d6e2aaf794fbd2c228a3755c19062ca0ba0Douglas Gregor 1552f4c7371fb1d3cebcfb40abad4537bb82515704eaJohn McCallQualType ASTNodeImporter::VisitBuiltinType(const BuiltinType *T) { 15531b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor switch (T->getKind()) { 15544967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar#define IMAGE_TYPE(ImgType, Id, SingletonId, Access, Suffix) \ 15554967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar case BuiltinType::Id: \ 15564967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar return Importer.getToContext().SingletonId; 15574967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar#include "clang/Basic/OpenCLImageTypes.def" 1558e0a22d06888c13989b3f72db319f1d498bf69153John McCall#define SHARED_SINGLETON_TYPE(Expansion) 1559e0a22d06888c13989b3f72db319f1d498bf69153John McCall#define BUILTIN_TYPE(Id, SingletonId) \ 1560e0a22d06888c13989b3f72db319f1d498bf69153John McCall case BuiltinType::Id: return Importer.getToContext().SingletonId; 1561e0a22d06888c13989b3f72db319f1d498bf69153John McCall#include "clang/AST/BuiltinTypes.def" 1562e0a22d06888c13989b3f72db319f1d498bf69153John McCall 1563e0a22d06888c13989b3f72db319f1d498bf69153John McCall // FIXME: for Char16, Char32, and NullPtr, make sure that the "to" 1564e0a22d06888c13989b3f72db319f1d498bf69153John McCall // context supports C++. 1565e0a22d06888c13989b3f72db319f1d498bf69153John McCall 1566e0a22d06888c13989b3f72db319f1d498bf69153John McCall // FIXME: for ObjCId, ObjCClass, and ObjCSel, make sure that the "to" 1567e0a22d06888c13989b3f72db319f1d498bf69153John McCall // context supports ObjC. 1568e0a22d06888c13989b3f72db319f1d498bf69153John McCall 15691b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor case BuiltinType::Char_U: 15701b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor // The context we're importing from has an unsigned 'char'. If we're 15711b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor // importing into a context with a signed 'char', translate to 15721b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor // 'unsigned char' instead. 15734e4d08403ca5cfd4d558fa2936215d3a4e5a528dDavid Blaikie if (Importer.getToContext().getLangOpts().CharIsSigned) 15741b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor return Importer.getToContext().UnsignedCharTy; 15751b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor 15761b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor return Importer.getToContext().CharTy; 15771b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor 15781b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor case BuiltinType::Char_S: 15791b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor // The context we're importing from has an unsigned 'char'. If we're 15801b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor // importing into a context with a signed 'char', translate to 15811b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor // 'unsigned char' instead. 15824e4d08403ca5cfd4d558fa2936215d3a4e5a528dDavid Blaikie if (!Importer.getToContext().getLangOpts().CharIsSigned) 15831b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor return Importer.getToContext().SignedCharTy; 15841b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor 15851b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor return Importer.getToContext().CharTy; 15861b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor 15873f59c975aa5d047f7edd1b900b5e885c38af0ef7Chris Lattner case BuiltinType::WChar_S: 15883f59c975aa5d047f7edd1b900b5e885c38af0ef7Chris Lattner case BuiltinType::WChar_U: 15891b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor // FIXME: If not in C++, shall we translate to the C equivalent of 15901b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor // wchar_t? 15911b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor return Importer.getToContext().WCharTy; 15921b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor } 15933026348bd4c13a0f83b59839f64065e0fcbea253David Blaikie 15943026348bd4c13a0f83b59839f64065e0fcbea253David Blaikie llvm_unreachable("Invalid BuiltinType Kind!"); 15951b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor} 15961b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor 1597f4c7371fb1d3cebcfb40abad4537bb82515704eaJohn McCallQualType ASTNodeImporter::VisitComplexType(const ComplexType *T) { 15981b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor QualType ToElementType = Importer.Import(T->getElementType()); 15991b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor if (ToElementType.isNull()) 16001b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor return QualType(); 16011b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor 16021b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor return Importer.getToContext().getComplexType(ToElementType); 16031b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor} 16041b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor 1605f4c7371fb1d3cebcfb40abad4537bb82515704eaJohn McCallQualType ASTNodeImporter::VisitPointerType(const PointerType *T) { 16061b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor QualType ToPointeeType = Importer.Import(T->getPointeeType()); 16071b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor if (ToPointeeType.isNull()) 16081b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor return QualType(); 16091b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor 16101b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor return Importer.getToContext().getPointerType(ToPointeeType); 16111b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor} 16121b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor 1613f4c7371fb1d3cebcfb40abad4537bb82515704eaJohn McCallQualType ASTNodeImporter::VisitBlockPointerType(const BlockPointerType *T) { 16141b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor // FIXME: Check for blocks support in "to" context. 16151b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor QualType ToPointeeType = Importer.Import(T->getPointeeType()); 16161b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor if (ToPointeeType.isNull()) 16171b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor return QualType(); 16181b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor 16191b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor return Importer.getToContext().getBlockPointerType(ToPointeeType); 16201b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor} 16211b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor 1622f4c7371fb1d3cebcfb40abad4537bb82515704eaJohn McCallQualType 1623f4c7371fb1d3cebcfb40abad4537bb82515704eaJohn McCallASTNodeImporter::VisitLValueReferenceType(const LValueReferenceType *T) { 16241b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor // FIXME: Check for C++ support in "to" context. 16251b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor QualType ToPointeeType = Importer.Import(T->getPointeeTypeAsWritten()); 16261b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor if (ToPointeeType.isNull()) 16271b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor return QualType(); 16281b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor 16291b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor return Importer.getToContext().getLValueReferenceType(ToPointeeType); 16301b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor} 16311b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor 1632f4c7371fb1d3cebcfb40abad4537bb82515704eaJohn McCallQualType 1633f4c7371fb1d3cebcfb40abad4537bb82515704eaJohn McCallASTNodeImporter::VisitRValueReferenceType(const RValueReferenceType *T) { 16341b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor // FIXME: Check for C++0x support in "to" context. 16351b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor QualType ToPointeeType = Importer.Import(T->getPointeeTypeAsWritten()); 16361b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor if (ToPointeeType.isNull()) 16371b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor return QualType(); 16381b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor 16391b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor return Importer.getToContext().getRValueReferenceType(ToPointeeType); 16401b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor} 16411b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor 1642f4c7371fb1d3cebcfb40abad4537bb82515704eaJohn McCallQualType ASTNodeImporter::VisitMemberPointerType(const MemberPointerType *T) { 16431b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor // FIXME: Check for C++ support in "to" context. 16441b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor QualType ToPointeeType = Importer.Import(T->getPointeeType()); 16451b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor if (ToPointeeType.isNull()) 16461b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor return QualType(); 16471b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor 16481b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor QualType ClassType = Importer.Import(QualType(T->getClass(), 0)); 16491b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor return Importer.getToContext().getMemberPointerType(ToPointeeType, 16501b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor ClassType.getTypePtr()); 16511b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor} 16521b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor 1653f4c7371fb1d3cebcfb40abad4537bb82515704eaJohn McCallQualType ASTNodeImporter::VisitConstantArrayType(const ConstantArrayType *T) { 16541b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor QualType ToElementType = Importer.Import(T->getElementType()); 16551b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor if (ToElementType.isNull()) 16561b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor return QualType(); 16571b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor 16581b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor return Importer.getToContext().getConstantArrayType(ToElementType, 16591b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor T->getSize(), 16601b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor T->getSizeModifier(), 16611b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor T->getIndexTypeCVRQualifiers()); 16621b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor} 16631b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor 1664f4c7371fb1d3cebcfb40abad4537bb82515704eaJohn McCallQualType 1665f4c7371fb1d3cebcfb40abad4537bb82515704eaJohn McCallASTNodeImporter::VisitIncompleteArrayType(const IncompleteArrayType *T) { 16661b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor QualType ToElementType = Importer.Import(T->getElementType()); 16671b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor if (ToElementType.isNull()) 16681b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor return QualType(); 16691b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor 16701b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor return Importer.getToContext().getIncompleteArrayType(ToElementType, 16711b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor T->getSizeModifier(), 16721b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor T->getIndexTypeCVRQualifiers()); 16731b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor} 16741b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor 1675f4c7371fb1d3cebcfb40abad4537bb82515704eaJohn McCallQualType ASTNodeImporter::VisitVariableArrayType(const VariableArrayType *T) { 16761b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor QualType ToElementType = Importer.Import(T->getElementType()); 16771b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor if (ToElementType.isNull()) 16781b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor return QualType(); 16791b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor 16801b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor Expr *Size = Importer.Import(T->getSizeExpr()); 16811b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor if (!Size) 16821b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor return QualType(); 16831b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor 16841b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor SourceRange Brackets = Importer.Import(T->getBracketsRange()); 16851b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor return Importer.getToContext().getVariableArrayType(ToElementType, Size, 16861b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor T->getSizeModifier(), 16871b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor T->getIndexTypeCVRQualifiers(), 16881b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor Brackets); 16891b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor} 16901b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor 1691f4c7371fb1d3cebcfb40abad4537bb82515704eaJohn McCallQualType ASTNodeImporter::VisitVectorType(const VectorType *T) { 16921b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor QualType ToElementType = Importer.Import(T->getElementType()); 16931b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor if (ToElementType.isNull()) 16941b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor return QualType(); 16951b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor 16961b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor return Importer.getToContext().getVectorType(ToElementType, 16971b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor T->getNumElements(), 1698e86d78cf4754a6aef2cf9a33d847aa15338e276fBob Wilson T->getVectorKind()); 16991b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor} 17001b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor 1701f4c7371fb1d3cebcfb40abad4537bb82515704eaJohn McCallQualType ASTNodeImporter::VisitExtVectorType(const ExtVectorType *T) { 17021b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor QualType ToElementType = Importer.Import(T->getElementType()); 17031b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor if (ToElementType.isNull()) 17041b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor return QualType(); 17051b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor 17061b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor return Importer.getToContext().getExtVectorType(ToElementType, 17071b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor T->getNumElements()); 17081b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor} 17091b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor 1710f4c7371fb1d3cebcfb40abad4537bb82515704eaJohn McCallQualType 1711f4c7371fb1d3cebcfb40abad4537bb82515704eaJohn McCallASTNodeImporter::VisitFunctionNoProtoType(const FunctionNoProtoType *T) { 17121b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor // FIXME: What happens if we're importing a function without a prototype 17131b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor // into C++? Should we make it variadic? 1714651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines QualType ToResultType = Importer.Import(T->getReturnType()); 17151b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor if (ToResultType.isNull()) 17161b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor return QualType(); 1717264ba48dc98f3f843935a485d5b086f7e0fdc4f1Rafael Espindola 17181b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor return Importer.getToContext().getFunctionNoProtoType(ToResultType, 1719264ba48dc98f3f843935a485d5b086f7e0fdc4f1Rafael Espindola T->getExtInfo()); 17201b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor} 17211b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor 1722d498f384d154e154e939a9c764054cd4a8d76819Argyrios KyrtzidisQualType ASTNodeImporter::VisitFunctionProtoType(const FunctionProtoType *T) { 1723651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines QualType ToResultType = Importer.Import(T->getReturnType()); 17241b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor if (ToResultType.isNull()) 17251b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor return QualType(); 17261b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor 17271b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor // Import argument types 17285f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner SmallVector<QualType, 4> ArgTypes; 1729651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines for (const auto &A : T->param_types()) { 1730651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines QualType ArgType = Importer.Import(A); 17311b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor if (ArgType.isNull()) 17321b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor return QualType(); 17331b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor ArgTypes.push_back(ArgType); 17341b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor } 17351b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor 17361b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor // Import exception types 17375f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner SmallVector<QualType, 4> ExceptionTypes; 1738651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines for (const auto &E : T->exceptions()) { 1739651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines QualType ExceptionType = Importer.Import(E); 17401b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor if (ExceptionType.isNull()) 17411b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor return QualType(); 17421b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor ExceptionTypes.push_back(ExceptionType); 17431b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor } 1744e23cf437fe76b1ed02d63c3f61b456fd48a915f5John McCall 1745f0fdefc13a58db2a8b32bb47ac23bc16efad6fdaArgyrios Kyrtzidis FunctionProtoType::ExtProtoInfo FromEPI = T->getExtProtoInfo(); 1746f0fdefc13a58db2a8b32bb47ac23bc16efad6fdaArgyrios Kyrtzidis FunctionProtoType::ExtProtoInfo ToEPI; 1747f0fdefc13a58db2a8b32bb47ac23bc16efad6fdaArgyrios Kyrtzidis 1748f0fdefc13a58db2a8b32bb47ac23bc16efad6fdaArgyrios Kyrtzidis ToEPI.ExtInfo = FromEPI.ExtInfo; 1749f0fdefc13a58db2a8b32bb47ac23bc16efad6fdaArgyrios Kyrtzidis ToEPI.Variadic = FromEPI.Variadic; 1750f0fdefc13a58db2a8b32bb47ac23bc16efad6fdaArgyrios Kyrtzidis ToEPI.HasTrailingReturn = FromEPI.HasTrailingReturn; 1751f0fdefc13a58db2a8b32bb47ac23bc16efad6fdaArgyrios Kyrtzidis ToEPI.TypeQuals = FromEPI.TypeQuals; 1752f0fdefc13a58db2a8b32bb47ac23bc16efad6fdaArgyrios Kyrtzidis ToEPI.RefQualifier = FromEPI.RefQualifier; 1753176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines ToEPI.ExceptionSpec.Type = FromEPI.ExceptionSpec.Type; 1754176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines ToEPI.ExceptionSpec.Exceptions = ExceptionTypes; 1755176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines ToEPI.ExceptionSpec.NoexceptExpr = 1756176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines Importer.Import(FromEPI.ExceptionSpec.NoexceptExpr); 1757176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines ToEPI.ExceptionSpec.SourceDecl = cast_or_null<FunctionDecl>( 1758176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines Importer.Import(FromEPI.ExceptionSpec.SourceDecl)); 1759176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines ToEPI.ExceptionSpec.SourceTemplate = cast_or_null<FunctionDecl>( 1760176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines Importer.Import(FromEPI.ExceptionSpec.SourceTemplate)); 1761f0fdefc13a58db2a8b32bb47ac23bc16efad6fdaArgyrios Kyrtzidis 1762bea522ff43a3f11c7a2bc7949119dbb9fce19e39Jordan Rose return Importer.getToContext().getFunctionType(ToResultType, ArgTypes, ToEPI); 1763f0fdefc13a58db2a8b32bb47ac23bc16efad6fdaArgyrios Kyrtzidis} 1764f0fdefc13a58db2a8b32bb47ac23bc16efad6fdaArgyrios Kyrtzidis 17650aeb2890389ec1872e49a18fb2022bfb9f96578dSean CallananQualType ASTNodeImporter::VisitParenType(const ParenType *T) { 17660aeb2890389ec1872e49a18fb2022bfb9f96578dSean Callanan QualType ToInnerType = Importer.Import(T->getInnerType()); 17670aeb2890389ec1872e49a18fb2022bfb9f96578dSean Callanan if (ToInnerType.isNull()) 17680aeb2890389ec1872e49a18fb2022bfb9f96578dSean Callanan return QualType(); 17690aeb2890389ec1872e49a18fb2022bfb9f96578dSean Callanan 17700aeb2890389ec1872e49a18fb2022bfb9f96578dSean Callanan return Importer.getToContext().getParenType(ToInnerType); 17710aeb2890389ec1872e49a18fb2022bfb9f96578dSean Callanan} 17720aeb2890389ec1872e49a18fb2022bfb9f96578dSean Callanan 1773f4c7371fb1d3cebcfb40abad4537bb82515704eaJohn McCallQualType ASTNodeImporter::VisitTypedefType(const TypedefType *T) { 1774162e1c1b487352434552147967c3dd296ebee2f7Richard Smith TypedefNameDecl *ToDecl 1775162e1c1b487352434552147967c3dd296ebee2f7Richard Smith = dyn_cast_or_null<TypedefNameDecl>(Importer.Import(T->getDecl())); 17761b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor if (!ToDecl) 17771b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor return QualType(); 17781b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor 17791b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor return Importer.getToContext().getTypeDeclType(ToDecl); 17801b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor} 17811b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor 1782f4c7371fb1d3cebcfb40abad4537bb82515704eaJohn McCallQualType ASTNodeImporter::VisitTypeOfExprType(const TypeOfExprType *T) { 17831b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor Expr *ToExpr = Importer.Import(T->getUnderlyingExpr()); 17841b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor if (!ToExpr) 17851b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor return QualType(); 17861b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor 17871b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor return Importer.getToContext().getTypeOfExprType(ToExpr); 17881b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor} 17891b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor 1790f4c7371fb1d3cebcfb40abad4537bb82515704eaJohn McCallQualType ASTNodeImporter::VisitTypeOfType(const TypeOfType *T) { 17911b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor QualType ToUnderlyingType = Importer.Import(T->getUnderlyingType()); 17921b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor if (ToUnderlyingType.isNull()) 17931b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor return QualType(); 17941b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor 17951b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor return Importer.getToContext().getTypeOfType(ToUnderlyingType); 17961b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor} 17971b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor 1798f4c7371fb1d3cebcfb40abad4537bb82515704eaJohn McCallQualType ASTNodeImporter::VisitDecltypeType(const DecltypeType *T) { 179934b41d939a1328f484511c6002ba2456db879a29Richard Smith // FIXME: Make sure that the "to" context supports C++0x! 18001b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor Expr *ToExpr = Importer.Import(T->getUnderlyingExpr()); 18011b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor if (!ToExpr) 18021b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor return QualType(); 18031b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor 1804f8af98286022f72157d84951b48fde5fb369ab29Douglas Gregor QualType UnderlyingType = Importer.Import(T->getUnderlyingType()); 1805f8af98286022f72157d84951b48fde5fb369ab29Douglas Gregor if (UnderlyingType.isNull()) 1806f8af98286022f72157d84951b48fde5fb369ab29Douglas Gregor return QualType(); 1807f8af98286022f72157d84951b48fde5fb369ab29Douglas Gregor 1808f8af98286022f72157d84951b48fde5fb369ab29Douglas Gregor return Importer.getToContext().getDecltypeType(ToExpr, UnderlyingType); 18091b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor} 18101b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor 1811ca63c200346c0ca9e00194ec6e34a5a7b0ed9321Sean HuntQualType ASTNodeImporter::VisitUnaryTransformType(const UnaryTransformType *T) { 1812ca63c200346c0ca9e00194ec6e34a5a7b0ed9321Sean Hunt QualType ToBaseType = Importer.Import(T->getBaseType()); 1813ca63c200346c0ca9e00194ec6e34a5a7b0ed9321Sean Hunt QualType ToUnderlyingType = Importer.Import(T->getUnderlyingType()); 1814ca63c200346c0ca9e00194ec6e34a5a7b0ed9321Sean Hunt if (ToBaseType.isNull() || ToUnderlyingType.isNull()) 1815ca63c200346c0ca9e00194ec6e34a5a7b0ed9321Sean Hunt return QualType(); 1816ca63c200346c0ca9e00194ec6e34a5a7b0ed9321Sean Hunt 1817ca63c200346c0ca9e00194ec6e34a5a7b0ed9321Sean Hunt return Importer.getToContext().getUnaryTransformType(ToBaseType, 1818ca63c200346c0ca9e00194ec6e34a5a7b0ed9321Sean Hunt ToUnderlyingType, 1819ca63c200346c0ca9e00194ec6e34a5a7b0ed9321Sean Hunt T->getUTTKind()); 1820ca63c200346c0ca9e00194ec6e34a5a7b0ed9321Sean Hunt} 1821ca63c200346c0ca9e00194ec6e34a5a7b0ed9321Sean Hunt 182234b41d939a1328f484511c6002ba2456db879a29Richard SmithQualType ASTNodeImporter::VisitAutoType(const AutoType *T) { 1823a2c3646c35dd09d21b74826240aa916545b1873fRichard Smith // FIXME: Make sure that the "to" context supports C++11! 182434b41d939a1328f484511c6002ba2456db879a29Richard Smith QualType FromDeduced = T->getDeducedType(); 182534b41d939a1328f484511c6002ba2456db879a29Richard Smith QualType ToDeduced; 182634b41d939a1328f484511c6002ba2456db879a29Richard Smith if (!FromDeduced.isNull()) { 182734b41d939a1328f484511c6002ba2456db879a29Richard Smith ToDeduced = Importer.Import(FromDeduced); 182834b41d939a1328f484511c6002ba2456db879a29Richard Smith if (ToDeduced.isNull()) 182934b41d939a1328f484511c6002ba2456db879a29Richard Smith return QualType(); 183034b41d939a1328f484511c6002ba2456db879a29Richard Smith } 183134b41d939a1328f484511c6002ba2456db879a29Richard Smith 183287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar return Importer.getToContext().getAutoType(ToDeduced, T->getKeyword(), 1833fad9e13f3cb85198f0ee5af620ba81cd78574faaFaisal Vali /*IsDependent*/false); 183434b41d939a1328f484511c6002ba2456db879a29Richard Smith} 183534b41d939a1328f484511c6002ba2456db879a29Richard Smith 18364967a710c84587c654b56c828382219c3937dacbPirama Arumuga NainarQualType ASTNodeImporter::VisitInjectedClassNameType( 18374967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar const InjectedClassNameType *T) { 18384967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar CXXRecordDecl *D = cast_or_null<CXXRecordDecl>(Importer.Import(T->getDecl())); 18394967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar if (!D) 18404967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar return QualType(); 18414967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar 18424967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar QualType InjType = Importer.Import(T->getInjectedSpecializationType()); 18434967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar if (InjType.isNull()) 18444967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar return QualType(); 18454967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar 18464967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar // FIXME: ASTContext::getInjectedClassNameType is not suitable for AST reading 18474967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar // See comments in InjectedClassNameType definition for details 18484967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar // return Importer.getToContext().getInjectedClassNameType(D, InjType); 18494967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar enum { 18504967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar TypeAlignmentInBits = 4, 18514967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar TypeAlignment = 1 << TypeAlignmentInBits 18524967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar }; 18534967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar 18544967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar return QualType(new (Importer.getToContext(), TypeAlignment) 18554967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar InjectedClassNameType(D, InjType), 0); 18564967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar} 18574967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar 1858f4c7371fb1d3cebcfb40abad4537bb82515704eaJohn McCallQualType ASTNodeImporter::VisitRecordType(const RecordType *T) { 18591b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor RecordDecl *ToDecl 18601b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor = dyn_cast_or_null<RecordDecl>(Importer.Import(T->getDecl())); 18611b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor if (!ToDecl) 18621b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor return QualType(); 18631b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor 18641b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor return Importer.getToContext().getTagDeclType(ToDecl); 18651b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor} 18661b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor 1867f4c7371fb1d3cebcfb40abad4537bb82515704eaJohn McCallQualType ASTNodeImporter::VisitEnumType(const EnumType *T) { 18681b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor EnumDecl *ToDecl 18691b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor = dyn_cast_or_null<EnumDecl>(Importer.Import(T->getDecl())); 18701b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor if (!ToDecl) 18711b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor return QualType(); 18721b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor 18731b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor return Importer.getToContext().getTagDeclType(ToDecl); 18741b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor} 18751b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor 187658878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga NainarQualType ASTNodeImporter::VisitAttributedType(const AttributedType *T) { 187758878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar QualType FromModifiedType = T->getModifiedType(); 187858878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar QualType FromEquivalentType = T->getEquivalentType(); 187958878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar QualType ToModifiedType; 188058878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar QualType ToEquivalentType; 188158878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar 188258878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar if (!FromModifiedType.isNull()) { 188358878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar ToModifiedType = Importer.Import(FromModifiedType); 188458878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar if (ToModifiedType.isNull()) 188558878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar return QualType(); 188658878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar } 188758878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar if (!FromEquivalentType.isNull()) { 188858878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar ToEquivalentType = Importer.Import(FromEquivalentType); 188958878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar if (ToEquivalentType.isNull()) 189058878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar return QualType(); 189158878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar } 189258878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar 189358878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar return Importer.getToContext().getAttributedType(T->getAttrKind(), 189458878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar ToModifiedType, ToEquivalentType); 189558878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar} 189658878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar 18974967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar 18984967a710c84587c654b56c828382219c3937dacbPirama Arumuga NainarQualType ASTNodeImporter::VisitTemplateTypeParmType( 18994967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar const TemplateTypeParmType *T) { 19004967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar TemplateTypeParmDecl *ParmDecl = 19014967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar cast_or_null<TemplateTypeParmDecl>(Importer.Import(T->getDecl())); 19024967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar if (!ParmDecl && T->getDecl()) 19034967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar return QualType(); 19044967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar 19054967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar return Importer.getToContext().getTemplateTypeParmType( 19064967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar T->getDepth(), T->getIndex(), T->isParameterPack(), ParmDecl); 19074967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar} 19084967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar 1909d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas GregorQualType ASTNodeImporter::VisitTemplateSpecializationType( 1910f4c7371fb1d3cebcfb40abad4537bb82515704eaJohn McCall const TemplateSpecializationType *T) { 1911d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor TemplateName ToTemplate = Importer.Import(T->getTemplateName()); 1912d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor if (ToTemplate.isNull()) 1913d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor return QualType(); 1914d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor 19155f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner SmallVector<TemplateArgument, 2> ToTemplateArgs; 1916d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor if (ImportTemplateArguments(T->getArgs(), T->getNumArgs(), ToTemplateArgs)) 1917d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor return QualType(); 1918d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor 1919d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor QualType ToCanonType; 1920d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor if (!QualType(T, 0).isCanonical()) { 1921d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor QualType FromCanonType 1922d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor = Importer.getFromContext().getCanonicalType(QualType(T, 0)); 1923d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor ToCanonType =Importer.Import(FromCanonType); 1924d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor if (ToCanonType.isNull()) 1925d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor return QualType(); 1926d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor } 1927d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor return Importer.getToContext().getTemplateSpecializationType(ToTemplate, 19284967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar ToTemplateArgs, 1929d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor ToCanonType); 1930d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor} 1931d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor 1932f4c7371fb1d3cebcfb40abad4537bb82515704eaJohn McCallQualType ASTNodeImporter::VisitElaboratedType(const ElaboratedType *T) { 19336bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines NestedNameSpecifier *ToQualifier = nullptr; 1934465d41b92b2c862f3062c412a0538db65c6a2661Abramo Bagnara // Note: the qualifier in an ElaboratedType is optional. 1935465d41b92b2c862f3062c412a0538db65c6a2661Abramo Bagnara if (T->getQualifier()) { 1936465d41b92b2c862f3062c412a0538db65c6a2661Abramo Bagnara ToQualifier = Importer.Import(T->getQualifier()); 1937465d41b92b2c862f3062c412a0538db65c6a2661Abramo Bagnara if (!ToQualifier) 1938465d41b92b2c862f3062c412a0538db65c6a2661Abramo Bagnara return QualType(); 1939465d41b92b2c862f3062c412a0538db65c6a2661Abramo Bagnara } 19401b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor 19411b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor QualType ToNamedType = Importer.Import(T->getNamedType()); 19421b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor if (ToNamedType.isNull()) 19431b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor return QualType(); 19441b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor 1945465d41b92b2c862f3062c412a0538db65c6a2661Abramo Bagnara return Importer.getToContext().getElaboratedType(T->getKeyword(), 1946465d41b92b2c862f3062c412a0538db65c6a2661Abramo Bagnara ToQualifier, ToNamedType); 19471b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor} 19481b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor 1949f4c7371fb1d3cebcfb40abad4537bb82515704eaJohn McCallQualType ASTNodeImporter::VisitObjCInterfaceType(const ObjCInterfaceType *T) { 19501b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor ObjCInterfaceDecl *Class 19511b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor = dyn_cast_or_null<ObjCInterfaceDecl>(Importer.Import(T->getDecl())); 19521b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor if (!Class) 19531b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor return QualType(); 19541b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor 1955c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall return Importer.getToContext().getObjCInterfaceType(Class); 1956c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall} 1957c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall 1958f4c7371fb1d3cebcfb40abad4537bb82515704eaJohn McCallQualType ASTNodeImporter::VisitObjCObjectType(const ObjCObjectType *T) { 1959c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall QualType ToBaseType = Importer.Import(T->getBaseType()); 1960c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall if (ToBaseType.isNull()) 1961c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall return QualType(); 1962c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall 196387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar SmallVector<QualType, 4> TypeArgs; 196487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar for (auto TypeArg : T->getTypeArgsAsWritten()) { 196587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar QualType ImportedTypeArg = Importer.Import(TypeArg); 196687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar if (ImportedTypeArg.isNull()) 196787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar return QualType(); 196887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar 196987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar TypeArgs.push_back(ImportedTypeArg); 197087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar } 197187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar 19725f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner SmallVector<ObjCProtocolDecl *, 4> Protocols; 1973651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines for (auto *P : T->quals()) { 19741b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor ObjCProtocolDecl *Protocol 1975651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines = dyn_cast_or_null<ObjCProtocolDecl>(Importer.Import(P)); 19761b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor if (!Protocol) 19771b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor return QualType(); 19781b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor Protocols.push_back(Protocol); 19791b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor } 19801b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor 198187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar return Importer.getToContext().getObjCObjectType(ToBaseType, TypeArgs, 198287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar Protocols, 198387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar T->isKindOfTypeAsWritten()); 19841b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor} 19851b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor 1986f4c7371fb1d3cebcfb40abad4537bb82515704eaJohn McCallQualType 1987f4c7371fb1d3cebcfb40abad4537bb82515704eaJohn McCallASTNodeImporter::VisitObjCObjectPointerType(const ObjCObjectPointerType *T) { 19881b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor QualType ToPointeeType = Importer.Import(T->getPointeeType()); 19891b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor if (ToPointeeType.isNull()) 19901b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor return QualType(); 19911b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor 1992c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall return Importer.getToContext().getObjCObjectPointerType(ToPointeeType); 19931b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor} 19941b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor 1995089459a16bf7e9cd10617d1fac5ec0240a0a1ee6Douglas Gregor//---------------------------------------------------------------------------- 1996089459a16bf7e9cd10617d1fac5ec0240a0a1ee6Douglas Gregor// Import Declarations 1997089459a16bf7e9cd10617d1fac5ec0240a0a1ee6Douglas Gregor//---------------------------------------------------------------------------- 1998a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregorbool ASTNodeImporter::ImportDeclParts(NamedDecl *D, DeclContext *&DC, 1999a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor DeclContext *&LexicalDC, 2000a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor DeclarationName &Name, 2001b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar NamedDecl *&ToD, 2002a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor SourceLocation &Loc) { 2003089459a16bf7e9cd10617d1fac5ec0240a0a1ee6Douglas Gregor // Import the context of this declaration. 2004a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor DC = Importer.ImportContext(D->getDeclContext()); 2005089459a16bf7e9cd10617d1fac5ec0240a0a1ee6Douglas Gregor if (!DC) 2006a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor return true; 2007a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor 2008a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor LexicalDC = DC; 20099bed8798964d9f07599c2c9199701f86fbc70e20Douglas Gregor if (D->getDeclContext() != D->getLexicalDeclContext()) { 20109bed8798964d9f07599c2c9199701f86fbc70e20Douglas Gregor LexicalDC = Importer.ImportContext(D->getLexicalDeclContext()); 20119bed8798964d9f07599c2c9199701f86fbc70e20Douglas Gregor if (!LexicalDC) 2012a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor return true; 20139bed8798964d9f07599c2c9199701f86fbc70e20Douglas Gregor } 2014a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor 2015089459a16bf7e9cd10617d1fac5ec0240a0a1ee6Douglas Gregor // Import the name of this declaration. 2016a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor Name = Importer.Import(D->getDeclName()); 2017089459a16bf7e9cd10617d1fac5ec0240a0a1ee6Douglas Gregor if (D->getDeclName() && !Name) 2018a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor return true; 2019a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor 2020a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor // Import the location of this declaration. 2021a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor Loc = Importer.Import(D->getLocation()); 2022b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar ToD = cast_or_null<NamedDecl>(Importer.GetAlreadyImportedOrNull(D)); 2023a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor return false; 2024a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor} 2025a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor 20261cf038c516c5e1f56ea9cff61aac7f7841744a91Douglas Gregorvoid ASTNodeImporter::ImportDefinitionIfNeeded(Decl *FromD, Decl *ToD) { 20271cf038c516c5e1f56ea9cff61aac7f7841744a91Douglas Gregor if (!FromD) 20281cf038c516c5e1f56ea9cff61aac7f7841744a91Douglas Gregor return; 20291cf038c516c5e1f56ea9cff61aac7f7841744a91Douglas Gregor 20301cf038c516c5e1f56ea9cff61aac7f7841744a91Douglas Gregor if (!ToD) { 20311cf038c516c5e1f56ea9cff61aac7f7841744a91Douglas Gregor ToD = Importer.Import(FromD); 20321cf038c516c5e1f56ea9cff61aac7f7841744a91Douglas Gregor if (!ToD) 20331cf038c516c5e1f56ea9cff61aac7f7841744a91Douglas Gregor return; 20341cf038c516c5e1f56ea9cff61aac7f7841744a91Douglas Gregor } 20351cf038c516c5e1f56ea9cff61aac7f7841744a91Douglas Gregor 20361cf038c516c5e1f56ea9cff61aac7f7841744a91Douglas Gregor if (RecordDecl *FromRecord = dyn_cast<RecordDecl>(FromD)) { 20371cf038c516c5e1f56ea9cff61aac7f7841744a91Douglas Gregor if (RecordDecl *ToRecord = cast_or_null<RecordDecl>(ToD)) { 20382246823e207a4846c842a27cf99d99920cd2b178Sean Callanan if (FromRecord->getDefinition() && FromRecord->isCompleteDefinition() && !ToRecord->getDefinition()) { 20391cf038c516c5e1f56ea9cff61aac7f7841744a91Douglas Gregor ImportDefinition(FromRecord, ToRecord); 20401cf038c516c5e1f56ea9cff61aac7f7841744a91Douglas Gregor } 20411cf038c516c5e1f56ea9cff61aac7f7841744a91Douglas Gregor } 20421cf038c516c5e1f56ea9cff61aac7f7841744a91Douglas Gregor return; 20431cf038c516c5e1f56ea9cff61aac7f7841744a91Douglas Gregor } 20441cf038c516c5e1f56ea9cff61aac7f7841744a91Douglas Gregor 20451cf038c516c5e1f56ea9cff61aac7f7841744a91Douglas Gregor if (EnumDecl *FromEnum = dyn_cast<EnumDecl>(FromD)) { 20461cf038c516c5e1f56ea9cff61aac7f7841744a91Douglas Gregor if (EnumDecl *ToEnum = cast_or_null<EnumDecl>(ToD)) { 20471cf038c516c5e1f56ea9cff61aac7f7841744a91Douglas Gregor if (FromEnum->getDefinition() && !ToEnum->getDefinition()) { 20481cf038c516c5e1f56ea9cff61aac7f7841744a91Douglas Gregor ImportDefinition(FromEnum, ToEnum); 20491cf038c516c5e1f56ea9cff61aac7f7841744a91Douglas Gregor } 20501cf038c516c5e1f56ea9cff61aac7f7841744a91Douglas Gregor } 20511cf038c516c5e1f56ea9cff61aac7f7841744a91Douglas Gregor return; 20521cf038c516c5e1f56ea9cff61aac7f7841744a91Douglas Gregor } 20531cf038c516c5e1f56ea9cff61aac7f7841744a91Douglas Gregor} 20541cf038c516c5e1f56ea9cff61aac7f7841744a91Douglas Gregor 20552577743c5650c646fb705df01403707e94f2df04Abramo Bagnaravoid 20562577743c5650c646fb705df01403707e94f2df04Abramo BagnaraASTNodeImporter::ImportDeclarationNameLoc(const DeclarationNameInfo &From, 20572577743c5650c646fb705df01403707e94f2df04Abramo Bagnara DeclarationNameInfo& To) { 20582577743c5650c646fb705df01403707e94f2df04Abramo Bagnara // NOTE: To.Name and To.Loc are already imported. 20592577743c5650c646fb705df01403707e94f2df04Abramo Bagnara // We only have to import To.LocInfo. 20602577743c5650c646fb705df01403707e94f2df04Abramo Bagnara switch (To.getName().getNameKind()) { 20612577743c5650c646fb705df01403707e94f2df04Abramo Bagnara case DeclarationName::Identifier: 20622577743c5650c646fb705df01403707e94f2df04Abramo Bagnara case DeclarationName::ObjCZeroArgSelector: 20632577743c5650c646fb705df01403707e94f2df04Abramo Bagnara case DeclarationName::ObjCOneArgSelector: 20642577743c5650c646fb705df01403707e94f2df04Abramo Bagnara case DeclarationName::ObjCMultiArgSelector: 20652577743c5650c646fb705df01403707e94f2df04Abramo Bagnara case DeclarationName::CXXUsingDirective: 20662577743c5650c646fb705df01403707e94f2df04Abramo Bagnara return; 20672577743c5650c646fb705df01403707e94f2df04Abramo Bagnara 20682577743c5650c646fb705df01403707e94f2df04Abramo Bagnara case DeclarationName::CXXOperatorName: { 20692577743c5650c646fb705df01403707e94f2df04Abramo Bagnara SourceRange Range = From.getCXXOperatorNameRange(); 20702577743c5650c646fb705df01403707e94f2df04Abramo Bagnara To.setCXXOperatorNameRange(Importer.Import(Range)); 20712577743c5650c646fb705df01403707e94f2df04Abramo Bagnara return; 20722577743c5650c646fb705df01403707e94f2df04Abramo Bagnara } 20732577743c5650c646fb705df01403707e94f2df04Abramo Bagnara case DeclarationName::CXXLiteralOperatorName: { 20742577743c5650c646fb705df01403707e94f2df04Abramo Bagnara SourceLocation Loc = From.getCXXLiteralOperatorNameLoc(); 20752577743c5650c646fb705df01403707e94f2df04Abramo Bagnara To.setCXXLiteralOperatorNameLoc(Importer.Import(Loc)); 20762577743c5650c646fb705df01403707e94f2df04Abramo Bagnara return; 20772577743c5650c646fb705df01403707e94f2df04Abramo Bagnara } 20782577743c5650c646fb705df01403707e94f2df04Abramo Bagnara case DeclarationName::CXXConstructorName: 20792577743c5650c646fb705df01403707e94f2df04Abramo Bagnara case DeclarationName::CXXDestructorName: 20802577743c5650c646fb705df01403707e94f2df04Abramo Bagnara case DeclarationName::CXXConversionFunctionName: { 20812577743c5650c646fb705df01403707e94f2df04Abramo Bagnara TypeSourceInfo *FromTInfo = From.getNamedTypeInfo(); 20822577743c5650c646fb705df01403707e94f2df04Abramo Bagnara To.setNamedTypeInfo(Importer.Import(FromTInfo)); 20832577743c5650c646fb705df01403707e94f2df04Abramo Bagnara return; 20842577743c5650c646fb705df01403707e94f2df04Abramo Bagnara } 20852577743c5650c646fb705df01403707e94f2df04Abramo Bagnara } 208621a25167b8279df3d8f889d041a4fd98733d3c27Douglas Gregor llvm_unreachable("Unknown name kind."); 20872577743c5650c646fb705df01403707e94f2df04Abramo Bagnara} 20882577743c5650c646fb705df01403707e94f2df04Abramo Bagnara 2089ac32ff9812e7d6bc31573b5499bfd005fc8b8f39Douglas Gregorvoid ASTNodeImporter::ImportDeclContext(DeclContext *FromDC, bool ForceImport) { 2090d8868a634d4fd362243dc646e58c3cf956c81dcdDouglas Gregor if (Importer.isMinimalImport() && !ForceImport) { 20918cc4fd795e01d50a7a7c96f4c0356d23b00d9349Sean Callanan Importer.ImportContext(FromDC); 2092d8868a634d4fd362243dc646e58c3cf956c81dcdDouglas Gregor return; 2093d8868a634d4fd362243dc646e58c3cf956c81dcdDouglas Gregor } 2094d8868a634d4fd362243dc646e58c3cf956c81dcdDouglas Gregor 2095651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines for (auto *From : FromDC->decls()) 2096651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines Importer.Import(From); 2097083a821bbd02bbc521275a2f144abe39a6c2745cDouglas Gregor} 2098083a821bbd02bbc521275a2f144abe39a6c2745cDouglas Gregor 20991cf038c516c5e1f56ea9cff61aac7f7841744a91Douglas Gregorbool ASTNodeImporter::ImportDefinition(RecordDecl *From, RecordDecl *To, 2100cd0d56a523f877ffd1fe1575caf758b4357f1661Douglas Gregor ImportDefinitionKind Kind) { 2101cd0d56a523f877ffd1fe1575caf758b4357f1661Douglas Gregor if (To->getDefinition() || To->isBeingDefined()) { 2102cd0d56a523f877ffd1fe1575caf758b4357f1661Douglas Gregor if (Kind == IDK_Everything) 2103cd0d56a523f877ffd1fe1575caf758b4357f1661Douglas Gregor ImportDeclContext(From, /*ForceImport=*/true); 2104cd0d56a523f877ffd1fe1575caf758b4357f1661Douglas Gregor 2105d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor return false; 2106cd0d56a523f877ffd1fe1575caf758b4357f1661Douglas Gregor } 2107d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor 2108d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor To->startDefinition(); 2109d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor 2110d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor // Add base classes. 2111d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor if (CXXRecordDecl *ToCXX = dyn_cast<CXXRecordDecl>(To)) { 2112d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor CXXRecordDecl *FromCXX = cast<CXXRecordDecl>(From); 211327c72d8ca8bbb2861959c71f737e2560a7bf9991Douglas Gregor 211427c72d8ca8bbb2861959c71f737e2560a7bf9991Douglas Gregor struct CXXRecordDecl::DefinitionData &ToData = ToCXX->data(); 211527c72d8ca8bbb2861959c71f737e2560a7bf9991Douglas Gregor struct CXXRecordDecl::DefinitionData &FromData = FromCXX->data(); 211627c72d8ca8bbb2861959c71f737e2560a7bf9991Douglas Gregor ToData.UserDeclaredConstructor = FromData.UserDeclaredConstructor; 21177d04d3a6855bc74d5c1a2213717eb5402b772ae6Richard Smith ToData.UserDeclaredSpecialMembers = FromData.UserDeclaredSpecialMembers; 211827c72d8ca8bbb2861959c71f737e2560a7bf9991Douglas Gregor ToData.Aggregate = FromData.Aggregate; 211927c72d8ca8bbb2861959c71f737e2560a7bf9991Douglas Gregor ToData.PlainOldData = FromData.PlainOldData; 212027c72d8ca8bbb2861959c71f737e2560a7bf9991Douglas Gregor ToData.Empty = FromData.Empty; 212127c72d8ca8bbb2861959c71f737e2560a7bf9991Douglas Gregor ToData.Polymorphic = FromData.Polymorphic; 212227c72d8ca8bbb2861959c71f737e2560a7bf9991Douglas Gregor ToData.Abstract = FromData.Abstract; 212327c72d8ca8bbb2861959c71f737e2560a7bf9991Douglas Gregor ToData.IsStandardLayout = FromData.IsStandardLayout; 212427c72d8ca8bbb2861959c71f737e2560a7bf9991Douglas Gregor ToData.HasNoNonEmptyBases = FromData.HasNoNonEmptyBases; 212527c72d8ca8bbb2861959c71f737e2560a7bf9991Douglas Gregor ToData.HasPrivateFields = FromData.HasPrivateFields; 212627c72d8ca8bbb2861959c71f737e2560a7bf9991Douglas Gregor ToData.HasProtectedFields = FromData.HasProtectedFields; 212727c72d8ca8bbb2861959c71f737e2560a7bf9991Douglas Gregor ToData.HasPublicFields = FromData.HasPublicFields; 212827c72d8ca8bbb2861959c71f737e2560a7bf9991Douglas Gregor ToData.HasMutableFields = FromData.HasMutableFields; 2129651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines ToData.HasVariantMembers = FromData.HasVariantMembers; 2130dfefb840e36f069286ef6cf178ef339c90f4603dRichard Smith ToData.HasOnlyCMembers = FromData.HasOnlyCMembers; 2131d079abfb5eefaf7da232e39a6564f561402cf4feRichard Smith ToData.HasInClassInitializer = FromData.HasInClassInitializer; 2132d5bc867f6597ee8d4eb31ea217934e436fc7c7e3Richard Smith ToData.HasUninitializedReferenceMember 2133d5bc867f6597ee8d4eb31ea217934e436fc7c7e3Richard Smith = FromData.HasUninitializedReferenceMember; 21344967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar ToData.HasUninitializedFields = FromData.HasUninitializedFields; 21354967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar ToData.HasInheritedConstructor = FromData.HasInheritedConstructor; 21364967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar ToData.HasInheritedAssignment = FromData.HasInheritedAssignment; 2137bc2a35d5ff492107dab5bdb7682f0da2f4a88861Richard Smith ToData.NeedOverloadResolutionForMoveConstructor 2138bc2a35d5ff492107dab5bdb7682f0da2f4a88861Richard Smith = FromData.NeedOverloadResolutionForMoveConstructor; 2139bc2a35d5ff492107dab5bdb7682f0da2f4a88861Richard Smith ToData.NeedOverloadResolutionForMoveAssignment 2140bc2a35d5ff492107dab5bdb7682f0da2f4a88861Richard Smith = FromData.NeedOverloadResolutionForMoveAssignment; 2141bc2a35d5ff492107dab5bdb7682f0da2f4a88861Richard Smith ToData.NeedOverloadResolutionForDestructor 2142bc2a35d5ff492107dab5bdb7682f0da2f4a88861Richard Smith = FromData.NeedOverloadResolutionForDestructor; 2143bc2a35d5ff492107dab5bdb7682f0da2f4a88861Richard Smith ToData.DefaultedMoveConstructorIsDeleted 2144bc2a35d5ff492107dab5bdb7682f0da2f4a88861Richard Smith = FromData.DefaultedMoveConstructorIsDeleted; 2145bc2a35d5ff492107dab5bdb7682f0da2f4a88861Richard Smith ToData.DefaultedMoveAssignmentIsDeleted 2146bc2a35d5ff492107dab5bdb7682f0da2f4a88861Richard Smith = FromData.DefaultedMoveAssignmentIsDeleted; 2147bc2a35d5ff492107dab5bdb7682f0da2f4a88861Richard Smith ToData.DefaultedDestructorIsDeleted = FromData.DefaultedDestructorIsDeleted; 21487d04d3a6855bc74d5c1a2213717eb5402b772ae6Richard Smith ToData.HasTrivialSpecialMembers = FromData.HasTrivialSpecialMembers; 21497d04d3a6855bc74d5c1a2213717eb5402b772ae6Richard Smith ToData.HasIrrelevantDestructor = FromData.HasIrrelevantDestructor; 215027c72d8ca8bbb2861959c71f737e2560a7bf9991Douglas Gregor ToData.HasConstexprNonCopyMoveConstructor 215127c72d8ca8bbb2861959c71f737e2560a7bf9991Douglas Gregor = FromData.HasConstexprNonCopyMoveConstructor; 21524967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar ToData.HasDefaultedDefaultConstructor 21534967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar = FromData.HasDefaultedDefaultConstructor; 2154dfefb840e36f069286ef6cf178ef339c90f4603dRichard Smith ToData.DefaultedDefaultConstructorIsConstexpr 2155dfefb840e36f069286ef6cf178ef339c90f4603dRichard Smith = FromData.DefaultedDefaultConstructorIsConstexpr; 2156dfefb840e36f069286ef6cf178ef339c90f4603dRichard Smith ToData.HasConstexprDefaultConstructor 2157dfefb840e36f069286ef6cf178ef339c90f4603dRichard Smith = FromData.HasConstexprDefaultConstructor; 215827c72d8ca8bbb2861959c71f737e2560a7bf9991Douglas Gregor ToData.HasNonLiteralTypeFieldsOrBases 215927c72d8ca8bbb2861959c71f737e2560a7bf9991Douglas Gregor = FromData.HasNonLiteralTypeFieldsOrBases; 2160dfefb840e36f069286ef6cf178ef339c90f4603dRichard Smith // ComputedVisibleConversions not imported. 216127c72d8ca8bbb2861959c71f737e2560a7bf9991Douglas Gregor ToData.UserProvidedDefaultConstructor 216227c72d8ca8bbb2861959c71f737e2560a7bf9991Douglas Gregor = FromData.UserProvidedDefaultConstructor; 21637d04d3a6855bc74d5c1a2213717eb5402b772ae6Richard Smith ToData.DeclaredSpecialMembers = FromData.DeclaredSpecialMembers; 2164acf796b4797c5b3e9e237148fa622afdc04b3effRichard Smith ToData.ImplicitCopyConstructorHasConstParam 2165acf796b4797c5b3e9e237148fa622afdc04b3effRichard Smith = FromData.ImplicitCopyConstructorHasConstParam; 2166acf796b4797c5b3e9e237148fa622afdc04b3effRichard Smith ToData.ImplicitCopyAssignmentHasConstParam 2167acf796b4797c5b3e9e237148fa622afdc04b3effRichard Smith = FromData.ImplicitCopyAssignmentHasConstParam; 2168acf796b4797c5b3e9e237148fa622afdc04b3effRichard Smith ToData.HasDeclaredCopyConstructorWithConstParam 2169acf796b4797c5b3e9e237148fa622afdc04b3effRichard Smith = FromData.HasDeclaredCopyConstructorWithConstParam; 2170acf796b4797c5b3e9e237148fa622afdc04b3effRichard Smith ToData.HasDeclaredCopyAssignmentWithConstParam 2171acf796b4797c5b3e9e237148fa622afdc04b3effRichard Smith = FromData.HasDeclaredCopyAssignmentWithConstParam; 2172dfefb840e36f069286ef6cf178ef339c90f4603dRichard Smith ToData.IsLambda = FromData.IsLambda; 2173dfefb840e36f069286ef6cf178ef339c90f4603dRichard Smith 21745f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner SmallVector<CXXBaseSpecifier *, 4> Bases; 2175651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines for (const auto &Base1 : FromCXX->bases()) { 2176651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines QualType T = Importer.Import(Base1.getType()); 2177d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor if (T.isNull()) 2178c04d9d1be026cb201a716df1cd28a88878958beeDouglas Gregor return true; 2179f90b27ad077c3339b62befc892382845339f9490Douglas Gregor 2180f90b27ad077c3339b62befc892382845339f9490Douglas Gregor SourceLocation EllipsisLoc; 2181651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines if (Base1.isPackExpansion()) 2182651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines EllipsisLoc = Importer.Import(Base1.getEllipsisLoc()); 21831cf038c516c5e1f56ea9cff61aac7f7841744a91Douglas Gregor 21841cf038c516c5e1f56ea9cff61aac7f7841744a91Douglas Gregor // Ensure that we have a definition for the base. 2185651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines ImportDefinitionIfNeeded(Base1.getType()->getAsCXXRecordDecl()); 21861cf038c516c5e1f56ea9cff61aac7f7841744a91Douglas Gregor 2187d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor Bases.push_back( 2188d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor new (Importer.getToContext()) 2189651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines CXXBaseSpecifier(Importer.Import(Base1.getSourceRange()), 2190651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines Base1.isVirtual(), 2191651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines Base1.isBaseOfClass(), 2192651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines Base1.getAccessSpecifierAsWritten(), 2193651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines Importer.Import(Base1.getTypeSourceInfo()), 2194f90b27ad077c3339b62befc892382845339f9490Douglas Gregor EllipsisLoc)); 2195d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor } 2196d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor if (!Bases.empty()) 2197d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor ToCXX->setBases(Bases.data(), Bases.size()); 2198d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor } 2199d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor 2200ac32ff9812e7d6bc31573b5499bfd005fc8b8f39Douglas Gregor if (shouldForceImportDeclContext(Kind)) 2201cd0d56a523f877ffd1fe1575caf758b4357f1661Douglas Gregor ImportDeclContext(From, /*ForceImport=*/true); 2202cd0d56a523f877ffd1fe1575caf758b4357f1661Douglas Gregor 2203d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor To->completeDefinition(); 2204c04d9d1be026cb201a716df1cd28a88878958beeDouglas Gregor return false; 2205d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor} 2206d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor 2207ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufobool ASTNodeImporter::ImportDefinition(VarDecl *From, VarDecl *To, 2208ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo ImportDefinitionKind Kind) { 2209b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar if (To->getAnyInitializer()) 2210ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo return false; 2211ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo 2212ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo // FIXME: Can we really import any initializer? Alternatively, we could force 2213ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo // ourselves to import every declaration of a variable and then only use 2214ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo // getInit() here. 2215ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo To->setInit(Importer.Import(const_cast<Expr *>(From->getAnyInitializer()))); 2216ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo 2217ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo // FIXME: Other bits to merge? 2218ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo 2219ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo return false; 2220ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo} 2221ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo 22221cf038c516c5e1f56ea9cff61aac7f7841744a91Douglas Gregorbool ASTNodeImporter::ImportDefinition(EnumDecl *From, EnumDecl *To, 2223ac32ff9812e7d6bc31573b5499bfd005fc8b8f39Douglas Gregor ImportDefinitionKind Kind) { 2224ac32ff9812e7d6bc31573b5499bfd005fc8b8f39Douglas Gregor if (To->getDefinition() || To->isBeingDefined()) { 2225ac32ff9812e7d6bc31573b5499bfd005fc8b8f39Douglas Gregor if (Kind == IDK_Everything) 2226ac32ff9812e7d6bc31573b5499bfd005fc8b8f39Douglas Gregor ImportDeclContext(From, /*ForceImport=*/true); 22271cf038c516c5e1f56ea9cff61aac7f7841744a91Douglas Gregor return false; 2228ac32ff9812e7d6bc31573b5499bfd005fc8b8f39Douglas Gregor } 22291cf038c516c5e1f56ea9cff61aac7f7841744a91Douglas Gregor 22301cf038c516c5e1f56ea9cff61aac7f7841744a91Douglas Gregor To->startDefinition(); 22311cf038c516c5e1f56ea9cff61aac7f7841744a91Douglas Gregor 22321cf038c516c5e1f56ea9cff61aac7f7841744a91Douglas Gregor QualType T = Importer.Import(Importer.getFromContext().getTypeDeclType(From)); 22331cf038c516c5e1f56ea9cff61aac7f7841744a91Douglas Gregor if (T.isNull()) 22341cf038c516c5e1f56ea9cff61aac7f7841744a91Douglas Gregor return true; 22351cf038c516c5e1f56ea9cff61aac7f7841744a91Douglas Gregor 22361cf038c516c5e1f56ea9cff61aac7f7841744a91Douglas Gregor QualType ToPromotionType = Importer.Import(From->getPromotionType()); 22371cf038c516c5e1f56ea9cff61aac7f7841744a91Douglas Gregor if (ToPromotionType.isNull()) 22381cf038c516c5e1f56ea9cff61aac7f7841744a91Douglas Gregor return true; 2239ac32ff9812e7d6bc31573b5499bfd005fc8b8f39Douglas Gregor 2240ac32ff9812e7d6bc31573b5499bfd005fc8b8f39Douglas Gregor if (shouldForceImportDeclContext(Kind)) 2241ac32ff9812e7d6bc31573b5499bfd005fc8b8f39Douglas Gregor ImportDeclContext(From, /*ForceImport=*/true); 22421cf038c516c5e1f56ea9cff61aac7f7841744a91Douglas Gregor 22431cf038c516c5e1f56ea9cff61aac7f7841744a91Douglas Gregor // FIXME: we might need to merge the number of positive or negative bits 22441cf038c516c5e1f56ea9cff61aac7f7841744a91Douglas Gregor // if the enumerator lists don't match. 22451cf038c516c5e1f56ea9cff61aac7f7841744a91Douglas Gregor To->completeDefinition(T, ToPromotionType, 22461cf038c516c5e1f56ea9cff61aac7f7841744a91Douglas Gregor From->getNumPositiveBits(), 22471cf038c516c5e1f56ea9cff61aac7f7841744a91Douglas Gregor From->getNumNegativeBits()); 22481cf038c516c5e1f56ea9cff61aac7f7841744a91Douglas Gregor return false; 22491cf038c516c5e1f56ea9cff61aac7f7841744a91Douglas Gregor} 22501cf038c516c5e1f56ea9cff61aac7f7841744a91Douglas Gregor 2251040afaeea2313dc69fd532995ac88cccdd62da56Douglas GregorTemplateParameterList *ASTNodeImporter::ImportTemplateParameterList( 2252040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor TemplateParameterList *Params) { 22535f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner SmallVector<NamedDecl *, 4> ToParams; 2254040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor ToParams.reserve(Params->size()); 2255040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor for (TemplateParameterList::iterator P = Params->begin(), 2256040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor PEnd = Params->end(); 2257040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor P != PEnd; ++P) { 2258040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor Decl *To = Importer.Import(*P); 2259040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor if (!To) 22606bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return nullptr; 22616bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 2262040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor ToParams.push_back(cast<NamedDecl>(To)); 2263040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor } 2264040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor 2265040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor return TemplateParameterList::Create(Importer.getToContext(), 2266040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor Importer.Import(Params->getTemplateLoc()), 2267040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor Importer.Import(Params->getLAngleLoc()), 22684967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar ToParams, 2269040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor Importer.Import(Params->getRAngleLoc())); 2270040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor} 2271040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor 2272d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas GregorTemplateArgument 2273d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas GregorASTNodeImporter::ImportTemplateArgument(const TemplateArgument &From) { 2274d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor switch (From.getKind()) { 2275d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor case TemplateArgument::Null: 2276d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor return TemplateArgument(); 2277d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor 2278d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor case TemplateArgument::Type: { 2279d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor QualType ToType = Importer.Import(From.getAsType()); 2280d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor if (ToType.isNull()) 2281d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor return TemplateArgument(); 2282d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor return TemplateArgument(ToType); 2283d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor } 2284d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor 2285d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor case TemplateArgument::Integral: { 2286d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor QualType ToType = Importer.Import(From.getIntegralType()); 2287d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor if (ToType.isNull()) 2288d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor return TemplateArgument(); 2289855243789cb44799c03f4c7216d3d6308805f549Benjamin Kramer return TemplateArgument(From, ToType); 2290d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor } 2291d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor 2292d7a6b1640e565487d163023a6a2e83f55476ae96Eli Friedman case TemplateArgument::Declaration: { 2293176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines ValueDecl *To = cast_or_null<ValueDecl>(Importer.Import(From.getAsDecl())); 2294176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines QualType ToType = Importer.Import(From.getParamTypeForDecl()); 2295176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines if (!To || ToType.isNull()) 2296176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines return TemplateArgument(); 2297176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines return TemplateArgument(To, ToType); 2298d7a6b1640e565487d163023a6a2e83f55476ae96Eli Friedman } 2299d7a6b1640e565487d163023a6a2e83f55476ae96Eli Friedman 2300d7a6b1640e565487d163023a6a2e83f55476ae96Eli Friedman case TemplateArgument::NullPtr: { 2301d7a6b1640e565487d163023a6a2e83f55476ae96Eli Friedman QualType ToType = Importer.Import(From.getNullPtrType()); 2302d7a6b1640e565487d163023a6a2e83f55476ae96Eli Friedman if (ToType.isNull()) 2303d7a6b1640e565487d163023a6a2e83f55476ae96Eli Friedman return TemplateArgument(); 2304d7a6b1640e565487d163023a6a2e83f55476ae96Eli Friedman return TemplateArgument(ToType, /*isNullPtr*/true); 2305d7a6b1640e565487d163023a6a2e83f55476ae96Eli Friedman } 2306d7a6b1640e565487d163023a6a2e83f55476ae96Eli Friedman 2307d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor case TemplateArgument::Template: { 2308d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor TemplateName ToTemplate = Importer.Import(From.getAsTemplate()); 2309d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor if (ToTemplate.isNull()) 2310d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor return TemplateArgument(); 2311d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor 2312d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor return TemplateArgument(ToTemplate); 2313d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor } 2314a7fc901a2e39bfe55bfcff5934b2d9fdf9656491Douglas Gregor 2315a7fc901a2e39bfe55bfcff5934b2d9fdf9656491Douglas Gregor case TemplateArgument::TemplateExpansion: { 2316a7fc901a2e39bfe55bfcff5934b2d9fdf9656491Douglas Gregor TemplateName ToTemplate 2317a7fc901a2e39bfe55bfcff5934b2d9fdf9656491Douglas Gregor = Importer.Import(From.getAsTemplateOrTemplatePattern()); 2318a7fc901a2e39bfe55bfcff5934b2d9fdf9656491Douglas Gregor if (ToTemplate.isNull()) 2319a7fc901a2e39bfe55bfcff5934b2d9fdf9656491Douglas Gregor return TemplateArgument(); 2320a7fc901a2e39bfe55bfcff5934b2d9fdf9656491Douglas Gregor 23212be29f423acad3bbe39099a78db2805acb5bdf17Douglas Gregor return TemplateArgument(ToTemplate, From.getNumTemplateExpansions()); 2322a7fc901a2e39bfe55bfcff5934b2d9fdf9656491Douglas Gregor } 2323a7fc901a2e39bfe55bfcff5934b2d9fdf9656491Douglas Gregor 2324d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor case TemplateArgument::Expression: 2325d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor if (Expr *ToExpr = Importer.Import(From.getAsExpr())) 2326d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor return TemplateArgument(ToExpr); 2327d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor return TemplateArgument(); 2328d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor 2329d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor case TemplateArgument::Pack: { 23305f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner SmallVector<TemplateArgument, 2> ToPack; 2331d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor ToPack.reserve(From.pack_size()); 2332d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor if (ImportTemplateArguments(From.pack_begin(), From.pack_size(), ToPack)) 2333d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor return TemplateArgument(); 233487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar 233587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar return TemplateArgument( 233687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar llvm::makeArrayRef(ToPack).copy(Importer.getToContext())); 2337d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor } 2338d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor } 2339d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor 2340d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor llvm_unreachable("Invalid template argument kind"); 2341d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor} 2342d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor 2343d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregorbool ASTNodeImporter::ImportTemplateArguments(const TemplateArgument *FromArgs, 2344d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor unsigned NumFromArgs, 23455f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner SmallVectorImpl<TemplateArgument> &ToArgs) { 2346d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor for (unsigned I = 0; I != NumFromArgs; ++I) { 2347d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor TemplateArgument To = ImportTemplateArgument(FromArgs[I]); 2348d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor if (To.isNull() && !FromArgs[I].isNull()) 2349d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor return true; 2350d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor 2351d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor ToArgs.push_back(To); 2352d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor } 2353d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor 2354d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor return false; 2355d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor} 2356d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor 235796a01b4acf76fb8fe1e05341a97a27b39fb0b914Douglas Gregorbool ASTNodeImporter::IsStructuralMatch(RecordDecl *FromRecord, 235893ed7cf05f900b9150dcf59c0e0f37f3bd325f62Douglas Gregor RecordDecl *ToRecord, bool Complain) { 23598f2cb42e1aa5dbdd6fa651a5da7ab8a3a0d4deceSean Callanan // Eliminate a potential failure point where we attempt to re-import 23608f2cb42e1aa5dbdd6fa651a5da7ab8a3a0d4deceSean Callanan // something we're trying to import while completing ToRecord. 23618f2cb42e1aa5dbdd6fa651a5da7ab8a3a0d4deceSean Callanan Decl *ToOrigin = Importer.GetOriginalDecl(ToRecord); 23628f2cb42e1aa5dbdd6fa651a5da7ab8a3a0d4deceSean Callanan if (ToOrigin) { 23638f2cb42e1aa5dbdd6fa651a5da7ab8a3a0d4deceSean Callanan RecordDecl *ToOriginRecord = dyn_cast<RecordDecl>(ToOrigin); 23648f2cb42e1aa5dbdd6fa651a5da7ab8a3a0d4deceSean Callanan if (ToOriginRecord) 23658f2cb42e1aa5dbdd6fa651a5da7ab8a3a0d4deceSean Callanan ToRecord = ToOriginRecord; 23668f2cb42e1aa5dbdd6fa651a5da7ab8a3a0d4deceSean Callanan } 23678f2cb42e1aa5dbdd6fa651a5da7ab8a3a0d4deceSean Callanan 2368bb2d176c4f434e9e73f63f2f9d128f63ce3e10d0Benjamin Kramer StructuralEquivalenceContext Ctx(Importer.getFromContext(), 23698f2cb42e1aa5dbdd6fa651a5da7ab8a3a0d4deceSean Callanan ToRecord->getASTContext(), 237093ed7cf05f900b9150dcf59c0e0f37f3bd325f62Douglas Gregor Importer.getNonEquivalentDecls(), 237193ed7cf05f900b9150dcf59c0e0f37f3bd325f62Douglas Gregor false, Complain); 2372bb2d176c4f434e9e73f63f2f9d128f63ce3e10d0Benjamin Kramer return Ctx.IsStructurallyEquivalent(FromRecord, ToRecord); 237396a01b4acf76fb8fe1e05341a97a27b39fb0b914Douglas Gregor} 237496a01b4acf76fb8fe1e05341a97a27b39fb0b914Douglas Gregor 2375ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufobool ASTNodeImporter::IsStructuralMatch(VarDecl *FromVar, VarDecl *ToVar, 2376ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo bool Complain) { 2377ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo StructuralEquivalenceContext Ctx( 2378ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo Importer.getFromContext(), Importer.getToContext(), 2379ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo Importer.getNonEquivalentDecls(), false, Complain); 2380ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo return Ctx.IsStructurallyEquivalent(FromVar, ToVar); 2381ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo} 2382ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo 238336ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas Gregorbool ASTNodeImporter::IsStructuralMatch(EnumDecl *FromEnum, EnumDecl *ToEnum) { 2384bb2d176c4f434e9e73f63f2f9d128f63ce3e10d0Benjamin Kramer StructuralEquivalenceContext Ctx(Importer.getFromContext(), 238573dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor Importer.getToContext(), 2386ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor Importer.getNonEquivalentDecls()); 2387bb2d176c4f434e9e73f63f2f9d128f63ce3e10d0Benjamin Kramer return Ctx.IsStructurallyEquivalent(FromEnum, ToEnum); 238836ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas Gregor} 238936ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas Gregor 23901cef45955d87dde48c78b6878dc0ee67a3404b6cDouglas Gregorbool ASTNodeImporter::IsStructuralMatch(EnumConstantDecl *FromEC, 23911cef45955d87dde48c78b6878dc0ee67a3404b6cDouglas Gregor EnumConstantDecl *ToEC) 23921cef45955d87dde48c78b6878dc0ee67a3404b6cDouglas Gregor{ 23931cef45955d87dde48c78b6878dc0ee67a3404b6cDouglas Gregor const llvm::APSInt &FromVal = FromEC->getInitVal(); 23941cef45955d87dde48c78b6878dc0ee67a3404b6cDouglas Gregor const llvm::APSInt &ToVal = ToEC->getInitVal(); 23951cef45955d87dde48c78b6878dc0ee67a3404b6cDouglas Gregor 23961cef45955d87dde48c78b6878dc0ee67a3404b6cDouglas Gregor return FromVal.isSigned() == ToVal.isSigned() && 23971cef45955d87dde48c78b6878dc0ee67a3404b6cDouglas Gregor FromVal.getBitWidth() == ToVal.getBitWidth() && 23981cef45955d87dde48c78b6878dc0ee67a3404b6cDouglas Gregor FromVal == ToVal; 23991cef45955d87dde48c78b6878dc0ee67a3404b6cDouglas Gregor} 24001cef45955d87dde48c78b6878dc0ee67a3404b6cDouglas Gregor 24011cef45955d87dde48c78b6878dc0ee67a3404b6cDouglas Gregorbool ASTNodeImporter::IsStructuralMatch(ClassTemplateDecl *From, 2402040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor ClassTemplateDecl *To) { 2403040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor StructuralEquivalenceContext Ctx(Importer.getFromContext(), 2404040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor Importer.getToContext(), 2405040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor Importer.getNonEquivalentDecls()); 2406040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor return Ctx.IsStructurallyEquivalent(From, To); 2407040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor} 2408040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor 2409ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufobool ASTNodeImporter::IsStructuralMatch(VarTemplateDecl *From, 2410ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo VarTemplateDecl *To) { 2411ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo StructuralEquivalenceContext Ctx(Importer.getFromContext(), 2412ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo Importer.getToContext(), 2413ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo Importer.getNonEquivalentDecls()); 2414ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo return Ctx.IsStructurallyEquivalent(From, To); 2415ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo} 2416ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo 2417a404ea673cbee5e74af710a5f1ab571e71580b67Douglas GregorDecl *ASTNodeImporter::VisitDecl(Decl *D) { 2418a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor Importer.FromDiag(D->getLocation(), diag::err_unsupported_ast_node) 2419a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor << D->getDeclKindName(); 24206bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return nullptr; 2421a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor} 2422a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor 2423f1b69466146cda83936fae66839c446602e05133Sean CallananDecl *ASTNodeImporter::VisitTranslationUnitDecl(TranslationUnitDecl *D) { 2424f1b69466146cda83936fae66839c446602e05133Sean Callanan TranslationUnitDecl *ToD = 2425f1b69466146cda83936fae66839c446602e05133Sean Callanan Importer.getToContext().getTranslationUnitDecl(); 2426f1b69466146cda83936fae66839c446602e05133Sean Callanan 2427f1b69466146cda83936fae66839c446602e05133Sean Callanan Importer.Imported(D, ToD); 2428f1b69466146cda83936fae66839c446602e05133Sean Callanan 2429f1b69466146cda83936fae66839c446602e05133Sean Callanan return ToD; 2430f1b69466146cda83936fae66839c446602e05133Sean Callanan} 2431f1b69466146cda83936fae66839c446602e05133Sean Callanan 24324967a710c84587c654b56c828382219c3937dacbPirama Arumuga NainarDecl *ASTNodeImporter::VisitAccessSpecDecl(AccessSpecDecl *D) { 24334967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar 24344967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar SourceLocation Loc = Importer.Import(D->getLocation()); 24354967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar SourceLocation ColonLoc = Importer.Import(D->getColonLoc()); 24364967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar 24374967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar // Import the context of this declaration. 24384967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar DeclContext *DC = Importer.ImportContext(D->getDeclContext()); 24394967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar if (!DC) 24404967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar return nullptr; 24414967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar 24424967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar AccessSpecDecl *accessSpecDecl 24434967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar = AccessSpecDecl::Create(Importer.getToContext(), D->getAccess(), 24444967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar DC, Loc, ColonLoc); 24454967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar 24464967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar if (!accessSpecDecl) 24474967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar return nullptr; 24484967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar 24494967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar // Lexical DeclContext and Semantic DeclContext 24504967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar // is always the same for the accessSpec. 24514967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar accessSpecDecl->setLexicalDeclContext(DC); 24524967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar DC->addDeclInternal(accessSpecDecl); 24534967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar 24544967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar return accessSpecDecl; 24554967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar} 24564967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar 2457788c62d1e87bfb596078817237f672a5f000999aDouglas GregorDecl *ASTNodeImporter::VisitNamespaceDecl(NamespaceDecl *D) { 2458788c62d1e87bfb596078817237f672a5f000999aDouglas Gregor // Import the major distinguishing characteristics of this namespace. 2459788c62d1e87bfb596078817237f672a5f000999aDouglas Gregor DeclContext *DC, *LexicalDC; 2460788c62d1e87bfb596078817237f672a5f000999aDouglas Gregor DeclarationName Name; 2461788c62d1e87bfb596078817237f672a5f000999aDouglas Gregor SourceLocation Loc; 2462b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar NamedDecl *ToD; 2463b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar if (ImportDeclParts(D, DC, LexicalDC, Name, ToD, Loc)) 24646bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return nullptr; 2465b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar if (ToD) 2466b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar return ToD; 24676bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 24686bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines NamespaceDecl *MergeWithNamespace = nullptr; 2469788c62d1e87bfb596078817237f672a5f000999aDouglas Gregor if (!Name) { 2470788c62d1e87bfb596078817237f672a5f000999aDouglas Gregor // This is an anonymous namespace. Adopt an existing anonymous 2471788c62d1e87bfb596078817237f672a5f000999aDouglas Gregor // namespace if we can. 2472788c62d1e87bfb596078817237f672a5f000999aDouglas Gregor // FIXME: Not testable. 2473788c62d1e87bfb596078817237f672a5f000999aDouglas Gregor if (TranslationUnitDecl *TU = dyn_cast<TranslationUnitDecl>(DC)) 2474788c62d1e87bfb596078817237f672a5f000999aDouglas Gregor MergeWithNamespace = TU->getAnonymousNamespace(); 2475788c62d1e87bfb596078817237f672a5f000999aDouglas Gregor else 2476788c62d1e87bfb596078817237f672a5f000999aDouglas Gregor MergeWithNamespace = cast<NamespaceDecl>(DC)->getAnonymousNamespace(); 2477788c62d1e87bfb596078817237f672a5f000999aDouglas Gregor } else { 24785f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner SmallVector<NamedDecl *, 4> ConflictingDecls; 2479cfa88f893915ceb8ae4ce2f17c46c24a4d67502fDmitri Gribenko SmallVector<NamedDecl *, 2> FoundDecls; 24800e2c34f92f00628d48968dfea096d36381f494cbStephen Hines DC->getRedeclContext()->localUncachedLookup(Name, FoundDecls); 2481b75a3451bcae1301875282e73a13934c90b6574cDouglas Gregor for (unsigned I = 0, N = FoundDecls.size(); I != N; ++I) { 2482b75a3451bcae1301875282e73a13934c90b6574cDouglas Gregor if (!FoundDecls[I]->isInIdentifierNamespace(Decl::IDNS_Namespace)) 2483788c62d1e87bfb596078817237f672a5f000999aDouglas Gregor continue; 2484788c62d1e87bfb596078817237f672a5f000999aDouglas Gregor 2485b75a3451bcae1301875282e73a13934c90b6574cDouglas Gregor if (NamespaceDecl *FoundNS = dyn_cast<NamespaceDecl>(FoundDecls[I])) { 2486788c62d1e87bfb596078817237f672a5f000999aDouglas Gregor MergeWithNamespace = FoundNS; 2487788c62d1e87bfb596078817237f672a5f000999aDouglas Gregor ConflictingDecls.clear(); 2488788c62d1e87bfb596078817237f672a5f000999aDouglas Gregor break; 2489788c62d1e87bfb596078817237f672a5f000999aDouglas Gregor } 2490788c62d1e87bfb596078817237f672a5f000999aDouglas Gregor 2491b75a3451bcae1301875282e73a13934c90b6574cDouglas Gregor ConflictingDecls.push_back(FoundDecls[I]); 2492788c62d1e87bfb596078817237f672a5f000999aDouglas Gregor } 2493788c62d1e87bfb596078817237f672a5f000999aDouglas Gregor 2494788c62d1e87bfb596078817237f672a5f000999aDouglas Gregor if (!ConflictingDecls.empty()) { 24950d6b1640eb4d1a4a0203235cfdfcdaf3335af36dJohn McCall Name = Importer.HandleNameConflict(Name, DC, Decl::IDNS_Namespace, 2496788c62d1e87bfb596078817237f672a5f000999aDouglas Gregor ConflictingDecls.data(), 2497788c62d1e87bfb596078817237f672a5f000999aDouglas Gregor ConflictingDecls.size()); 2498788c62d1e87bfb596078817237f672a5f000999aDouglas Gregor } 2499788c62d1e87bfb596078817237f672a5f000999aDouglas Gregor } 2500788c62d1e87bfb596078817237f672a5f000999aDouglas Gregor 2501788c62d1e87bfb596078817237f672a5f000999aDouglas Gregor // Create the "to" namespace, if needed. 2502788c62d1e87bfb596078817237f672a5f000999aDouglas Gregor NamespaceDecl *ToNamespace = MergeWithNamespace; 2503788c62d1e87bfb596078817237f672a5f000999aDouglas Gregor if (!ToNamespace) { 2504acba90f30876b4140b738f0d3dd0e50724053a96Abramo Bagnara ToNamespace = NamespaceDecl::Create(Importer.getToContext(), DC, 2505f5c9f9fd6f5e2850b9b0f19283430245b696c6e5Douglas Gregor D->isInline(), 2506acba90f30876b4140b738f0d3dd0e50724053a96Abramo Bagnara Importer.Import(D->getLocStart()), 2507f5c9f9fd6f5e2850b9b0f19283430245b696c6e5Douglas Gregor Loc, Name.getAsIdentifierInfo(), 25086bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines /*PrevDecl=*/nullptr); 2509788c62d1e87bfb596078817237f672a5f000999aDouglas Gregor ToNamespace->setLexicalDeclContext(LexicalDC); 25109faf810f08132aabb34a478297dfeea89c3bbe17Sean Callanan LexicalDC->addDeclInternal(ToNamespace); 2511788c62d1e87bfb596078817237f672a5f000999aDouglas Gregor 2512788c62d1e87bfb596078817237f672a5f000999aDouglas Gregor // If this is an anonymous namespace, register it as the anonymous 2513788c62d1e87bfb596078817237f672a5f000999aDouglas Gregor // namespace within its context. 2514788c62d1e87bfb596078817237f672a5f000999aDouglas Gregor if (!Name) { 2515788c62d1e87bfb596078817237f672a5f000999aDouglas Gregor if (TranslationUnitDecl *TU = dyn_cast<TranslationUnitDecl>(DC)) 2516788c62d1e87bfb596078817237f672a5f000999aDouglas Gregor TU->setAnonymousNamespace(ToNamespace); 2517788c62d1e87bfb596078817237f672a5f000999aDouglas Gregor else 2518788c62d1e87bfb596078817237f672a5f000999aDouglas Gregor cast<NamespaceDecl>(DC)->setAnonymousNamespace(ToNamespace); 2519788c62d1e87bfb596078817237f672a5f000999aDouglas Gregor } 2520788c62d1e87bfb596078817237f672a5f000999aDouglas Gregor } 2521788c62d1e87bfb596078817237f672a5f000999aDouglas Gregor Importer.Imported(D, ToNamespace); 2522788c62d1e87bfb596078817237f672a5f000999aDouglas Gregor 2523788c62d1e87bfb596078817237f672a5f000999aDouglas Gregor ImportDeclContext(D); 2524788c62d1e87bfb596078817237f672a5f000999aDouglas Gregor 2525788c62d1e87bfb596078817237f672a5f000999aDouglas Gregor return ToNamespace; 2526788c62d1e87bfb596078817237f672a5f000999aDouglas Gregor} 2527788c62d1e87bfb596078817237f672a5f000999aDouglas Gregor 2528162e1c1b487352434552147967c3dd296ebee2f7Richard SmithDecl *ASTNodeImporter::VisitTypedefNameDecl(TypedefNameDecl *D, bool IsAlias) { 25299e5d996444e40fdf5cce44ee82bec0d4e3df3d56Douglas Gregor // Import the major distinguishing characteristics of this typedef. 25309e5d996444e40fdf5cce44ee82bec0d4e3df3d56Douglas Gregor DeclContext *DC, *LexicalDC; 25319e5d996444e40fdf5cce44ee82bec0d4e3df3d56Douglas Gregor DeclarationName Name; 25329e5d996444e40fdf5cce44ee82bec0d4e3df3d56Douglas Gregor SourceLocation Loc; 2533b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar NamedDecl *ToD; 2534b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar if (ImportDeclParts(D, DC, LexicalDC, Name, ToD, Loc)) 25356bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return nullptr; 2536b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar if (ToD) 2537b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar return ToD; 25386bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 25399e5d996444e40fdf5cce44ee82bec0d4e3df3d56Douglas Gregor // If this typedef is not in block scope, determine whether we've 25409e5d996444e40fdf5cce44ee82bec0d4e3df3d56Douglas Gregor // seen a typedef with the same name (that we can merge with) or any 25419e5d996444e40fdf5cce44ee82bec0d4e3df3d56Douglas Gregor // other entity by that name (which name lookup could conflict with). 25429e5d996444e40fdf5cce44ee82bec0d4e3df3d56Douglas Gregor if (!DC->isFunctionOrMethod()) { 25435f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner SmallVector<NamedDecl *, 4> ConflictingDecls; 25449e5d996444e40fdf5cce44ee82bec0d4e3df3d56Douglas Gregor unsigned IDNS = Decl::IDNS_Ordinary; 2545cfa88f893915ceb8ae4ce2f17c46c24a4d67502fDmitri Gribenko SmallVector<NamedDecl *, 2> FoundDecls; 25460e2c34f92f00628d48968dfea096d36381f494cbStephen Hines DC->getRedeclContext()->localUncachedLookup(Name, FoundDecls); 2547b75a3451bcae1301875282e73a13934c90b6574cDouglas Gregor for (unsigned I = 0, N = FoundDecls.size(); I != N; ++I) { 2548b75a3451bcae1301875282e73a13934c90b6574cDouglas Gregor if (!FoundDecls[I]->isInIdentifierNamespace(IDNS)) 25499e5d996444e40fdf5cce44ee82bec0d4e3df3d56Douglas Gregor continue; 2550162e1c1b487352434552147967c3dd296ebee2f7Richard Smith if (TypedefNameDecl *FoundTypedef = 2551b75a3451bcae1301875282e73a13934c90b6574cDouglas Gregor dyn_cast<TypedefNameDecl>(FoundDecls[I])) { 2552ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor if (Importer.IsStructurallyEquivalent(D->getUnderlyingType(), 2553ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor FoundTypedef->getUnderlyingType())) 25545ce5dab3c30e4255b8f62b148b6a86f09a444aaaDouglas Gregor return Importer.Imported(D, FoundTypedef); 25559e5d996444e40fdf5cce44ee82bec0d4e3df3d56Douglas Gregor } 25569e5d996444e40fdf5cce44ee82bec0d4e3df3d56Douglas Gregor 2557b75a3451bcae1301875282e73a13934c90b6574cDouglas Gregor ConflictingDecls.push_back(FoundDecls[I]); 25589e5d996444e40fdf5cce44ee82bec0d4e3df3d56Douglas Gregor } 25599e5d996444e40fdf5cce44ee82bec0d4e3df3d56Douglas Gregor 25609e5d996444e40fdf5cce44ee82bec0d4e3df3d56Douglas Gregor if (!ConflictingDecls.empty()) { 25619e5d996444e40fdf5cce44ee82bec0d4e3df3d56Douglas Gregor Name = Importer.HandleNameConflict(Name, DC, IDNS, 25629e5d996444e40fdf5cce44ee82bec0d4e3df3d56Douglas Gregor ConflictingDecls.data(), 25639e5d996444e40fdf5cce44ee82bec0d4e3df3d56Douglas Gregor ConflictingDecls.size()); 25649e5d996444e40fdf5cce44ee82bec0d4e3df3d56Douglas Gregor if (!Name) 25656bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return nullptr; 25669e5d996444e40fdf5cce44ee82bec0d4e3df3d56Douglas Gregor } 25679e5d996444e40fdf5cce44ee82bec0d4e3df3d56Douglas Gregor } 25689e5d996444e40fdf5cce44ee82bec0d4e3df3d56Douglas Gregor 2569ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor // Import the underlying type of this typedef; 2570ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor QualType T = Importer.Import(D->getUnderlyingType()); 2571ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor if (T.isNull()) 25726bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return nullptr; 25736bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 25749e5d996444e40fdf5cce44ee82bec0d4e3df3d56Douglas Gregor // Create the new typedef node. 25759e5d996444e40fdf5cce44ee82bec0d4e3df3d56Douglas Gregor TypeSourceInfo *TInfo = Importer.Import(D->getTypeSourceInfo()); 2576344577e6b58f42d18dc8118c8903b49a85dc005eAbramo Bagnara SourceLocation StartL = Importer.Import(D->getLocStart()); 2577162e1c1b487352434552147967c3dd296ebee2f7Richard Smith TypedefNameDecl *ToTypedef; 2578162e1c1b487352434552147967c3dd296ebee2f7Richard Smith if (IsAlias) 25797c9412cdad37146e6d1eee15eaa0d7a1d93e6ee1Douglas Gregor ToTypedef = TypeAliasDecl::Create(Importer.getToContext(), DC, 25807c9412cdad37146e6d1eee15eaa0d7a1d93e6ee1Douglas Gregor StartL, Loc, 25817c9412cdad37146e6d1eee15eaa0d7a1d93e6ee1Douglas Gregor Name.getAsIdentifierInfo(), 25827c9412cdad37146e6d1eee15eaa0d7a1d93e6ee1Douglas Gregor TInfo); 25837c9412cdad37146e6d1eee15eaa0d7a1d93e6ee1Douglas Gregor else 2584162e1c1b487352434552147967c3dd296ebee2f7Richard Smith ToTypedef = TypedefDecl::Create(Importer.getToContext(), DC, 2585162e1c1b487352434552147967c3dd296ebee2f7Richard Smith StartL, Loc, 2586162e1c1b487352434552147967c3dd296ebee2f7Richard Smith Name.getAsIdentifierInfo(), 2587162e1c1b487352434552147967c3dd296ebee2f7Richard Smith TInfo); 25887c9412cdad37146e6d1eee15eaa0d7a1d93e6ee1Douglas Gregor 2589325bf177ac0f1db7888e2d7b194515466ba91762Douglas Gregor ToTypedef->setAccess(D->getAccess()); 25909e5d996444e40fdf5cce44ee82bec0d4e3df3d56Douglas Gregor ToTypedef->setLexicalDeclContext(LexicalDC); 25915ce5dab3c30e4255b8f62b148b6a86f09a444aaaDouglas Gregor Importer.Imported(D, ToTypedef); 25929faf810f08132aabb34a478297dfeea89c3bbe17Sean Callanan LexicalDC->addDeclInternal(ToTypedef); 2593ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor 25949e5d996444e40fdf5cce44ee82bec0d4e3df3d56Douglas Gregor return ToTypedef; 25959e5d996444e40fdf5cce44ee82bec0d4e3df3d56Douglas Gregor} 25969e5d996444e40fdf5cce44ee82bec0d4e3df3d56Douglas Gregor 2597162e1c1b487352434552147967c3dd296ebee2f7Richard SmithDecl *ASTNodeImporter::VisitTypedefDecl(TypedefDecl *D) { 2598162e1c1b487352434552147967c3dd296ebee2f7Richard Smith return VisitTypedefNameDecl(D, /*IsAlias=*/false); 2599162e1c1b487352434552147967c3dd296ebee2f7Richard Smith} 2600162e1c1b487352434552147967c3dd296ebee2f7Richard Smith 2601162e1c1b487352434552147967c3dd296ebee2f7Richard SmithDecl *ASTNodeImporter::VisitTypeAliasDecl(TypeAliasDecl *D) { 2602162e1c1b487352434552147967c3dd296ebee2f7Richard Smith return VisitTypedefNameDecl(D, /*IsAlias=*/true); 2603162e1c1b487352434552147967c3dd296ebee2f7Richard Smith} 2604162e1c1b487352434552147967c3dd296ebee2f7Richard Smith 26054967a710c84587c654b56c828382219c3937dacbPirama Arumuga NainarDecl *ASTNodeImporter::VisitLabelDecl(LabelDecl *D) { 26064967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar // Import the major distinguishing characteristics of this label. 26074967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar DeclContext *DC, *LexicalDC; 26084967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar DeclarationName Name; 26094967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar SourceLocation Loc; 26104967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar NamedDecl *ToD; 26114967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar if (ImportDeclParts(D, DC, LexicalDC, Name, ToD, Loc)) 26124967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar return nullptr; 26134967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar if (ToD) 26144967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar return ToD; 26154967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar 26164967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar assert(LexicalDC->isFunctionOrMethod()); 26174967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar 26184967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar LabelDecl *ToLabel = D->isGnuLocal() 26194967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar ? LabelDecl::Create(Importer.getToContext(), 26204967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar DC, Importer.Import(D->getLocation()), 26214967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Name.getAsIdentifierInfo(), 26224967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Importer.Import(D->getLocStart())) 26234967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar : LabelDecl::Create(Importer.getToContext(), 26244967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar DC, Importer.Import(D->getLocation()), 26254967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Name.getAsIdentifierInfo()); 26264967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Importer.Imported(D, ToLabel); 26274967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar 26284967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar LabelStmt *Label = cast_or_null<LabelStmt>(Importer.Import(D->getStmt())); 26294967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar if (!Label) 26304967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar return nullptr; 26314967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar 26324967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar ToLabel->setStmt(Label); 26334967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar ToLabel->setLexicalDeclContext(LexicalDC); 26344967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar LexicalDC->addDeclInternal(ToLabel); 26354967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar return ToLabel; 26364967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar} 26374967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar 263836ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas GregorDecl *ASTNodeImporter::VisitEnumDecl(EnumDecl *D) { 263936ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas Gregor // Import the major distinguishing characteristics of this enum. 264036ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas Gregor DeclContext *DC, *LexicalDC; 264136ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas Gregor DeclarationName Name; 264236ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas Gregor SourceLocation Loc; 2643b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar NamedDecl *ToD; 2644b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar if (ImportDeclParts(D, DC, LexicalDC, Name, ToD, Loc)) 26456bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return nullptr; 2646b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar if (ToD) 2647b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar return ToD; 26486bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 264936ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas Gregor // Figure out what enum name we're looking for. 265036ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas Gregor unsigned IDNS = Decl::IDNS_Tag; 265136ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas Gregor DeclarationName SearchName = Name; 2652162e1c1b487352434552147967c3dd296ebee2f7Richard Smith if (!SearchName && D->getTypedefNameForAnonDecl()) { 2653162e1c1b487352434552147967c3dd296ebee2f7Richard Smith SearchName = Importer.Import(D->getTypedefNameForAnonDecl()->getDeclName()); 265436ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas Gregor IDNS = Decl::IDNS_Ordinary; 26554e4d08403ca5cfd4d558fa2936215d3a4e5a528dDavid Blaikie } else if (Importer.getToContext().getLangOpts().CPlusPlus) 265636ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas Gregor IDNS |= Decl::IDNS_Ordinary; 265736ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas Gregor 265836ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas Gregor // We may already have an enum of the same name; try to find and match it. 265936ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas Gregor if (!DC->isFunctionOrMethod() && SearchName) { 26605f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner SmallVector<NamedDecl *, 4> ConflictingDecls; 2661cfa88f893915ceb8ae4ce2f17c46c24a4d67502fDmitri Gribenko SmallVector<NamedDecl *, 2> FoundDecls; 26620e2c34f92f00628d48968dfea096d36381f494cbStephen Hines DC->getRedeclContext()->localUncachedLookup(Name, FoundDecls); 2663b75a3451bcae1301875282e73a13934c90b6574cDouglas Gregor for (unsigned I = 0, N = FoundDecls.size(); I != N; ++I) { 2664b75a3451bcae1301875282e73a13934c90b6574cDouglas Gregor if (!FoundDecls[I]->isInIdentifierNamespace(IDNS)) 266536ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas Gregor continue; 266636ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas Gregor 2667b75a3451bcae1301875282e73a13934c90b6574cDouglas Gregor Decl *Found = FoundDecls[I]; 2668162e1c1b487352434552147967c3dd296ebee2f7Richard Smith if (TypedefNameDecl *Typedef = dyn_cast<TypedefNameDecl>(Found)) { 266936ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas Gregor if (const TagType *Tag = Typedef->getUnderlyingType()->getAs<TagType>()) 267036ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas Gregor Found = Tag->getDecl(); 267136ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas Gregor } 267236ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas Gregor 267336ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas Gregor if (EnumDecl *FoundEnum = dyn_cast<EnumDecl>(Found)) { 26745ce5dab3c30e4255b8f62b148b6a86f09a444aaaDouglas Gregor if (IsStructuralMatch(D, FoundEnum)) 26755ce5dab3c30e4255b8f62b148b6a86f09a444aaaDouglas Gregor return Importer.Imported(D, FoundEnum); 267636ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas Gregor } 267736ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas Gregor 2678b75a3451bcae1301875282e73a13934c90b6574cDouglas Gregor ConflictingDecls.push_back(FoundDecls[I]); 267936ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas Gregor } 268036ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas Gregor 268136ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas Gregor if (!ConflictingDecls.empty()) { 268236ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas Gregor Name = Importer.HandleNameConflict(Name, DC, IDNS, 268336ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas Gregor ConflictingDecls.data(), 268436ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas Gregor ConflictingDecls.size()); 268536ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas Gregor } 268636ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas Gregor } 268736ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas Gregor 268836ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas Gregor // Create the enum declaration. 2689ba877adeb49ed6dc17f27fa3a3bcd0cca713fd68Abramo Bagnara EnumDecl *D2 = EnumDecl::Create(Importer.getToContext(), DC, 2690ba877adeb49ed6dc17f27fa3a3bcd0cca713fd68Abramo Bagnara Importer.Import(D->getLocStart()), 26916bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines Loc, Name.getAsIdentifierInfo(), nullptr, 2692a88cefd266c428be33cc06f7e8b00ff8fc97c1ffAbramo Bagnara D->isScoped(), D->isScopedUsingClassTag(), 2693a88cefd266c428be33cc06f7e8b00ff8fc97c1ffAbramo Bagnara D->isFixed()); 2694b6217665c6a987f2d6c8665fd70365d7719ac4dfJohn McCall // Import the qualifier, if any. 2695c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor D2->setQualifierInfo(Importer.Import(D->getQualifierLoc())); 2696325bf177ac0f1db7888e2d7b194515466ba91762Douglas Gregor D2->setAccess(D->getAccess()); 269773dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor D2->setLexicalDeclContext(LexicalDC); 269873dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor Importer.Imported(D, D2); 26999faf810f08132aabb34a478297dfeea89c3bbe17Sean Callanan LexicalDC->addDeclInternal(D2); 270036ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas Gregor 270136ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas Gregor // Import the integer type. 270236ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas Gregor QualType ToIntegerType = Importer.Import(D->getIntegerType()); 270336ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas Gregor if (ToIntegerType.isNull()) 27046bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return nullptr; 270573dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor D2->setIntegerType(ToIntegerType); 270636ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas Gregor 270736ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas Gregor // Import the definition 27085e1cdac63c3d9c9b32fa41fa0b2d242a58a20d49John McCall if (D->isCompleteDefinition() && ImportDefinition(D, D2)) 27096bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return nullptr; 271036ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas Gregor 271173dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor return D2; 271236ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas Gregor} 271336ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas Gregor 271496a01b4acf76fb8fe1e05341a97a27b39fb0b914Douglas GregorDecl *ASTNodeImporter::VisitRecordDecl(RecordDecl *D) { 271596a01b4acf76fb8fe1e05341a97a27b39fb0b914Douglas Gregor // If this record has a definition in the translation unit we're coming from, 271696a01b4acf76fb8fe1e05341a97a27b39fb0b914Douglas Gregor // but this particular declaration is not that definition, import the 271796a01b4acf76fb8fe1e05341a97a27b39fb0b914Douglas Gregor // definition and map to that. 2718952b017601f9c82b51119c3a1600f1312a833db9Douglas Gregor TagDecl *Definition = D->getDefinition(); 271996a01b4acf76fb8fe1e05341a97a27b39fb0b914Douglas Gregor if (Definition && Definition != D) { 272096a01b4acf76fb8fe1e05341a97a27b39fb0b914Douglas Gregor Decl *ImportedDef = Importer.Import(Definition); 27215ce5dab3c30e4255b8f62b148b6a86f09a444aaaDouglas Gregor if (!ImportedDef) 27226bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return nullptr; 27236bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 27245ce5dab3c30e4255b8f62b148b6a86f09a444aaaDouglas Gregor return Importer.Imported(D, ImportedDef); 272596a01b4acf76fb8fe1e05341a97a27b39fb0b914Douglas Gregor } 272696a01b4acf76fb8fe1e05341a97a27b39fb0b914Douglas Gregor 272796a01b4acf76fb8fe1e05341a97a27b39fb0b914Douglas Gregor // Import the major distinguishing characteristics of this record. 272896a01b4acf76fb8fe1e05341a97a27b39fb0b914Douglas Gregor DeclContext *DC, *LexicalDC; 272996a01b4acf76fb8fe1e05341a97a27b39fb0b914Douglas Gregor DeclarationName Name; 273096a01b4acf76fb8fe1e05341a97a27b39fb0b914Douglas Gregor SourceLocation Loc; 2731b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar NamedDecl *ToD; 2732b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar if (ImportDeclParts(D, DC, LexicalDC, Name, ToD, Loc)) 27336bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return nullptr; 2734b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar if (ToD) 2735b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar return ToD; 27366bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 273796a01b4acf76fb8fe1e05341a97a27b39fb0b914Douglas Gregor // Figure out what structure name we're looking for. 273896a01b4acf76fb8fe1e05341a97a27b39fb0b914Douglas Gregor unsigned IDNS = Decl::IDNS_Tag; 273996a01b4acf76fb8fe1e05341a97a27b39fb0b914Douglas Gregor DeclarationName SearchName = Name; 2740162e1c1b487352434552147967c3dd296ebee2f7Richard Smith if (!SearchName && D->getTypedefNameForAnonDecl()) { 2741162e1c1b487352434552147967c3dd296ebee2f7Richard Smith SearchName = Importer.Import(D->getTypedefNameForAnonDecl()->getDeclName()); 274296a01b4acf76fb8fe1e05341a97a27b39fb0b914Douglas Gregor IDNS = Decl::IDNS_Ordinary; 27434e4d08403ca5cfd4d558fa2936215d3a4e5a528dDavid Blaikie } else if (Importer.getToContext().getLangOpts().CPlusPlus) 274496a01b4acf76fb8fe1e05341a97a27b39fb0b914Douglas Gregor IDNS |= Decl::IDNS_Ordinary; 274596a01b4acf76fb8fe1e05341a97a27b39fb0b914Douglas Gregor 274696a01b4acf76fb8fe1e05341a97a27b39fb0b914Douglas Gregor // We may already have a record of the same name; try to find and match it. 27476bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines RecordDecl *AdoptDecl = nullptr; 274893ed7cf05f900b9150dcf59c0e0f37f3bd325f62Douglas Gregor if (!DC->isFunctionOrMethod()) { 27495f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner SmallVector<NamedDecl *, 4> ConflictingDecls; 2750cfa88f893915ceb8ae4ce2f17c46c24a4d67502fDmitri Gribenko SmallVector<NamedDecl *, 2> FoundDecls; 27510e2c34f92f00628d48968dfea096d36381f494cbStephen Hines DC->getRedeclContext()->localUncachedLookup(Name, FoundDecls); 2752b75a3451bcae1301875282e73a13934c90b6574cDouglas Gregor for (unsigned I = 0, N = FoundDecls.size(); I != N; ++I) { 2753b75a3451bcae1301875282e73a13934c90b6574cDouglas Gregor if (!FoundDecls[I]->isInIdentifierNamespace(IDNS)) 275496a01b4acf76fb8fe1e05341a97a27b39fb0b914Douglas Gregor continue; 275596a01b4acf76fb8fe1e05341a97a27b39fb0b914Douglas Gregor 2756b75a3451bcae1301875282e73a13934c90b6574cDouglas Gregor Decl *Found = FoundDecls[I]; 2757162e1c1b487352434552147967c3dd296ebee2f7Richard Smith if (TypedefNameDecl *Typedef = dyn_cast<TypedefNameDecl>(Found)) { 275896a01b4acf76fb8fe1e05341a97a27b39fb0b914Douglas Gregor if (const TagType *Tag = Typedef->getUnderlyingType()->getAs<TagType>()) 275996a01b4acf76fb8fe1e05341a97a27b39fb0b914Douglas Gregor Found = Tag->getDecl(); 276096a01b4acf76fb8fe1e05341a97a27b39fb0b914Douglas Gregor } 276196a01b4acf76fb8fe1e05341a97a27b39fb0b914Douglas Gregor 276296a01b4acf76fb8fe1e05341a97a27b39fb0b914Douglas Gregor if (RecordDecl *FoundRecord = dyn_cast<RecordDecl>(Found)) { 276311ce5fe7d8dda29f3d093e5759a7476b140e3241Douglas Gregor if (D->isAnonymousStructOrUnion() && 276411ce5fe7d8dda29f3d093e5759a7476b140e3241Douglas Gregor FoundRecord->isAnonymousStructOrUnion()) { 276511ce5fe7d8dda29f3d093e5759a7476b140e3241Douglas Gregor // If both anonymous structs/unions are in a record context, make sure 276611ce5fe7d8dda29f3d093e5759a7476b140e3241Douglas Gregor // they occur in the same location in the context records. 2767dc84cd5efdd3430efb22546b4ac656aa0540b210David Blaikie if (Optional<unsigned> Index1 27684967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar = findUntaggedStructOrUnionIndex(D)) { 2769dc84cd5efdd3430efb22546b4ac656aa0540b210David Blaikie if (Optional<unsigned> Index2 = 27704967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar findUntaggedStructOrUnionIndex(FoundRecord)) { 277111ce5fe7d8dda29f3d093e5759a7476b140e3241Douglas Gregor if (*Index1 != *Index2) 277211ce5fe7d8dda29f3d093e5759a7476b140e3241Douglas Gregor continue; 277311ce5fe7d8dda29f3d093e5759a7476b140e3241Douglas Gregor } 277411ce5fe7d8dda29f3d093e5759a7476b140e3241Douglas Gregor } 277511ce5fe7d8dda29f3d093e5759a7476b140e3241Douglas Gregor } 277611ce5fe7d8dda29f3d093e5759a7476b140e3241Douglas Gregor 2777e72b5dc556805ea4c91f0ae6d8f8404fc341b687Douglas Gregor if (RecordDecl *FoundDef = FoundRecord->getDefinition()) { 277893ed7cf05f900b9150dcf59c0e0f37f3bd325f62Douglas Gregor if ((SearchName && !D->isCompleteDefinition()) 277993ed7cf05f900b9150dcf59c0e0f37f3bd325f62Douglas Gregor || (D->isCompleteDefinition() && 278093ed7cf05f900b9150dcf59c0e0f37f3bd325f62Douglas Gregor D->isAnonymousStructOrUnion() 278193ed7cf05f900b9150dcf59c0e0f37f3bd325f62Douglas Gregor == FoundDef->isAnonymousStructOrUnion() && 278293ed7cf05f900b9150dcf59c0e0f37f3bd325f62Douglas Gregor IsStructuralMatch(D, FoundDef))) { 2783e72b5dc556805ea4c91f0ae6d8f8404fc341b687Douglas Gregor // The record types structurally match, or the "from" translation 2784e72b5dc556805ea4c91f0ae6d8f8404fc341b687Douglas Gregor // unit only had a forward declaration anyway; call it the same 2785e72b5dc556805ea4c91f0ae6d8f8404fc341b687Douglas Gregor // function. 2786e72b5dc556805ea4c91f0ae6d8f8404fc341b687Douglas Gregor // FIXME: For C++, we should also merge methods here. 27875ce5dab3c30e4255b8f62b148b6a86f09a444aaaDouglas Gregor return Importer.Imported(D, FoundDef); 2788e72b5dc556805ea4c91f0ae6d8f8404fc341b687Douglas Gregor } 278993ed7cf05f900b9150dcf59c0e0f37f3bd325f62Douglas Gregor } else if (!D->isCompleteDefinition()) { 2790e72b5dc556805ea4c91f0ae6d8f8404fc341b687Douglas Gregor // We have a forward declaration of this type, so adopt that forward 2791e72b5dc556805ea4c91f0ae6d8f8404fc341b687Douglas Gregor // declaration rather than building a new one. 2792651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 2793651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // If one or both can be completed from external storage then try one 2794651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // last time to complete and compare them before doing this. 2795651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 2796651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines if (FoundRecord->hasExternalLexicalStorage() && 2797651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines !FoundRecord->isCompleteDefinition()) 2798651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines FoundRecord->getASTContext().getExternalSource()->CompleteType(FoundRecord); 2799651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines if (D->hasExternalLexicalStorage()) 2800651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines D->getASTContext().getExternalSource()->CompleteType(D); 2801651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 2802651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines if (FoundRecord->isCompleteDefinition() && 2803651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines D->isCompleteDefinition() && 2804651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines !IsStructuralMatch(D, FoundRecord)) 2805651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines continue; 2806651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 2807e72b5dc556805ea4c91f0ae6d8f8404fc341b687Douglas Gregor AdoptDecl = FoundRecord; 2808e72b5dc556805ea4c91f0ae6d8f8404fc341b687Douglas Gregor continue; 280993ed7cf05f900b9150dcf59c0e0f37f3bd325f62Douglas Gregor } else if (!SearchName) { 281093ed7cf05f900b9150dcf59c0e0f37f3bd325f62Douglas Gregor continue; 281193ed7cf05f900b9150dcf59c0e0f37f3bd325f62Douglas Gregor } 281296a01b4acf76fb8fe1e05341a97a27b39fb0b914Douglas Gregor } 281396a01b4acf76fb8fe1e05341a97a27b39fb0b914Douglas Gregor 2814b75a3451bcae1301875282e73a13934c90b6574cDouglas Gregor ConflictingDecls.push_back(FoundDecls[I]); 281596a01b4acf76fb8fe1e05341a97a27b39fb0b914Douglas Gregor } 281696a01b4acf76fb8fe1e05341a97a27b39fb0b914Douglas Gregor 281793ed7cf05f900b9150dcf59c0e0f37f3bd325f62Douglas Gregor if (!ConflictingDecls.empty() && SearchName) { 281896a01b4acf76fb8fe1e05341a97a27b39fb0b914Douglas Gregor Name = Importer.HandleNameConflict(Name, DC, IDNS, 281996a01b4acf76fb8fe1e05341a97a27b39fb0b914Douglas Gregor ConflictingDecls.data(), 282096a01b4acf76fb8fe1e05341a97a27b39fb0b914Douglas Gregor ConflictingDecls.size()); 282196a01b4acf76fb8fe1e05341a97a27b39fb0b914Douglas Gregor } 282296a01b4acf76fb8fe1e05341a97a27b39fb0b914Douglas Gregor } 282396a01b4acf76fb8fe1e05341a97a27b39fb0b914Douglas Gregor 282496a01b4acf76fb8fe1e05341a97a27b39fb0b914Douglas Gregor // Create the record declaration. 282573dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor RecordDecl *D2 = AdoptDecl; 2826ba877adeb49ed6dc17f27fa3a3bcd0cca713fd68Abramo Bagnara SourceLocation StartLoc = Importer.Import(D->getLocStart()); 282773dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor if (!D2) { 28284967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar CXXRecordDecl *D2CXX = nullptr; 28294967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar if (CXXRecordDecl *DCXX = llvm::dyn_cast<CXXRecordDecl>(D)) { 28304967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar if (DCXX->isLambda()) { 28314967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar TypeSourceInfo *TInfo = Importer.Import(DCXX->getLambdaTypeInfo()); 28324967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar D2CXX = CXXRecordDecl::CreateLambda(Importer.getToContext(), 28334967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar DC, TInfo, Loc, 28344967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar DCXX->isDependentLambda(), 28354967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar DCXX->isGenericLambda(), 28364967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar DCXX->getLambdaCaptureDefault()); 28374967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Decl *CDecl = Importer.Import(DCXX->getLambdaContextDecl()); 28384967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar if (DCXX->getLambdaContextDecl() && !CDecl) 28394967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar return nullptr; 28404967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar D2CXX->setLambdaMangling(DCXX->getLambdaManglingNumber(), CDecl); 28414967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar } else if (DCXX->isInjectedClassName()) { 28424967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar // We have to be careful to do a similar dance to the one in 28434967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar // Sema::ActOnStartCXXMemberDeclarations 28444967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar CXXRecordDecl *const PrevDecl = nullptr; 28454967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar const bool DelayTypeCreation = true; 28464967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar D2CXX = CXXRecordDecl::Create( 28474967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Importer.getToContext(), D->getTagKind(), DC, StartLoc, Loc, 28484967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Name.getAsIdentifierInfo(), PrevDecl, DelayTypeCreation); 28494967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Importer.getToContext().getTypeDeclType( 28504967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar D2CXX, llvm::dyn_cast<CXXRecordDecl>(DC)); 28514967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar } else { 28524967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar D2CXX = CXXRecordDecl::Create(Importer.getToContext(), 28534967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar D->getTagKind(), 28544967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar DC, StartLoc, Loc, 28554967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Name.getAsIdentifierInfo()); 28564967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar } 285773dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor D2 = D2CXX; 2858325bf177ac0f1db7888e2d7b194515466ba91762Douglas Gregor D2->setAccess(D->getAccess()); 2859e72b5dc556805ea4c91f0ae6d8f8404fc341b687Douglas Gregor } else { 286073dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor D2 = RecordDecl::Create(Importer.getToContext(), D->getTagKind(), 2861ba877adeb49ed6dc17f27fa3a3bcd0cca713fd68Abramo Bagnara DC, StartLoc, Loc, Name.getAsIdentifierInfo()); 286296a01b4acf76fb8fe1e05341a97a27b39fb0b914Douglas Gregor } 2863c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor 2864c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor D2->setQualifierInfo(Importer.Import(D->getQualifierLoc())); 286573dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor D2->setLexicalDeclContext(LexicalDC); 28669faf810f08132aabb34a478297dfeea89c3bbe17Sean Callanan LexicalDC->addDeclInternal(D2); 286793ed7cf05f900b9150dcf59c0e0f37f3bd325f62Douglas Gregor if (D->isAnonymousStructOrUnion()) 286893ed7cf05f900b9150dcf59c0e0f37f3bd325f62Douglas Gregor D2->setAnonymousStructOrUnion(true); 286996a01b4acf76fb8fe1e05341a97a27b39fb0b914Douglas Gregor } 28705ce5dab3c30e4255b8f62b148b6a86f09a444aaaDouglas Gregor 287173dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor Importer.Imported(D, D2); 2872e72b5dc556805ea4c91f0ae6d8f8404fc341b687Douglas Gregor 2873cd0d56a523f877ffd1fe1575caf758b4357f1661Douglas Gregor if (D->isCompleteDefinition() && ImportDefinition(D, D2, IDK_Default)) 28746bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return nullptr; 28756bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 287673dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor return D2; 287796a01b4acf76fb8fe1e05341a97a27b39fb0b914Douglas Gregor} 287896a01b4acf76fb8fe1e05341a97a27b39fb0b914Douglas Gregor 287936ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas GregorDecl *ASTNodeImporter::VisitEnumConstantDecl(EnumConstantDecl *D) { 288036ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas Gregor // Import the major distinguishing characteristics of this enumerator. 288136ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas Gregor DeclContext *DC, *LexicalDC; 288236ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas Gregor DeclarationName Name; 288336ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas Gregor SourceLocation Loc; 2884b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar NamedDecl *ToD; 2885b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar if (ImportDeclParts(D, DC, LexicalDC, Name, ToD, Loc)) 28866bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return nullptr; 2887b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar if (ToD) 2888b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar return ToD; 2889ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor 2890ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor QualType T = Importer.Import(D->getType()); 2891ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor if (T.isNull()) 28926bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return nullptr; 2893ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor 289436ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas Gregor // Determine whether there are any other declarations with the same name and 289536ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas Gregor // in the same context. 289636ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas Gregor if (!LexicalDC->isFunctionOrMethod()) { 28975f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner SmallVector<NamedDecl *, 4> ConflictingDecls; 289836ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas Gregor unsigned IDNS = Decl::IDNS_Ordinary; 2899cfa88f893915ceb8ae4ce2f17c46c24a4d67502fDmitri Gribenko SmallVector<NamedDecl *, 2> FoundDecls; 29000e2c34f92f00628d48968dfea096d36381f494cbStephen Hines DC->getRedeclContext()->localUncachedLookup(Name, FoundDecls); 2901b75a3451bcae1301875282e73a13934c90b6574cDouglas Gregor for (unsigned I = 0, N = FoundDecls.size(); I != N; ++I) { 2902b75a3451bcae1301875282e73a13934c90b6574cDouglas Gregor if (!FoundDecls[I]->isInIdentifierNamespace(IDNS)) 290336ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas Gregor continue; 29041cef45955d87dde48c78b6878dc0ee67a3404b6cDouglas Gregor 29051cef45955d87dde48c78b6878dc0ee67a3404b6cDouglas Gregor if (EnumConstantDecl *FoundEnumConstant 29061cef45955d87dde48c78b6878dc0ee67a3404b6cDouglas Gregor = dyn_cast<EnumConstantDecl>(FoundDecls[I])) { 29071cef45955d87dde48c78b6878dc0ee67a3404b6cDouglas Gregor if (IsStructuralMatch(D, FoundEnumConstant)) 29081cef45955d87dde48c78b6878dc0ee67a3404b6cDouglas Gregor return Importer.Imported(D, FoundEnumConstant); 29091cef45955d87dde48c78b6878dc0ee67a3404b6cDouglas Gregor } 29101cef45955d87dde48c78b6878dc0ee67a3404b6cDouglas Gregor 2911b75a3451bcae1301875282e73a13934c90b6574cDouglas Gregor ConflictingDecls.push_back(FoundDecls[I]); 291236ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas Gregor } 291336ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas Gregor 291436ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas Gregor if (!ConflictingDecls.empty()) { 291536ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas Gregor Name = Importer.HandleNameConflict(Name, DC, IDNS, 291636ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas Gregor ConflictingDecls.data(), 291736ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas Gregor ConflictingDecls.size()); 291836ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas Gregor if (!Name) 29196bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return nullptr; 292036ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas Gregor } 292136ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas Gregor } 292236ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas Gregor 292336ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas Gregor Expr *Init = Importer.Import(D->getInitExpr()); 292436ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas Gregor if (D->getInitExpr() && !Init) 29256bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return nullptr; 29266bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 292736ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas Gregor EnumConstantDecl *ToEnumerator 292836ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas Gregor = EnumConstantDecl::Create(Importer.getToContext(), cast<EnumDecl>(DC), Loc, 292936ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas Gregor Name.getAsIdentifierInfo(), T, 293036ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas Gregor Init, D->getInitVal()); 2931325bf177ac0f1db7888e2d7b194515466ba91762Douglas Gregor ToEnumerator->setAccess(D->getAccess()); 293236ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas Gregor ToEnumerator->setLexicalDeclContext(LexicalDC); 29335ce5dab3c30e4255b8f62b148b6a86f09a444aaaDouglas Gregor Importer.Imported(D, ToEnumerator); 29349faf810f08132aabb34a478297dfeea89c3bbe17Sean Callanan LexicalDC->addDeclInternal(ToEnumerator); 293536ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas Gregor return ToEnumerator; 293636ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas Gregor} 293796a01b4acf76fb8fe1e05341a97a27b39fb0b914Douglas Gregor 2938a404ea673cbee5e74af710a5f1ab571e71580b67Douglas GregorDecl *ASTNodeImporter::VisitFunctionDecl(FunctionDecl *D) { 2939a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor // Import the major distinguishing characteristics of this function. 2940a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor DeclContext *DC, *LexicalDC; 2941a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor DeclarationName Name; 2942a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor SourceLocation Loc; 2943b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar NamedDecl *ToD; 2944b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar if (ImportDeclParts(D, DC, LexicalDC, Name, ToD, Loc)) 29456bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return nullptr; 2946b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar if (ToD) 2947b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar return ToD; 29482577743c5650c646fb705df01403707e94f2df04Abramo Bagnara 2949a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor // Try to find a function in our own ("to") context with the same name, same 2950a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor // type, and in the same context as the function we're importing. 2951a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor if (!LexicalDC->isFunctionOrMethod()) { 29525f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner SmallVector<NamedDecl *, 4> ConflictingDecls; 2953a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor unsigned IDNS = Decl::IDNS_Ordinary; 2954cfa88f893915ceb8ae4ce2f17c46c24a4d67502fDmitri Gribenko SmallVector<NamedDecl *, 2> FoundDecls; 29550e2c34f92f00628d48968dfea096d36381f494cbStephen Hines DC->getRedeclContext()->localUncachedLookup(Name, FoundDecls); 2956b75a3451bcae1301875282e73a13934c90b6574cDouglas Gregor for (unsigned I = 0, N = FoundDecls.size(); I != N; ++I) { 2957b75a3451bcae1301875282e73a13934c90b6574cDouglas Gregor if (!FoundDecls[I]->isInIdentifierNamespace(IDNS)) 2958a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor continue; 2959a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor 2960b75a3451bcae1301875282e73a13934c90b6574cDouglas Gregor if (FunctionDecl *FoundFunction = dyn_cast<FunctionDecl>(FoundDecls[I])) { 2961181e3ecc0907ae0103586a9f4db52241995a8267Rafael Espindola if (FoundFunction->hasExternalFormalLinkage() && 2962181e3ecc0907ae0103586a9f4db52241995a8267Rafael Espindola D->hasExternalFormalLinkage()) { 2963ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor if (Importer.IsStructurallyEquivalent(D->getType(), 2964ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor FoundFunction->getType())) { 2965a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor // FIXME: Actually try to merge the body and other attributes. 29665ce5dab3c30e4255b8f62b148b6a86f09a444aaaDouglas Gregor return Importer.Imported(D, FoundFunction); 2967a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor } 2968a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor 2969a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor // FIXME: Check for overloading more carefully, e.g., by boosting 2970a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor // Sema::IsOverload out to the AST library. 2971a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor 2972a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor // Function overloading is okay in C++. 29734e4d08403ca5cfd4d558fa2936215d3a4e5a528dDavid Blaikie if (Importer.getToContext().getLangOpts().CPlusPlus) 2974a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor continue; 2975a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor 2976a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor // Complain about inconsistent function types. 2977a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor Importer.ToDiag(Loc, diag::err_odr_function_type_inconsistent) 2978ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor << Name << D->getType() << FoundFunction->getType(); 2979a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor Importer.ToDiag(FoundFunction->getLocation(), 2980a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor diag::note_odr_value_here) 2981a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor << FoundFunction->getType(); 2982a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor } 2983a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor } 2984a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor 2985b75a3451bcae1301875282e73a13934c90b6574cDouglas Gregor ConflictingDecls.push_back(FoundDecls[I]); 2986a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor } 2987a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor 2988a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor if (!ConflictingDecls.empty()) { 2989a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor Name = Importer.HandleNameConflict(Name, DC, IDNS, 2990a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor ConflictingDecls.data(), 2991a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor ConflictingDecls.size()); 2992a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor if (!Name) 29936bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return nullptr; 2994a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor } 2995a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor } 2996ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor 29972577743c5650c646fb705df01403707e94f2df04Abramo Bagnara DeclarationNameInfo NameInfo(Name, Loc); 29982577743c5650c646fb705df01403707e94f2df04Abramo Bagnara // Import additional name location/type info. 29992577743c5650c646fb705df01403707e94f2df04Abramo Bagnara ImportDeclarationNameLoc(D->getNameInfo(), NameInfo); 30002577743c5650c646fb705df01403707e94f2df04Abramo Bagnara 3001d498f384d154e154e939a9c764054cd4a8d76819Argyrios Kyrtzidis QualType FromTy = D->getType(); 3002d498f384d154e154e939a9c764054cd4a8d76819Argyrios Kyrtzidis bool usedDifferentExceptionSpec = false; 3003d498f384d154e154e939a9c764054cd4a8d76819Argyrios Kyrtzidis 3004d498f384d154e154e939a9c764054cd4a8d76819Argyrios Kyrtzidis if (const FunctionProtoType * 3005d498f384d154e154e939a9c764054cd4a8d76819Argyrios Kyrtzidis FromFPT = D->getType()->getAs<FunctionProtoType>()) { 3006d498f384d154e154e939a9c764054cd4a8d76819Argyrios Kyrtzidis FunctionProtoType::ExtProtoInfo FromEPI = FromFPT->getExtProtoInfo(); 3007d498f384d154e154e939a9c764054cd4a8d76819Argyrios Kyrtzidis // FunctionProtoType::ExtProtoInfo's ExceptionSpecDecl can point to the 3008d498f384d154e154e939a9c764054cd4a8d76819Argyrios Kyrtzidis // FunctionDecl that we are importing the FunctionProtoType for. 3009d498f384d154e154e939a9c764054cd4a8d76819Argyrios Kyrtzidis // To avoid an infinite recursion when importing, create the FunctionDecl 3010d498f384d154e154e939a9c764054cd4a8d76819Argyrios Kyrtzidis // with a simplified function type and update it afterwards. 3011176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines if (FromEPI.ExceptionSpec.SourceDecl || 3012176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines FromEPI.ExceptionSpec.SourceTemplate || 3013176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines FromEPI.ExceptionSpec.NoexceptExpr) { 3014d498f384d154e154e939a9c764054cd4a8d76819Argyrios Kyrtzidis FunctionProtoType::ExtProtoInfo DefaultEPI; 3015d498f384d154e154e939a9c764054cd4a8d76819Argyrios Kyrtzidis FromTy = Importer.getFromContext().getFunctionType( 3016651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines FromFPT->getReturnType(), FromFPT->getParamTypes(), DefaultEPI); 3017d498f384d154e154e939a9c764054cd4a8d76819Argyrios Kyrtzidis usedDifferentExceptionSpec = true; 3018d498f384d154e154e939a9c764054cd4a8d76819Argyrios Kyrtzidis } 3019d498f384d154e154e939a9c764054cd4a8d76819Argyrios Kyrtzidis } 3020d498f384d154e154e939a9c764054cd4a8d76819Argyrios Kyrtzidis 3021ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor // Import the type. 3022d498f384d154e154e939a9c764054cd4a8d76819Argyrios Kyrtzidis QualType T = Importer.Import(FromTy); 3023ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor if (T.isNull()) 30246bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return nullptr; 30256bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 3026a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor // Import the function parameters. 30275f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner SmallVector<ParmVarDecl *, 8> Parameters; 30284967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar for (auto P : D->parameters()) { 3029651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines ParmVarDecl *ToP = cast_or_null<ParmVarDecl>(Importer.Import(P)); 3030a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor if (!ToP) 30316bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return nullptr; 30326bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 3033a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor Parameters.push_back(ToP); 3034a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor } 3035a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor 3036a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor // Create the imported function. 3037a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor TypeSourceInfo *TInfo = Importer.Import(D->getTypeSourceInfo()); 30386bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines FunctionDecl *ToFunction = nullptr; 3039b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar SourceLocation InnerLocStart = Importer.Import(D->getInnerLocStart()); 3040c144f3534e2f7a70ea9ebf8dd83090a2883d61fbDouglas Gregor if (CXXConstructorDecl *FromConstructor = dyn_cast<CXXConstructorDecl>(D)) { 3041c144f3534e2f7a70ea9ebf8dd83090a2883d61fbDouglas Gregor ToFunction = CXXConstructorDecl::Create(Importer.getToContext(), 3042c144f3534e2f7a70ea9ebf8dd83090a2883d61fbDouglas Gregor cast<CXXRecordDecl>(DC), 3043b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar InnerLocStart, 30442577743c5650c646fb705df01403707e94f2df04Abramo Bagnara NameInfo, T, TInfo, 3045c144f3534e2f7a70ea9ebf8dd83090a2883d61fbDouglas Gregor FromConstructor->isExplicit(), 3046c144f3534e2f7a70ea9ebf8dd83090a2883d61fbDouglas Gregor D->isInlineSpecified(), 3047af1fc7af351758b0ea0d285bdfe5640128109a4eRichard Smith D->isImplicit(), 3048af1fc7af351758b0ea0d285bdfe5640128109a4eRichard Smith D->isConstexpr()); 30494967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar if (unsigned NumInitializers = FromConstructor->getNumCtorInitializers()) { 30504967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar SmallVector<CXXCtorInitializer *, 4> CtorInitializers; 30514967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar for (CXXCtorInitializer *I : FromConstructor->inits()) { 30524967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar CXXCtorInitializer *ToI = 30534967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar cast_or_null<CXXCtorInitializer>(Importer.Import(I)); 30544967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar if (!ToI && I) 30554967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar return nullptr; 30564967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar CtorInitializers.push_back(ToI); 30574967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar } 30584967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar CXXCtorInitializer **Memory = 30594967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar new (Importer.getToContext()) CXXCtorInitializer *[NumInitializers]; 30604967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar std::copy(CtorInitializers.begin(), CtorInitializers.end(), Memory); 30614967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar CXXConstructorDecl *ToCtor = llvm::cast<CXXConstructorDecl>(ToFunction); 30624967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar ToCtor->setCtorInitializers(Memory); 30634967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar ToCtor->setNumCtorInitializers(NumInitializers); 30644967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar } 3065c144f3534e2f7a70ea9ebf8dd83090a2883d61fbDouglas Gregor } else if (isa<CXXDestructorDecl>(D)) { 3066c144f3534e2f7a70ea9ebf8dd83090a2883d61fbDouglas Gregor ToFunction = CXXDestructorDecl::Create(Importer.getToContext(), 3067c144f3534e2f7a70ea9ebf8dd83090a2883d61fbDouglas Gregor cast<CXXRecordDecl>(DC), 3068b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar InnerLocStart, 3069b41d899a6023385c00a61eb9dd3e44db9dc7994eCraig Silverstein NameInfo, T, TInfo, 3070c144f3534e2f7a70ea9ebf8dd83090a2883d61fbDouglas Gregor D->isInlineSpecified(), 3071c144f3534e2f7a70ea9ebf8dd83090a2883d61fbDouglas Gregor D->isImplicit()); 3072c144f3534e2f7a70ea9ebf8dd83090a2883d61fbDouglas Gregor } else if (CXXConversionDecl *FromConversion 3073c144f3534e2f7a70ea9ebf8dd83090a2883d61fbDouglas Gregor = dyn_cast<CXXConversionDecl>(D)) { 3074c144f3534e2f7a70ea9ebf8dd83090a2883d61fbDouglas Gregor ToFunction = CXXConversionDecl::Create(Importer.getToContext(), 3075c144f3534e2f7a70ea9ebf8dd83090a2883d61fbDouglas Gregor cast<CXXRecordDecl>(DC), 3076b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar InnerLocStart, 30772577743c5650c646fb705df01403707e94f2df04Abramo Bagnara NameInfo, T, TInfo, 3078c144f3534e2f7a70ea9ebf8dd83090a2883d61fbDouglas Gregor D->isInlineSpecified(), 3079f52516038ab5d0b1b90a6dd32f46b7d6dabd04c8Douglas Gregor FromConversion->isExplicit(), 3080af1fc7af351758b0ea0d285bdfe5640128109a4eRichard Smith D->isConstexpr(), 3081f52516038ab5d0b1b90a6dd32f46b7d6dabd04c8Douglas Gregor Importer.Import(D->getLocEnd())); 30820629cbe86b6d890076548778ed8597ee298adcbaDouglas Gregor } else if (CXXMethodDecl *Method = dyn_cast<CXXMethodDecl>(D)) { 30830629cbe86b6d890076548778ed8597ee298adcbaDouglas Gregor ToFunction = CXXMethodDecl::Create(Importer.getToContext(), 30840629cbe86b6d890076548778ed8597ee298adcbaDouglas Gregor cast<CXXRecordDecl>(DC), 3085b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar InnerLocStart, 30860629cbe86b6d890076548778ed8597ee298adcbaDouglas Gregor NameInfo, T, TInfo, 3087d2615cc53b916e8aae45783ca7113b93de515ce3Rafael Espindola Method->getStorageClass(), 3088f52516038ab5d0b1b90a6dd32f46b7d6dabd04c8Douglas Gregor Method->isInlineSpecified(), 3089af1fc7af351758b0ea0d285bdfe5640128109a4eRichard Smith D->isConstexpr(), 3090f52516038ab5d0b1b90a6dd32f46b7d6dabd04c8Douglas Gregor Importer.Import(D->getLocEnd())); 3091c144f3534e2f7a70ea9ebf8dd83090a2883d61fbDouglas Gregor } else { 30922577743c5650c646fb705df01403707e94f2df04Abramo Bagnara ToFunction = FunctionDecl::Create(Importer.getToContext(), DC, 3093b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar InnerLocStart, 30942577743c5650c646fb705df01403707e94f2df04Abramo Bagnara NameInfo, T, TInfo, D->getStorageClass(), 3095c144f3534e2f7a70ea9ebf8dd83090a2883d61fbDouglas Gregor D->isInlineSpecified(), 3096af1fc7af351758b0ea0d285bdfe5640128109a4eRichard Smith D->hasWrittenPrototype(), 3097af1fc7af351758b0ea0d285bdfe5640128109a4eRichard Smith D->isConstexpr()); 3098c144f3534e2f7a70ea9ebf8dd83090a2883d61fbDouglas Gregor } 3099b6217665c6a987f2d6c8665fd70365d7719ac4dfJohn McCall 3100b6217665c6a987f2d6c8665fd70365d7719ac4dfJohn McCall // Import the qualifier, if any. 3101c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor ToFunction->setQualifierInfo(Importer.Import(D->getQualifierLoc())); 3102325bf177ac0f1db7888e2d7b194515466ba91762Douglas Gregor ToFunction->setAccess(D->getAccess()); 3103c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor ToFunction->setLexicalDeclContext(LexicalDC); 3104f2eca2cf302c50b79891f24b3861d64ea9263831John McCall ToFunction->setVirtualAsWritten(D->isVirtualAsWritten()); 3105f2eca2cf302c50b79891f24b3861d64ea9263831John McCall ToFunction->setTrivial(D->isTrivial()); 3106f2eca2cf302c50b79891f24b3861d64ea9263831John McCall ToFunction->setPure(D->isPure()); 3107c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor Importer.Imported(D, ToFunction); 3108a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor 3109a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor // Set the parameters. 3110a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor for (unsigned I = 0, N = Parameters.size(); I != N; ++I) { 3111c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor Parameters[I]->setOwningFunction(ToFunction); 31129faf810f08132aabb34a478297dfeea89c3bbe17Sean Callanan ToFunction->addDeclInternal(Parameters[I]); 3113a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor } 31144278c654b645402554eb52a48e9c7097c9f1233aDavid Blaikie ToFunction->setParams(Parameters); 3115a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor 3116d498f384d154e154e939a9c764054cd4a8d76819Argyrios Kyrtzidis if (usedDifferentExceptionSpec) { 3117d498f384d154e154e939a9c764054cd4a8d76819Argyrios Kyrtzidis // Update FunctionProtoType::ExtProtoInfo. 3118d498f384d154e154e939a9c764054cd4a8d76819Argyrios Kyrtzidis QualType T = Importer.Import(D->getType()); 3119d498f384d154e154e939a9c764054cd4a8d76819Argyrios Kyrtzidis if (T.isNull()) 31206bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return nullptr; 3121d498f384d154e154e939a9c764054cd4a8d76819Argyrios Kyrtzidis ToFunction->setType(T); 3122f0fdefc13a58db2a8b32bb47ac23bc16efad6fdaArgyrios Kyrtzidis } 3123f0fdefc13a58db2a8b32bb47ac23bc16efad6fdaArgyrios Kyrtzidis 3124b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar // Import the body, if any. 3125b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar if (Stmt *FromBody = D->getBody()) { 3126b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar if (Stmt *ToBody = Importer.Import(FromBody)) { 3127b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar ToFunction->setBody(ToBody); 3128b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar } 3129b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar } 3130b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar 3131a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor // FIXME: Other bits to merge? 313281134ad7a056e45b7cb4ee1b562ab8c8413d65b7Douglas Gregor 313381134ad7a056e45b7cb4ee1b562ab8c8413d65b7Douglas Gregor // Add this function to the lexical context. 31349faf810f08132aabb34a478297dfeea89c3bbe17Sean Callanan LexicalDC->addDeclInternal(ToFunction); 313581134ad7a056e45b7cb4ee1b562ab8c8413d65b7Douglas Gregor 3136c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor return ToFunction; 3137a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor} 3138a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor 3139c144f3534e2f7a70ea9ebf8dd83090a2883d61fbDouglas GregorDecl *ASTNodeImporter::VisitCXXMethodDecl(CXXMethodDecl *D) { 3140c144f3534e2f7a70ea9ebf8dd83090a2883d61fbDouglas Gregor return VisitFunctionDecl(D); 3141c144f3534e2f7a70ea9ebf8dd83090a2883d61fbDouglas Gregor} 3142c144f3534e2f7a70ea9ebf8dd83090a2883d61fbDouglas Gregor 3143c144f3534e2f7a70ea9ebf8dd83090a2883d61fbDouglas GregorDecl *ASTNodeImporter::VisitCXXConstructorDecl(CXXConstructorDecl *D) { 3144c144f3534e2f7a70ea9ebf8dd83090a2883d61fbDouglas Gregor return VisitCXXMethodDecl(D); 3145c144f3534e2f7a70ea9ebf8dd83090a2883d61fbDouglas Gregor} 3146c144f3534e2f7a70ea9ebf8dd83090a2883d61fbDouglas Gregor 3147c144f3534e2f7a70ea9ebf8dd83090a2883d61fbDouglas GregorDecl *ASTNodeImporter::VisitCXXDestructorDecl(CXXDestructorDecl *D) { 3148c144f3534e2f7a70ea9ebf8dd83090a2883d61fbDouglas Gregor return VisitCXXMethodDecl(D); 3149c144f3534e2f7a70ea9ebf8dd83090a2883d61fbDouglas Gregor} 3150c144f3534e2f7a70ea9ebf8dd83090a2883d61fbDouglas Gregor 3151c144f3534e2f7a70ea9ebf8dd83090a2883d61fbDouglas GregorDecl *ASTNodeImporter::VisitCXXConversionDecl(CXXConversionDecl *D) { 3152c144f3534e2f7a70ea9ebf8dd83090a2883d61fbDouglas Gregor return VisitCXXMethodDecl(D); 3153c144f3534e2f7a70ea9ebf8dd83090a2883d61fbDouglas Gregor} 3154c144f3534e2f7a70ea9ebf8dd83090a2883d61fbDouglas Gregor 315511ce5fe7d8dda29f3d093e5759a7476b140e3241Douglas Gregorstatic unsigned getFieldIndex(Decl *F) { 315611ce5fe7d8dda29f3d093e5759a7476b140e3241Douglas Gregor RecordDecl *Owner = dyn_cast<RecordDecl>(F->getDeclContext()); 315711ce5fe7d8dda29f3d093e5759a7476b140e3241Douglas Gregor if (!Owner) 315811ce5fe7d8dda29f3d093e5759a7476b140e3241Douglas Gregor return 0; 315911ce5fe7d8dda29f3d093e5759a7476b140e3241Douglas Gregor 316011ce5fe7d8dda29f3d093e5759a7476b140e3241Douglas Gregor unsigned Index = 1; 3161651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines for (const auto *D : Owner->noload_decls()) { 3162651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines if (D == F) 316311ce5fe7d8dda29f3d093e5759a7476b140e3241Douglas Gregor return Index; 316411ce5fe7d8dda29f3d093e5759a7476b140e3241Douglas Gregor 316511ce5fe7d8dda29f3d093e5759a7476b140e3241Douglas Gregor if (isa<FieldDecl>(*D) || isa<IndirectFieldDecl>(*D)) 316611ce5fe7d8dda29f3d093e5759a7476b140e3241Douglas Gregor ++Index; 316711ce5fe7d8dda29f3d093e5759a7476b140e3241Douglas Gregor } 316811ce5fe7d8dda29f3d093e5759a7476b140e3241Douglas Gregor 316911ce5fe7d8dda29f3d093e5759a7476b140e3241Douglas Gregor return Index; 317011ce5fe7d8dda29f3d093e5759a7476b140e3241Douglas Gregor} 317111ce5fe7d8dda29f3d093e5759a7476b140e3241Douglas Gregor 317296a01b4acf76fb8fe1e05341a97a27b39fb0b914Douglas GregorDecl *ASTNodeImporter::VisitFieldDecl(FieldDecl *D) { 317396a01b4acf76fb8fe1e05341a97a27b39fb0b914Douglas Gregor // Import the major distinguishing characteristics of a variable. 317496a01b4acf76fb8fe1e05341a97a27b39fb0b914Douglas Gregor DeclContext *DC, *LexicalDC; 317596a01b4acf76fb8fe1e05341a97a27b39fb0b914Douglas Gregor DeclarationName Name; 317696a01b4acf76fb8fe1e05341a97a27b39fb0b914Douglas Gregor SourceLocation Loc; 3177b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar NamedDecl *ToD; 3178b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar if (ImportDeclParts(D, DC, LexicalDC, Name, ToD, Loc)) 31796bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return nullptr; 3180b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar if (ToD) 3181b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar return ToD; 31826bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 31837c9412cdad37146e6d1eee15eaa0d7a1d93e6ee1Douglas Gregor // Determine whether we've already imported this field. 3184cfa88f893915ceb8ae4ce2f17c46c24a4d67502fDmitri Gribenko SmallVector<NamedDecl *, 2> FoundDecls; 31850e2c34f92f00628d48968dfea096d36381f494cbStephen Hines DC->getRedeclContext()->localUncachedLookup(Name, FoundDecls); 3186b75a3451bcae1301875282e73a13934c90b6574cDouglas Gregor for (unsigned I = 0, N = FoundDecls.size(); I != N; ++I) { 3187b75a3451bcae1301875282e73a13934c90b6574cDouglas Gregor if (FieldDecl *FoundField = dyn_cast<FieldDecl>(FoundDecls[I])) { 318811ce5fe7d8dda29f3d093e5759a7476b140e3241Douglas Gregor // For anonymous fields, match up by index. 318911ce5fe7d8dda29f3d093e5759a7476b140e3241Douglas Gregor if (!Name && getFieldIndex(D) != getFieldIndex(FoundField)) 319011ce5fe7d8dda29f3d093e5759a7476b140e3241Douglas Gregor continue; 319111ce5fe7d8dda29f3d093e5759a7476b140e3241Douglas Gregor 31927c9412cdad37146e6d1eee15eaa0d7a1d93e6ee1Douglas Gregor if (Importer.IsStructurallyEquivalent(D->getType(), 31937c9412cdad37146e6d1eee15eaa0d7a1d93e6ee1Douglas Gregor FoundField->getType())) { 31947c9412cdad37146e6d1eee15eaa0d7a1d93e6ee1Douglas Gregor Importer.Imported(D, FoundField); 31957c9412cdad37146e6d1eee15eaa0d7a1d93e6ee1Douglas Gregor return FoundField; 31967c9412cdad37146e6d1eee15eaa0d7a1d93e6ee1Douglas Gregor } 31977c9412cdad37146e6d1eee15eaa0d7a1d93e6ee1Douglas Gregor 31987c9412cdad37146e6d1eee15eaa0d7a1d93e6ee1Douglas Gregor Importer.ToDiag(Loc, diag::err_odr_field_type_inconsistent) 31997c9412cdad37146e6d1eee15eaa0d7a1d93e6ee1Douglas Gregor << Name << D->getType() << FoundField->getType(); 32007c9412cdad37146e6d1eee15eaa0d7a1d93e6ee1Douglas Gregor Importer.ToDiag(FoundField->getLocation(), diag::note_odr_value_here) 32017c9412cdad37146e6d1eee15eaa0d7a1d93e6ee1Douglas Gregor << FoundField->getType(); 32026bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return nullptr; 32037c9412cdad37146e6d1eee15eaa0d7a1d93e6ee1Douglas Gregor } 32047c9412cdad37146e6d1eee15eaa0d7a1d93e6ee1Douglas Gregor } 32057c9412cdad37146e6d1eee15eaa0d7a1d93e6ee1Douglas Gregor 3206ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor // Import the type. 3207ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor QualType T = Importer.Import(D->getType()); 3208ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor if (T.isNull()) 32096bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return nullptr; 32106bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 321196a01b4acf76fb8fe1e05341a97a27b39fb0b914Douglas Gregor TypeSourceInfo *TInfo = Importer.Import(D->getTypeSourceInfo()); 321296a01b4acf76fb8fe1e05341a97a27b39fb0b914Douglas Gregor Expr *BitWidth = Importer.Import(D->getBitWidth()); 321396a01b4acf76fb8fe1e05341a97a27b39fb0b914Douglas Gregor if (!BitWidth && D->getBitWidth()) 32146bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return nullptr; 32156bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 3216ff676cb48fe8bf7be2feaa251dc7c5fb15af4730Abramo Bagnara FieldDecl *ToField = FieldDecl::Create(Importer.getToContext(), DC, 3217ff676cb48fe8bf7be2feaa251dc7c5fb15af4730Abramo Bagnara Importer.Import(D->getInnerLocStart()), 321896a01b4acf76fb8fe1e05341a97a27b39fb0b914Douglas Gregor Loc, Name.getAsIdentifierInfo(), 32197a614d8380297fcd2bc23986241905d97222948cRichard Smith T, TInfo, BitWidth, D->isMutable(), 3220ca5233044ef679840d1ad1c46a36b16e2ee8a6e1Richard Smith D->getInClassInitStyle()); 3221325bf177ac0f1db7888e2d7b194515466ba91762Douglas Gregor ToField->setAccess(D->getAccess()); 322296a01b4acf76fb8fe1e05341a97a27b39fb0b914Douglas Gregor ToField->setLexicalDeclContext(LexicalDC); 32234967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar if (Expr *FromInitializer = D->getInClassInitializer()) { 32244967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Expr *ToInitializer = Importer.Import(FromInitializer); 32254967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar if (ToInitializer) 32264967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar ToField->setInClassInitializer(ToInitializer); 32274967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar else 32284967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar return nullptr; 32294967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar } 323011ce5fe7d8dda29f3d093e5759a7476b140e3241Douglas Gregor ToField->setImplicit(D->isImplicit()); 32315ce5dab3c30e4255b8f62b148b6a86f09a444aaaDouglas Gregor Importer.Imported(D, ToField); 32329faf810f08132aabb34a478297dfeea89c3bbe17Sean Callanan LexicalDC->addDeclInternal(ToField); 323396a01b4acf76fb8fe1e05341a97a27b39fb0b914Douglas Gregor return ToField; 323496a01b4acf76fb8fe1e05341a97a27b39fb0b914Douglas Gregor} 323596a01b4acf76fb8fe1e05341a97a27b39fb0b914Douglas Gregor 323687c2e121cf0522fc266efe2922b58091cd2e0182Francois PichetDecl *ASTNodeImporter::VisitIndirectFieldDecl(IndirectFieldDecl *D) { 323787c2e121cf0522fc266efe2922b58091cd2e0182Francois Pichet // Import the major distinguishing characteristics of a variable. 323887c2e121cf0522fc266efe2922b58091cd2e0182Francois Pichet DeclContext *DC, *LexicalDC; 323987c2e121cf0522fc266efe2922b58091cd2e0182Francois Pichet DeclarationName Name; 324087c2e121cf0522fc266efe2922b58091cd2e0182Francois Pichet SourceLocation Loc; 3241b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar NamedDecl *ToD; 3242b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar if (ImportDeclParts(D, DC, LexicalDC, Name, ToD, Loc)) 32436bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return nullptr; 3244b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar if (ToD) 3245b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar return ToD; 324687c2e121cf0522fc266efe2922b58091cd2e0182Francois Pichet 32477c9412cdad37146e6d1eee15eaa0d7a1d93e6ee1Douglas Gregor // Determine whether we've already imported this field. 3248cfa88f893915ceb8ae4ce2f17c46c24a4d67502fDmitri Gribenko SmallVector<NamedDecl *, 2> FoundDecls; 32490e2c34f92f00628d48968dfea096d36381f494cbStephen Hines DC->getRedeclContext()->localUncachedLookup(Name, FoundDecls); 3250b75a3451bcae1301875282e73a13934c90b6574cDouglas Gregor for (unsigned I = 0, N = FoundDecls.size(); I != N; ++I) { 32517c9412cdad37146e6d1eee15eaa0d7a1d93e6ee1Douglas Gregor if (IndirectFieldDecl *FoundField 3252b75a3451bcae1301875282e73a13934c90b6574cDouglas Gregor = dyn_cast<IndirectFieldDecl>(FoundDecls[I])) { 325311ce5fe7d8dda29f3d093e5759a7476b140e3241Douglas Gregor // For anonymous indirect fields, match up by index. 325411ce5fe7d8dda29f3d093e5759a7476b140e3241Douglas Gregor if (!Name && getFieldIndex(D) != getFieldIndex(FoundField)) 325511ce5fe7d8dda29f3d093e5759a7476b140e3241Douglas Gregor continue; 325611ce5fe7d8dda29f3d093e5759a7476b140e3241Douglas Gregor 32577c9412cdad37146e6d1eee15eaa0d7a1d93e6ee1Douglas Gregor if (Importer.IsStructurallyEquivalent(D->getType(), 325893ed7cf05f900b9150dcf59c0e0f37f3bd325f62Douglas Gregor FoundField->getType(), 32597247c88d1e41514a41085f83ebf03dd5220e054aDavid Blaikie !Name.isEmpty())) { 32607c9412cdad37146e6d1eee15eaa0d7a1d93e6ee1Douglas Gregor Importer.Imported(D, FoundField); 32617c9412cdad37146e6d1eee15eaa0d7a1d93e6ee1Douglas Gregor return FoundField; 32627c9412cdad37146e6d1eee15eaa0d7a1d93e6ee1Douglas Gregor } 326393ed7cf05f900b9150dcf59c0e0f37f3bd325f62Douglas Gregor 326493ed7cf05f900b9150dcf59c0e0f37f3bd325f62Douglas Gregor // If there are more anonymous fields to check, continue. 326593ed7cf05f900b9150dcf59c0e0f37f3bd325f62Douglas Gregor if (!Name && I < N-1) 326693ed7cf05f900b9150dcf59c0e0f37f3bd325f62Douglas Gregor continue; 326793ed7cf05f900b9150dcf59c0e0f37f3bd325f62Douglas Gregor 32687c9412cdad37146e6d1eee15eaa0d7a1d93e6ee1Douglas Gregor Importer.ToDiag(Loc, diag::err_odr_field_type_inconsistent) 32697c9412cdad37146e6d1eee15eaa0d7a1d93e6ee1Douglas Gregor << Name << D->getType() << FoundField->getType(); 32707c9412cdad37146e6d1eee15eaa0d7a1d93e6ee1Douglas Gregor Importer.ToDiag(FoundField->getLocation(), diag::note_odr_value_here) 32717c9412cdad37146e6d1eee15eaa0d7a1d93e6ee1Douglas Gregor << FoundField->getType(); 32726bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return nullptr; 32737c9412cdad37146e6d1eee15eaa0d7a1d93e6ee1Douglas Gregor } 32747c9412cdad37146e6d1eee15eaa0d7a1d93e6ee1Douglas Gregor } 32757c9412cdad37146e6d1eee15eaa0d7a1d93e6ee1Douglas Gregor 327687c2e121cf0522fc266efe2922b58091cd2e0182Francois Pichet // Import the type. 327787c2e121cf0522fc266efe2922b58091cd2e0182Francois Pichet QualType T = Importer.Import(D->getType()); 327887c2e121cf0522fc266efe2922b58091cd2e0182Francois Pichet if (T.isNull()) 32796bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return nullptr; 328087c2e121cf0522fc266efe2922b58091cd2e0182Francois Pichet 328187c2e121cf0522fc266efe2922b58091cd2e0182Francois Pichet NamedDecl **NamedChain = 328287c2e121cf0522fc266efe2922b58091cd2e0182Francois Pichet new (Importer.getToContext())NamedDecl*[D->getChainingSize()]; 328387c2e121cf0522fc266efe2922b58091cd2e0182Francois Pichet 328487c2e121cf0522fc266efe2922b58091cd2e0182Francois Pichet unsigned i = 0; 3285651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines for (auto *PI : D->chain()) { 3286651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines Decl *D = Importer.Import(PI); 328787c2e121cf0522fc266efe2922b58091cd2e0182Francois Pichet if (!D) 32886bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return nullptr; 328987c2e121cf0522fc266efe2922b58091cd2e0182Francois Pichet NamedChain[i++] = cast<NamedDecl>(D); 329087c2e121cf0522fc266efe2922b58091cd2e0182Francois Pichet } 329187c2e121cf0522fc266efe2922b58091cd2e0182Francois Pichet 329287c2e121cf0522fc266efe2922b58091cd2e0182Francois Pichet IndirectFieldDecl *ToIndirectField = IndirectFieldDecl::Create( 3293176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines Importer.getToContext(), DC, Loc, Name.getAsIdentifierInfo(), T, 32944967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar {NamedChain, D->getChainingSize()}); 3295176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines 3296176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines for (const auto *Attr : D->attrs()) 3297176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines ToIndirectField->addAttr(Attr->clone(Importer.getToContext())); 3298176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines 329987c2e121cf0522fc266efe2922b58091cd2e0182Francois Pichet ToIndirectField->setAccess(D->getAccess()); 330087c2e121cf0522fc266efe2922b58091cd2e0182Francois Pichet ToIndirectField->setLexicalDeclContext(LexicalDC); 330187c2e121cf0522fc266efe2922b58091cd2e0182Francois Pichet Importer.Imported(D, ToIndirectField); 33029faf810f08132aabb34a478297dfeea89c3bbe17Sean Callanan LexicalDC->addDeclInternal(ToIndirectField); 330387c2e121cf0522fc266efe2922b58091cd2e0182Francois Pichet return ToIndirectField; 330487c2e121cf0522fc266efe2922b58091cd2e0182Francois Pichet} 330587c2e121cf0522fc266efe2922b58091cd2e0182Francois Pichet 33062e55e3af2f6d6c0509495357fade95105dd144cdDouglas GregorDecl *ASTNodeImporter::VisitObjCIvarDecl(ObjCIvarDecl *D) { 33072e55e3af2f6d6c0509495357fade95105dd144cdDouglas Gregor // Import the major distinguishing characteristics of an ivar. 33082e55e3af2f6d6c0509495357fade95105dd144cdDouglas Gregor DeclContext *DC, *LexicalDC; 33092e55e3af2f6d6c0509495357fade95105dd144cdDouglas Gregor DeclarationName Name; 33102e55e3af2f6d6c0509495357fade95105dd144cdDouglas Gregor SourceLocation Loc; 3311b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar NamedDecl *ToD; 3312b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar if (ImportDeclParts(D, DC, LexicalDC, Name, ToD, Loc)) 33136bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return nullptr; 3314b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar if (ToD) 3315b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar return ToD; 33166bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 33172e55e3af2f6d6c0509495357fade95105dd144cdDouglas Gregor // Determine whether we've already imported this ivar 3318cfa88f893915ceb8ae4ce2f17c46c24a4d67502fDmitri Gribenko SmallVector<NamedDecl *, 2> FoundDecls; 33190e2c34f92f00628d48968dfea096d36381f494cbStephen Hines DC->getRedeclContext()->localUncachedLookup(Name, FoundDecls); 3320b75a3451bcae1301875282e73a13934c90b6574cDouglas Gregor for (unsigned I = 0, N = FoundDecls.size(); I != N; ++I) { 3321b75a3451bcae1301875282e73a13934c90b6574cDouglas Gregor if (ObjCIvarDecl *FoundIvar = dyn_cast<ObjCIvarDecl>(FoundDecls[I])) { 33222e55e3af2f6d6c0509495357fade95105dd144cdDouglas Gregor if (Importer.IsStructurallyEquivalent(D->getType(), 33232e55e3af2f6d6c0509495357fade95105dd144cdDouglas Gregor FoundIvar->getType())) { 33242e55e3af2f6d6c0509495357fade95105dd144cdDouglas Gregor Importer.Imported(D, FoundIvar); 33252e55e3af2f6d6c0509495357fade95105dd144cdDouglas Gregor return FoundIvar; 33262e55e3af2f6d6c0509495357fade95105dd144cdDouglas Gregor } 33272e55e3af2f6d6c0509495357fade95105dd144cdDouglas Gregor 33282e55e3af2f6d6c0509495357fade95105dd144cdDouglas Gregor Importer.ToDiag(Loc, diag::err_odr_ivar_type_inconsistent) 33292e55e3af2f6d6c0509495357fade95105dd144cdDouglas Gregor << Name << D->getType() << FoundIvar->getType(); 33302e55e3af2f6d6c0509495357fade95105dd144cdDouglas Gregor Importer.ToDiag(FoundIvar->getLocation(), diag::note_odr_value_here) 33312e55e3af2f6d6c0509495357fade95105dd144cdDouglas Gregor << FoundIvar->getType(); 33326bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return nullptr; 33332e55e3af2f6d6c0509495357fade95105dd144cdDouglas Gregor } 33342e55e3af2f6d6c0509495357fade95105dd144cdDouglas Gregor } 33352e55e3af2f6d6c0509495357fade95105dd144cdDouglas Gregor 33362e55e3af2f6d6c0509495357fade95105dd144cdDouglas Gregor // Import the type. 33372e55e3af2f6d6c0509495357fade95105dd144cdDouglas Gregor QualType T = Importer.Import(D->getType()); 33382e55e3af2f6d6c0509495357fade95105dd144cdDouglas Gregor if (T.isNull()) 33396bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return nullptr; 33406bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 33412e55e3af2f6d6c0509495357fade95105dd144cdDouglas Gregor TypeSourceInfo *TInfo = Importer.Import(D->getTypeSourceInfo()); 33422e55e3af2f6d6c0509495357fade95105dd144cdDouglas Gregor Expr *BitWidth = Importer.Import(D->getBitWidth()); 33432e55e3af2f6d6c0509495357fade95105dd144cdDouglas Gregor if (!BitWidth && D->getBitWidth()) 33446bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return nullptr; 33456bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 3346a06549226f45d5b72169a3d054415616dd1014a2Daniel Dunbar ObjCIvarDecl *ToIvar = ObjCIvarDecl::Create(Importer.getToContext(), 3347a06549226f45d5b72169a3d054415616dd1014a2Daniel Dunbar cast<ObjCContainerDecl>(DC), 3348ff676cb48fe8bf7be2feaa251dc7c5fb15af4730Abramo Bagnara Importer.Import(D->getInnerLocStart()), 33492e55e3af2f6d6c0509495357fade95105dd144cdDouglas Gregor Loc, Name.getAsIdentifierInfo(), 33502e55e3af2f6d6c0509495357fade95105dd144cdDouglas Gregor T, TInfo, D->getAccessControl(), 3351651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines BitWidth, D->getSynthesize()); 33522e55e3af2f6d6c0509495357fade95105dd144cdDouglas Gregor ToIvar->setLexicalDeclContext(LexicalDC); 33532e55e3af2f6d6c0509495357fade95105dd144cdDouglas Gregor Importer.Imported(D, ToIvar); 33549faf810f08132aabb34a478297dfeea89c3bbe17Sean Callanan LexicalDC->addDeclInternal(ToIvar); 33552e55e3af2f6d6c0509495357fade95105dd144cdDouglas Gregor return ToIvar; 33562e55e3af2f6d6c0509495357fade95105dd144cdDouglas Gregor 33572e55e3af2f6d6c0509495357fade95105dd144cdDouglas Gregor} 33582e55e3af2f6d6c0509495357fade95105dd144cdDouglas Gregor 3359a404ea673cbee5e74af710a5f1ab571e71580b67Douglas GregorDecl *ASTNodeImporter::VisitVarDecl(VarDecl *D) { 3360a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor // Import the major distinguishing characteristics of a variable. 3361a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor DeclContext *DC, *LexicalDC; 3362a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor DeclarationName Name; 3363a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor SourceLocation Loc; 3364b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar NamedDecl *ToD; 3365b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar if (ImportDeclParts(D, DC, LexicalDC, Name, ToD, Loc)) 33666bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return nullptr; 3367b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar if (ToD) 3368b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar return ToD; 33696bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 3370089459a16bf7e9cd10617d1fac5ec0240a0a1ee6Douglas Gregor // Try to find a variable in our own ("to") context with the same name and 3371089459a16bf7e9cd10617d1fac5ec0240a0a1ee6Douglas Gregor // in the same context as the variable we're importing. 33729bed8798964d9f07599c2c9199701f86fbc70e20Douglas Gregor if (D->isFileVarDecl()) { 33736bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines VarDecl *MergeWithVar = nullptr; 33745f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner SmallVector<NamedDecl *, 4> ConflictingDecls; 3375089459a16bf7e9cd10617d1fac5ec0240a0a1ee6Douglas Gregor unsigned IDNS = Decl::IDNS_Ordinary; 3376cfa88f893915ceb8ae4ce2f17c46c24a4d67502fDmitri Gribenko SmallVector<NamedDecl *, 2> FoundDecls; 33770e2c34f92f00628d48968dfea096d36381f494cbStephen Hines DC->getRedeclContext()->localUncachedLookup(Name, FoundDecls); 3378b75a3451bcae1301875282e73a13934c90b6574cDouglas Gregor for (unsigned I = 0, N = FoundDecls.size(); I != N; ++I) { 3379b75a3451bcae1301875282e73a13934c90b6574cDouglas Gregor if (!FoundDecls[I]->isInIdentifierNamespace(IDNS)) 3380089459a16bf7e9cd10617d1fac5ec0240a0a1ee6Douglas Gregor continue; 3381089459a16bf7e9cd10617d1fac5ec0240a0a1ee6Douglas Gregor 3382b75a3451bcae1301875282e73a13934c90b6574cDouglas Gregor if (VarDecl *FoundVar = dyn_cast<VarDecl>(FoundDecls[I])) { 3383089459a16bf7e9cd10617d1fac5ec0240a0a1ee6Douglas Gregor // We have found a variable that we may need to merge with. Check it. 3384181e3ecc0907ae0103586a9f4db52241995a8267Rafael Espindola if (FoundVar->hasExternalFormalLinkage() && 3385181e3ecc0907ae0103586a9f4db52241995a8267Rafael Espindola D->hasExternalFormalLinkage()) { 3386ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor if (Importer.IsStructurallyEquivalent(D->getType(), 3387ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor FoundVar->getType())) { 3388089459a16bf7e9cd10617d1fac5ec0240a0a1ee6Douglas Gregor MergeWithVar = FoundVar; 3389089459a16bf7e9cd10617d1fac5ec0240a0a1ee6Douglas Gregor break; 3390089459a16bf7e9cd10617d1fac5ec0240a0a1ee6Douglas Gregor } 3391089459a16bf7e9cd10617d1fac5ec0240a0a1ee6Douglas Gregor 3392d014542e1c6710d2c230b65b0cfcb8302a596b21Douglas Gregor const ArrayType *FoundArray 3393d014542e1c6710d2c230b65b0cfcb8302a596b21Douglas Gregor = Importer.getToContext().getAsArrayType(FoundVar->getType()); 3394d014542e1c6710d2c230b65b0cfcb8302a596b21Douglas Gregor const ArrayType *TArray 3395ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor = Importer.getToContext().getAsArrayType(D->getType()); 3396d014542e1c6710d2c230b65b0cfcb8302a596b21Douglas Gregor if (FoundArray && TArray) { 3397d014542e1c6710d2c230b65b0cfcb8302a596b21Douglas Gregor if (isa<IncompleteArrayType>(FoundArray) && 3398d014542e1c6710d2c230b65b0cfcb8302a596b21Douglas Gregor isa<ConstantArrayType>(TArray)) { 3399ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor // Import the type. 3400ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor QualType T = Importer.Import(D->getType()); 3401ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor if (T.isNull()) 34026bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return nullptr; 34036bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 3404d014542e1c6710d2c230b65b0cfcb8302a596b21Douglas Gregor FoundVar->setType(T); 3405d014542e1c6710d2c230b65b0cfcb8302a596b21Douglas Gregor MergeWithVar = FoundVar; 3406d014542e1c6710d2c230b65b0cfcb8302a596b21Douglas Gregor break; 3407d014542e1c6710d2c230b65b0cfcb8302a596b21Douglas Gregor } else if (isa<IncompleteArrayType>(TArray) && 3408d014542e1c6710d2c230b65b0cfcb8302a596b21Douglas Gregor isa<ConstantArrayType>(FoundArray)) { 3409d014542e1c6710d2c230b65b0cfcb8302a596b21Douglas Gregor MergeWithVar = FoundVar; 3410d014542e1c6710d2c230b65b0cfcb8302a596b21Douglas Gregor break; 34110f962a8e61e1c094a89df17f9d3ad947d31c4e5cDouglas Gregor } 34120f962a8e61e1c094a89df17f9d3ad947d31c4e5cDouglas Gregor } 34130f962a8e61e1c094a89df17f9d3ad947d31c4e5cDouglas Gregor 3414089459a16bf7e9cd10617d1fac5ec0240a0a1ee6Douglas Gregor Importer.ToDiag(Loc, diag::err_odr_variable_type_inconsistent) 3415ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor << Name << D->getType() << FoundVar->getType(); 3416089459a16bf7e9cd10617d1fac5ec0240a0a1ee6Douglas Gregor Importer.ToDiag(FoundVar->getLocation(), diag::note_odr_value_here) 3417089459a16bf7e9cd10617d1fac5ec0240a0a1ee6Douglas Gregor << FoundVar->getType(); 3418089459a16bf7e9cd10617d1fac5ec0240a0a1ee6Douglas Gregor } 3419089459a16bf7e9cd10617d1fac5ec0240a0a1ee6Douglas Gregor } 3420089459a16bf7e9cd10617d1fac5ec0240a0a1ee6Douglas Gregor 3421b75a3451bcae1301875282e73a13934c90b6574cDouglas Gregor ConflictingDecls.push_back(FoundDecls[I]); 3422089459a16bf7e9cd10617d1fac5ec0240a0a1ee6Douglas Gregor } 3423089459a16bf7e9cd10617d1fac5ec0240a0a1ee6Douglas Gregor 3424089459a16bf7e9cd10617d1fac5ec0240a0a1ee6Douglas Gregor if (MergeWithVar) { 3425089459a16bf7e9cd10617d1fac5ec0240a0a1ee6Douglas Gregor // An equivalent variable with external linkage has been found. Link 3426089459a16bf7e9cd10617d1fac5ec0240a0a1ee6Douglas Gregor // the two declarations, then merge them. 34275ce5dab3c30e4255b8f62b148b6a86f09a444aaaDouglas Gregor Importer.Imported(D, MergeWithVar); 3428089459a16bf7e9cd10617d1fac5ec0240a0a1ee6Douglas Gregor 3429089459a16bf7e9cd10617d1fac5ec0240a0a1ee6Douglas Gregor if (VarDecl *DDef = D->getDefinition()) { 3430089459a16bf7e9cd10617d1fac5ec0240a0a1ee6Douglas Gregor if (VarDecl *ExistingDef = MergeWithVar->getDefinition()) { 3431089459a16bf7e9cd10617d1fac5ec0240a0a1ee6Douglas Gregor Importer.ToDiag(ExistingDef->getLocation(), 3432089459a16bf7e9cd10617d1fac5ec0240a0a1ee6Douglas Gregor diag::err_odr_variable_multiple_def) 3433089459a16bf7e9cd10617d1fac5ec0240a0a1ee6Douglas Gregor << Name; 3434089459a16bf7e9cd10617d1fac5ec0240a0a1ee6Douglas Gregor Importer.FromDiag(DDef->getLocation(), diag::note_odr_defined_here); 3435089459a16bf7e9cd10617d1fac5ec0240a0a1ee6Douglas Gregor } else { 3436089459a16bf7e9cd10617d1fac5ec0240a0a1ee6Douglas Gregor Expr *Init = Importer.Import(DDef->getInit()); 3437838db383b69b9fb55f55c8e9546477df198a4faaDouglas Gregor MergeWithVar->setInit(Init); 3438099e7f647ccda915513f2b2ec53352dc756082d3Richard Smith if (DDef->isInitKnownICE()) { 3439099e7f647ccda915513f2b2ec53352dc756082d3Richard Smith EvaluatedStmt *Eval = MergeWithVar->ensureEvaluatedStmt(); 3440099e7f647ccda915513f2b2ec53352dc756082d3Richard Smith Eval->CheckedICE = true; 3441099e7f647ccda915513f2b2ec53352dc756082d3Richard Smith Eval->IsICE = DDef->isInitICE(); 3442099e7f647ccda915513f2b2ec53352dc756082d3Richard Smith } 3443089459a16bf7e9cd10617d1fac5ec0240a0a1ee6Douglas Gregor } 3444089459a16bf7e9cd10617d1fac5ec0240a0a1ee6Douglas Gregor } 3445089459a16bf7e9cd10617d1fac5ec0240a0a1ee6Douglas Gregor 3446089459a16bf7e9cd10617d1fac5ec0240a0a1ee6Douglas Gregor return MergeWithVar; 3447089459a16bf7e9cd10617d1fac5ec0240a0a1ee6Douglas Gregor } 3448089459a16bf7e9cd10617d1fac5ec0240a0a1ee6Douglas Gregor 3449089459a16bf7e9cd10617d1fac5ec0240a0a1ee6Douglas Gregor if (!ConflictingDecls.empty()) { 3450089459a16bf7e9cd10617d1fac5ec0240a0a1ee6Douglas Gregor Name = Importer.HandleNameConflict(Name, DC, IDNS, 3451089459a16bf7e9cd10617d1fac5ec0240a0a1ee6Douglas Gregor ConflictingDecls.data(), 3452089459a16bf7e9cd10617d1fac5ec0240a0a1ee6Douglas Gregor ConflictingDecls.size()); 3453089459a16bf7e9cd10617d1fac5ec0240a0a1ee6Douglas Gregor if (!Name) 34546bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return nullptr; 3455089459a16bf7e9cd10617d1fac5ec0240a0a1ee6Douglas Gregor } 3456089459a16bf7e9cd10617d1fac5ec0240a0a1ee6Douglas Gregor } 345782fc4bfa6f8ea35488b9038dd83d40766c3645cfDouglas Gregor 3458ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor // Import the type. 3459ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor QualType T = Importer.Import(D->getType()); 3460ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor if (T.isNull()) 34616bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return nullptr; 34626bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 3463089459a16bf7e9cd10617d1fac5ec0240a0a1ee6Douglas Gregor // Create the imported variable. 346482fc4bfa6f8ea35488b9038dd83d40766c3645cfDouglas Gregor TypeSourceInfo *TInfo = Importer.Import(D->getTypeSourceInfo()); 3465ff676cb48fe8bf7be2feaa251dc7c5fb15af4730Abramo Bagnara VarDecl *ToVar = VarDecl::Create(Importer.getToContext(), DC, 3466ff676cb48fe8bf7be2feaa251dc7c5fb15af4730Abramo Bagnara Importer.Import(D->getInnerLocStart()), 3467ff676cb48fe8bf7be2feaa251dc7c5fb15af4730Abramo Bagnara Loc, Name.getAsIdentifierInfo(), 3468ff676cb48fe8bf7be2feaa251dc7c5fb15af4730Abramo Bagnara T, TInfo, 3469d2615cc53b916e8aae45783ca7113b93de515ce3Rafael Espindola D->getStorageClass()); 3470c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor ToVar->setQualifierInfo(Importer.Import(D->getQualifierLoc())); 3471325bf177ac0f1db7888e2d7b194515466ba91762Douglas Gregor ToVar->setAccess(D->getAccess()); 34729bed8798964d9f07599c2c9199701f86fbc70e20Douglas Gregor ToVar->setLexicalDeclContext(LexicalDC); 34735ce5dab3c30e4255b8f62b148b6a86f09a444aaaDouglas Gregor Importer.Imported(D, ToVar); 34749faf810f08132aabb34a478297dfeea89c3bbe17Sean Callanan LexicalDC->addDeclInternal(ToVar); 34759bed8798964d9f07599c2c9199701f86fbc70e20Douglas Gregor 3476b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar if (!D->isFileVarDecl() && 3477b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar D->isUsed()) 3478b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar ToVar->setIsUsed(); 3479b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar 3480089459a16bf7e9cd10617d1fac5ec0240a0a1ee6Douglas Gregor // Merge the initializer. 3481ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo if (ImportDefinition(D, ToVar)) 34826bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return nullptr; 3483089459a16bf7e9cd10617d1fac5ec0240a0a1ee6Douglas Gregor 3484089459a16bf7e9cd10617d1fac5ec0240a0a1ee6Douglas Gregor return ToVar; 3485089459a16bf7e9cd10617d1fac5ec0240a0a1ee6Douglas Gregor} 3486089459a16bf7e9cd10617d1fac5ec0240a0a1ee6Douglas Gregor 34872cd00932b9b5403047139ce8cfaa3ae47966f894Douglas GregorDecl *ASTNodeImporter::VisitImplicitParamDecl(ImplicitParamDecl *D) { 34882cd00932b9b5403047139ce8cfaa3ae47966f894Douglas Gregor // Parameters are created in the translation unit's context, then moved 34892cd00932b9b5403047139ce8cfaa3ae47966f894Douglas Gregor // into the function declaration's context afterward. 34902cd00932b9b5403047139ce8cfaa3ae47966f894Douglas Gregor DeclContext *DC = Importer.getToContext().getTranslationUnitDecl(); 34912cd00932b9b5403047139ce8cfaa3ae47966f894Douglas Gregor 34922cd00932b9b5403047139ce8cfaa3ae47966f894Douglas Gregor // Import the name of this declaration. 34932cd00932b9b5403047139ce8cfaa3ae47966f894Douglas Gregor DeclarationName Name = Importer.Import(D->getDeclName()); 34942cd00932b9b5403047139ce8cfaa3ae47966f894Douglas Gregor if (D->getDeclName() && !Name) 34956bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return nullptr; 34966bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 34972cd00932b9b5403047139ce8cfaa3ae47966f894Douglas Gregor // Import the location of this declaration. 34982cd00932b9b5403047139ce8cfaa3ae47966f894Douglas Gregor SourceLocation Loc = Importer.Import(D->getLocation()); 34992cd00932b9b5403047139ce8cfaa3ae47966f894Douglas Gregor 35002cd00932b9b5403047139ce8cfaa3ae47966f894Douglas Gregor // Import the parameter's type. 35012cd00932b9b5403047139ce8cfaa3ae47966f894Douglas Gregor QualType T = Importer.Import(D->getType()); 35022cd00932b9b5403047139ce8cfaa3ae47966f894Douglas Gregor if (T.isNull()) 35036bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return nullptr; 35046bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 35052cd00932b9b5403047139ce8cfaa3ae47966f894Douglas Gregor // Create the imported parameter. 35062cd00932b9b5403047139ce8cfaa3ae47966f894Douglas Gregor ImplicitParamDecl *ToParm 35072cd00932b9b5403047139ce8cfaa3ae47966f894Douglas Gregor = ImplicitParamDecl::Create(Importer.getToContext(), DC, 35082cd00932b9b5403047139ce8cfaa3ae47966f894Douglas Gregor Loc, Name.getAsIdentifierInfo(), 35092cd00932b9b5403047139ce8cfaa3ae47966f894Douglas Gregor T); 35102cd00932b9b5403047139ce8cfaa3ae47966f894Douglas Gregor return Importer.Imported(D, ToParm); 35112cd00932b9b5403047139ce8cfaa3ae47966f894Douglas Gregor} 35122cd00932b9b5403047139ce8cfaa3ae47966f894Douglas Gregor 3513a404ea673cbee5e74af710a5f1ab571e71580b67Douglas GregorDecl *ASTNodeImporter::VisitParmVarDecl(ParmVarDecl *D) { 3514a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor // Parameters are created in the translation unit's context, then moved 3515a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor // into the function declaration's context afterward. 3516a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor DeclContext *DC = Importer.getToContext().getTranslationUnitDecl(); 3517a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor 351882fc4bfa6f8ea35488b9038dd83d40766c3645cfDouglas Gregor // Import the name of this declaration. 351982fc4bfa6f8ea35488b9038dd83d40766c3645cfDouglas Gregor DeclarationName Name = Importer.Import(D->getDeclName()); 352082fc4bfa6f8ea35488b9038dd83d40766c3645cfDouglas Gregor if (D->getDeclName() && !Name) 35216bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return nullptr; 35226bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 3523a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor // Import the location of this declaration. 3524a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor SourceLocation Loc = Importer.Import(D->getLocation()); 3525a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor 3526a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor // Import the parameter's type. 3527a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor QualType T = Importer.Import(D->getType()); 352882fc4bfa6f8ea35488b9038dd83d40766c3645cfDouglas Gregor if (T.isNull()) 35296bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return nullptr; 35306bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 3531a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor // Create the imported parameter. 3532a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor TypeSourceInfo *TInfo = Importer.Import(D->getTypeSourceInfo()); 3533a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor ParmVarDecl *ToParm = ParmVarDecl::Create(Importer.getToContext(), DC, 3534ff676cb48fe8bf7be2feaa251dc7c5fb15af4730Abramo Bagnara Importer.Import(D->getInnerLocStart()), 3535a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor Loc, Name.getAsIdentifierInfo(), 3536a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor T, TInfo, D->getStorageClass(), 35376bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines /*FIXME: Default argument*/nullptr); 3538bf73b352acb7a2d041ce8b50171dd7f8e2b2c1bbJohn McCall ToParm->setHasInheritedDefaultArg(D->hasInheritedDefaultArg()); 3539b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar 3540b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar if (D->isUsed()) 3541b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar ToParm->setIsUsed(); 3542b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar 35435ce5dab3c30e4255b8f62b148b6a86f09a444aaaDouglas Gregor return Importer.Imported(D, ToParm); 3544a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor} 354582fc4bfa6f8ea35488b9038dd83d40766c3645cfDouglas Gregor 3546c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas GregorDecl *ASTNodeImporter::VisitObjCMethodDecl(ObjCMethodDecl *D) { 3547c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor // Import the major distinguishing characteristics of a method. 3548c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor DeclContext *DC, *LexicalDC; 3549c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor DeclarationName Name; 3550c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor SourceLocation Loc; 3551b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar NamedDecl *ToD; 3552b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar if (ImportDeclParts(D, DC, LexicalDC, Name, ToD, Loc)) 35536bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return nullptr; 3554b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar if (ToD) 3555b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar return ToD; 35566bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 3557cfa88f893915ceb8ae4ce2f17c46c24a4d67502fDmitri Gribenko SmallVector<NamedDecl *, 2> FoundDecls; 35580e2c34f92f00628d48968dfea096d36381f494cbStephen Hines DC->getRedeclContext()->localUncachedLookup(Name, FoundDecls); 3559b75a3451bcae1301875282e73a13934c90b6574cDouglas Gregor for (unsigned I = 0, N = FoundDecls.size(); I != N; ++I) { 3560b75a3451bcae1301875282e73a13934c90b6574cDouglas Gregor if (ObjCMethodDecl *FoundMethod = dyn_cast<ObjCMethodDecl>(FoundDecls[I])) { 3561c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor if (FoundMethod->isInstanceMethod() != D->isInstanceMethod()) 3562c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor continue; 3563c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor 3564c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor // Check return types. 3565651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines if (!Importer.IsStructurallyEquivalent(D->getReturnType(), 3566651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines FoundMethod->getReturnType())) { 3567c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor Importer.ToDiag(Loc, diag::err_odr_objc_method_result_type_inconsistent) 3568651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines << D->isInstanceMethod() << Name << D->getReturnType() 3569651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines << FoundMethod->getReturnType(); 3570c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor Importer.ToDiag(FoundMethod->getLocation(), 3571c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor diag::note_odr_objc_method_here) 3572c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor << D->isInstanceMethod() << Name; 35736bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return nullptr; 3574c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor } 3575c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor 3576c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor // Check the number of parameters. 3577c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor if (D->param_size() != FoundMethod->param_size()) { 3578c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor Importer.ToDiag(Loc, diag::err_odr_objc_method_num_params_inconsistent) 3579c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor << D->isInstanceMethod() << Name 3580c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor << D->param_size() << FoundMethod->param_size(); 3581c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor Importer.ToDiag(FoundMethod->getLocation(), 3582c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor diag::note_odr_objc_method_here) 3583c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor << D->isInstanceMethod() << Name; 35846bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return nullptr; 3585c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor } 3586c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor 3587c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor // Check parameter types. 3588c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor for (ObjCMethodDecl::param_iterator P = D->param_begin(), 3589c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor PEnd = D->param_end(), FoundP = FoundMethod->param_begin(); 3590c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor P != PEnd; ++P, ++FoundP) { 3591c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor if (!Importer.IsStructurallyEquivalent((*P)->getType(), 3592c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor (*FoundP)->getType())) { 3593c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor Importer.FromDiag((*P)->getLocation(), 3594c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor diag::err_odr_objc_method_param_type_inconsistent) 3595c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor << D->isInstanceMethod() << Name 3596c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor << (*P)->getType() << (*FoundP)->getType(); 3597c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor Importer.ToDiag((*FoundP)->getLocation(), diag::note_odr_value_here) 3598c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor << (*FoundP)->getType(); 35996bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return nullptr; 3600c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor } 3601c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor } 3602c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor 3603c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor // Check variadic/non-variadic. 3604c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor // Check the number of parameters. 3605c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor if (D->isVariadic() != FoundMethod->isVariadic()) { 3606c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor Importer.ToDiag(Loc, diag::err_odr_objc_method_variadic_inconsistent) 3607c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor << D->isInstanceMethod() << Name; 3608c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor Importer.ToDiag(FoundMethod->getLocation(), 3609c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor diag::note_odr_objc_method_here) 3610c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor << D->isInstanceMethod() << Name; 36116bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return nullptr; 3612c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor } 3613c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor 3614c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor // FIXME: Any other bits we need to merge? 3615c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor return Importer.Imported(D, FoundMethod); 3616c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor } 3617c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor } 3618c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor 3619c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor // Import the result type. 3620651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines QualType ResultTy = Importer.Import(D->getReturnType()); 3621c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor if (ResultTy.isNull()) 36226bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return nullptr; 3623c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor 3624651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines TypeSourceInfo *ReturnTInfo = Importer.Import(D->getReturnTypeSourceInfo()); 3625651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 3626651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines ObjCMethodDecl *ToMethod = ObjCMethodDecl::Create( 3627651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines Importer.getToContext(), Loc, Importer.Import(D->getLocEnd()), 3628651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines Name.getObjCSelector(), ResultTy, ReturnTInfo, DC, D->isInstanceMethod(), 3629651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines D->isVariadic(), D->isPropertyAccessor(), D->isImplicit(), D->isDefined(), 3630651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines D->getImplementationControl(), D->hasRelatedResultType()); 3631c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor 3632c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor // FIXME: When we decide to merge method definitions, we'll need to 3633c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor // deal with implicit parameters. 3634c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor 3635c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor // Import the parameters 36365f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner SmallVector<ParmVarDecl *, 5> ToParams; 36374967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar for (auto *FromP : D->parameters()) { 3638651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines ParmVarDecl *ToP = cast_or_null<ParmVarDecl>(Importer.Import(FromP)); 3639c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor if (!ToP) 36406bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return nullptr; 36416bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 3642c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor ToParams.push_back(ToP); 3643c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor } 3644c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor 3645c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor // Set the parameters. 3646c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor for (unsigned I = 0, N = ToParams.size(); I != N; ++I) { 3647c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor ToParams[I]->setOwningFunction(ToMethod); 36489faf810f08132aabb34a478297dfeea89c3bbe17Sean Callanan ToMethod->addDeclInternal(ToParams[I]); 3649c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor } 3650491306a83c4f0f49f95a3bcbca8580cb98a91c7aArgyrios Kyrtzidis SmallVector<SourceLocation, 12> SelLocs; 3651491306a83c4f0f49f95a3bcbca8580cb98a91c7aArgyrios Kyrtzidis D->getSelectorLocs(SelLocs); 3652491306a83c4f0f49f95a3bcbca8580cb98a91c7aArgyrios Kyrtzidis ToMethod->setMethodParams(Importer.getToContext(), ToParams, SelLocs); 3653c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor 3654c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor ToMethod->setLexicalDeclContext(LexicalDC); 3655c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor Importer.Imported(D, ToMethod); 36569faf810f08132aabb34a478297dfeea89c3bbe17Sean Callanan LexicalDC->addDeclInternal(ToMethod); 3657c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor return ToMethod; 3658c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor} 3659c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor 366087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga NainarDecl *ASTNodeImporter::VisitObjCTypeParamDecl(ObjCTypeParamDecl *D) { 366187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar // Import the major distinguishing characteristics of a category. 366287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar DeclContext *DC, *LexicalDC; 366387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar DeclarationName Name; 366487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar SourceLocation Loc; 366587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar NamedDecl *ToD; 366687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar if (ImportDeclParts(D, DC, LexicalDC, Name, ToD, Loc)) 366787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar return nullptr; 366887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar if (ToD) 366987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar return ToD; 367087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar 367187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar TypeSourceInfo *BoundInfo = Importer.Import(D->getTypeSourceInfo()); 367287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar if (!BoundInfo) 367387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar return nullptr; 367487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar 367587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar ObjCTypeParamDecl *Result = ObjCTypeParamDecl::Create( 367687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar Importer.getToContext(), DC, 367787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar D->getVariance(), 367887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar Importer.Import(D->getVarianceLoc()), 367987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar D->getIndex(), 368087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar Importer.Import(D->getLocation()), 368187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar Name.getAsIdentifierInfo(), 368287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar Importer.Import(D->getColonLoc()), 368387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar BoundInfo); 368487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar Importer.Imported(D, Result); 368587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar Result->setLexicalDeclContext(LexicalDC); 368687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar return Result; 368787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar} 368887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar 3689b4677b62a8e9bba0913dfe1456bd9d689cdbccacDouglas GregorDecl *ASTNodeImporter::VisitObjCCategoryDecl(ObjCCategoryDecl *D) { 3690b4677b62a8e9bba0913dfe1456bd9d689cdbccacDouglas Gregor // Import the major distinguishing characteristics of a category. 3691b4677b62a8e9bba0913dfe1456bd9d689cdbccacDouglas Gregor DeclContext *DC, *LexicalDC; 3692b4677b62a8e9bba0913dfe1456bd9d689cdbccacDouglas Gregor DeclarationName Name; 3693b4677b62a8e9bba0913dfe1456bd9d689cdbccacDouglas Gregor SourceLocation Loc; 3694b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar NamedDecl *ToD; 3695b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar if (ImportDeclParts(D, DC, LexicalDC, Name, ToD, Loc)) 36966bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return nullptr; 3697b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar if (ToD) 3698b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar return ToD; 36996bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 3700b4677b62a8e9bba0913dfe1456bd9d689cdbccacDouglas Gregor ObjCInterfaceDecl *ToInterface 3701b4677b62a8e9bba0913dfe1456bd9d689cdbccacDouglas Gregor = cast_or_null<ObjCInterfaceDecl>(Importer.Import(D->getClassInterface())); 3702b4677b62a8e9bba0913dfe1456bd9d689cdbccacDouglas Gregor if (!ToInterface) 37036bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return nullptr; 37046bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 3705b4677b62a8e9bba0913dfe1456bd9d689cdbccacDouglas Gregor // Determine if we've already encountered this category. 3706b4677b62a8e9bba0913dfe1456bd9d689cdbccacDouglas Gregor ObjCCategoryDecl *MergeWithCategory 3707b4677b62a8e9bba0913dfe1456bd9d689cdbccacDouglas Gregor = ToInterface->FindCategoryDeclaration(Name.getAsIdentifierInfo()); 3708b4677b62a8e9bba0913dfe1456bd9d689cdbccacDouglas Gregor ObjCCategoryDecl *ToCategory = MergeWithCategory; 3709b4677b62a8e9bba0913dfe1456bd9d689cdbccacDouglas Gregor if (!ToCategory) { 3710b4677b62a8e9bba0913dfe1456bd9d689cdbccacDouglas Gregor ToCategory = ObjCCategoryDecl::Create(Importer.getToContext(), DC, 37111711fc91efb36d131f7ba771f73f0154dc1abd1fArgyrios Kyrtzidis Importer.Import(D->getAtStartLoc()), 3712b4677b62a8e9bba0913dfe1456bd9d689cdbccacDouglas Gregor Loc, 3713b4677b62a8e9bba0913dfe1456bd9d689cdbccacDouglas Gregor Importer.Import(D->getCategoryNameLoc()), 3714955fadbdfecfa24a590febe66a86519096787f2dArgyrios Kyrtzidis Name.getAsIdentifierInfo(), 3715af300298ab86752fa64e339ba34195888a830756Fariborz Jahanian ToInterface, 371687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar /*TypeParamList=*/nullptr, 3717af300298ab86752fa64e339ba34195888a830756Fariborz Jahanian Importer.Import(D->getIvarLBraceLoc()), 3718af300298ab86752fa64e339ba34195888a830756Fariborz Jahanian Importer.Import(D->getIvarRBraceLoc())); 3719b4677b62a8e9bba0913dfe1456bd9d689cdbccacDouglas Gregor ToCategory->setLexicalDeclContext(LexicalDC); 37209faf810f08132aabb34a478297dfeea89c3bbe17Sean Callanan LexicalDC->addDeclInternal(ToCategory); 3721b4677b62a8e9bba0913dfe1456bd9d689cdbccacDouglas Gregor Importer.Imported(D, ToCategory); 372287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar // Import the type parameter list after calling Imported, to avoid 372387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar // loops when bringing in their DeclContext. 372487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar ToCategory->setTypeParamList(ImportObjCTypeParamList( 372587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar D->getTypeParamList())); 3726b4677b62a8e9bba0913dfe1456bd9d689cdbccacDouglas Gregor 3727b4677b62a8e9bba0913dfe1456bd9d689cdbccacDouglas Gregor // Import protocols 37285f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner SmallVector<ObjCProtocolDecl *, 4> Protocols; 37295f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner SmallVector<SourceLocation, 4> ProtocolLocs; 3730b4677b62a8e9bba0913dfe1456bd9d689cdbccacDouglas Gregor ObjCCategoryDecl::protocol_loc_iterator FromProtoLoc 3731b4677b62a8e9bba0913dfe1456bd9d689cdbccacDouglas Gregor = D->protocol_loc_begin(); 3732b4677b62a8e9bba0913dfe1456bd9d689cdbccacDouglas Gregor for (ObjCCategoryDecl::protocol_iterator FromProto = D->protocol_begin(), 3733b4677b62a8e9bba0913dfe1456bd9d689cdbccacDouglas Gregor FromProtoEnd = D->protocol_end(); 3734b4677b62a8e9bba0913dfe1456bd9d689cdbccacDouglas Gregor FromProto != FromProtoEnd; 3735b4677b62a8e9bba0913dfe1456bd9d689cdbccacDouglas Gregor ++FromProto, ++FromProtoLoc) { 3736b4677b62a8e9bba0913dfe1456bd9d689cdbccacDouglas Gregor ObjCProtocolDecl *ToProto 3737b4677b62a8e9bba0913dfe1456bd9d689cdbccacDouglas Gregor = cast_or_null<ObjCProtocolDecl>(Importer.Import(*FromProto)); 3738b4677b62a8e9bba0913dfe1456bd9d689cdbccacDouglas Gregor if (!ToProto) 37396bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return nullptr; 3740b4677b62a8e9bba0913dfe1456bd9d689cdbccacDouglas Gregor Protocols.push_back(ToProto); 3741b4677b62a8e9bba0913dfe1456bd9d689cdbccacDouglas Gregor ProtocolLocs.push_back(Importer.Import(*FromProtoLoc)); 3742b4677b62a8e9bba0913dfe1456bd9d689cdbccacDouglas Gregor } 3743b4677b62a8e9bba0913dfe1456bd9d689cdbccacDouglas Gregor 3744b4677b62a8e9bba0913dfe1456bd9d689cdbccacDouglas Gregor // FIXME: If we're merging, make sure that the protocol list is the same. 3745b4677b62a8e9bba0913dfe1456bd9d689cdbccacDouglas Gregor ToCategory->setProtocolList(Protocols.data(), Protocols.size(), 3746b4677b62a8e9bba0913dfe1456bd9d689cdbccacDouglas Gregor ProtocolLocs.data(), Importer.getToContext()); 3747b4677b62a8e9bba0913dfe1456bd9d689cdbccacDouglas Gregor 3748b4677b62a8e9bba0913dfe1456bd9d689cdbccacDouglas Gregor } else { 3749b4677b62a8e9bba0913dfe1456bd9d689cdbccacDouglas Gregor Importer.Imported(D, ToCategory); 3750b4677b62a8e9bba0913dfe1456bd9d689cdbccacDouglas Gregor } 3751b4677b62a8e9bba0913dfe1456bd9d689cdbccacDouglas Gregor 3752b4677b62a8e9bba0913dfe1456bd9d689cdbccacDouglas Gregor // Import all of the members of this category. 3753083a821bbd02bbc521275a2f144abe39a6c2745cDouglas Gregor ImportDeclContext(D); 3754b4677b62a8e9bba0913dfe1456bd9d689cdbccacDouglas Gregor 3755b4677b62a8e9bba0913dfe1456bd9d689cdbccacDouglas Gregor // If we have an implementation, import it as well. 3756b4677b62a8e9bba0913dfe1456bd9d689cdbccacDouglas Gregor if (D->getImplementation()) { 3757b4677b62a8e9bba0913dfe1456bd9d689cdbccacDouglas Gregor ObjCCategoryImplDecl *Impl 3758cad2c59b0c087edea83d0fbf6eabde4a7960c778Douglas Gregor = cast_or_null<ObjCCategoryImplDecl>( 3759cad2c59b0c087edea83d0fbf6eabde4a7960c778Douglas Gregor Importer.Import(D->getImplementation())); 3760b4677b62a8e9bba0913dfe1456bd9d689cdbccacDouglas Gregor if (!Impl) 37616bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return nullptr; 37626bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 3763b4677b62a8e9bba0913dfe1456bd9d689cdbccacDouglas Gregor ToCategory->setImplementation(Impl); 3764b4677b62a8e9bba0913dfe1456bd9d689cdbccacDouglas Gregor } 3765b4677b62a8e9bba0913dfe1456bd9d689cdbccacDouglas Gregor 3766b4677b62a8e9bba0913dfe1456bd9d689cdbccacDouglas Gregor return ToCategory; 3767b4677b62a8e9bba0913dfe1456bd9d689cdbccacDouglas Gregor} 3768b4677b62a8e9bba0913dfe1456bd9d689cdbccacDouglas Gregor 37695602f7e77e975d780f84079532408c0064566c3bDouglas Gregorbool ASTNodeImporter::ImportDefinition(ObjCProtocolDecl *From, 37705602f7e77e975d780f84079532408c0064566c3bDouglas Gregor ObjCProtocolDecl *To, 3771ac32ff9812e7d6bc31573b5499bfd005fc8b8f39Douglas Gregor ImportDefinitionKind Kind) { 37725602f7e77e975d780f84079532408c0064566c3bDouglas Gregor if (To->getDefinition()) { 3773ac32ff9812e7d6bc31573b5499bfd005fc8b8f39Douglas Gregor if (shouldForceImportDeclContext(Kind)) 3774ac32ff9812e7d6bc31573b5499bfd005fc8b8f39Douglas Gregor ImportDeclContext(From); 37755602f7e77e975d780f84079532408c0064566c3bDouglas Gregor return false; 37765602f7e77e975d780f84079532408c0064566c3bDouglas Gregor } 37775602f7e77e975d780f84079532408c0064566c3bDouglas Gregor 37785602f7e77e975d780f84079532408c0064566c3bDouglas Gregor // Start the protocol definition 37795602f7e77e975d780f84079532408c0064566c3bDouglas Gregor To->startDefinition(); 37805602f7e77e975d780f84079532408c0064566c3bDouglas Gregor 37815602f7e77e975d780f84079532408c0064566c3bDouglas Gregor // Import protocols 37825602f7e77e975d780f84079532408c0064566c3bDouglas Gregor SmallVector<ObjCProtocolDecl *, 4> Protocols; 37835602f7e77e975d780f84079532408c0064566c3bDouglas Gregor SmallVector<SourceLocation, 4> ProtocolLocs; 37845602f7e77e975d780f84079532408c0064566c3bDouglas Gregor ObjCProtocolDecl::protocol_loc_iterator 37855602f7e77e975d780f84079532408c0064566c3bDouglas Gregor FromProtoLoc = From->protocol_loc_begin(); 37865602f7e77e975d780f84079532408c0064566c3bDouglas Gregor for (ObjCProtocolDecl::protocol_iterator FromProto = From->protocol_begin(), 37875602f7e77e975d780f84079532408c0064566c3bDouglas Gregor FromProtoEnd = From->protocol_end(); 37885602f7e77e975d780f84079532408c0064566c3bDouglas Gregor FromProto != FromProtoEnd; 37895602f7e77e975d780f84079532408c0064566c3bDouglas Gregor ++FromProto, ++FromProtoLoc) { 37905602f7e77e975d780f84079532408c0064566c3bDouglas Gregor ObjCProtocolDecl *ToProto 37915602f7e77e975d780f84079532408c0064566c3bDouglas Gregor = cast_or_null<ObjCProtocolDecl>(Importer.Import(*FromProto)); 37925602f7e77e975d780f84079532408c0064566c3bDouglas Gregor if (!ToProto) 37935602f7e77e975d780f84079532408c0064566c3bDouglas Gregor return true; 37945602f7e77e975d780f84079532408c0064566c3bDouglas Gregor Protocols.push_back(ToProto); 37955602f7e77e975d780f84079532408c0064566c3bDouglas Gregor ProtocolLocs.push_back(Importer.Import(*FromProtoLoc)); 37965602f7e77e975d780f84079532408c0064566c3bDouglas Gregor } 37975602f7e77e975d780f84079532408c0064566c3bDouglas Gregor 37985602f7e77e975d780f84079532408c0064566c3bDouglas Gregor // FIXME: If we're merging, make sure that the protocol list is the same. 37995602f7e77e975d780f84079532408c0064566c3bDouglas Gregor To->setProtocolList(Protocols.data(), Protocols.size(), 38005602f7e77e975d780f84079532408c0064566c3bDouglas Gregor ProtocolLocs.data(), Importer.getToContext()); 38015602f7e77e975d780f84079532408c0064566c3bDouglas Gregor 3802ac32ff9812e7d6bc31573b5499bfd005fc8b8f39Douglas Gregor if (shouldForceImportDeclContext(Kind)) { 3803ac32ff9812e7d6bc31573b5499bfd005fc8b8f39Douglas Gregor // Import all of the members of this protocol. 3804ac32ff9812e7d6bc31573b5499bfd005fc8b8f39Douglas Gregor ImportDeclContext(From, /*ForceImport=*/true); 3805ac32ff9812e7d6bc31573b5499bfd005fc8b8f39Douglas Gregor } 38065602f7e77e975d780f84079532408c0064566c3bDouglas Gregor return false; 38075602f7e77e975d780f84079532408c0064566c3bDouglas Gregor} 38085602f7e77e975d780f84079532408c0064566c3bDouglas Gregor 38092e2a400383c7a64a927f61eeed596b08928e1d4bDouglas GregorDecl *ASTNodeImporter::VisitObjCProtocolDecl(ObjCProtocolDecl *D) { 38105602f7e77e975d780f84079532408c0064566c3bDouglas Gregor // If this protocol has a definition in the translation unit we're coming 38115602f7e77e975d780f84079532408c0064566c3bDouglas Gregor // from, but this particular declaration is not that definition, import the 38125602f7e77e975d780f84079532408c0064566c3bDouglas Gregor // definition and map to that. 38135602f7e77e975d780f84079532408c0064566c3bDouglas Gregor ObjCProtocolDecl *Definition = D->getDefinition(); 38145602f7e77e975d780f84079532408c0064566c3bDouglas Gregor if (Definition && Definition != D) { 38155602f7e77e975d780f84079532408c0064566c3bDouglas Gregor Decl *ImportedDef = Importer.Import(Definition); 38165602f7e77e975d780f84079532408c0064566c3bDouglas Gregor if (!ImportedDef) 38176bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return nullptr; 38186bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 38195602f7e77e975d780f84079532408c0064566c3bDouglas Gregor return Importer.Imported(D, ImportedDef); 38205602f7e77e975d780f84079532408c0064566c3bDouglas Gregor } 38215602f7e77e975d780f84079532408c0064566c3bDouglas Gregor 3822b4677b62a8e9bba0913dfe1456bd9d689cdbccacDouglas Gregor // Import the major distinguishing characteristics of a protocol. 38232e2a400383c7a64a927f61eeed596b08928e1d4bDouglas Gregor DeclContext *DC, *LexicalDC; 38242e2a400383c7a64a927f61eeed596b08928e1d4bDouglas Gregor DeclarationName Name; 38252e2a400383c7a64a927f61eeed596b08928e1d4bDouglas Gregor SourceLocation Loc; 3826b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar NamedDecl *ToD; 3827b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar if (ImportDeclParts(D, DC, LexicalDC, Name, ToD, Loc)) 38286bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return nullptr; 3829b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar if (ToD) 3830b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar return ToD; 38312e2a400383c7a64a927f61eeed596b08928e1d4bDouglas Gregor 38326bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines ObjCProtocolDecl *MergeWithProtocol = nullptr; 3833cfa88f893915ceb8ae4ce2f17c46c24a4d67502fDmitri Gribenko SmallVector<NamedDecl *, 2> FoundDecls; 38340e2c34f92f00628d48968dfea096d36381f494cbStephen Hines DC->getRedeclContext()->localUncachedLookup(Name, FoundDecls); 3835b75a3451bcae1301875282e73a13934c90b6574cDouglas Gregor for (unsigned I = 0, N = FoundDecls.size(); I != N; ++I) { 3836b75a3451bcae1301875282e73a13934c90b6574cDouglas Gregor if (!FoundDecls[I]->isInIdentifierNamespace(Decl::IDNS_ObjCProtocol)) 38372e2a400383c7a64a927f61eeed596b08928e1d4bDouglas Gregor continue; 38382e2a400383c7a64a927f61eeed596b08928e1d4bDouglas Gregor 3839b75a3451bcae1301875282e73a13934c90b6574cDouglas Gregor if ((MergeWithProtocol = dyn_cast<ObjCProtocolDecl>(FoundDecls[I]))) 38402e2a400383c7a64a927f61eeed596b08928e1d4bDouglas Gregor break; 38412e2a400383c7a64a927f61eeed596b08928e1d4bDouglas Gregor } 38422e2a400383c7a64a927f61eeed596b08928e1d4bDouglas Gregor 38432e2a400383c7a64a927f61eeed596b08928e1d4bDouglas Gregor ObjCProtocolDecl *ToProto = MergeWithProtocol; 38445602f7e77e975d780f84079532408c0064566c3bDouglas Gregor if (!ToProto) { 38455602f7e77e975d780f84079532408c0064566c3bDouglas Gregor ToProto = ObjCProtocolDecl::Create(Importer.getToContext(), DC, 38465602f7e77e975d780f84079532408c0064566c3bDouglas Gregor Name.getAsIdentifierInfo(), Loc, 38475602f7e77e975d780f84079532408c0064566c3bDouglas Gregor Importer.Import(D->getAtStartLoc()), 38486bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines /*PrevDecl=*/nullptr); 38495602f7e77e975d780f84079532408c0064566c3bDouglas Gregor ToProto->setLexicalDeclContext(LexicalDC); 38505602f7e77e975d780f84079532408c0064566c3bDouglas Gregor LexicalDC->addDeclInternal(ToProto); 38515602f7e77e975d780f84079532408c0064566c3bDouglas Gregor } 38525e2a1ff9f28d2eab256d2553e76a9c9d54693875Douglas Gregor 38535602f7e77e975d780f84079532408c0064566c3bDouglas Gregor Importer.Imported(D, ToProto); 38542e2a400383c7a64a927f61eeed596b08928e1d4bDouglas Gregor 38555602f7e77e975d780f84079532408c0064566c3bDouglas Gregor if (D->isThisDeclarationADefinition() && ImportDefinition(D, ToProto)) 38566bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return nullptr; 38576bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 38585602f7e77e975d780f84079532408c0064566c3bDouglas Gregor return ToProto; 38595602f7e77e975d780f84079532408c0064566c3bDouglas Gregor} 38605602f7e77e975d780f84079532408c0064566c3bDouglas Gregor 38610e2c34f92f00628d48968dfea096d36381f494cbStephen HinesDecl *ASTNodeImporter::VisitLinkageSpecDecl(LinkageSpecDecl *D) { 38620e2c34f92f00628d48968dfea096d36381f494cbStephen Hines DeclContext *DC = Importer.ImportContext(D->getDeclContext()); 38630e2c34f92f00628d48968dfea096d36381f494cbStephen Hines DeclContext *LexicalDC = Importer.ImportContext(D->getLexicalDeclContext()); 38640e2c34f92f00628d48968dfea096d36381f494cbStephen Hines 38650e2c34f92f00628d48968dfea096d36381f494cbStephen Hines SourceLocation ExternLoc = Importer.Import(D->getExternLoc()); 38660e2c34f92f00628d48968dfea096d36381f494cbStephen Hines SourceLocation LangLoc = Importer.Import(D->getLocation()); 38670e2c34f92f00628d48968dfea096d36381f494cbStephen Hines 38680e2c34f92f00628d48968dfea096d36381f494cbStephen Hines bool HasBraces = D->hasBraces(); 38690e2c34f92f00628d48968dfea096d36381f494cbStephen Hines 38700e2c34f92f00628d48968dfea096d36381f494cbStephen Hines LinkageSpecDecl *ToLinkageSpec = 38710e2c34f92f00628d48968dfea096d36381f494cbStephen Hines LinkageSpecDecl::Create(Importer.getToContext(), 38720e2c34f92f00628d48968dfea096d36381f494cbStephen Hines DC, 38730e2c34f92f00628d48968dfea096d36381f494cbStephen Hines ExternLoc, 38740e2c34f92f00628d48968dfea096d36381f494cbStephen Hines LangLoc, 38750e2c34f92f00628d48968dfea096d36381f494cbStephen Hines D->getLanguage(), 38760e2c34f92f00628d48968dfea096d36381f494cbStephen Hines HasBraces); 38770e2c34f92f00628d48968dfea096d36381f494cbStephen Hines 38780e2c34f92f00628d48968dfea096d36381f494cbStephen Hines if (HasBraces) { 38790e2c34f92f00628d48968dfea096d36381f494cbStephen Hines SourceLocation RBraceLoc = Importer.Import(D->getRBraceLoc()); 38800e2c34f92f00628d48968dfea096d36381f494cbStephen Hines ToLinkageSpec->setRBraceLoc(RBraceLoc); 38810e2c34f92f00628d48968dfea096d36381f494cbStephen Hines } 38820e2c34f92f00628d48968dfea096d36381f494cbStephen Hines 38830e2c34f92f00628d48968dfea096d36381f494cbStephen Hines ToLinkageSpec->setLexicalDeclContext(LexicalDC); 38840e2c34f92f00628d48968dfea096d36381f494cbStephen Hines LexicalDC->addDeclInternal(ToLinkageSpec); 38850e2c34f92f00628d48968dfea096d36381f494cbStephen Hines 38860e2c34f92f00628d48968dfea096d36381f494cbStephen Hines Importer.Imported(D, ToLinkageSpec); 38870e2c34f92f00628d48968dfea096d36381f494cbStephen Hines 38880e2c34f92f00628d48968dfea096d36381f494cbStephen Hines return ToLinkageSpec; 38890e2c34f92f00628d48968dfea096d36381f494cbStephen Hines} 38900e2c34f92f00628d48968dfea096d36381f494cbStephen Hines 38915602f7e77e975d780f84079532408c0064566c3bDouglas Gregorbool ASTNodeImporter::ImportDefinition(ObjCInterfaceDecl *From, 38925602f7e77e975d780f84079532408c0064566c3bDouglas Gregor ObjCInterfaceDecl *To, 3893ac32ff9812e7d6bc31573b5499bfd005fc8b8f39Douglas Gregor ImportDefinitionKind Kind) { 38945602f7e77e975d780f84079532408c0064566c3bDouglas Gregor if (To->getDefinition()) { 38955602f7e77e975d780f84079532408c0064566c3bDouglas Gregor // Check consistency of superclass. 38965602f7e77e975d780f84079532408c0064566c3bDouglas Gregor ObjCInterfaceDecl *FromSuper = From->getSuperClass(); 38975602f7e77e975d780f84079532408c0064566c3bDouglas Gregor if (FromSuper) { 38985602f7e77e975d780f84079532408c0064566c3bDouglas Gregor FromSuper = cast_or_null<ObjCInterfaceDecl>(Importer.Import(FromSuper)); 38995602f7e77e975d780f84079532408c0064566c3bDouglas Gregor if (!FromSuper) 39005602f7e77e975d780f84079532408c0064566c3bDouglas Gregor return true; 39012e2a400383c7a64a927f61eeed596b08928e1d4bDouglas Gregor } 39022e2a400383c7a64a927f61eeed596b08928e1d4bDouglas Gregor 39035602f7e77e975d780f84079532408c0064566c3bDouglas Gregor ObjCInterfaceDecl *ToSuper = To->getSuperClass(); 39045602f7e77e975d780f84079532408c0064566c3bDouglas Gregor if ((bool)FromSuper != (bool)ToSuper || 39055602f7e77e975d780f84079532408c0064566c3bDouglas Gregor (FromSuper && !declaresSameEntity(FromSuper, ToSuper))) { 39065602f7e77e975d780f84079532408c0064566c3bDouglas Gregor Importer.ToDiag(To->getLocation(), 39075602f7e77e975d780f84079532408c0064566c3bDouglas Gregor diag::err_odr_objc_superclass_inconsistent) 39085602f7e77e975d780f84079532408c0064566c3bDouglas Gregor << To->getDeclName(); 39095602f7e77e975d780f84079532408c0064566c3bDouglas Gregor if (ToSuper) 39105602f7e77e975d780f84079532408c0064566c3bDouglas Gregor Importer.ToDiag(To->getSuperClassLoc(), diag::note_odr_objc_superclass) 39115602f7e77e975d780f84079532408c0064566c3bDouglas Gregor << To->getSuperClass()->getDeclName(); 39125602f7e77e975d780f84079532408c0064566c3bDouglas Gregor else 39135602f7e77e975d780f84079532408c0064566c3bDouglas Gregor Importer.ToDiag(To->getLocation(), 39145602f7e77e975d780f84079532408c0064566c3bDouglas Gregor diag::note_odr_objc_missing_superclass); 39155602f7e77e975d780f84079532408c0064566c3bDouglas Gregor if (From->getSuperClass()) 39165602f7e77e975d780f84079532408c0064566c3bDouglas Gregor Importer.FromDiag(From->getSuperClassLoc(), 39175602f7e77e975d780f84079532408c0064566c3bDouglas Gregor diag::note_odr_objc_superclass) 39185602f7e77e975d780f84079532408c0064566c3bDouglas Gregor << From->getSuperClass()->getDeclName(); 39195602f7e77e975d780f84079532408c0064566c3bDouglas Gregor else 39205602f7e77e975d780f84079532408c0064566c3bDouglas Gregor Importer.FromDiag(From->getLocation(), 39215602f7e77e975d780f84079532408c0064566c3bDouglas Gregor diag::note_odr_objc_missing_superclass); 39225602f7e77e975d780f84079532408c0064566c3bDouglas Gregor } 39235602f7e77e975d780f84079532408c0064566c3bDouglas Gregor 3924ac32ff9812e7d6bc31573b5499bfd005fc8b8f39Douglas Gregor if (shouldForceImportDeclContext(Kind)) 3925ac32ff9812e7d6bc31573b5499bfd005fc8b8f39Douglas Gregor ImportDeclContext(From); 39265602f7e77e975d780f84079532408c0064566c3bDouglas Gregor return false; 39275602f7e77e975d780f84079532408c0064566c3bDouglas Gregor } 39285602f7e77e975d780f84079532408c0064566c3bDouglas Gregor 39295602f7e77e975d780f84079532408c0064566c3bDouglas Gregor // Start the definition. 39305602f7e77e975d780f84079532408c0064566c3bDouglas Gregor To->startDefinition(); 39315602f7e77e975d780f84079532408c0064566c3bDouglas Gregor 39325602f7e77e975d780f84079532408c0064566c3bDouglas Gregor // If this class has a superclass, import it. 39335602f7e77e975d780f84079532408c0064566c3bDouglas Gregor if (From->getSuperClass()) { 393487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar TypeSourceInfo *SuperTInfo = Importer.Import(From->getSuperClassTInfo()); 393587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar if (!SuperTInfo) 39365602f7e77e975d780f84079532408c0064566c3bDouglas Gregor return true; 393787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar 393887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar To->setSuperClass(SuperTInfo); 39395602f7e77e975d780f84079532408c0064566c3bDouglas Gregor } 39405602f7e77e975d780f84079532408c0064566c3bDouglas Gregor 39415602f7e77e975d780f84079532408c0064566c3bDouglas Gregor // Import protocols 39425602f7e77e975d780f84079532408c0064566c3bDouglas Gregor SmallVector<ObjCProtocolDecl *, 4> Protocols; 39435602f7e77e975d780f84079532408c0064566c3bDouglas Gregor SmallVector<SourceLocation, 4> ProtocolLocs; 39445602f7e77e975d780f84079532408c0064566c3bDouglas Gregor ObjCInterfaceDecl::protocol_loc_iterator 39455602f7e77e975d780f84079532408c0064566c3bDouglas Gregor FromProtoLoc = From->protocol_loc_begin(); 39465602f7e77e975d780f84079532408c0064566c3bDouglas Gregor 39475602f7e77e975d780f84079532408c0064566c3bDouglas Gregor for (ObjCInterfaceDecl::protocol_iterator FromProto = From->protocol_begin(), 39485602f7e77e975d780f84079532408c0064566c3bDouglas Gregor FromProtoEnd = From->protocol_end(); 39495602f7e77e975d780f84079532408c0064566c3bDouglas Gregor FromProto != FromProtoEnd; 39505602f7e77e975d780f84079532408c0064566c3bDouglas Gregor ++FromProto, ++FromProtoLoc) { 39515602f7e77e975d780f84079532408c0064566c3bDouglas Gregor ObjCProtocolDecl *ToProto 39525602f7e77e975d780f84079532408c0064566c3bDouglas Gregor = cast_or_null<ObjCProtocolDecl>(Importer.Import(*FromProto)); 39535602f7e77e975d780f84079532408c0064566c3bDouglas Gregor if (!ToProto) 39545602f7e77e975d780f84079532408c0064566c3bDouglas Gregor return true; 39555602f7e77e975d780f84079532408c0064566c3bDouglas Gregor Protocols.push_back(ToProto); 39565602f7e77e975d780f84079532408c0064566c3bDouglas Gregor ProtocolLocs.push_back(Importer.Import(*FromProtoLoc)); 39572e2a400383c7a64a927f61eeed596b08928e1d4bDouglas Gregor } 39585602f7e77e975d780f84079532408c0064566c3bDouglas Gregor 39595602f7e77e975d780f84079532408c0064566c3bDouglas Gregor // FIXME: If we're merging, make sure that the protocol list is the same. 39605602f7e77e975d780f84079532408c0064566c3bDouglas Gregor To->setProtocolList(Protocols.data(), Protocols.size(), 39615602f7e77e975d780f84079532408c0064566c3bDouglas Gregor ProtocolLocs.data(), Importer.getToContext()); 39625602f7e77e975d780f84079532408c0064566c3bDouglas Gregor 39635602f7e77e975d780f84079532408c0064566c3bDouglas Gregor // Import categories. When the categories themselves are imported, they'll 39645602f7e77e975d780f84079532408c0064566c3bDouglas Gregor // hook themselves into this interface. 3965651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines for (auto *Cat : From->known_categories()) 3966651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines Importer.Import(Cat); 3967d329724745b49f894b768d47275b7c2713106e89Douglas Gregor 39685602f7e77e975d780f84079532408c0064566c3bDouglas Gregor // If we have an @implementation, import it as well. 39695602f7e77e975d780f84079532408c0064566c3bDouglas Gregor if (From->getImplementation()) { 39705602f7e77e975d780f84079532408c0064566c3bDouglas Gregor ObjCImplementationDecl *Impl = cast_or_null<ObjCImplementationDecl>( 39715602f7e77e975d780f84079532408c0064566c3bDouglas Gregor Importer.Import(From->getImplementation())); 39725602f7e77e975d780f84079532408c0064566c3bDouglas Gregor if (!Impl) 39735602f7e77e975d780f84079532408c0064566c3bDouglas Gregor return true; 39745602f7e77e975d780f84079532408c0064566c3bDouglas Gregor 39755602f7e77e975d780f84079532408c0064566c3bDouglas Gregor To->setImplementation(Impl); 39765602f7e77e975d780f84079532408c0064566c3bDouglas Gregor } 39772e2a400383c7a64a927f61eeed596b08928e1d4bDouglas Gregor 3978ac32ff9812e7d6bc31573b5499bfd005fc8b8f39Douglas Gregor if (shouldForceImportDeclContext(Kind)) { 3979ac32ff9812e7d6bc31573b5499bfd005fc8b8f39Douglas Gregor // Import all of the members of this class. 3980ac32ff9812e7d6bc31573b5499bfd005fc8b8f39Douglas Gregor ImportDeclContext(From, /*ForceImport=*/true); 3981ac32ff9812e7d6bc31573b5499bfd005fc8b8f39Douglas Gregor } 39825602f7e77e975d780f84079532408c0064566c3bDouglas Gregor return false; 39832e2a400383c7a64a927f61eeed596b08928e1d4bDouglas Gregor} 39842e2a400383c7a64a927f61eeed596b08928e1d4bDouglas Gregor 398587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga NainarObjCTypeParamList * 398687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga NainarASTNodeImporter::ImportObjCTypeParamList(ObjCTypeParamList *list) { 398787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar if (!list) 398887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar return nullptr; 398987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar 399087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar SmallVector<ObjCTypeParamDecl *, 4> toTypeParams; 399187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar for (auto fromTypeParam : *list) { 399287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar auto toTypeParam = cast_or_null<ObjCTypeParamDecl>( 399387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar Importer.Import(fromTypeParam)); 399487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar if (!toTypeParam) 399587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar return nullptr; 399687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar 399787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar toTypeParams.push_back(toTypeParam); 399887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar } 399987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar 400087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar return ObjCTypeParamList::create(Importer.getToContext(), 400187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar Importer.Import(list->getLAngleLoc()), 400287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar toTypeParams, 400387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar Importer.Import(list->getRAngleLoc())); 400487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar} 400587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar 4006a12d294db5bd59cd8836b9bd0dafadaaa2e3dd8aDouglas GregorDecl *ASTNodeImporter::VisitObjCInterfaceDecl(ObjCInterfaceDecl *D) { 40075602f7e77e975d780f84079532408c0064566c3bDouglas Gregor // If this class has a definition in the translation unit we're coming from, 40085602f7e77e975d780f84079532408c0064566c3bDouglas Gregor // but this particular declaration is not that definition, import the 40095602f7e77e975d780f84079532408c0064566c3bDouglas Gregor // definition and map to that. 40105602f7e77e975d780f84079532408c0064566c3bDouglas Gregor ObjCInterfaceDecl *Definition = D->getDefinition(); 40115602f7e77e975d780f84079532408c0064566c3bDouglas Gregor if (Definition && Definition != D) { 40125602f7e77e975d780f84079532408c0064566c3bDouglas Gregor Decl *ImportedDef = Importer.Import(Definition); 40135602f7e77e975d780f84079532408c0064566c3bDouglas Gregor if (!ImportedDef) 40146bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return nullptr; 40156bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 40165602f7e77e975d780f84079532408c0064566c3bDouglas Gregor return Importer.Imported(D, ImportedDef); 40175602f7e77e975d780f84079532408c0064566c3bDouglas Gregor } 40185602f7e77e975d780f84079532408c0064566c3bDouglas Gregor 4019a12d294db5bd59cd8836b9bd0dafadaaa2e3dd8aDouglas Gregor // Import the major distinguishing characteristics of an @interface. 4020a12d294db5bd59cd8836b9bd0dafadaaa2e3dd8aDouglas Gregor DeclContext *DC, *LexicalDC; 4021a12d294db5bd59cd8836b9bd0dafadaaa2e3dd8aDouglas Gregor DeclarationName Name; 4022a12d294db5bd59cd8836b9bd0dafadaaa2e3dd8aDouglas Gregor SourceLocation Loc; 4023b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar NamedDecl *ToD; 4024b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar if (ImportDeclParts(D, DC, LexicalDC, Name, ToD, Loc)) 40256bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return nullptr; 4026b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar if (ToD) 4027b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar return ToD; 4028a12d294db5bd59cd8836b9bd0dafadaaa2e3dd8aDouglas Gregor 40295602f7e77e975d780f84079532408c0064566c3bDouglas Gregor // Look for an existing interface with the same name. 40306bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines ObjCInterfaceDecl *MergeWithIface = nullptr; 4031cfa88f893915ceb8ae4ce2f17c46c24a4d67502fDmitri Gribenko SmallVector<NamedDecl *, 2> FoundDecls; 40320e2c34f92f00628d48968dfea096d36381f494cbStephen Hines DC->getRedeclContext()->localUncachedLookup(Name, FoundDecls); 4033b75a3451bcae1301875282e73a13934c90b6574cDouglas Gregor for (unsigned I = 0, N = FoundDecls.size(); I != N; ++I) { 4034b75a3451bcae1301875282e73a13934c90b6574cDouglas Gregor if (!FoundDecls[I]->isInIdentifierNamespace(Decl::IDNS_Ordinary)) 4035a12d294db5bd59cd8836b9bd0dafadaaa2e3dd8aDouglas Gregor continue; 4036a12d294db5bd59cd8836b9bd0dafadaaa2e3dd8aDouglas Gregor 4037b75a3451bcae1301875282e73a13934c90b6574cDouglas Gregor if ((MergeWithIface = dyn_cast<ObjCInterfaceDecl>(FoundDecls[I]))) 4038a12d294db5bd59cd8836b9bd0dafadaaa2e3dd8aDouglas Gregor break; 4039a12d294db5bd59cd8836b9bd0dafadaaa2e3dd8aDouglas Gregor } 4040a12d294db5bd59cd8836b9bd0dafadaaa2e3dd8aDouglas Gregor 40415602f7e77e975d780f84079532408c0064566c3bDouglas Gregor // Create an interface declaration, if one does not already exist. 4042a12d294db5bd59cd8836b9bd0dafadaaa2e3dd8aDouglas Gregor ObjCInterfaceDecl *ToIface = MergeWithIface; 40435602f7e77e975d780f84079532408c0064566c3bDouglas Gregor if (!ToIface) { 40445602f7e77e975d780f84079532408c0064566c3bDouglas Gregor ToIface = ObjCInterfaceDecl::Create(Importer.getToContext(), DC, 40455602f7e77e975d780f84079532408c0064566c3bDouglas Gregor Importer.Import(D->getAtStartLoc()), 404687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar Name.getAsIdentifierInfo(), 404787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar /*TypeParamList=*/nullptr, 40486bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines /*PrevDecl=*/nullptr, Loc, 40495602f7e77e975d780f84079532408c0064566c3bDouglas Gregor D->isImplicitInterfaceDecl()); 40505602f7e77e975d780f84079532408c0064566c3bDouglas Gregor ToIface->setLexicalDeclContext(LexicalDC); 40515602f7e77e975d780f84079532408c0064566c3bDouglas Gregor LexicalDC->addDeclInternal(ToIface); 4052a12d294db5bd59cd8836b9bd0dafadaaa2e3dd8aDouglas Gregor } 40535602f7e77e975d780f84079532408c0064566c3bDouglas Gregor Importer.Imported(D, ToIface); 405487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar // Import the type parameter list after calling Imported, to avoid 405587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar // loops when bringing in their DeclContext. 405687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar ToIface->setTypeParamList(ImportObjCTypeParamList( 405787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar D->getTypeParamListAsWritten())); 4058a12d294db5bd59cd8836b9bd0dafadaaa2e3dd8aDouglas Gregor 40595602f7e77e975d780f84079532408c0064566c3bDouglas Gregor if (D->isThisDeclarationADefinition() && ImportDefinition(D, ToIface)) 40606bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return nullptr; 40616bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 40622e2a400383c7a64a927f61eeed596b08928e1d4bDouglas Gregor return ToIface; 4063a12d294db5bd59cd8836b9bd0dafadaaa2e3dd8aDouglas Gregor} 4064a12d294db5bd59cd8836b9bd0dafadaaa2e3dd8aDouglas Gregor 40653daef29bf390dbdb3603748280afd5827d1811daDouglas GregorDecl *ASTNodeImporter::VisitObjCCategoryImplDecl(ObjCCategoryImplDecl *D) { 40663daef29bf390dbdb3603748280afd5827d1811daDouglas Gregor ObjCCategoryDecl *Category = cast_or_null<ObjCCategoryDecl>( 40673daef29bf390dbdb3603748280afd5827d1811daDouglas Gregor Importer.Import(D->getCategoryDecl())); 40683daef29bf390dbdb3603748280afd5827d1811daDouglas Gregor if (!Category) 40696bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return nullptr; 40706bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 40713daef29bf390dbdb3603748280afd5827d1811daDouglas Gregor ObjCCategoryImplDecl *ToImpl = Category->getImplementation(); 40723daef29bf390dbdb3603748280afd5827d1811daDouglas Gregor if (!ToImpl) { 40733daef29bf390dbdb3603748280afd5827d1811daDouglas Gregor DeclContext *DC = Importer.ImportContext(D->getDeclContext()); 40743daef29bf390dbdb3603748280afd5827d1811daDouglas Gregor if (!DC) 40756bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return nullptr; 40766bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 4077c6994005dc9f677c831b8e90bdab483cc2197c29Argyrios Kyrtzidis SourceLocation CategoryNameLoc = Importer.Import(D->getCategoryNameLoc()); 40783daef29bf390dbdb3603748280afd5827d1811daDouglas Gregor ToImpl = ObjCCategoryImplDecl::Create(Importer.getToContext(), DC, 40793daef29bf390dbdb3603748280afd5827d1811daDouglas Gregor Importer.Import(D->getIdentifier()), 40801711fc91efb36d131f7ba771f73f0154dc1abd1fArgyrios Kyrtzidis Category->getClassInterface(), 40811711fc91efb36d131f7ba771f73f0154dc1abd1fArgyrios Kyrtzidis Importer.Import(D->getLocation()), 4082c6994005dc9f677c831b8e90bdab483cc2197c29Argyrios Kyrtzidis Importer.Import(D->getAtStartLoc()), 4083c6994005dc9f677c831b8e90bdab483cc2197c29Argyrios Kyrtzidis CategoryNameLoc); 40843daef29bf390dbdb3603748280afd5827d1811daDouglas Gregor 40853daef29bf390dbdb3603748280afd5827d1811daDouglas Gregor DeclContext *LexicalDC = DC; 40863daef29bf390dbdb3603748280afd5827d1811daDouglas Gregor if (D->getDeclContext() != D->getLexicalDeclContext()) { 40873daef29bf390dbdb3603748280afd5827d1811daDouglas Gregor LexicalDC = Importer.ImportContext(D->getLexicalDeclContext()); 40883daef29bf390dbdb3603748280afd5827d1811daDouglas Gregor if (!LexicalDC) 40896bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return nullptr; 40906bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 40913daef29bf390dbdb3603748280afd5827d1811daDouglas Gregor ToImpl->setLexicalDeclContext(LexicalDC); 40923daef29bf390dbdb3603748280afd5827d1811daDouglas Gregor } 40933daef29bf390dbdb3603748280afd5827d1811daDouglas Gregor 40949faf810f08132aabb34a478297dfeea89c3bbe17Sean Callanan LexicalDC->addDeclInternal(ToImpl); 40953daef29bf390dbdb3603748280afd5827d1811daDouglas Gregor Category->setImplementation(ToImpl); 40963daef29bf390dbdb3603748280afd5827d1811daDouglas Gregor } 40973daef29bf390dbdb3603748280afd5827d1811daDouglas Gregor 40983daef29bf390dbdb3603748280afd5827d1811daDouglas Gregor Importer.Imported(D, ToImpl); 4099cad2c59b0c087edea83d0fbf6eabde4a7960c778Douglas Gregor ImportDeclContext(D); 41003daef29bf390dbdb3603748280afd5827d1811daDouglas Gregor return ToImpl; 41013daef29bf390dbdb3603748280afd5827d1811daDouglas Gregor} 41023daef29bf390dbdb3603748280afd5827d1811daDouglas Gregor 4103dd182ff10b9145e432dea1fd2fb67100ccca3b10Douglas GregorDecl *ASTNodeImporter::VisitObjCImplementationDecl(ObjCImplementationDecl *D) { 4104dd182ff10b9145e432dea1fd2fb67100ccca3b10Douglas Gregor // Find the corresponding interface. 4105dd182ff10b9145e432dea1fd2fb67100ccca3b10Douglas Gregor ObjCInterfaceDecl *Iface = cast_or_null<ObjCInterfaceDecl>( 4106dd182ff10b9145e432dea1fd2fb67100ccca3b10Douglas Gregor Importer.Import(D->getClassInterface())); 4107dd182ff10b9145e432dea1fd2fb67100ccca3b10Douglas Gregor if (!Iface) 41086bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return nullptr; 4109dd182ff10b9145e432dea1fd2fb67100ccca3b10Douglas Gregor 4110dd182ff10b9145e432dea1fd2fb67100ccca3b10Douglas Gregor // Import the superclass, if any. 41116bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines ObjCInterfaceDecl *Super = nullptr; 4112dd182ff10b9145e432dea1fd2fb67100ccca3b10Douglas Gregor if (D->getSuperClass()) { 4113dd182ff10b9145e432dea1fd2fb67100ccca3b10Douglas Gregor Super = cast_or_null<ObjCInterfaceDecl>( 4114dd182ff10b9145e432dea1fd2fb67100ccca3b10Douglas Gregor Importer.Import(D->getSuperClass())); 4115dd182ff10b9145e432dea1fd2fb67100ccca3b10Douglas Gregor if (!Super) 41166bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return nullptr; 4117dd182ff10b9145e432dea1fd2fb67100ccca3b10Douglas Gregor } 4118dd182ff10b9145e432dea1fd2fb67100ccca3b10Douglas Gregor 4119dd182ff10b9145e432dea1fd2fb67100ccca3b10Douglas Gregor ObjCImplementationDecl *Impl = Iface->getImplementation(); 4120dd182ff10b9145e432dea1fd2fb67100ccca3b10Douglas Gregor if (!Impl) { 4121dd182ff10b9145e432dea1fd2fb67100ccca3b10Douglas Gregor // We haven't imported an implementation yet. Create a new @implementation 4122dd182ff10b9145e432dea1fd2fb67100ccca3b10Douglas Gregor // now. 4123dd182ff10b9145e432dea1fd2fb67100ccca3b10Douglas Gregor Impl = ObjCImplementationDecl::Create(Importer.getToContext(), 4124dd182ff10b9145e432dea1fd2fb67100ccca3b10Douglas Gregor Importer.ImportContext(D->getDeclContext()), 41251711fc91efb36d131f7ba771f73f0154dc1abd1fArgyrios Kyrtzidis Iface, Super, 4126dd182ff10b9145e432dea1fd2fb67100ccca3b10Douglas Gregor Importer.Import(D->getLocation()), 4127af300298ab86752fa64e339ba34195888a830756Fariborz Jahanian Importer.Import(D->getAtStartLoc()), 41282f729009067e6aff6198719ec9f8220d88cfea09Argyrios Kyrtzidis Importer.Import(D->getSuperClassLoc()), 4129af300298ab86752fa64e339ba34195888a830756Fariborz Jahanian Importer.Import(D->getIvarLBraceLoc()), 4130af300298ab86752fa64e339ba34195888a830756Fariborz Jahanian Importer.Import(D->getIvarRBraceLoc())); 4131dd182ff10b9145e432dea1fd2fb67100ccca3b10Douglas Gregor 4132dd182ff10b9145e432dea1fd2fb67100ccca3b10Douglas Gregor if (D->getDeclContext() != D->getLexicalDeclContext()) { 4133dd182ff10b9145e432dea1fd2fb67100ccca3b10Douglas Gregor DeclContext *LexicalDC 4134dd182ff10b9145e432dea1fd2fb67100ccca3b10Douglas Gregor = Importer.ImportContext(D->getLexicalDeclContext()); 4135dd182ff10b9145e432dea1fd2fb67100ccca3b10Douglas Gregor if (!LexicalDC) 41366bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return nullptr; 4137dd182ff10b9145e432dea1fd2fb67100ccca3b10Douglas Gregor Impl->setLexicalDeclContext(LexicalDC); 4138dd182ff10b9145e432dea1fd2fb67100ccca3b10Douglas Gregor } 4139dd182ff10b9145e432dea1fd2fb67100ccca3b10Douglas Gregor 4140dd182ff10b9145e432dea1fd2fb67100ccca3b10Douglas Gregor // Associate the implementation with the class it implements. 4141dd182ff10b9145e432dea1fd2fb67100ccca3b10Douglas Gregor Iface->setImplementation(Impl); 4142dd182ff10b9145e432dea1fd2fb67100ccca3b10Douglas Gregor Importer.Imported(D, Iface->getImplementation()); 4143dd182ff10b9145e432dea1fd2fb67100ccca3b10Douglas Gregor } else { 4144dd182ff10b9145e432dea1fd2fb67100ccca3b10Douglas Gregor Importer.Imported(D, Iface->getImplementation()); 4145dd182ff10b9145e432dea1fd2fb67100ccca3b10Douglas Gregor 4146dd182ff10b9145e432dea1fd2fb67100ccca3b10Douglas Gregor // Verify that the existing @implementation has the same superclass. 4147dd182ff10b9145e432dea1fd2fb67100ccca3b10Douglas Gregor if ((Super && !Impl->getSuperClass()) || 4148dd182ff10b9145e432dea1fd2fb67100ccca3b10Douglas Gregor (!Super && Impl->getSuperClass()) || 41496bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines (Super && Impl->getSuperClass() && 41506bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines !declaresSameEntity(Super->getCanonicalDecl(), 41516bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines Impl->getSuperClass()))) { 41526bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines Importer.ToDiag(Impl->getLocation(), 41536bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines diag::err_odr_objc_superclass_inconsistent) 41546bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines << Iface->getDeclName(); 41556bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines // FIXME: It would be nice to have the location of the superclass 41566bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines // below. 41576bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines if (Impl->getSuperClass()) 41586bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines Importer.ToDiag(Impl->getLocation(), 41596bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines diag::note_odr_objc_superclass) 41606bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines << Impl->getSuperClass()->getDeclName(); 41616bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines else 41626bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines Importer.ToDiag(Impl->getLocation(), 41636bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines diag::note_odr_objc_missing_superclass); 41646bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines if (D->getSuperClass()) 41656bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines Importer.FromDiag(D->getLocation(), 4166dd182ff10b9145e432dea1fd2fb67100ccca3b10Douglas Gregor diag::note_odr_objc_superclass) 41676bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines << D->getSuperClass()->getDeclName(); 41686bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines else 41696bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines Importer.FromDiag(D->getLocation(), 4170dd182ff10b9145e432dea1fd2fb67100ccca3b10Douglas Gregor diag::note_odr_objc_missing_superclass); 41716bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return nullptr; 4172dd182ff10b9145e432dea1fd2fb67100ccca3b10Douglas Gregor } 4173dd182ff10b9145e432dea1fd2fb67100ccca3b10Douglas Gregor } 4174dd182ff10b9145e432dea1fd2fb67100ccca3b10Douglas Gregor 4175dd182ff10b9145e432dea1fd2fb67100ccca3b10Douglas Gregor // Import all of the members of this @implementation. 4176dd182ff10b9145e432dea1fd2fb67100ccca3b10Douglas Gregor ImportDeclContext(D); 4177dd182ff10b9145e432dea1fd2fb67100ccca3b10Douglas Gregor 4178dd182ff10b9145e432dea1fd2fb67100ccca3b10Douglas Gregor return Impl; 4179dd182ff10b9145e432dea1fd2fb67100ccca3b10Douglas Gregor} 4180dd182ff10b9145e432dea1fd2fb67100ccca3b10Douglas Gregor 4181e3261624c1870e52d7efc2ac83e647713361ac6cDouglas GregorDecl *ASTNodeImporter::VisitObjCPropertyDecl(ObjCPropertyDecl *D) { 4182e3261624c1870e52d7efc2ac83e647713361ac6cDouglas Gregor // Import the major distinguishing characteristics of an @property. 4183e3261624c1870e52d7efc2ac83e647713361ac6cDouglas Gregor DeclContext *DC, *LexicalDC; 4184e3261624c1870e52d7efc2ac83e647713361ac6cDouglas Gregor DeclarationName Name; 4185e3261624c1870e52d7efc2ac83e647713361ac6cDouglas Gregor SourceLocation Loc; 4186b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar NamedDecl *ToD; 4187b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar if (ImportDeclParts(D, DC, LexicalDC, Name, ToD, Loc)) 41886bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return nullptr; 4189b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar if (ToD) 4190b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar return ToD; 4191e3261624c1870e52d7efc2ac83e647713361ac6cDouglas Gregor 4192e3261624c1870e52d7efc2ac83e647713361ac6cDouglas Gregor // Check whether we have already imported this property. 4193cfa88f893915ceb8ae4ce2f17c46c24a4d67502fDmitri Gribenko SmallVector<NamedDecl *, 2> FoundDecls; 41940e2c34f92f00628d48968dfea096d36381f494cbStephen Hines DC->getRedeclContext()->localUncachedLookup(Name, FoundDecls); 4195b75a3451bcae1301875282e73a13934c90b6574cDouglas Gregor for (unsigned I = 0, N = FoundDecls.size(); I != N; ++I) { 4196e3261624c1870e52d7efc2ac83e647713361ac6cDouglas Gregor if (ObjCPropertyDecl *FoundProp 4197b75a3451bcae1301875282e73a13934c90b6574cDouglas Gregor = dyn_cast<ObjCPropertyDecl>(FoundDecls[I])) { 4198e3261624c1870e52d7efc2ac83e647713361ac6cDouglas Gregor // Check property types. 4199e3261624c1870e52d7efc2ac83e647713361ac6cDouglas Gregor if (!Importer.IsStructurallyEquivalent(D->getType(), 4200e3261624c1870e52d7efc2ac83e647713361ac6cDouglas Gregor FoundProp->getType())) { 4201e3261624c1870e52d7efc2ac83e647713361ac6cDouglas Gregor Importer.ToDiag(Loc, diag::err_odr_objc_property_type_inconsistent) 4202e3261624c1870e52d7efc2ac83e647713361ac6cDouglas Gregor << Name << D->getType() << FoundProp->getType(); 4203e3261624c1870e52d7efc2ac83e647713361ac6cDouglas Gregor Importer.ToDiag(FoundProp->getLocation(), diag::note_odr_value_here) 4204e3261624c1870e52d7efc2ac83e647713361ac6cDouglas Gregor << FoundProp->getType(); 42056bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return nullptr; 4206e3261624c1870e52d7efc2ac83e647713361ac6cDouglas Gregor } 4207e3261624c1870e52d7efc2ac83e647713361ac6cDouglas Gregor 4208e3261624c1870e52d7efc2ac83e647713361ac6cDouglas Gregor // FIXME: Check property attributes, getters, setters, etc.? 4209e3261624c1870e52d7efc2ac83e647713361ac6cDouglas Gregor 4210e3261624c1870e52d7efc2ac83e647713361ac6cDouglas Gregor // Consider these properties to be equivalent. 4211e3261624c1870e52d7efc2ac83e647713361ac6cDouglas Gregor Importer.Imported(D, FoundProp); 4212e3261624c1870e52d7efc2ac83e647713361ac6cDouglas Gregor return FoundProp; 4213e3261624c1870e52d7efc2ac83e647713361ac6cDouglas Gregor } 4214e3261624c1870e52d7efc2ac83e647713361ac6cDouglas Gregor } 4215e3261624c1870e52d7efc2ac83e647713361ac6cDouglas Gregor 4216e3261624c1870e52d7efc2ac83e647713361ac6cDouglas Gregor // Import the type. 421787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar TypeSourceInfo *TSI = Importer.Import(D->getTypeSourceInfo()); 421887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar if (!TSI) 42196bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return nullptr; 4220e3261624c1870e52d7efc2ac83e647713361ac6cDouglas Gregor 4221e3261624c1870e52d7efc2ac83e647713361ac6cDouglas Gregor // Create the new property. 4222e3261624c1870e52d7efc2ac83e647713361ac6cDouglas Gregor ObjCPropertyDecl *ToProperty 4223e3261624c1870e52d7efc2ac83e647713361ac6cDouglas Gregor = ObjCPropertyDecl::Create(Importer.getToContext(), DC, Loc, 4224e3261624c1870e52d7efc2ac83e647713361ac6cDouglas Gregor Name.getAsIdentifierInfo(), 4225e3261624c1870e52d7efc2ac83e647713361ac6cDouglas Gregor Importer.Import(D->getAtLoc()), 422677bfb8b43ec3f7dee3a71f6e854b03ad29dab84fFariborz Jahanian Importer.Import(D->getLParenLoc()), 422787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar Importer.Import(D->getType()), 422887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar TSI, 4229e3261624c1870e52d7efc2ac83e647713361ac6cDouglas Gregor D->getPropertyImplementation()); 4230e3261624c1870e52d7efc2ac83e647713361ac6cDouglas Gregor Importer.Imported(D, ToProperty); 4231e3261624c1870e52d7efc2ac83e647713361ac6cDouglas Gregor ToProperty->setLexicalDeclContext(LexicalDC); 42329faf810f08132aabb34a478297dfeea89c3bbe17Sean Callanan LexicalDC->addDeclInternal(ToProperty); 4233e3261624c1870e52d7efc2ac83e647713361ac6cDouglas Gregor 4234e3261624c1870e52d7efc2ac83e647713361ac6cDouglas Gregor ToProperty->setPropertyAttributes(D->getPropertyAttributes()); 423580aa1cd7973561889e51c1c152c8990a8de9c953Fariborz Jahanian ToProperty->setPropertyAttributesAsWritten( 423680aa1cd7973561889e51c1c152c8990a8de9c953Fariborz Jahanian D->getPropertyAttributesAsWritten()); 4237e3261624c1870e52d7efc2ac83e647713361ac6cDouglas Gregor ToProperty->setGetterName(Importer.Import(D->getGetterName())); 4238e3261624c1870e52d7efc2ac83e647713361ac6cDouglas Gregor ToProperty->setSetterName(Importer.Import(D->getSetterName())); 4239e3261624c1870e52d7efc2ac83e647713361ac6cDouglas Gregor ToProperty->setGetterMethodDecl( 4240e3261624c1870e52d7efc2ac83e647713361ac6cDouglas Gregor cast_or_null<ObjCMethodDecl>(Importer.Import(D->getGetterMethodDecl()))); 4241e3261624c1870e52d7efc2ac83e647713361ac6cDouglas Gregor ToProperty->setSetterMethodDecl( 4242e3261624c1870e52d7efc2ac83e647713361ac6cDouglas Gregor cast_or_null<ObjCMethodDecl>(Importer.Import(D->getSetterMethodDecl()))); 4243e3261624c1870e52d7efc2ac83e647713361ac6cDouglas Gregor ToProperty->setPropertyIvarDecl( 4244e3261624c1870e52d7efc2ac83e647713361ac6cDouglas Gregor cast_or_null<ObjCIvarDecl>(Importer.Import(D->getPropertyIvarDecl()))); 4245e3261624c1870e52d7efc2ac83e647713361ac6cDouglas Gregor return ToProperty; 4246e3261624c1870e52d7efc2ac83e647713361ac6cDouglas Gregor} 4247e3261624c1870e52d7efc2ac83e647713361ac6cDouglas Gregor 4248954e0c75c42f321945aff8b9ee96da43cd90c752Douglas GregorDecl *ASTNodeImporter::VisitObjCPropertyImplDecl(ObjCPropertyImplDecl *D) { 4249954e0c75c42f321945aff8b9ee96da43cd90c752Douglas Gregor ObjCPropertyDecl *Property = cast_or_null<ObjCPropertyDecl>( 4250954e0c75c42f321945aff8b9ee96da43cd90c752Douglas Gregor Importer.Import(D->getPropertyDecl())); 4251954e0c75c42f321945aff8b9ee96da43cd90c752Douglas Gregor if (!Property) 42526bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return nullptr; 4253954e0c75c42f321945aff8b9ee96da43cd90c752Douglas Gregor 4254954e0c75c42f321945aff8b9ee96da43cd90c752Douglas Gregor DeclContext *DC = Importer.ImportContext(D->getDeclContext()); 4255954e0c75c42f321945aff8b9ee96da43cd90c752Douglas Gregor if (!DC) 42566bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return nullptr; 42576bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 4258954e0c75c42f321945aff8b9ee96da43cd90c752Douglas Gregor // Import the lexical declaration context. 4259954e0c75c42f321945aff8b9ee96da43cd90c752Douglas Gregor DeclContext *LexicalDC = DC; 4260954e0c75c42f321945aff8b9ee96da43cd90c752Douglas Gregor if (D->getDeclContext() != D->getLexicalDeclContext()) { 4261954e0c75c42f321945aff8b9ee96da43cd90c752Douglas Gregor LexicalDC = Importer.ImportContext(D->getLexicalDeclContext()); 4262954e0c75c42f321945aff8b9ee96da43cd90c752Douglas Gregor if (!LexicalDC) 42636bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return nullptr; 4264954e0c75c42f321945aff8b9ee96da43cd90c752Douglas Gregor } 4265954e0c75c42f321945aff8b9ee96da43cd90c752Douglas Gregor 4266954e0c75c42f321945aff8b9ee96da43cd90c752Douglas Gregor ObjCImplDecl *InImpl = dyn_cast<ObjCImplDecl>(LexicalDC); 4267954e0c75c42f321945aff8b9ee96da43cd90c752Douglas Gregor if (!InImpl) 42686bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return nullptr; 4269954e0c75c42f321945aff8b9ee96da43cd90c752Douglas Gregor 4270954e0c75c42f321945aff8b9ee96da43cd90c752Douglas Gregor // Import the ivar (for an @synthesize). 42716bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines ObjCIvarDecl *Ivar = nullptr; 4272954e0c75c42f321945aff8b9ee96da43cd90c752Douglas Gregor if (D->getPropertyIvarDecl()) { 4273954e0c75c42f321945aff8b9ee96da43cd90c752Douglas Gregor Ivar = cast_or_null<ObjCIvarDecl>( 4274954e0c75c42f321945aff8b9ee96da43cd90c752Douglas Gregor Importer.Import(D->getPropertyIvarDecl())); 4275954e0c75c42f321945aff8b9ee96da43cd90c752Douglas Gregor if (!Ivar) 42766bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return nullptr; 4277954e0c75c42f321945aff8b9ee96da43cd90c752Douglas Gregor } 4278954e0c75c42f321945aff8b9ee96da43cd90c752Douglas Gregor 4279954e0c75c42f321945aff8b9ee96da43cd90c752Douglas Gregor ObjCPropertyImplDecl *ToImpl 42804967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar = InImpl->FindPropertyImplDecl(Property->getIdentifier(), 42814967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Property->getQueryKind()); 4282954e0c75c42f321945aff8b9ee96da43cd90c752Douglas Gregor if (!ToImpl) { 4283954e0c75c42f321945aff8b9ee96da43cd90c752Douglas Gregor ToImpl = ObjCPropertyImplDecl::Create(Importer.getToContext(), DC, 4284954e0c75c42f321945aff8b9ee96da43cd90c752Douglas Gregor Importer.Import(D->getLocStart()), 4285954e0c75c42f321945aff8b9ee96da43cd90c752Douglas Gregor Importer.Import(D->getLocation()), 4286954e0c75c42f321945aff8b9ee96da43cd90c752Douglas Gregor Property, 4287954e0c75c42f321945aff8b9ee96da43cd90c752Douglas Gregor D->getPropertyImplementation(), 4288954e0c75c42f321945aff8b9ee96da43cd90c752Douglas Gregor Ivar, 4289954e0c75c42f321945aff8b9ee96da43cd90c752Douglas Gregor Importer.Import(D->getPropertyIvarDeclLoc())); 4290954e0c75c42f321945aff8b9ee96da43cd90c752Douglas Gregor ToImpl->setLexicalDeclContext(LexicalDC); 4291954e0c75c42f321945aff8b9ee96da43cd90c752Douglas Gregor Importer.Imported(D, ToImpl); 42929faf810f08132aabb34a478297dfeea89c3bbe17Sean Callanan LexicalDC->addDeclInternal(ToImpl); 4293954e0c75c42f321945aff8b9ee96da43cd90c752Douglas Gregor } else { 4294954e0c75c42f321945aff8b9ee96da43cd90c752Douglas Gregor // Check that we have the same kind of property implementation (@synthesize 4295954e0c75c42f321945aff8b9ee96da43cd90c752Douglas Gregor // vs. @dynamic). 4296954e0c75c42f321945aff8b9ee96da43cd90c752Douglas Gregor if (D->getPropertyImplementation() != ToImpl->getPropertyImplementation()) { 4297954e0c75c42f321945aff8b9ee96da43cd90c752Douglas Gregor Importer.ToDiag(ToImpl->getLocation(), 4298954e0c75c42f321945aff8b9ee96da43cd90c752Douglas Gregor diag::err_odr_objc_property_impl_kind_inconsistent) 4299954e0c75c42f321945aff8b9ee96da43cd90c752Douglas Gregor << Property->getDeclName() 4300954e0c75c42f321945aff8b9ee96da43cd90c752Douglas Gregor << (ToImpl->getPropertyImplementation() 4301954e0c75c42f321945aff8b9ee96da43cd90c752Douglas Gregor == ObjCPropertyImplDecl::Dynamic); 4302954e0c75c42f321945aff8b9ee96da43cd90c752Douglas Gregor Importer.FromDiag(D->getLocation(), 4303954e0c75c42f321945aff8b9ee96da43cd90c752Douglas Gregor diag::note_odr_objc_property_impl_kind) 4304954e0c75c42f321945aff8b9ee96da43cd90c752Douglas Gregor << D->getPropertyDecl()->getDeclName() 4305954e0c75c42f321945aff8b9ee96da43cd90c752Douglas Gregor << (D->getPropertyImplementation() == ObjCPropertyImplDecl::Dynamic); 43066bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return nullptr; 4307954e0c75c42f321945aff8b9ee96da43cd90c752Douglas Gregor } 4308954e0c75c42f321945aff8b9ee96da43cd90c752Douglas Gregor 4309954e0c75c42f321945aff8b9ee96da43cd90c752Douglas Gregor // For @synthesize, check that we have the same 4310954e0c75c42f321945aff8b9ee96da43cd90c752Douglas Gregor if (D->getPropertyImplementation() == ObjCPropertyImplDecl::Synthesize && 4311954e0c75c42f321945aff8b9ee96da43cd90c752Douglas Gregor Ivar != ToImpl->getPropertyIvarDecl()) { 4312954e0c75c42f321945aff8b9ee96da43cd90c752Douglas Gregor Importer.ToDiag(ToImpl->getPropertyIvarDeclLoc(), 4313954e0c75c42f321945aff8b9ee96da43cd90c752Douglas Gregor diag::err_odr_objc_synthesize_ivar_inconsistent) 4314954e0c75c42f321945aff8b9ee96da43cd90c752Douglas Gregor << Property->getDeclName() 4315954e0c75c42f321945aff8b9ee96da43cd90c752Douglas Gregor << ToImpl->getPropertyIvarDecl()->getDeclName() 4316954e0c75c42f321945aff8b9ee96da43cd90c752Douglas Gregor << Ivar->getDeclName(); 4317954e0c75c42f321945aff8b9ee96da43cd90c752Douglas Gregor Importer.FromDiag(D->getPropertyIvarDeclLoc(), 4318954e0c75c42f321945aff8b9ee96da43cd90c752Douglas Gregor diag::note_odr_objc_synthesize_ivar_here) 4319954e0c75c42f321945aff8b9ee96da43cd90c752Douglas Gregor << D->getPropertyIvarDecl()->getDeclName(); 43206bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return nullptr; 4321954e0c75c42f321945aff8b9ee96da43cd90c752Douglas Gregor } 4322954e0c75c42f321945aff8b9ee96da43cd90c752Douglas Gregor 4323954e0c75c42f321945aff8b9ee96da43cd90c752Douglas Gregor // Merge the existing implementation with the new implementation. 4324954e0c75c42f321945aff8b9ee96da43cd90c752Douglas Gregor Importer.Imported(D, ToImpl); 4325954e0c75c42f321945aff8b9ee96da43cd90c752Douglas Gregor } 4326954e0c75c42f321945aff8b9ee96da43cd90c752Douglas Gregor 4327954e0c75c42f321945aff8b9ee96da43cd90c752Douglas Gregor return ToImpl; 4328954e0c75c42f321945aff8b9ee96da43cd90c752Douglas Gregor} 4329954e0c75c42f321945aff8b9ee96da43cd90c752Douglas Gregor 4330040afaeea2313dc69fd532995ac88cccdd62da56Douglas GregorDecl *ASTNodeImporter::VisitTemplateTypeParmDecl(TemplateTypeParmDecl *D) { 4331040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor // For template arguments, we adopt the translation unit as our declaration 4332040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor // context. This context will be fixed when the actual template declaration 4333040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor // is created. 4334040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor 4335040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor // FIXME: Import default argument. 4336040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor return TemplateTypeParmDecl::Create(Importer.getToContext(), 4337040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor Importer.getToContext().getTranslationUnitDecl(), 4338344577e6b58f42d18dc8118c8903b49a85dc005eAbramo Bagnara Importer.Import(D->getLocStart()), 4339040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor Importer.Import(D->getLocation()), 4340040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor D->getDepth(), 4341040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor D->getIndex(), 4342040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor Importer.Import(D->getIdentifier()), 4343040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor D->wasDeclaredWithTypename(), 4344040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor D->isParameterPack()); 4345040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor} 4346040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor 4347040afaeea2313dc69fd532995ac88cccdd62da56Douglas GregorDecl * 4348040afaeea2313dc69fd532995ac88cccdd62da56Douglas GregorASTNodeImporter::VisitNonTypeTemplateParmDecl(NonTypeTemplateParmDecl *D) { 4349040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor // Import the name of this declaration. 4350040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor DeclarationName Name = Importer.Import(D->getDeclName()); 4351040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor if (D->getDeclName() && !Name) 43526bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return nullptr; 43536bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 4354040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor // Import the location of this declaration. 4355040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor SourceLocation Loc = Importer.Import(D->getLocation()); 4356040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor 4357040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor // Import the type of this declaration. 4358040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor QualType T = Importer.Import(D->getType()); 4359040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor if (T.isNull()) 43606bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return nullptr; 43616bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 4362040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor // Import type-source information. 4363040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor TypeSourceInfo *TInfo = Importer.Import(D->getTypeSourceInfo()); 4364040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor if (D->getTypeSourceInfo() && !TInfo) 43656bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return nullptr; 43666bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 4367040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor // FIXME: Import default argument. 4368040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor 4369040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor return NonTypeTemplateParmDecl::Create(Importer.getToContext(), 4370040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor Importer.getToContext().getTranslationUnitDecl(), 4371ff676cb48fe8bf7be2feaa251dc7c5fb15af4730Abramo Bagnara Importer.Import(D->getInnerLocStart()), 4372040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor Loc, D->getDepth(), D->getPosition(), 4373040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor Name.getAsIdentifierInfo(), 437410738d36b150aa65206890c1c845cdba076e4200Douglas Gregor T, D->isParameterPack(), TInfo); 4375040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor} 4376040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor 4377040afaeea2313dc69fd532995ac88cccdd62da56Douglas GregorDecl * 4378040afaeea2313dc69fd532995ac88cccdd62da56Douglas GregorASTNodeImporter::VisitTemplateTemplateParmDecl(TemplateTemplateParmDecl *D) { 4379040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor // Import the name of this declaration. 4380040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor DeclarationName Name = Importer.Import(D->getDeclName()); 4381040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor if (D->getDeclName() && !Name) 43826bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return nullptr; 43836bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 4384040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor // Import the location of this declaration. 4385040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor SourceLocation Loc = Importer.Import(D->getLocation()); 4386040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor 4387040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor // Import template parameters. 4388040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor TemplateParameterList *TemplateParams 4389040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor = ImportTemplateParameterList(D->getTemplateParameters()); 4390040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor if (!TemplateParams) 43916bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return nullptr; 43926bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 4393040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor // FIXME: Import default argument. 4394040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor 4395040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor return TemplateTemplateParmDecl::Create(Importer.getToContext(), 4396040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor Importer.getToContext().getTranslationUnitDecl(), 4397040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor Loc, D->getDepth(), D->getPosition(), 439861c4d28e36cd3f1be392cb77f07436d1fa6b0f9fDouglas Gregor D->isParameterPack(), 4399040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor Name.getAsIdentifierInfo(), 4400040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor TemplateParams); 4401040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor} 4402040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor 4403040afaeea2313dc69fd532995ac88cccdd62da56Douglas GregorDecl *ASTNodeImporter::VisitClassTemplateDecl(ClassTemplateDecl *D) { 4404040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor // If this record has a definition in the translation unit we're coming from, 4405040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor // but this particular declaration is not that definition, import the 4406040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor // definition and map to that. 4407040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor CXXRecordDecl *Definition 4408040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor = cast_or_null<CXXRecordDecl>(D->getTemplatedDecl()->getDefinition()); 4409040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor if (Definition && Definition != D->getTemplatedDecl()) { 4410040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor Decl *ImportedDef 4411040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor = Importer.Import(Definition->getDescribedClassTemplate()); 4412040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor if (!ImportedDef) 44136bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return nullptr; 44146bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 4415040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor return Importer.Imported(D, ImportedDef); 4416040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor } 4417040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor 4418040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor // Import the major distinguishing characteristics of this class template. 4419040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor DeclContext *DC, *LexicalDC; 4420040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor DeclarationName Name; 4421040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor SourceLocation Loc; 4422b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar NamedDecl *ToD; 4423b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar if (ImportDeclParts(D, DC, LexicalDC, Name, ToD, Loc)) 44246bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return nullptr; 4425b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar if (ToD) 4426b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar return ToD; 44276bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 4428040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor // We may already have a template of the same name; try to find and match it. 4429040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor if (!DC->isFunctionOrMethod()) { 44305f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner SmallVector<NamedDecl *, 4> ConflictingDecls; 4431cfa88f893915ceb8ae4ce2f17c46c24a4d67502fDmitri Gribenko SmallVector<NamedDecl *, 2> FoundDecls; 44320e2c34f92f00628d48968dfea096d36381f494cbStephen Hines DC->getRedeclContext()->localUncachedLookup(Name, FoundDecls); 4433b75a3451bcae1301875282e73a13934c90b6574cDouglas Gregor for (unsigned I = 0, N = FoundDecls.size(); I != N; ++I) { 4434b75a3451bcae1301875282e73a13934c90b6574cDouglas Gregor if (!FoundDecls[I]->isInIdentifierNamespace(Decl::IDNS_Ordinary)) 4435040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor continue; 4436040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor 4437b75a3451bcae1301875282e73a13934c90b6574cDouglas Gregor Decl *Found = FoundDecls[I]; 4438040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor if (ClassTemplateDecl *FoundTemplate 4439040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor = dyn_cast<ClassTemplateDecl>(Found)) { 4440040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor if (IsStructuralMatch(D, FoundTemplate)) { 4441040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor // The class templates structurally match; call it the same template. 4442040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor // FIXME: We may be filling in a forward declaration here. Handle 4443040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor // this case! 4444040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor Importer.Imported(D->getTemplatedDecl(), 4445040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor FoundTemplate->getTemplatedDecl()); 4446040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor return Importer.Imported(D, FoundTemplate); 4447040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor } 4448040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor } 4449040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor 4450b75a3451bcae1301875282e73a13934c90b6574cDouglas Gregor ConflictingDecls.push_back(FoundDecls[I]); 4451040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor } 4452040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor 4453040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor if (!ConflictingDecls.empty()) { 4454040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor Name = Importer.HandleNameConflict(Name, DC, Decl::IDNS_Ordinary, 4455040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor ConflictingDecls.data(), 4456040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor ConflictingDecls.size()); 4457040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor } 4458040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor 4459040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor if (!Name) 44606bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return nullptr; 4461040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor } 4462040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor 4463040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor CXXRecordDecl *DTemplated = D->getTemplatedDecl(); 4464040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor 4465040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor // Create the declaration that is being templated. 44664967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar // Create the declaration that is being templated. 44674967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar CXXRecordDecl *D2Templated = cast_or_null<CXXRecordDecl>( 44684967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Importer.Import(DTemplated)); 44694967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar if (!D2Templated) 44704967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar return nullptr; 44714967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar 44724967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar // Resolve possible cyclic import. 44734967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar if (Decl *AlreadyImported = Importer.GetAlreadyImportedOrNull(D)) 44744967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar return AlreadyImported; 44754967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar 4476040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor // Create the class template declaration itself. 4477040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor TemplateParameterList *TemplateParams 4478040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor = ImportTemplateParameterList(D->getTemplateParameters()); 4479040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor if (!TemplateParams) 44806bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return nullptr; 44816bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 4482040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor ClassTemplateDecl *D2 = ClassTemplateDecl::Create(Importer.getToContext(), DC, 4483040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor Loc, Name, TemplateParams, 4484040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor D2Templated, 44856bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines /*PrevDecl=*/nullptr); 4486040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor D2Templated->setDescribedClassTemplate(D2); 4487040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor 4488040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor D2->setAccess(D->getAccess()); 4489040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor D2->setLexicalDeclContext(LexicalDC); 44909faf810f08132aabb34a478297dfeea89c3bbe17Sean Callanan LexicalDC->addDeclInternal(D2); 4491040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor 4492040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor // Note the relationship between the class templates. 4493040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor Importer.Imported(D, D2); 4494040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor Importer.Imported(DTemplated, D2Templated); 4495040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor 44965e1cdac63c3d9c9b32fa41fa0b2d242a58a20d49John McCall if (DTemplated->isCompleteDefinition() && 44975e1cdac63c3d9c9b32fa41fa0b2d242a58a20d49John McCall !D2Templated->isCompleteDefinition()) { 4498040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor // FIXME: Import definition! 4499040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor } 4500040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor 4501040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor return D2; 4502040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor} 4503040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor 4504d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas GregorDecl *ASTNodeImporter::VisitClassTemplateSpecializationDecl( 4505d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor ClassTemplateSpecializationDecl *D) { 4506d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor // If this record has a definition in the translation unit we're coming from, 4507d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor // but this particular declaration is not that definition, import the 4508d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor // definition and map to that. 4509d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor TagDecl *Definition = D->getDefinition(); 4510d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor if (Definition && Definition != D) { 4511d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor Decl *ImportedDef = Importer.Import(Definition); 4512d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor if (!ImportedDef) 45136bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return nullptr; 45146bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 4515d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor return Importer.Imported(D, ImportedDef); 4516d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor } 4517d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor 4518d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor ClassTemplateDecl *ClassTemplate 4519d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor = cast_or_null<ClassTemplateDecl>(Importer.Import( 4520d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor D->getSpecializedTemplate())); 4521d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor if (!ClassTemplate) 45226bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return nullptr; 45236bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 4524d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor // Import the context of this declaration. 4525d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor DeclContext *DC = ClassTemplate->getDeclContext(); 4526d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor if (!DC) 45276bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return nullptr; 45286bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 4529d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor DeclContext *LexicalDC = DC; 4530d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor if (D->getDeclContext() != D->getLexicalDeclContext()) { 4531d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor LexicalDC = Importer.ImportContext(D->getLexicalDeclContext()); 4532d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor if (!LexicalDC) 45336bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return nullptr; 4534d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor } 4535d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor 4536d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor // Import the location of this declaration. 4537ba877adeb49ed6dc17f27fa3a3bcd0cca713fd68Abramo Bagnara SourceLocation StartLoc = Importer.Import(D->getLocStart()); 4538ba877adeb49ed6dc17f27fa3a3bcd0cca713fd68Abramo Bagnara SourceLocation IdLoc = Importer.Import(D->getLocation()); 4539d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor 4540d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor // Import template arguments. 45415f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner SmallVector<TemplateArgument, 2> TemplateArgs; 4542d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor if (ImportTemplateArguments(D->getTemplateArgs().data(), 4543d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor D->getTemplateArgs().size(), 4544d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor TemplateArgs)) 45456bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return nullptr; 45466bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 4547d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor // Try to find an existing specialization with these template arguments. 45486bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines void *InsertPos = nullptr; 4549d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor ClassTemplateSpecializationDecl *D2 4550c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines = ClassTemplate->findSpecialization(TemplateArgs, InsertPos); 4551d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor if (D2) { 4552d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor // We already have a class template specialization with these template 4553d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor // arguments. 4554d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor 4555d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor // FIXME: Check for specialization vs. instantiation errors. 4556d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor 4557d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor if (RecordDecl *FoundDef = D2->getDefinition()) { 45585e1cdac63c3d9c9b32fa41fa0b2d242a58a20d49John McCall if (!D->isCompleteDefinition() || IsStructuralMatch(D, FoundDef)) { 4559d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor // The record types structurally match, or the "from" translation 4560d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor // unit only had a forward declaration anyway; call it the same 4561d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor // function. 4562d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor return Importer.Imported(D, FoundDef); 4563d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor } 4564d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor } 4565d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor } else { 4566d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor // Create a new specialization. 4567d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor D2 = ClassTemplateSpecializationDecl::Create(Importer.getToContext(), 4568d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor D->getTagKind(), DC, 4569ba877adeb49ed6dc17f27fa3a3bcd0cca713fd68Abramo Bagnara StartLoc, IdLoc, 4570ba877adeb49ed6dc17f27fa3a3bcd0cca713fd68Abramo Bagnara ClassTemplate, 45714967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar TemplateArgs, 45726bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines /*PrevDecl=*/nullptr); 4573d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor D2->setSpecializationKind(D->getSpecializationKind()); 4574d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor 4575d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor // Add this specialization to the class template. 4576d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor ClassTemplate->AddSpecialization(D2, InsertPos); 4577d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor 4578d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor // Import the qualifier, if any. 4579c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor D2->setQualifierInfo(Importer.Import(D->getQualifierLoc())); 4580d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor 4581d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor // Add the specialization to this context. 4582d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor D2->setLexicalDeclContext(LexicalDC); 45839faf810f08132aabb34a478297dfeea89c3bbe17Sean Callanan LexicalDC->addDeclInternal(D2); 4584d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor } 4585d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor Importer.Imported(D, D2); 4586d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor 45875e1cdac63c3d9c9b32fa41fa0b2d242a58a20d49John McCall if (D->isCompleteDefinition() && ImportDefinition(D, D2)) 45886bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return nullptr; 45896bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 4590d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor return D2; 4591d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor} 4592d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor 4593ef4579cda09b73e3d4d98af48201da25adc29326Larisse VoufoDecl *ASTNodeImporter::VisitVarTemplateDecl(VarTemplateDecl *D) { 4594ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo // If this variable has a definition in the translation unit we're coming 4595ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo // from, 4596ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo // but this particular declaration is not that definition, import the 4597ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo // definition and map to that. 4598ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo VarDecl *Definition = 4599ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo cast_or_null<VarDecl>(D->getTemplatedDecl()->getDefinition()); 4600ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo if (Definition && Definition != D->getTemplatedDecl()) { 4601ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo Decl *ImportedDef = Importer.Import(Definition->getDescribedVarTemplate()); 4602ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo if (!ImportedDef) 46036bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return nullptr; 4604ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo 4605ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo return Importer.Imported(D, ImportedDef); 4606ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo } 4607ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo 4608ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo // Import the major distinguishing characteristics of this variable template. 4609ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo DeclContext *DC, *LexicalDC; 4610ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo DeclarationName Name; 4611ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo SourceLocation Loc; 4612b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar NamedDecl *ToD; 4613b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar if (ImportDeclParts(D, DC, LexicalDC, Name, ToD, Loc)) 46146bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return nullptr; 4615b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar if (ToD) 4616b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar return ToD; 4617ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo 4618ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo // We may already have a template of the same name; try to find and match it. 4619ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo assert(!DC->isFunctionOrMethod() && 4620ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo "Variable templates cannot be declared at function scope"); 4621ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo SmallVector<NamedDecl *, 4> ConflictingDecls; 4622ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo SmallVector<NamedDecl *, 2> FoundDecls; 46230e2c34f92f00628d48968dfea096d36381f494cbStephen Hines DC->getRedeclContext()->localUncachedLookup(Name, FoundDecls); 4624ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo for (unsigned I = 0, N = FoundDecls.size(); I != N; ++I) { 4625ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo if (!FoundDecls[I]->isInIdentifierNamespace(Decl::IDNS_Ordinary)) 4626ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo continue; 4627ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo 4628ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo Decl *Found = FoundDecls[I]; 4629ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo if (VarTemplateDecl *FoundTemplate = dyn_cast<VarTemplateDecl>(Found)) { 4630ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo if (IsStructuralMatch(D, FoundTemplate)) { 4631ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo // The variable templates structurally match; call it the same template. 4632ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo Importer.Imported(D->getTemplatedDecl(), 4633ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo FoundTemplate->getTemplatedDecl()); 4634ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo return Importer.Imported(D, FoundTemplate); 4635ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo } 4636ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo } 4637ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo 4638ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo ConflictingDecls.push_back(FoundDecls[I]); 4639ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo } 4640ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo 4641ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo if (!ConflictingDecls.empty()) { 4642ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo Name = Importer.HandleNameConflict(Name, DC, Decl::IDNS_Ordinary, 4643ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo ConflictingDecls.data(), 4644ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo ConflictingDecls.size()); 4645ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo } 4646ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo 4647ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo if (!Name) 46486bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return nullptr; 4649ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo 4650ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo VarDecl *DTemplated = D->getTemplatedDecl(); 4651ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo 4652ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo // Import the type. 4653ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo QualType T = Importer.Import(DTemplated->getType()); 4654ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo if (T.isNull()) 46556bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return nullptr; 4656ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo 4657ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo // Create the declaration that is being templated. 4658ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo SourceLocation StartLoc = Importer.Import(DTemplated->getLocStart()); 4659ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo SourceLocation IdLoc = Importer.Import(DTemplated->getLocation()); 4660ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo TypeSourceInfo *TInfo = Importer.Import(DTemplated->getTypeSourceInfo()); 4661ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo VarDecl *D2Templated = VarDecl::Create(Importer.getToContext(), DC, StartLoc, 4662ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo IdLoc, Name.getAsIdentifierInfo(), T, 4663ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo TInfo, DTemplated->getStorageClass()); 4664ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo D2Templated->setAccess(DTemplated->getAccess()); 4665ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo D2Templated->setQualifierInfo(Importer.Import(DTemplated->getQualifierLoc())); 4666ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo D2Templated->setLexicalDeclContext(LexicalDC); 4667ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo 4668ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo // Importer.Imported(DTemplated, D2Templated); 4669ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo // LexicalDC->addDeclInternal(D2Templated); 4670ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo 4671ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo // Merge the initializer. 4672ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo if (ImportDefinition(DTemplated, D2Templated)) 46736bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return nullptr; 4674ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo 4675ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo // Create the variable template declaration itself. 4676ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo TemplateParameterList *TemplateParams = 4677ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo ImportTemplateParameterList(D->getTemplateParameters()); 4678ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo if (!TemplateParams) 46796bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return nullptr; 4680ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo 4681ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo VarTemplateDecl *D2 = VarTemplateDecl::Create( 4682651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines Importer.getToContext(), DC, Loc, Name, TemplateParams, D2Templated); 4683ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo D2Templated->setDescribedVarTemplate(D2); 4684ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo 4685ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo D2->setAccess(D->getAccess()); 4686ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo D2->setLexicalDeclContext(LexicalDC); 4687ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo LexicalDC->addDeclInternal(D2); 4688ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo 4689ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo // Note the relationship between the variable templates. 4690ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo Importer.Imported(D, D2); 4691ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo Importer.Imported(DTemplated, D2Templated); 4692ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo 4693ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo if (DTemplated->isThisDeclarationADefinition() && 4694ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo !D2Templated->isThisDeclarationADefinition()) { 4695ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo // FIXME: Import definition! 4696ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo } 4697ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo 4698ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo return D2; 4699ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo} 4700ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo 4701ef4579cda09b73e3d4d98af48201da25adc29326Larisse VoufoDecl *ASTNodeImporter::VisitVarTemplateSpecializationDecl( 4702ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo VarTemplateSpecializationDecl *D) { 4703ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo // If this record has a definition in the translation unit we're coming from, 4704ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo // but this particular declaration is not that definition, import the 4705ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo // definition and map to that. 4706ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo VarDecl *Definition = D->getDefinition(); 4707ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo if (Definition && Definition != D) { 4708ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo Decl *ImportedDef = Importer.Import(Definition); 4709ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo if (!ImportedDef) 47106bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return nullptr; 4711ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo 4712ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo return Importer.Imported(D, ImportedDef); 4713ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo } 4714ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo 4715ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo VarTemplateDecl *VarTemplate = cast_or_null<VarTemplateDecl>( 4716ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo Importer.Import(D->getSpecializedTemplate())); 4717ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo if (!VarTemplate) 47186bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return nullptr; 4719ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo 4720ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo // Import the context of this declaration. 4721ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo DeclContext *DC = VarTemplate->getDeclContext(); 4722ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo if (!DC) 47236bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return nullptr; 4724ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo 4725ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo DeclContext *LexicalDC = DC; 4726ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo if (D->getDeclContext() != D->getLexicalDeclContext()) { 4727ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo LexicalDC = Importer.ImportContext(D->getLexicalDeclContext()); 4728ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo if (!LexicalDC) 47296bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return nullptr; 4730ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo } 4731ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo 4732ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo // Import the location of this declaration. 4733ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo SourceLocation StartLoc = Importer.Import(D->getLocStart()); 4734ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo SourceLocation IdLoc = Importer.Import(D->getLocation()); 4735ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo 4736ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo // Import template arguments. 4737ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo SmallVector<TemplateArgument, 2> TemplateArgs; 4738ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo if (ImportTemplateArguments(D->getTemplateArgs().data(), 4739ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo D->getTemplateArgs().size(), TemplateArgs)) 47406bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return nullptr; 4741ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo 4742ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo // Try to find an existing specialization with these template arguments. 47436bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines void *InsertPos = nullptr; 4744ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo VarTemplateSpecializationDecl *D2 = VarTemplate->findSpecialization( 4745c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines TemplateArgs, InsertPos); 4746ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo if (D2) { 4747ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo // We already have a variable template specialization with these template 4748ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo // arguments. 4749ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo 4750ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo // FIXME: Check for specialization vs. instantiation errors. 4751ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo 4752ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo if (VarDecl *FoundDef = D2->getDefinition()) { 4753ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo if (!D->isThisDeclarationADefinition() || 4754ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo IsStructuralMatch(D, FoundDef)) { 4755ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo // The record types structurally match, or the "from" translation 4756ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo // unit only had a forward declaration anyway; call it the same 4757ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo // variable. 4758ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo return Importer.Imported(D, FoundDef); 4759ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo } 4760ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo } 4761ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo } else { 4762ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo 4763ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo // Import the type. 4764ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo QualType T = Importer.Import(D->getType()); 4765ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo if (T.isNull()) 47666bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return nullptr; 4767ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo TypeSourceInfo *TInfo = Importer.Import(D->getTypeSourceInfo()); 4768ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo 4769ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo // Create a new specialization. 4770ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo D2 = VarTemplateSpecializationDecl::Create( 4771ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo Importer.getToContext(), DC, StartLoc, IdLoc, VarTemplate, T, TInfo, 47724967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar D->getStorageClass(), TemplateArgs); 4773ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo D2->setSpecializationKind(D->getSpecializationKind()); 4774ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo D2->setTemplateArgsInfo(D->getTemplateArgsInfo()); 4775ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo 4776ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo // Add this specialization to the class template. 4777ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo VarTemplate->AddSpecialization(D2, InsertPos); 4778ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo 4779ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo // Import the qualifier, if any. 4780ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo D2->setQualifierInfo(Importer.Import(D->getQualifierLoc())); 4781ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo 4782ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo // Add the specialization to this context. 4783ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo D2->setLexicalDeclContext(LexicalDC); 4784ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo LexicalDC->addDeclInternal(D2); 4785ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo } 4786ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo Importer.Imported(D, D2); 4787ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo 4788ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo if (D->isThisDeclarationADefinition() && ImportDefinition(D, D2)) 47896bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return nullptr; 4790ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo 4791ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo return D2; 4792ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo} 4793ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo 47944800d95d28b20eca5d57c108ae3d2e6e312c1182Douglas Gregor//---------------------------------------------------------------------------- 47954800d95d28b20eca5d57c108ae3d2e6e312c1182Douglas Gregor// Import Statements 47964800d95d28b20eca5d57c108ae3d2e6e312c1182Douglas Gregor//---------------------------------------------------------------------------- 47974800d95d28b20eca5d57c108ae3d2e6e312c1182Douglas Gregor 4798b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga NainarDeclGroupRef ASTNodeImporter::ImportDeclGroup(DeclGroupRef DG) { 4799b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar if (DG.isNull()) 4800b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar return DeclGroupRef::Create(Importer.getToContext(), nullptr, 0); 4801b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar size_t NumDecls = DG.end() - DG.begin(); 4802b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar SmallVector<Decl *, 1> ToDecls(NumDecls); 4803b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar auto &_Importer = this->Importer; 4804b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar std::transform(DG.begin(), DG.end(), ToDecls.begin(), 4805b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar [&_Importer](Decl *D) -> Decl * { 4806b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar return _Importer.Import(D); 4807b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar }); 4808b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar return DeclGroupRef::Create(Importer.getToContext(), 4809b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar ToDecls.begin(), 4810b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar NumDecls); 4811b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar} 4812b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar 4813b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar Stmt *ASTNodeImporter::VisitStmt(Stmt *S) { 4814b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar Importer.FromDiag(S->getLocStart(), diag::err_unsupported_ast_node) 4815b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar << S->getStmtClassName(); 4816b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar return nullptr; 4817b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar } 48184967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar 48194967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar 48204967a710c84587c654b56c828382219c3937dacbPirama Arumuga NainarStmt *ASTNodeImporter::VisitGCCAsmStmt(GCCAsmStmt *S) { 48214967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar SmallVector<IdentifierInfo *, 4> Names; 48224967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar for (unsigned I = 0, E = S->getNumOutputs(); I != E; I++) { 48234967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar IdentifierInfo *ToII = Importer.Import(S->getOutputIdentifier(I)); 48244967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar if (!ToII) 48254967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar return nullptr; 48264967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Names.push_back(ToII); 48274967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar } 48284967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar for (unsigned I = 0, E = S->getNumInputs(); I != E; I++) { 48294967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar IdentifierInfo *ToII = Importer.Import(S->getInputIdentifier(I)); 48304967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar if (!ToII) 48314967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar return nullptr; 48324967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Names.push_back(ToII); 48334967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar } 48344967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar 48354967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar SmallVector<StringLiteral *, 4> Clobbers; 48364967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar for (unsigned I = 0, E = S->getNumClobbers(); I != E; I++) { 48374967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar StringLiteral *Clobber = cast_or_null<StringLiteral>( 48384967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Importer.Import(S->getClobberStringLiteral(I))); 48394967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar if (!Clobber) 48404967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar return nullptr; 48414967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Clobbers.push_back(Clobber); 48424967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar } 48434967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar 48444967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar SmallVector<StringLiteral *, 4> Constraints; 48454967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar for (unsigned I = 0, E = S->getNumOutputs(); I != E; I++) { 48464967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar StringLiteral *Output = cast_or_null<StringLiteral>( 48474967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Importer.Import(S->getOutputConstraintLiteral(I))); 48484967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar if (!Output) 48494967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar return nullptr; 48504967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Constraints.push_back(Output); 48514967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar } 48524967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar 48534967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar for (unsigned I = 0, E = S->getNumInputs(); I != E; I++) { 48544967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar StringLiteral *Input = cast_or_null<StringLiteral>( 48554967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Importer.Import(S->getInputConstraintLiteral(I))); 48564967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar if (!Input) 48574967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar return nullptr; 48584967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Constraints.push_back(Input); 48594967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar } 48604967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar 48614967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar SmallVector<Expr *, 4> Exprs(S->getNumOutputs() + S->getNumInputs()); 48624967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar if (ImportArrayChecked(S->begin_outputs(), S->end_outputs(), Exprs.begin())) 48634967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar return nullptr; 48644967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar 48654967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar if (ImportArrayChecked(S->begin_inputs(), S->end_inputs(), 48664967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Exprs.begin() + S->getNumOutputs())) 48674967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar return nullptr; 48684967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar 48694967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar StringLiteral *AsmStr = cast_or_null<StringLiteral>( 48704967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Importer.Import(S->getAsmString())); 48714967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar if (!AsmStr) 48724967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar return nullptr; 48734967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar 48744967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar return new (Importer.getToContext()) GCCAsmStmt( 48754967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Importer.getToContext(), 48764967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Importer.Import(S->getAsmLoc()), 48774967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar S->isSimple(), 48784967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar S->isVolatile(), 48794967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar S->getNumOutputs(), 48804967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar S->getNumInputs(), 48814967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Names.data(), 48824967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Constraints.data(), 48834967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Exprs.data(), 48844967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar AsmStr, 48854967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar S->getNumClobbers(), 48864967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Clobbers.data(), 48874967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Importer.Import(S->getRParenLoc())); 48884967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar} 48894967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar 4890b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga NainarStmt *ASTNodeImporter::VisitDeclStmt(DeclStmt *S) { 4891b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar DeclGroupRef ToDG = ImportDeclGroup(S->getDeclGroup()); 4892b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar for (Decl *ToD : ToDG) { 4893b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar if (!ToD) 4894b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar return nullptr; 4895b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar } 4896b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar SourceLocation ToStartLoc = Importer.Import(S->getStartLoc()); 4897b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar SourceLocation ToEndLoc = Importer.Import(S->getEndLoc()); 4898b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar return new (Importer.getToContext()) DeclStmt(ToDG, ToStartLoc, ToEndLoc); 4899b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar} 4900b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar 4901b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga NainarStmt *ASTNodeImporter::VisitNullStmt(NullStmt *S) { 4902b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar SourceLocation ToSemiLoc = Importer.Import(S->getSemiLoc()); 4903b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar return new (Importer.getToContext()) NullStmt(ToSemiLoc, 4904b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar S->hasLeadingEmptyMacro()); 4905b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar} 4906b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar 4907b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga NainarStmt *ASTNodeImporter::VisitCompoundStmt(CompoundStmt *S) { 49084967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar llvm::SmallVector<Stmt *, 8> ToStmts(S->size()); 49094967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar 49104967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar if (ImportArrayChecked(S->body_begin(), S->body_end(), ToStmts.begin())) 49114967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar return nullptr; 49124967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar 4913b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar SourceLocation ToLBraceLoc = Importer.Import(S->getLBracLoc()); 4914b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar SourceLocation ToRBraceLoc = Importer.Import(S->getRBracLoc()); 4915b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar return new (Importer.getToContext()) CompoundStmt(Importer.getToContext(), 4916b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar ToStmts, 4917b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar ToLBraceLoc, ToRBraceLoc); 4918b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar} 4919b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar 4920b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga NainarStmt *ASTNodeImporter::VisitCaseStmt(CaseStmt *S) { 4921b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar Expr *ToLHS = Importer.Import(S->getLHS()); 4922b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar if (!ToLHS) 4923b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar return nullptr; 4924b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar Expr *ToRHS = Importer.Import(S->getRHS()); 4925b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar if (!ToRHS && S->getRHS()) 4926b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar return nullptr; 4927b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar SourceLocation ToCaseLoc = Importer.Import(S->getCaseLoc()); 4928b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar SourceLocation ToEllipsisLoc = Importer.Import(S->getEllipsisLoc()); 4929b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar SourceLocation ToColonLoc = Importer.Import(S->getColonLoc()); 4930b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar return new (Importer.getToContext()) CaseStmt(ToLHS, ToRHS, 4931b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar ToCaseLoc, ToEllipsisLoc, 4932b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar ToColonLoc); 4933b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar} 4934b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar 4935b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga NainarStmt *ASTNodeImporter::VisitDefaultStmt(DefaultStmt *S) { 4936b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar SourceLocation ToDefaultLoc = Importer.Import(S->getDefaultLoc()); 4937b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar SourceLocation ToColonLoc = Importer.Import(S->getColonLoc()); 4938b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar Stmt *ToSubStmt = Importer.Import(S->getSubStmt()); 4939b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar if (!ToSubStmt && S->getSubStmt()) 4940b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar return nullptr; 4941b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar return new (Importer.getToContext()) DefaultStmt(ToDefaultLoc, ToColonLoc, 4942b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar ToSubStmt); 4943b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar} 4944b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar 4945b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga NainarStmt *ASTNodeImporter::VisitLabelStmt(LabelStmt *S) { 4946b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar SourceLocation ToIdentLoc = Importer.Import(S->getIdentLoc()); 4947b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar LabelDecl *ToLabelDecl = 4948b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar cast_or_null<LabelDecl>(Importer.Import(S->getDecl())); 4949b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar if (!ToLabelDecl && S->getDecl()) 4950b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar return nullptr; 4951b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar Stmt *ToSubStmt = Importer.Import(S->getSubStmt()); 4952b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar if (!ToSubStmt && S->getSubStmt()) 4953b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar return nullptr; 4954b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar return new (Importer.getToContext()) LabelStmt(ToIdentLoc, ToLabelDecl, 4955b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar ToSubStmt); 4956b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar} 4957b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar 4958b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga NainarStmt *ASTNodeImporter::VisitAttributedStmt(AttributedStmt *S) { 4959b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar SourceLocation ToAttrLoc = Importer.Import(S->getAttrLoc()); 4960b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar ArrayRef<const Attr*> FromAttrs(S->getAttrs()); 4961b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar SmallVector<const Attr *, 1> ToAttrs(FromAttrs.size()); 4962b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar ASTContext &_ToContext = Importer.getToContext(); 4963b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar std::transform(FromAttrs.begin(), FromAttrs.end(), ToAttrs.begin(), 4964b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar [&_ToContext](const Attr *A) -> const Attr * { 4965b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar return A->clone(_ToContext); 4966b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar }); 4967b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar for (const Attr *ToA : ToAttrs) { 4968b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar if (!ToA) 4969b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar return nullptr; 4970b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar } 4971b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar Stmt *ToSubStmt = Importer.Import(S->getSubStmt()); 4972b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar if (!ToSubStmt && S->getSubStmt()) 4973b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar return nullptr; 4974b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar return AttributedStmt::Create(Importer.getToContext(), ToAttrLoc, 4975b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar ToAttrs, ToSubStmt); 4976b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar} 4977b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar 4978b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga NainarStmt *ASTNodeImporter::VisitIfStmt(IfStmt *S) { 4979b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar SourceLocation ToIfLoc = Importer.Import(S->getIfLoc()); 49804967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Stmt *ToInit = Importer.Import(S->getInit()); 49814967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar if (!ToInit && S->getInit()) 49824967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar return nullptr; 4983b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar VarDecl *ToConditionVariable = nullptr; 4984b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar if (VarDecl *FromConditionVariable = S->getConditionVariable()) { 4985b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar ToConditionVariable = 4986b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar dyn_cast_or_null<VarDecl>(Importer.Import(FromConditionVariable)); 4987b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar if (!ToConditionVariable) 4988b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar return nullptr; 4989b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar } 4990b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar Expr *ToCondition = Importer.Import(S->getCond()); 4991b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar if (!ToCondition && S->getCond()) 4992b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar return nullptr; 4993b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar Stmt *ToThenStmt = Importer.Import(S->getThen()); 4994b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar if (!ToThenStmt && S->getThen()) 4995b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar return nullptr; 4996b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar SourceLocation ToElseLoc = Importer.Import(S->getElseLoc()); 4997b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar Stmt *ToElseStmt = Importer.Import(S->getElse()); 4998b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar if (!ToElseStmt && S->getElse()) 4999b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar return nullptr; 5000b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar return new (Importer.getToContext()) IfStmt(Importer.getToContext(), 50014967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar ToIfLoc, S->isConstexpr(), 50024967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar ToInit, 50034967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar ToConditionVariable, 5004b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar ToCondition, ToThenStmt, 5005b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar ToElseLoc, ToElseStmt); 5006b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar} 5007b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar 5008b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga NainarStmt *ASTNodeImporter::VisitSwitchStmt(SwitchStmt *S) { 50094967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Stmt *ToInit = Importer.Import(S->getInit()); 50104967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar if (!ToInit && S->getInit()) 50114967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar return nullptr; 5012b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar VarDecl *ToConditionVariable = nullptr; 5013b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar if (VarDecl *FromConditionVariable = S->getConditionVariable()) { 5014b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar ToConditionVariable = 5015b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar dyn_cast_or_null<VarDecl>(Importer.Import(FromConditionVariable)); 5016b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar if (!ToConditionVariable) 5017b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar return nullptr; 5018b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar } 5019b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar Expr *ToCondition = Importer.Import(S->getCond()); 5020b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar if (!ToCondition && S->getCond()) 5021b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar return nullptr; 5022b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar SwitchStmt *ToStmt = new (Importer.getToContext()) SwitchStmt( 50234967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Importer.getToContext(), ToInit, 50244967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar ToConditionVariable, ToCondition); 5025b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar Stmt *ToBody = Importer.Import(S->getBody()); 5026b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar if (!ToBody && S->getBody()) 5027b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar return nullptr; 5028b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar ToStmt->setBody(ToBody); 5029b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar ToStmt->setSwitchLoc(Importer.Import(S->getSwitchLoc())); 5030b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar // Now we have to re-chain the cases. 5031b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar SwitchCase *LastChainedSwitchCase = nullptr; 5032b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar for (SwitchCase *SC = S->getSwitchCaseList(); SC != nullptr; 5033b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar SC = SC->getNextSwitchCase()) { 5034b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar SwitchCase *ToSC = dyn_cast_or_null<SwitchCase>(Importer.Import(SC)); 5035b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar if (!ToSC) 5036b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar return nullptr; 5037b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar if (LastChainedSwitchCase) 5038b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar LastChainedSwitchCase->setNextSwitchCase(ToSC); 5039b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar else 5040b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar ToStmt->setSwitchCaseList(ToSC); 5041b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar LastChainedSwitchCase = ToSC; 5042b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar } 5043b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar return ToStmt; 5044b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar} 5045b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar 5046b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga NainarStmt *ASTNodeImporter::VisitWhileStmt(WhileStmt *S) { 5047b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar VarDecl *ToConditionVariable = nullptr; 5048b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar if (VarDecl *FromConditionVariable = S->getConditionVariable()) { 5049b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar ToConditionVariable = 5050b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar dyn_cast_or_null<VarDecl>(Importer.Import(FromConditionVariable)); 5051b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar if (!ToConditionVariable) 5052b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar return nullptr; 5053b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar } 5054b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar Expr *ToCondition = Importer.Import(S->getCond()); 5055b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar if (!ToCondition && S->getCond()) 5056b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar return nullptr; 5057b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar Stmt *ToBody = Importer.Import(S->getBody()); 5058b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar if (!ToBody && S->getBody()) 5059b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar return nullptr; 5060b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar SourceLocation ToWhileLoc = Importer.Import(S->getWhileLoc()); 5061b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar return new (Importer.getToContext()) WhileStmt(Importer.getToContext(), 5062b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar ToConditionVariable, 5063b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar ToCondition, ToBody, 5064b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar ToWhileLoc); 5065b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar} 5066b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar 5067b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga NainarStmt *ASTNodeImporter::VisitDoStmt(DoStmt *S) { 5068b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar Stmt *ToBody = Importer.Import(S->getBody()); 5069b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar if (!ToBody && S->getBody()) 5070b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar return nullptr; 5071b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar Expr *ToCondition = Importer.Import(S->getCond()); 5072b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar if (!ToCondition && S->getCond()) 5073b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar return nullptr; 5074b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar SourceLocation ToDoLoc = Importer.Import(S->getDoLoc()); 5075b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar SourceLocation ToWhileLoc = Importer.Import(S->getWhileLoc()); 5076b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar SourceLocation ToRParenLoc = Importer.Import(S->getRParenLoc()); 5077b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar return new (Importer.getToContext()) DoStmt(ToBody, ToCondition, 5078b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar ToDoLoc, ToWhileLoc, 5079b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar ToRParenLoc); 5080b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar} 5081b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar 5082b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga NainarStmt *ASTNodeImporter::VisitForStmt(ForStmt *S) { 5083b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar Stmt *ToInit = Importer.Import(S->getInit()); 5084b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar if (!ToInit && S->getInit()) 5085b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar return nullptr; 5086b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar Expr *ToCondition = Importer.Import(S->getCond()); 5087b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar if (!ToCondition && S->getCond()) 5088b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar return nullptr; 5089b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar VarDecl *ToConditionVariable = nullptr; 5090b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar if (VarDecl *FromConditionVariable = S->getConditionVariable()) { 5091b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar ToConditionVariable = 5092b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar dyn_cast_or_null<VarDecl>(Importer.Import(FromConditionVariable)); 5093b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar if (!ToConditionVariable) 5094b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar return nullptr; 5095b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar } 5096b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar Expr *ToInc = Importer.Import(S->getInc()); 5097b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar if (!ToInc && S->getInc()) 5098b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar return nullptr; 5099b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar Stmt *ToBody = Importer.Import(S->getBody()); 5100b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar if (!ToBody && S->getBody()) 5101b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar return nullptr; 5102b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar SourceLocation ToForLoc = Importer.Import(S->getForLoc()); 5103b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar SourceLocation ToLParenLoc = Importer.Import(S->getLParenLoc()); 5104b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar SourceLocation ToRParenLoc = Importer.Import(S->getRParenLoc()); 5105b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar return new (Importer.getToContext()) ForStmt(Importer.getToContext(), 5106b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar ToInit, ToCondition, 5107b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar ToConditionVariable, 5108b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar ToInc, ToBody, 5109b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar ToForLoc, ToLParenLoc, 5110b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar ToRParenLoc); 5111b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar} 5112b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar 5113b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga NainarStmt *ASTNodeImporter::VisitGotoStmt(GotoStmt *S) { 5114b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar LabelDecl *ToLabel = nullptr; 5115b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar if (LabelDecl *FromLabel = S->getLabel()) { 5116b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar ToLabel = dyn_cast_or_null<LabelDecl>(Importer.Import(FromLabel)); 5117b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar if (!ToLabel) 5118b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar return nullptr; 5119b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar } 5120b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar SourceLocation ToGotoLoc = Importer.Import(S->getGotoLoc()); 5121b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar SourceLocation ToLabelLoc = Importer.Import(S->getLabelLoc()); 5122b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar return new (Importer.getToContext()) GotoStmt(ToLabel, 5123b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar ToGotoLoc, ToLabelLoc); 5124b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar} 5125b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar 5126b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga NainarStmt *ASTNodeImporter::VisitIndirectGotoStmt(IndirectGotoStmt *S) { 5127b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar SourceLocation ToGotoLoc = Importer.Import(S->getGotoLoc()); 5128b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar SourceLocation ToStarLoc = Importer.Import(S->getStarLoc()); 5129b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar Expr *ToTarget = Importer.Import(S->getTarget()); 5130b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar if (!ToTarget && S->getTarget()) 5131b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar return nullptr; 5132b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar return new (Importer.getToContext()) IndirectGotoStmt(ToGotoLoc, ToStarLoc, 5133b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar ToTarget); 5134b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar} 5135b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar 5136b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga NainarStmt *ASTNodeImporter::VisitContinueStmt(ContinueStmt *S) { 5137b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar SourceLocation ToContinueLoc = Importer.Import(S->getContinueLoc()); 5138b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar return new (Importer.getToContext()) ContinueStmt(ToContinueLoc); 5139b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar} 5140b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar 5141b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga NainarStmt *ASTNodeImporter::VisitBreakStmt(BreakStmt *S) { 5142b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar SourceLocation ToBreakLoc = Importer.Import(S->getBreakLoc()); 5143b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar return new (Importer.getToContext()) BreakStmt(ToBreakLoc); 5144b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar} 5145b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar 5146b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga NainarStmt *ASTNodeImporter::VisitReturnStmt(ReturnStmt *S) { 5147b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar SourceLocation ToRetLoc = Importer.Import(S->getReturnLoc()); 5148b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar Expr *ToRetExpr = Importer.Import(S->getRetValue()); 5149b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar if (!ToRetExpr && S->getRetValue()) 5150b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar return nullptr; 5151b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar VarDecl *NRVOCandidate = const_cast<VarDecl*>(S->getNRVOCandidate()); 5152b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar VarDecl *ToNRVOCandidate = cast_or_null<VarDecl>(Importer.Import(NRVOCandidate)); 5153b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar if (!ToNRVOCandidate && NRVOCandidate) 5154b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar return nullptr; 5155b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar return new (Importer.getToContext()) ReturnStmt(ToRetLoc, ToRetExpr, 5156b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar ToNRVOCandidate); 5157b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar} 5158b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar 5159b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga NainarStmt *ASTNodeImporter::VisitCXXCatchStmt(CXXCatchStmt *S) { 5160b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar SourceLocation ToCatchLoc = Importer.Import(S->getCatchLoc()); 5161b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar VarDecl *ToExceptionDecl = nullptr; 5162b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar if (VarDecl *FromExceptionDecl = S->getExceptionDecl()) { 5163b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar ToExceptionDecl = 5164b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar dyn_cast_or_null<VarDecl>(Importer.Import(FromExceptionDecl)); 5165b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar if (!ToExceptionDecl) 5166b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar return nullptr; 5167b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar } 5168b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar Stmt *ToHandlerBlock = Importer.Import(S->getHandlerBlock()); 5169b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar if (!ToHandlerBlock && S->getHandlerBlock()) 5170b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar return nullptr; 5171b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar return new (Importer.getToContext()) CXXCatchStmt(ToCatchLoc, 5172b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar ToExceptionDecl, 5173b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar ToHandlerBlock); 5174b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar} 5175b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar 5176b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga NainarStmt *ASTNodeImporter::VisitCXXTryStmt(CXXTryStmt *S) { 5177b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar SourceLocation ToTryLoc = Importer.Import(S->getTryLoc()); 5178b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar Stmt *ToTryBlock = Importer.Import(S->getTryBlock()); 5179b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar if (!ToTryBlock && S->getTryBlock()) 5180b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar return nullptr; 5181b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar SmallVector<Stmt *, 1> ToHandlers(S->getNumHandlers()); 5182b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar for (unsigned HI = 0, HE = S->getNumHandlers(); HI != HE; ++HI) { 5183b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar CXXCatchStmt *FromHandler = S->getHandler(HI); 5184b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar if (Stmt *ToHandler = Importer.Import(FromHandler)) 5185b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar ToHandlers[HI] = ToHandler; 5186b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar else 5187b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar return nullptr; 5188b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar } 5189b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar return CXXTryStmt::Create(Importer.getToContext(), ToTryLoc, ToTryBlock, 5190b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar ToHandlers); 5191b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar} 5192b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar 5193b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga NainarStmt *ASTNodeImporter::VisitCXXForRangeStmt(CXXForRangeStmt *S) { 5194b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar DeclStmt *ToRange = 5195b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar dyn_cast_or_null<DeclStmt>(Importer.Import(S->getRangeStmt())); 5196b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar if (!ToRange && S->getRangeStmt()) 5197b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar return nullptr; 51984967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar DeclStmt *ToBegin = 51994967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar dyn_cast_or_null<DeclStmt>(Importer.Import(S->getBeginStmt())); 52004967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar if (!ToBegin && S->getBeginStmt()) 52014967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar return nullptr; 52024967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar DeclStmt *ToEnd = 52034967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar dyn_cast_or_null<DeclStmt>(Importer.Import(S->getEndStmt())); 52044967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar if (!ToEnd && S->getEndStmt()) 5205b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar return nullptr; 5206b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar Expr *ToCond = Importer.Import(S->getCond()); 5207b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar if (!ToCond && S->getCond()) 5208b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar return nullptr; 5209b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar Expr *ToInc = Importer.Import(S->getInc()); 5210b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar if (!ToInc && S->getInc()) 5211b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar return nullptr; 5212b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar DeclStmt *ToLoopVar = 5213b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar dyn_cast_or_null<DeclStmt>(Importer.Import(S->getLoopVarStmt())); 5214b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar if (!ToLoopVar && S->getLoopVarStmt()) 5215b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar return nullptr; 5216b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar Stmt *ToBody = Importer.Import(S->getBody()); 5217b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar if (!ToBody && S->getBody()) 5218b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar return nullptr; 5219b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar SourceLocation ToForLoc = Importer.Import(S->getForLoc()); 522087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar SourceLocation ToCoawaitLoc = Importer.Import(S->getCoawaitLoc()); 5221b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar SourceLocation ToColonLoc = Importer.Import(S->getColonLoc()); 5222b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar SourceLocation ToRParenLoc = Importer.Import(S->getRParenLoc()); 52234967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar return new (Importer.getToContext()) CXXForRangeStmt(ToRange, ToBegin, ToEnd, 5224b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar ToCond, ToInc, 5225b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar ToLoopVar, ToBody, 522687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar ToForLoc, ToCoawaitLoc, 522787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar ToColonLoc, ToRParenLoc); 5228b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar} 5229b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar 5230b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga NainarStmt *ASTNodeImporter::VisitObjCForCollectionStmt(ObjCForCollectionStmt *S) { 5231b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar Stmt *ToElem = Importer.Import(S->getElement()); 5232b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar if (!ToElem && S->getElement()) 5233b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar return nullptr; 5234b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar Expr *ToCollect = Importer.Import(S->getCollection()); 5235b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar if (!ToCollect && S->getCollection()) 5236b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar return nullptr; 5237b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar Stmt *ToBody = Importer.Import(S->getBody()); 5238b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar if (!ToBody && S->getBody()) 5239b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar return nullptr; 5240b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar SourceLocation ToForLoc = Importer.Import(S->getForLoc()); 5241b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar SourceLocation ToRParenLoc = Importer.Import(S->getRParenLoc()); 5242b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar return new (Importer.getToContext()) ObjCForCollectionStmt(ToElem, 5243b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar ToCollect, 5244b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar ToBody, ToForLoc, 5245b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar ToRParenLoc); 5246b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar} 5247b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar 5248b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga NainarStmt *ASTNodeImporter::VisitObjCAtCatchStmt(ObjCAtCatchStmt *S) { 5249b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar SourceLocation ToAtCatchLoc = Importer.Import(S->getAtCatchLoc()); 5250b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar SourceLocation ToRParenLoc = Importer.Import(S->getRParenLoc()); 5251b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar VarDecl *ToExceptionDecl = nullptr; 5252b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar if (VarDecl *FromExceptionDecl = S->getCatchParamDecl()) { 5253b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar ToExceptionDecl = 5254b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar dyn_cast_or_null<VarDecl>(Importer.Import(FromExceptionDecl)); 5255b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar if (!ToExceptionDecl) 5256b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar return nullptr; 5257b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar } 5258b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar Stmt *ToBody = Importer.Import(S->getCatchBody()); 5259b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar if (!ToBody && S->getCatchBody()) 5260b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar return nullptr; 5261b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar return new (Importer.getToContext()) ObjCAtCatchStmt(ToAtCatchLoc, 5262b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar ToRParenLoc, 5263b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar ToExceptionDecl, 5264b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar ToBody); 5265b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar} 5266b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar 5267b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga NainarStmt *ASTNodeImporter::VisitObjCAtFinallyStmt(ObjCAtFinallyStmt *S) { 5268b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar SourceLocation ToAtFinallyLoc = Importer.Import(S->getAtFinallyLoc()); 5269b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar Stmt *ToAtFinallyStmt = Importer.Import(S->getFinallyBody()); 5270b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar if (!ToAtFinallyStmt && S->getFinallyBody()) 5271b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar return nullptr; 5272b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar return new (Importer.getToContext()) ObjCAtFinallyStmt(ToAtFinallyLoc, 5273b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar ToAtFinallyStmt); 5274b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar} 5275b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar 5276b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga NainarStmt *ASTNodeImporter::VisitObjCAtTryStmt(ObjCAtTryStmt *S) { 5277b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar SourceLocation ToAtTryLoc = Importer.Import(S->getAtTryLoc()); 5278b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar Stmt *ToAtTryStmt = Importer.Import(S->getTryBody()); 5279b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar if (!ToAtTryStmt && S->getTryBody()) 5280b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar return nullptr; 5281b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar SmallVector<Stmt *, 1> ToCatchStmts(S->getNumCatchStmts()); 5282b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar for (unsigned CI = 0, CE = S->getNumCatchStmts(); CI != CE; ++CI) { 5283b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar ObjCAtCatchStmt *FromCatchStmt = S->getCatchStmt(CI); 5284b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar if (Stmt *ToCatchStmt = Importer.Import(FromCatchStmt)) 5285b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar ToCatchStmts[CI] = ToCatchStmt; 5286b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar else 5287b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar return nullptr; 5288b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar } 5289b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar Stmt *ToAtFinallyStmt = Importer.Import(S->getFinallyStmt()); 5290b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar if (!ToAtFinallyStmt && S->getFinallyStmt()) 5291b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar return nullptr; 5292b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar return ObjCAtTryStmt::Create(Importer.getToContext(), 5293b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar ToAtTryLoc, ToAtTryStmt, 5294b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar ToCatchStmts.begin(), ToCatchStmts.size(), 5295b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar ToAtFinallyStmt); 5296b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar} 5297b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar 5298b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga NainarStmt *ASTNodeImporter::VisitObjCAtSynchronizedStmt 5299b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar (ObjCAtSynchronizedStmt *S) { 5300b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar SourceLocation ToAtSynchronizedLoc = 5301b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar Importer.Import(S->getAtSynchronizedLoc()); 5302b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar Expr *ToSynchExpr = Importer.Import(S->getSynchExpr()); 5303b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar if (!ToSynchExpr && S->getSynchExpr()) 5304b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar return nullptr; 5305b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar Stmt *ToSynchBody = Importer.Import(S->getSynchBody()); 5306b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar if (!ToSynchBody && S->getSynchBody()) 5307b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar return nullptr; 5308b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar return new (Importer.getToContext()) ObjCAtSynchronizedStmt( 5309b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar ToAtSynchronizedLoc, ToSynchExpr, ToSynchBody); 5310b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar} 5311b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar 5312b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga NainarStmt *ASTNodeImporter::VisitObjCAtThrowStmt(ObjCAtThrowStmt *S) { 5313b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar SourceLocation ToAtThrowLoc = Importer.Import(S->getThrowLoc()); 5314b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar Expr *ToThrow = Importer.Import(S->getThrowExpr()); 5315b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar if (!ToThrow && S->getThrowExpr()) 5316b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar return nullptr; 5317b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar return new (Importer.getToContext()) ObjCAtThrowStmt(ToAtThrowLoc, ToThrow); 5318b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar} 5319b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar 5320b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga NainarStmt *ASTNodeImporter::VisitObjCAutoreleasePoolStmt 5321b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar (ObjCAutoreleasePoolStmt *S) { 5322b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar SourceLocation ToAtLoc = Importer.Import(S->getAtLoc()); 5323b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar Stmt *ToSubStmt = Importer.Import(S->getSubStmt()); 5324b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar if (!ToSubStmt && S->getSubStmt()) 5325b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar return nullptr; 5326b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar return new (Importer.getToContext()) ObjCAutoreleasePoolStmt(ToAtLoc, 5327b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar ToSubStmt); 53284800d95d28b20eca5d57c108ae3d2e6e312c1182Douglas Gregor} 53294800d95d28b20eca5d57c108ae3d2e6e312c1182Douglas Gregor 53304800d95d28b20eca5d57c108ae3d2e6e312c1182Douglas Gregor//---------------------------------------------------------------------------- 53314800d95d28b20eca5d57c108ae3d2e6e312c1182Douglas Gregor// Import Expressions 53324800d95d28b20eca5d57c108ae3d2e6e312c1182Douglas Gregor//---------------------------------------------------------------------------- 53334800d95d28b20eca5d57c108ae3d2e6e312c1182Douglas GregorExpr *ASTNodeImporter::VisitExpr(Expr *E) { 53344800d95d28b20eca5d57c108ae3d2e6e312c1182Douglas Gregor Importer.FromDiag(E->getLocStart(), diag::err_unsupported_ast_node) 53354800d95d28b20eca5d57c108ae3d2e6e312c1182Douglas Gregor << E->getStmtClassName(); 53366bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return nullptr; 53374800d95d28b20eca5d57c108ae3d2e6e312c1182Douglas Gregor} 53384800d95d28b20eca5d57c108ae3d2e6e312c1182Douglas Gregor 53394967a710c84587c654b56c828382219c3937dacbPirama Arumuga NainarExpr *ASTNodeImporter::VisitVAArgExpr(VAArgExpr *E) { 53404967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar QualType T = Importer.Import(E->getType()); 53414967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar if (T.isNull()) 53424967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar return nullptr; 53434967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar 53444967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Expr *SubExpr = Importer.Import(E->getSubExpr()); 53454967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar if (!SubExpr && E->getSubExpr()) 53464967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar return nullptr; 53474967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar 53484967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar TypeSourceInfo *TInfo = Importer.Import(E->getWrittenTypeInfo()); 53494967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar if (!TInfo) 53504967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar return nullptr; 53514967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar 53524967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar return new (Importer.getToContext()) VAArgExpr( 53534967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Importer.Import(E->getBuiltinLoc()), SubExpr, TInfo, 53544967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Importer.Import(E->getRParenLoc()), T, E->isMicrosoftABI()); 53554967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar} 53564967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar 53574967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar 53584967a710c84587c654b56c828382219c3937dacbPirama Arumuga NainarExpr *ASTNodeImporter::VisitGNUNullExpr(GNUNullExpr *E) { 53594967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar QualType T = Importer.Import(E->getType()); 53604967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar if (T.isNull()) 53614967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar return nullptr; 53624967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar 53634967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar return new (Importer.getToContext()) GNUNullExpr( 53644967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar T, Importer.Import(E->getExprLoc())); 53654967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar} 53664967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar 53674967a710c84587c654b56c828382219c3937dacbPirama Arumuga NainarExpr *ASTNodeImporter::VisitPredefinedExpr(PredefinedExpr *E) { 53684967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar QualType T = Importer.Import(E->getType()); 53694967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar if (T.isNull()) 53704967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar return nullptr; 53714967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar 53724967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar StringLiteral *SL = cast_or_null<StringLiteral>( 53734967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Importer.Import(E->getFunctionName())); 53744967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar if (!SL && E->getFunctionName()) 53754967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar return nullptr; 53764967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar 53774967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar return new (Importer.getToContext()) PredefinedExpr( 53784967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Importer.Import(E->getExprLoc()), T, E->getIdentType(), SL); 53794967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar} 53804967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar 5381440806306674e23ad74726208cbdc6f37849dd9dDouglas GregorExpr *ASTNodeImporter::VisitDeclRefExpr(DeclRefExpr *E) { 5382440806306674e23ad74726208cbdc6f37849dd9dDouglas Gregor ValueDecl *ToD = cast_or_null<ValueDecl>(Importer.Import(E->getDecl())); 5383440806306674e23ad74726208cbdc6f37849dd9dDouglas Gregor if (!ToD) 53846bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return nullptr; 53853aa8140bde5b9bedf13e46ec0a668daa54814196Chandler Carruth 53866bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines NamedDecl *FoundD = nullptr; 53873aa8140bde5b9bedf13e46ec0a668daa54814196Chandler Carruth if (E->getDecl() != E->getFoundDecl()) { 53883aa8140bde5b9bedf13e46ec0a668daa54814196Chandler Carruth FoundD = cast_or_null<NamedDecl>(Importer.Import(E->getFoundDecl())); 53893aa8140bde5b9bedf13e46ec0a668daa54814196Chandler Carruth if (!FoundD) 53906bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return nullptr; 53913aa8140bde5b9bedf13e46ec0a668daa54814196Chandler Carruth } 5392440806306674e23ad74726208cbdc6f37849dd9dDouglas Gregor 5393440806306674e23ad74726208cbdc6f37849dd9dDouglas Gregor QualType T = Importer.Import(E->getType()); 5394440806306674e23ad74726208cbdc6f37849dd9dDouglas Gregor if (T.isNull()) 53956bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return nullptr; 53967cc58b4c927fca539d43eaa58e00dca95946eb7cAbramo Bagnara 53977cc58b4c927fca539d43eaa58e00dca95946eb7cAbramo Bagnara DeclRefExpr *DRE = DeclRefExpr::Create(Importer.getToContext(), 53987cc58b4c927fca539d43eaa58e00dca95946eb7cAbramo Bagnara Importer.Import(E->getQualifierLoc()), 5399e4b92761b43ced611c417ae478568610f1ad7b1eAbramo Bagnara Importer.Import(E->getTemplateKeywordLoc()), 54007cc58b4c927fca539d43eaa58e00dca95946eb7cAbramo Bagnara ToD, 54010e2c34f92f00628d48968dfea096d36381f494cbStephen Hines E->refersToEnclosingVariableOrCapture(), 54027cc58b4c927fca539d43eaa58e00dca95946eb7cAbramo Bagnara Importer.Import(E->getLocation()), 54037cc58b4c927fca539d43eaa58e00dca95946eb7cAbramo Bagnara T, E->getValueKind(), 54047cc58b4c927fca539d43eaa58e00dca95946eb7cAbramo Bagnara FoundD, 54056bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines /*FIXME:TemplateArgs=*/nullptr); 54067cc58b4c927fca539d43eaa58e00dca95946eb7cAbramo Bagnara if (E->hadMultipleCandidates()) 54077cc58b4c927fca539d43eaa58e00dca95946eb7cAbramo Bagnara DRE->setHadMultipleCandidates(true); 54087cc58b4c927fca539d43eaa58e00dca95946eb7cAbramo Bagnara return DRE; 5409440806306674e23ad74726208cbdc6f37849dd9dDouglas Gregor} 5410440806306674e23ad74726208cbdc6f37849dd9dDouglas Gregor 54114967a710c84587c654b56c828382219c3937dacbPirama Arumuga NainarExpr *ASTNodeImporter::VisitImplicitValueInitExpr(ImplicitValueInitExpr *E) { 54124967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar QualType T = Importer.Import(E->getType()); 54134967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar if (T.isNull()) 54144967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar return NULL; 54154967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar 54164967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar return new (Importer.getToContext()) ImplicitValueInitExpr(T); 54174967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar} 54184967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar 54194967a710c84587c654b56c828382219c3937dacbPirama Arumuga NainarASTNodeImporter::Designator 54204967a710c84587c654b56c828382219c3937dacbPirama Arumuga NainarASTNodeImporter::ImportDesignator(const Designator &D) { 54214967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar if (D.isFieldDesignator()) { 54224967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar IdentifierInfo *ToFieldName = Importer.Import(D.getFieldName()); 54234967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar // Caller checks for import error 54244967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar return Designator(ToFieldName, Importer.Import(D.getDotLoc()), 54254967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Importer.Import(D.getFieldLoc())); 54264967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar } 54274967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar if (D.isArrayDesignator()) 54284967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar return Designator(D.getFirstExprIndex(), 54294967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Importer.Import(D.getLBracketLoc()), 54304967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Importer.Import(D.getRBracketLoc())); 54314967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar 54324967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar assert(D.isArrayRangeDesignator()); 54334967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar return Designator(D.getFirstExprIndex(), 54344967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Importer.Import(D.getLBracketLoc()), 54354967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Importer.Import(D.getEllipsisLoc()), 54364967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Importer.Import(D.getRBracketLoc())); 54374967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar} 54384967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar 54394967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar 54404967a710c84587c654b56c828382219c3937dacbPirama Arumuga NainarExpr *ASTNodeImporter::VisitDesignatedInitExpr(DesignatedInitExpr *DIE) { 54414967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Expr *Init = cast_or_null<Expr>(Importer.Import(DIE->getInit())); 54424967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar if (!Init) 54434967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar return nullptr; 54444967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar 54454967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar SmallVector<Expr *, 4> IndexExprs(DIE->getNumSubExprs() - 1); 54464967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar // List elements from the second, the first is Init itself 54474967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar for (unsigned I = 1, E = DIE->getNumSubExprs(); I < E; I++) { 54484967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar if (Expr *Arg = cast_or_null<Expr>(Importer.Import(DIE->getSubExpr(I)))) 54494967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar IndexExprs[I - 1] = Arg; 54504967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar else 54514967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar return nullptr; 54524967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar } 54534967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar 54544967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar SmallVector<Designator, 4> Designators(DIE->size()); 54554967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar llvm::transform(DIE->designators(), Designators.begin(), 54564967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar [this](const Designator &D) -> Designator { 54574967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar return ImportDesignator(D); 54584967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar }); 54594967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar 54604967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar for (const Designator &D : DIE->designators()) 54614967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar if (D.isFieldDesignator() && !D.getFieldName()) 54624967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar return nullptr; 54634967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar 54644967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar return DesignatedInitExpr::Create( 54654967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Importer.getToContext(), Designators, 54664967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar IndexExprs, Importer.Import(DIE->getEqualOrColonLoc()), 54674967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar DIE->usesGNUSyntax(), Init); 54684967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar} 54694967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar 54704967a710c84587c654b56c828382219c3937dacbPirama Arumuga NainarExpr *ASTNodeImporter::VisitCXXNullPtrLiteralExpr(CXXNullPtrLiteralExpr *E) { 54714967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar QualType T = Importer.Import(E->getType()); 54724967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar if (T.isNull()) 54734967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar return nullptr; 54744967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar 54754967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar return new (Importer.getToContext()) 54764967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar CXXNullPtrLiteralExpr(T, Importer.Import(E->getLocation())); 54774967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar} 54784967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar 54794800d95d28b20eca5d57c108ae3d2e6e312c1182Douglas GregorExpr *ASTNodeImporter::VisitIntegerLiteral(IntegerLiteral *E) { 54804800d95d28b20eca5d57c108ae3d2e6e312c1182Douglas Gregor QualType T = Importer.Import(E->getType()); 54814800d95d28b20eca5d57c108ae3d2e6e312c1182Douglas Gregor if (T.isNull()) 54826bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return nullptr; 54834800d95d28b20eca5d57c108ae3d2e6e312c1182Douglas Gregor 54849996a7f06a3c5b4554692e7177930cf4e8ef09afArgyrios Kyrtzidis return IntegerLiteral::Create(Importer.getToContext(), 54859996a7f06a3c5b4554692e7177930cf4e8ef09afArgyrios Kyrtzidis E->getValue(), T, 54869996a7f06a3c5b4554692e7177930cf4e8ef09afArgyrios Kyrtzidis Importer.Import(E->getLocation())); 54874800d95d28b20eca5d57c108ae3d2e6e312c1182Douglas Gregor} 54884800d95d28b20eca5d57c108ae3d2e6e312c1182Douglas Gregor 54894967a710c84587c654b56c828382219c3937dacbPirama Arumuga NainarExpr *ASTNodeImporter::VisitFloatingLiteral(FloatingLiteral *E) { 54904967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar QualType T = Importer.Import(E->getType()); 54914967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar if (T.isNull()) 54924967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar return nullptr; 54934967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar 54944967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar return FloatingLiteral::Create(Importer.getToContext(), 54954967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar E->getValue(), E->isExact(), T, 54964967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Importer.Import(E->getLocation())); 54974967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar} 54984967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar 5499b2e400aae8c62c4e1616016f40618baace0da065Douglas GregorExpr *ASTNodeImporter::VisitCharacterLiteral(CharacterLiteral *E) { 5500b2e400aae8c62c4e1616016f40618baace0da065Douglas Gregor QualType T = Importer.Import(E->getType()); 5501b2e400aae8c62c4e1616016f40618baace0da065Douglas Gregor if (T.isNull()) 55026bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return nullptr; 55036bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 55045cee1195584fa8672253139c86e922daeda69b9eDouglas Gregor return new (Importer.getToContext()) CharacterLiteral(E->getValue(), 55055cee1195584fa8672253139c86e922daeda69b9eDouglas Gregor E->getKind(), T, 5506b2e400aae8c62c4e1616016f40618baace0da065Douglas Gregor Importer.Import(E->getLocation())); 5507b2e400aae8c62c4e1616016f40618baace0da065Douglas Gregor} 5508b2e400aae8c62c4e1616016f40618baace0da065Douglas Gregor 55094967a710c84587c654b56c828382219c3937dacbPirama Arumuga NainarExpr *ASTNodeImporter::VisitStringLiteral(StringLiteral *E) { 55104967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar QualType T = Importer.Import(E->getType()); 55114967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar if (T.isNull()) 55124967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar return nullptr; 55134967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar 55144967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar SmallVector<SourceLocation, 4> Locations(E->getNumConcatenated()); 55154967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar ImportArray(E->tokloc_begin(), E->tokloc_end(), Locations.begin()); 55164967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar 55174967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar return StringLiteral::Create(Importer.getToContext(), E->getBytes(), 55184967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar E->getKind(), E->isPascal(), T, 55194967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Locations.data(), Locations.size()); 55204967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar} 55214967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar 55224967a710c84587c654b56c828382219c3937dacbPirama Arumuga NainarExpr *ASTNodeImporter::VisitCompoundLiteralExpr(CompoundLiteralExpr *E) { 55234967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar QualType T = Importer.Import(E->getType()); 55244967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar if (T.isNull()) 55254967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar return nullptr; 55264967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar 55274967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar TypeSourceInfo *TInfo = Importer.Import(E->getTypeSourceInfo()); 55284967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar if (!TInfo) 55294967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar return nullptr; 55304967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar 55314967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Expr *Init = Importer.Import(E->getInitializer()); 55324967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar if (!Init) 55334967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar return nullptr; 55344967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar 55354967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar return new (Importer.getToContext()) CompoundLiteralExpr( 55364967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Importer.Import(E->getLParenLoc()), TInfo, T, E->getValueKind(), 55374967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Init, E->isFileScope()); 55384967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar} 55394967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar 55404967a710c84587c654b56c828382219c3937dacbPirama Arumuga NainarExpr *ASTNodeImporter::VisitAtomicExpr(AtomicExpr *E) { 55414967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar QualType T = Importer.Import(E->getType()); 55424967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar if (T.isNull()) 55434967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar return nullptr; 55444967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar 55454967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar SmallVector<Expr *, 6> Exprs(E->getNumSubExprs()); 55464967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar if (ImportArrayChecked( 55474967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar E->getSubExprs(), E->getSubExprs() + E->getNumSubExprs(), 55484967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Exprs.begin())) 55494967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar return nullptr; 55504967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar 55514967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar return new (Importer.getToContext()) AtomicExpr( 55524967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Importer.Import(E->getBuiltinLoc()), Exprs, T, E->getOp(), 55534967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Importer.Import(E->getRParenLoc())); 55544967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar} 55554967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar 55564967a710c84587c654b56c828382219c3937dacbPirama Arumuga NainarExpr *ASTNodeImporter::VisitAddrLabelExpr(AddrLabelExpr *E) { 55574967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar QualType T = Importer.Import(E->getType()); 55584967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar if (T.isNull()) 55594967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar return nullptr; 55604967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar 55614967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar LabelDecl *ToLabel = cast_or_null<LabelDecl>(Importer.Import(E->getLabel())); 55624967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar if (!ToLabel) 55634967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar return nullptr; 55644967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar 55654967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar return new (Importer.getToContext()) AddrLabelExpr( 55664967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Importer.Import(E->getAmpAmpLoc()), Importer.Import(E->getLabelLoc()), 55674967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar ToLabel, T); 55684967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar} 55694967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar 5570f638f9580ba0da99a66668f00e1a1d4987067bddDouglas GregorExpr *ASTNodeImporter::VisitParenExpr(ParenExpr *E) { 5571f638f9580ba0da99a66668f00e1a1d4987067bddDouglas Gregor Expr *SubExpr = Importer.Import(E->getSubExpr()); 5572f638f9580ba0da99a66668f00e1a1d4987067bddDouglas Gregor if (!SubExpr) 55736bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return nullptr; 55746bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 5575f638f9580ba0da99a66668f00e1a1d4987067bddDouglas Gregor return new (Importer.getToContext()) 5576f638f9580ba0da99a66668f00e1a1d4987067bddDouglas Gregor ParenExpr(Importer.Import(E->getLParen()), 5577f638f9580ba0da99a66668f00e1a1d4987067bddDouglas Gregor Importer.Import(E->getRParen()), 5578f638f9580ba0da99a66668f00e1a1d4987067bddDouglas Gregor SubExpr); 5579f638f9580ba0da99a66668f00e1a1d4987067bddDouglas Gregor} 5580f638f9580ba0da99a66668f00e1a1d4987067bddDouglas Gregor 55814967a710c84587c654b56c828382219c3937dacbPirama Arumuga NainarExpr *ASTNodeImporter::VisitParenListExpr(ParenListExpr *E) { 55824967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar SmallVector<Expr *, 4> Exprs(E->getNumExprs()); 55834967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar if (ImportArrayChecked( 55844967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar E->getExprs(), E->getExprs() + E->getNumExprs(), Exprs.begin())) 55854967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar return nullptr; 55864967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar 55874967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar return new (Importer.getToContext()) ParenListExpr( 55884967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Importer.getToContext(), Importer.Import(E->getLParenLoc()), 55894967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Exprs, Importer.Import(E->getLParenLoc())); 55904967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar} 55914967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar 55924967a710c84587c654b56c828382219c3937dacbPirama Arumuga NainarExpr *ASTNodeImporter::VisitStmtExpr(StmtExpr *E) { 55934967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar QualType T = Importer.Import(E->getType()); 55944967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar if (T.isNull()) 55954967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar return nullptr; 55964967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar 55974967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar CompoundStmt *ToSubStmt = cast_or_null<CompoundStmt>( 55984967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Importer.Import(E->getSubStmt())); 55994967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar if (!ToSubStmt && E->getSubStmt()) 56004967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar return nullptr; 56014967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar 56024967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar return new (Importer.getToContext()) StmtExpr(ToSubStmt, T, 56034967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Importer.Import(E->getLParenLoc()), Importer.Import(E->getRParenLoc())); 56044967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar} 56054967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar 5606f638f9580ba0da99a66668f00e1a1d4987067bddDouglas GregorExpr *ASTNodeImporter::VisitUnaryOperator(UnaryOperator *E) { 5607f638f9580ba0da99a66668f00e1a1d4987067bddDouglas Gregor QualType T = Importer.Import(E->getType()); 5608f638f9580ba0da99a66668f00e1a1d4987067bddDouglas Gregor if (T.isNull()) 56096bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return nullptr; 5610f638f9580ba0da99a66668f00e1a1d4987067bddDouglas Gregor 5611f638f9580ba0da99a66668f00e1a1d4987067bddDouglas Gregor Expr *SubExpr = Importer.Import(E->getSubExpr()); 5612f638f9580ba0da99a66668f00e1a1d4987067bddDouglas Gregor if (!SubExpr) 56136bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return nullptr; 56146bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 5615f638f9580ba0da99a66668f00e1a1d4987067bddDouglas Gregor return new (Importer.getToContext()) UnaryOperator(SubExpr, E->getOpcode(), 5616f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall T, E->getValueKind(), 5617f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall E->getObjectKind(), 5618f638f9580ba0da99a66668f00e1a1d4987067bddDouglas Gregor Importer.Import(E->getOperatorLoc())); 5619f638f9580ba0da99a66668f00e1a1d4987067bddDouglas Gregor} 5620f638f9580ba0da99a66668f00e1a1d4987067bddDouglas Gregor 5621f4e3cfbe8abd124be6341ef5d714819b4fbd9082Peter CollingbourneExpr *ASTNodeImporter::VisitUnaryExprOrTypeTraitExpr( 5622f4e3cfbe8abd124be6341ef5d714819b4fbd9082Peter Collingbourne UnaryExprOrTypeTraitExpr *E) { 5623bd249a542878a626192746c1e0c0b21f164e6df7Douglas Gregor QualType ResultType = Importer.Import(E->getType()); 5624bd249a542878a626192746c1e0c0b21f164e6df7Douglas Gregor 5625bd249a542878a626192746c1e0c0b21f164e6df7Douglas Gregor if (E->isArgumentType()) { 5626bd249a542878a626192746c1e0c0b21f164e6df7Douglas Gregor TypeSourceInfo *TInfo = Importer.Import(E->getArgumentTypeInfo()); 5627bd249a542878a626192746c1e0c0b21f164e6df7Douglas Gregor if (!TInfo) 56286bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return nullptr; 56296bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 5630f4e3cfbe8abd124be6341ef5d714819b4fbd9082Peter Collingbourne return new (Importer.getToContext()) UnaryExprOrTypeTraitExpr(E->getKind(), 5631f4e3cfbe8abd124be6341ef5d714819b4fbd9082Peter Collingbourne TInfo, ResultType, 5632bd249a542878a626192746c1e0c0b21f164e6df7Douglas Gregor Importer.Import(E->getOperatorLoc()), 5633bd249a542878a626192746c1e0c0b21f164e6df7Douglas Gregor Importer.Import(E->getRParenLoc())); 5634bd249a542878a626192746c1e0c0b21f164e6df7Douglas Gregor } 5635bd249a542878a626192746c1e0c0b21f164e6df7Douglas Gregor 5636bd249a542878a626192746c1e0c0b21f164e6df7Douglas Gregor Expr *SubExpr = Importer.Import(E->getArgumentExpr()); 5637bd249a542878a626192746c1e0c0b21f164e6df7Douglas Gregor if (!SubExpr) 56386bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return nullptr; 56396bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 5640f4e3cfbe8abd124be6341ef5d714819b4fbd9082Peter Collingbourne return new (Importer.getToContext()) UnaryExprOrTypeTraitExpr(E->getKind(), 5641f4e3cfbe8abd124be6341ef5d714819b4fbd9082Peter Collingbourne SubExpr, ResultType, 5642bd249a542878a626192746c1e0c0b21f164e6df7Douglas Gregor Importer.Import(E->getOperatorLoc()), 5643bd249a542878a626192746c1e0c0b21f164e6df7Douglas Gregor Importer.Import(E->getRParenLoc())); 5644bd249a542878a626192746c1e0c0b21f164e6df7Douglas Gregor} 5645bd249a542878a626192746c1e0c0b21f164e6df7Douglas Gregor 5646f638f9580ba0da99a66668f00e1a1d4987067bddDouglas GregorExpr *ASTNodeImporter::VisitBinaryOperator(BinaryOperator *E) { 5647f638f9580ba0da99a66668f00e1a1d4987067bddDouglas Gregor QualType T = Importer.Import(E->getType()); 5648f638f9580ba0da99a66668f00e1a1d4987067bddDouglas Gregor if (T.isNull()) 56496bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return nullptr; 5650f638f9580ba0da99a66668f00e1a1d4987067bddDouglas Gregor 5651f638f9580ba0da99a66668f00e1a1d4987067bddDouglas Gregor Expr *LHS = Importer.Import(E->getLHS()); 5652f638f9580ba0da99a66668f00e1a1d4987067bddDouglas Gregor if (!LHS) 56536bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return nullptr; 56546bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 5655f638f9580ba0da99a66668f00e1a1d4987067bddDouglas Gregor Expr *RHS = Importer.Import(E->getRHS()); 5656f638f9580ba0da99a66668f00e1a1d4987067bddDouglas Gregor if (!RHS) 56576bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return nullptr; 56586bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 5659f638f9580ba0da99a66668f00e1a1d4987067bddDouglas Gregor return new (Importer.getToContext()) BinaryOperator(LHS, RHS, E->getOpcode(), 5660f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall T, E->getValueKind(), 5661f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall E->getObjectKind(), 5662be9af1288881110e406b87914162eaa59f1e5918Lang Hames Importer.Import(E->getOperatorLoc()), 5663be9af1288881110e406b87914162eaa59f1e5918Lang Hames E->isFPContractable()); 5664f638f9580ba0da99a66668f00e1a1d4987067bddDouglas Gregor} 5665f638f9580ba0da99a66668f00e1a1d4987067bddDouglas Gregor 56664967a710c84587c654b56c828382219c3937dacbPirama Arumuga NainarExpr *ASTNodeImporter::VisitConditionalOperator(ConditionalOperator *E) { 56674967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar QualType T = Importer.Import(E->getType()); 56684967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar if (T.isNull()) 56694967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar return nullptr; 56704967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar 56714967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Expr *ToLHS = Importer.Import(E->getLHS()); 56724967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar if (!ToLHS) 56734967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar return nullptr; 56744967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar 56754967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Expr *ToRHS = Importer.Import(E->getRHS()); 56764967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar if (!ToRHS) 56774967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar return nullptr; 56784967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar 56794967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Expr *ToCond = Importer.Import(E->getCond()); 56804967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar if (!ToCond) 56814967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar return nullptr; 56824967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar 56834967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar return new (Importer.getToContext()) ConditionalOperator( 56844967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar ToCond, Importer.Import(E->getQuestionLoc()), 56854967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar ToLHS, Importer.Import(E->getColonLoc()), 56864967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar ToRHS, T, E->getValueKind(), E->getObjectKind()); 56874967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar} 56884967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar 56894967a710c84587c654b56c828382219c3937dacbPirama Arumuga NainarExpr *ASTNodeImporter::VisitBinaryConditionalOperator( 56904967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar BinaryConditionalOperator *E) { 56914967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar QualType T = Importer.Import(E->getType()); 56924967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar if (T.isNull()) 56934967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar return nullptr; 56944967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar 56954967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Expr *Common = Importer.Import(E->getCommon()); 56964967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar if (!Common) 56974967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar return nullptr; 56984967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar 56994967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Expr *Cond = Importer.Import(E->getCond()); 57004967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar if (!Cond) 57014967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar return nullptr; 57024967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar 57034967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar OpaqueValueExpr *OpaqueValue = cast_or_null<OpaqueValueExpr>( 57044967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Importer.Import(E->getOpaqueValue())); 57054967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar if (!OpaqueValue) 57064967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar return nullptr; 57074967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar 57084967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Expr *TrueExpr = Importer.Import(E->getTrueExpr()); 57094967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar if (!TrueExpr) 57104967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar return nullptr; 57114967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar 57124967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Expr *FalseExpr = Importer.Import(E->getFalseExpr()); 57134967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar if (!FalseExpr) 57144967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar return nullptr; 57154967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar 57164967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar return new (Importer.getToContext()) BinaryConditionalOperator( 57174967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Common, OpaqueValue, Cond, TrueExpr, FalseExpr, 57184967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Importer.Import(E->getQuestionLoc()), Importer.Import(E->getColonLoc()), 57194967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar T, E->getValueKind(), E->getObjectKind()); 57204967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar} 57214967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar 57224967a710c84587c654b56c828382219c3937dacbPirama Arumuga NainarExpr *ASTNodeImporter::VisitOpaqueValueExpr(OpaqueValueExpr *E) { 57234967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar QualType T = Importer.Import(E->getType()); 57244967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar if (T.isNull()) 57254967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar return nullptr; 57264967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar 57274967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Expr *SourceExpr = Importer.Import(E->getSourceExpr()); 57284967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar if (!SourceExpr && E->getSourceExpr()) 57294967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar return nullptr; 57304967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar 57314967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar return new (Importer.getToContext()) OpaqueValueExpr( 57324967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Importer.Import(E->getExprLoc()), T, E->getValueKind(), 57334967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar E->getObjectKind(), SourceExpr); 57344967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar} 57354967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar 5736f638f9580ba0da99a66668f00e1a1d4987067bddDouglas GregorExpr *ASTNodeImporter::VisitCompoundAssignOperator(CompoundAssignOperator *E) { 5737f638f9580ba0da99a66668f00e1a1d4987067bddDouglas Gregor QualType T = Importer.Import(E->getType()); 5738f638f9580ba0da99a66668f00e1a1d4987067bddDouglas Gregor if (T.isNull()) 57396bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return nullptr; 57406bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 5741f638f9580ba0da99a66668f00e1a1d4987067bddDouglas Gregor QualType CompLHSType = Importer.Import(E->getComputationLHSType()); 5742f638f9580ba0da99a66668f00e1a1d4987067bddDouglas Gregor if (CompLHSType.isNull()) 57436bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return nullptr; 57446bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 5745f638f9580ba0da99a66668f00e1a1d4987067bddDouglas Gregor QualType CompResultType = Importer.Import(E->getComputationResultType()); 5746f638f9580ba0da99a66668f00e1a1d4987067bddDouglas Gregor if (CompResultType.isNull()) 57476bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return nullptr; 57486bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 5749f638f9580ba0da99a66668f00e1a1d4987067bddDouglas Gregor Expr *LHS = Importer.Import(E->getLHS()); 5750f638f9580ba0da99a66668f00e1a1d4987067bddDouglas Gregor if (!LHS) 57516bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return nullptr; 57526bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 5753f638f9580ba0da99a66668f00e1a1d4987067bddDouglas Gregor Expr *RHS = Importer.Import(E->getRHS()); 5754f638f9580ba0da99a66668f00e1a1d4987067bddDouglas Gregor if (!RHS) 57556bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return nullptr; 57566bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 5757f638f9580ba0da99a66668f00e1a1d4987067bddDouglas Gregor return new (Importer.getToContext()) 5758f638f9580ba0da99a66668f00e1a1d4987067bddDouglas Gregor CompoundAssignOperator(LHS, RHS, E->getOpcode(), 5759f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall T, E->getValueKind(), 5760f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall E->getObjectKind(), 5761f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall CompLHSType, CompResultType, 5762be9af1288881110e406b87914162eaa59f1e5918Lang Hames Importer.Import(E->getOperatorLoc()), 5763be9af1288881110e406b87914162eaa59f1e5918Lang Hames E->isFPContractable()); 5764f638f9580ba0da99a66668f00e1a1d4987067bddDouglas Gregor} 5765f638f9580ba0da99a66668f00e1a1d4987067bddDouglas Gregor 5766da57f3eeab7b7f7f6e6788956f0a0d9adf196a7dBenjamin Kramerstatic bool ImportCastPath(CastExpr *E, CXXCastPath &Path) { 5767f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall if (E->path_empty()) return false; 5768f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall 5769f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall // TODO: import cast paths 5770f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall return true; 5771f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall} 5772f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall 577336ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas GregorExpr *ASTNodeImporter::VisitImplicitCastExpr(ImplicitCastExpr *E) { 577436ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas Gregor QualType T = Importer.Import(E->getType()); 577536ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas Gregor if (T.isNull()) 57766bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return nullptr; 577736ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas Gregor 577836ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas Gregor Expr *SubExpr = Importer.Import(E->getSubExpr()); 577936ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas Gregor if (!SubExpr) 57806bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return nullptr; 5781f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall 5782f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall CXXCastPath BasePath; 5783f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall if (ImportCastPath(E, BasePath)) 57846bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return nullptr; 5785f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall 5786f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall return ImplicitCastExpr::Create(Importer.getToContext(), T, E->getCastKind(), 57875baba9d98364a3525d6afa15a04cdad82fd6dd30John McCall SubExpr, &BasePath, E->getValueKind()); 578836ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas Gregor} 578936ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas Gregor 5790008847a70ab122a99911149199855060fb3753b4Douglas GregorExpr *ASTNodeImporter::VisitCStyleCastExpr(CStyleCastExpr *E) { 5791008847a70ab122a99911149199855060fb3753b4Douglas Gregor QualType T = Importer.Import(E->getType()); 5792008847a70ab122a99911149199855060fb3753b4Douglas Gregor if (T.isNull()) 57936bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return nullptr; 57946bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 5795008847a70ab122a99911149199855060fb3753b4Douglas Gregor Expr *SubExpr = Importer.Import(E->getSubExpr()); 5796008847a70ab122a99911149199855060fb3753b4Douglas Gregor if (!SubExpr) 57976bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return nullptr; 5798008847a70ab122a99911149199855060fb3753b4Douglas Gregor 5799008847a70ab122a99911149199855060fb3753b4Douglas Gregor TypeSourceInfo *TInfo = Importer.Import(E->getTypeInfoAsWritten()); 5800008847a70ab122a99911149199855060fb3753b4Douglas Gregor if (!TInfo && E->getTypeInfoAsWritten()) 58016bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return nullptr; 58026bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 5803f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall CXXCastPath BasePath; 5804f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall if (ImportCastPath(E, BasePath)) 58056bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return nullptr; 5806f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall 5807f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall return CStyleCastExpr::Create(Importer.getToContext(), T, 5808f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall E->getValueKind(), E->getCastKind(), 5809f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall SubExpr, &BasePath, TInfo, 5810f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall Importer.Import(E->getLParenLoc()), 5811f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall Importer.Import(E->getRParenLoc())); 5812008847a70ab122a99911149199855060fb3753b4Douglas Gregor} 5813008847a70ab122a99911149199855060fb3753b4Douglas Gregor 5814b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga NainarExpr *ASTNodeImporter::VisitCXXConstructExpr(CXXConstructExpr *E) { 5815b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar QualType T = Importer.Import(E->getType()); 5816b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar if (T.isNull()) 5817b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar return nullptr; 5818b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar 5819b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar CXXConstructorDecl *ToCCD = 58204967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar dyn_cast_or_null<CXXConstructorDecl>(Importer.Import(E->getConstructor())); 58214967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar if (!ToCCD) 5822b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar return nullptr; 5823b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar 58244967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar SmallVector<Expr *, 6> ToArgs(E->getNumArgs()); 58254967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar if (ImportArrayChecked(E->getArgs(), E->getArgs() + E->getNumArgs(), 58264967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar ToArgs.begin())) 58274967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar return nullptr; 5828b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar 5829b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar return CXXConstructExpr::Create(Importer.getToContext(), T, 5830b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar Importer.Import(E->getLocation()), 5831b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar ToCCD, E->isElidable(), 5832b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar ToArgs, E->hadMultipleCandidates(), 5833b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar E->isListInitialization(), 5834b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar E->isStdInitListInitialization(), 5835b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar E->requiresZeroInitialization(), 5836b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar E->getConstructionKind(), 5837b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar Importer.Import(E->getParenOrBraceRange())); 5838b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar} 5839b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar 58404967a710c84587c654b56c828382219c3937dacbPirama Arumuga NainarExpr *ASTNodeImporter::VisitCXXMemberCallExpr(CXXMemberCallExpr *E) { 58414967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar QualType T = Importer.Import(E->getType()); 58424967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar if (T.isNull()) 58434967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar return nullptr; 58444967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar 58454967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Expr *ToFn = Importer.Import(E->getCallee()); 58464967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar if (!ToFn) 58474967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar return nullptr; 58484967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar 58494967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar SmallVector<Expr *, 4> ToArgs(E->getNumArgs()); 58504967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar 58514967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar if (ImportArrayChecked(E->arg_begin(), E->arg_end(), ToArgs.begin())) 58524967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar return nullptr; 58534967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar 58544967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar return new (Importer.getToContext()) CXXMemberCallExpr( 58554967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Importer.getToContext(), ToFn, ToArgs, T, E->getValueKind(), 58564967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Importer.Import(E->getRParenLoc())); 58574967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar} 58584967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar 58594967a710c84587c654b56c828382219c3937dacbPirama Arumuga NainarExpr *ASTNodeImporter::VisitCXXThisExpr(CXXThisExpr *E) { 58604967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar QualType T = Importer.Import(E->getType()); 58614967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar if (T.isNull()) 58624967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar return nullptr; 58634967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar 58644967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar return new (Importer.getToContext()) 58654967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar CXXThisExpr(Importer.Import(E->getLocation()), T, E->isImplicit()); 58664967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar} 58674967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar 58684967a710c84587c654b56c828382219c3937dacbPirama Arumuga NainarExpr *ASTNodeImporter::VisitCXXBoolLiteralExpr(CXXBoolLiteralExpr *E) { 58694967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar QualType T = Importer.Import(E->getType()); 58704967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar if (T.isNull()) 58714967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar return nullptr; 58724967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar 58734967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar return new (Importer.getToContext()) 58744967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar CXXBoolLiteralExpr(E->getValue(), T, Importer.Import(E->getLocation())); 58754967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar} 58764967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar 58774967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar 5878b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga NainarExpr *ASTNodeImporter::VisitMemberExpr(MemberExpr *E) { 5879b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar QualType T = Importer.Import(E->getType()); 5880b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar if (T.isNull()) 5881b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar return nullptr; 5882b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar 5883b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar Expr *ToBase = Importer.Import(E->getBase()); 5884b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar if (!ToBase && E->getBase()) 5885b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar return nullptr; 5886b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar 5887b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar ValueDecl *ToMember = dyn_cast<ValueDecl>(Importer.Import(E->getMemberDecl())); 5888b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar if (!ToMember && E->getMemberDecl()) 5889b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar return nullptr; 5890b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar 5891b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar DeclAccessPair ToFoundDecl = DeclAccessPair::make( 5892b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar dyn_cast<NamedDecl>(Importer.Import(E->getFoundDecl().getDecl())), 5893b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar E->getFoundDecl().getAccess()); 5894b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar 5895b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar DeclarationNameInfo ToMemberNameInfo( 5896b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar Importer.Import(E->getMemberNameInfo().getName()), 5897b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar Importer.Import(E->getMemberNameInfo().getLoc())); 5898b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar 5899b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar if (E->hasExplicitTemplateArgs()) { 5900b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar return nullptr; // FIXME: handle template arguments 5901b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar } 5902b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar 5903b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar return MemberExpr::Create(Importer.getToContext(), ToBase, 5904b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar E->isArrow(), 5905b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar Importer.Import(E->getOperatorLoc()), 5906b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar Importer.Import(E->getQualifierLoc()), 5907b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar Importer.Import(E->getTemplateKeywordLoc()), 5908b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar ToMember, ToFoundDecl, ToMemberNameInfo, 5909b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar nullptr, T, E->getValueKind(), 5910b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar E->getObjectKind()); 5911b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar} 5912b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar 5913b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga NainarExpr *ASTNodeImporter::VisitCallExpr(CallExpr *E) { 5914b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar QualType T = Importer.Import(E->getType()); 5915b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar if (T.isNull()) 5916b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar return nullptr; 5917b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar 5918b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar Expr *ToCallee = Importer.Import(E->getCallee()); 5919b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar if (!ToCallee && E->getCallee()) 5920b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar return nullptr; 5921b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar 5922b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar unsigned NumArgs = E->getNumArgs(); 5923b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar 5924b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar llvm::SmallVector<Expr *, 2> ToArgs(NumArgs); 5925b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar 5926b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar for (unsigned ai = 0, ae = NumArgs; ai != ae; ++ai) { 5927b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar Expr *FromArg = E->getArg(ai); 5928b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar Expr *ToArg = Importer.Import(FromArg); 5929b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar if (!ToArg) 5930b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar return nullptr; 5931b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar ToArgs[ai] = ToArg; 5932b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar } 5933b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar 5934b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar Expr **ToArgs_Copied = new (Importer.getToContext()) 5935b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar Expr*[NumArgs]; 5936b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar 5937b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar for (unsigned ai = 0, ae = NumArgs; ai != ae; ++ai) 5938b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar ToArgs_Copied[ai] = ToArgs[ai]; 5939b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar 5940b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar return new (Importer.getToContext()) 5941b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar CallExpr(Importer.getToContext(), ToCallee, 594287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar llvm::makeArrayRef(ToArgs_Copied, NumArgs), T, E->getValueKind(), 5943b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar Importer.Import(E->getRParenLoc())); 5944b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar} 5945b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar 59464967a710c84587c654b56c828382219c3937dacbPirama Arumuga NainarExpr *ASTNodeImporter::VisitInitListExpr(InitListExpr *ILE) { 59474967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar QualType T = Importer.Import(ILE->getType()); 59484967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar if (T.isNull()) 59494967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar return nullptr; 59504967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar 59514967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar llvm::SmallVector<Expr *, 4> Exprs(ILE->getNumInits()); 59524967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar if (ImportArrayChecked( 59534967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar ILE->getInits(), ILE->getInits() + ILE->getNumInits(), Exprs.begin())) 59544967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar return nullptr; 59554967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar 59564967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar ASTContext &ToCtx = Importer.getToContext(); 59574967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar InitListExpr *To = new (ToCtx) InitListExpr( 59584967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar ToCtx, Importer.Import(ILE->getLBraceLoc()), 59594967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Exprs, Importer.Import(ILE->getLBraceLoc())); 59604967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar To->setType(T); 59614967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar 59624967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar if (ILE->hasArrayFiller()) { 59634967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Expr *Filler = Importer.Import(ILE->getArrayFiller()); 59644967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar if (!Filler) 59654967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar return nullptr; 59664967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar To->setArrayFiller(Filler); 59674967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar } 59684967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar 59694967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar if (FieldDecl *FromFD = ILE->getInitializedFieldInUnion()) { 59704967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar FieldDecl *ToFD = cast_or_null<FieldDecl>(Importer.Import(FromFD)); 59714967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar if (!ToFD) 59724967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar return nullptr; 59734967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar To->setInitializedFieldInUnion(ToFD); 59744967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar } 59754967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar 59764967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar if (InitListExpr *SyntForm = ILE->getSyntacticForm()) { 59774967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar InitListExpr *ToSyntForm = cast_or_null<InitListExpr>( 59784967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Importer.Import(SyntForm)); 59794967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar if (!ToSyntForm) 59804967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar return nullptr; 59814967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar To->setSyntacticForm(ToSyntForm); 59824967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar } 59834967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar 59844967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar To->sawArrayRangeDesignator(ILE->hadArrayRangeDesignator()); 59854967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar To->setValueDependent(ILE->isValueDependent()); 59864967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar To->setInstantiationDependent(ILE->isInstantiationDependent()); 59874967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar 59884967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar return To; 59894967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar} 59904967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar 59914967a710c84587c654b56c828382219c3937dacbPirama Arumuga NainarExpr *ASTNodeImporter::VisitCXXDefaultInitExpr(CXXDefaultInitExpr *DIE) { 59924967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar FieldDecl *ToField = llvm::dyn_cast_or_null<FieldDecl>( 59934967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Importer.Import(DIE->getField())); 59944967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar if (!ToField && DIE->getField()) 59954967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar return nullptr; 59964967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar 59974967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar return CXXDefaultInitExpr::Create( 59984967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Importer.getToContext(), Importer.Import(DIE->getLocStart()), ToField); 59994967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar} 60004967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar 60014967a710c84587c654b56c828382219c3937dacbPirama Arumuga NainarExpr *ASTNodeImporter::VisitCXXNamedCastExpr(CXXNamedCastExpr *E) { 60024967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar QualType ToType = Importer.Import(E->getType()); 60034967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar if (ToType.isNull() && !E->getType().isNull()) 60044967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar return nullptr; 60054967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar ExprValueKind VK = E->getValueKind(); 60064967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar CastKind CK = E->getCastKind(); 60074967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Expr *ToOp = Importer.Import(E->getSubExpr()); 60084967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar if (!ToOp && E->getSubExpr()) 60094967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar return nullptr; 60104967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar CXXCastPath BasePath; 60114967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar if (ImportCastPath(E, BasePath)) 60124967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar return nullptr; 60134967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar TypeSourceInfo *ToWritten = Importer.Import(E->getTypeInfoAsWritten()); 60144967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar SourceLocation ToOperatorLoc = Importer.Import(E->getOperatorLoc()); 60154967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar SourceLocation ToRParenLoc = Importer.Import(E->getRParenLoc()); 60164967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar SourceRange ToAngleBrackets = Importer.Import(E->getAngleBrackets()); 60174967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar 60184967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar if (isa<CXXStaticCastExpr>(E)) { 60194967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar return CXXStaticCastExpr::Create( 60204967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Importer.getToContext(), ToType, VK, CK, ToOp, &BasePath, 60214967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar ToWritten, ToOperatorLoc, ToRParenLoc, ToAngleBrackets); 60224967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar } else if (isa<CXXDynamicCastExpr>(E)) { 60234967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar return CXXDynamicCastExpr::Create( 60244967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Importer.getToContext(), ToType, VK, CK, ToOp, &BasePath, 60254967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar ToWritten, ToOperatorLoc, ToRParenLoc, ToAngleBrackets); 60264967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar } else if (isa<CXXReinterpretCastExpr>(E)) { 60274967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar return CXXReinterpretCastExpr::Create( 60284967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Importer.getToContext(), ToType, VK, CK, ToOp, &BasePath, 60294967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar ToWritten, ToOperatorLoc, ToRParenLoc, ToAngleBrackets); 60304967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar } else { 60314967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar return nullptr; 60324967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar } 60334967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar} 60344967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar 603533e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios KyrtzidisASTImporter::ASTImporter(ASTContext &ToContext, FileManager &ToFileManager, 6036d8868a634d4fd362243dc646e58c3cf956c81dcdDouglas Gregor ASTContext &FromContext, FileManager &FromFileManager, 6037d8868a634d4fd362243dc646e58c3cf956c81dcdDouglas Gregor bool MinimalImport) 60381b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor : ToContext(ToContext), FromContext(FromContext), 6039d8868a634d4fd362243dc646e58c3cf956c81dcdDouglas Gregor ToFileManager(ToFileManager), FromFileManager(FromFileManager), 60405b9268f26ac53a74d2c504279fe577d988d5615dRichard Smith Minimal(MinimalImport), LastDiagFromFrom(false) 6041d8868a634d4fd362243dc646e58c3cf956c81dcdDouglas Gregor{ 60429bed8798964d9f07599c2c9199701f86fbc70e20Douglas Gregor ImportedDecls[FromContext.getTranslationUnitDecl()] 60439bed8798964d9f07599c2c9199701f86fbc70e20Douglas Gregor = ToContext.getTranslationUnitDecl(); 60449bed8798964d9f07599c2c9199701f86fbc70e20Douglas Gregor} 60459bed8798964d9f07599c2c9199701f86fbc70e20Douglas Gregor 60469bed8798964d9f07599c2c9199701f86fbc70e20Douglas GregorASTImporter::~ASTImporter() { } 60471b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor 60481b2949d27ec72894dec017c330c0548af4bb2476Douglas GregorQualType ASTImporter::Import(QualType FromT) { 60491b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor if (FromT.isNull()) 60501b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor return QualType(); 6051f4c7371fb1d3cebcfb40abad4537bb82515704eaJohn McCall 6052f4c7371fb1d3cebcfb40abad4537bb82515704eaJohn McCall const Type *fromTy = FromT.getTypePtr(); 60531b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor 6054169fba50da76d71723cd1d91629cabb310f8bf9eDouglas Gregor // Check whether we've already imported this type. 6055f4c7371fb1d3cebcfb40abad4537bb82515704eaJohn McCall llvm::DenseMap<const Type *, const Type *>::iterator Pos 6056f4c7371fb1d3cebcfb40abad4537bb82515704eaJohn McCall = ImportedTypes.find(fromTy); 6057169fba50da76d71723cd1d91629cabb310f8bf9eDouglas Gregor if (Pos != ImportedTypes.end()) 6058f4c7371fb1d3cebcfb40abad4537bb82515704eaJohn McCall return ToContext.getQualifiedType(Pos->second, FromT.getLocalQualifiers()); 60591b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor 6060169fba50da76d71723cd1d91629cabb310f8bf9eDouglas Gregor // Import the type 60611b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor ASTNodeImporter Importer(*this); 6062f4c7371fb1d3cebcfb40abad4537bb82515704eaJohn McCall QualType ToT = Importer.Visit(fromTy); 60631b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor if (ToT.isNull()) 60641b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor return ToT; 60651b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor 6066169fba50da76d71723cd1d91629cabb310f8bf9eDouglas Gregor // Record the imported type. 6067f4c7371fb1d3cebcfb40abad4537bb82515704eaJohn McCall ImportedTypes[fromTy] = ToT.getTypePtr(); 6068169fba50da76d71723cd1d91629cabb310f8bf9eDouglas Gregor 6069f4c7371fb1d3cebcfb40abad4537bb82515704eaJohn McCall return ToContext.getQualifiedType(ToT, FromT.getLocalQualifiers()); 60701b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor} 60711b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor 60729bed8798964d9f07599c2c9199701f86fbc70e20Douglas GregorTypeSourceInfo *ASTImporter::Import(TypeSourceInfo *FromTSI) { 607382fc4bfa6f8ea35488b9038dd83d40766c3645cfDouglas Gregor if (!FromTSI) 607482fc4bfa6f8ea35488b9038dd83d40766c3645cfDouglas Gregor return FromTSI; 607582fc4bfa6f8ea35488b9038dd83d40766c3645cfDouglas Gregor 607682fc4bfa6f8ea35488b9038dd83d40766c3645cfDouglas Gregor // FIXME: For now we just create a "trivial" type source info based 60775606220447c7901ba8d80147ddab893bb7949dd5Nick Lewycky // on the type and a single location. Implement a real version of this. 607882fc4bfa6f8ea35488b9038dd83d40766c3645cfDouglas Gregor QualType T = Import(FromTSI->getType()); 607982fc4bfa6f8ea35488b9038dd83d40766c3645cfDouglas Gregor if (T.isNull()) 60806bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return nullptr; 608182fc4bfa6f8ea35488b9038dd83d40766c3645cfDouglas Gregor 608282fc4bfa6f8ea35488b9038dd83d40766c3645cfDouglas Gregor return ToContext.getTrivialTypeSourceInfo(T, 608387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar Import(FromTSI->getTypeLoc().getLocStart())); 60849bed8798964d9f07599c2c9199701f86fbc70e20Douglas Gregor} 60859bed8798964d9f07599c2c9199701f86fbc70e20Douglas Gregor 6086b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga NainarDecl *ASTImporter::GetAlreadyImportedOrNull(Decl *FromD) { 6087b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar llvm::DenseMap<Decl *, Decl *>::iterator Pos = ImportedDecls.find(FromD); 6088b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar if (Pos != ImportedDecls.end()) { 6089b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar Decl *ToD = Pos->second; 6090b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar ASTNodeImporter(*this).ImportDefinitionIfNeeded(FromD, ToD); 6091b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar return ToD; 6092b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar } else { 6093b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar return nullptr; 6094b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar } 6095b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar} 6096b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar 60979bed8798964d9f07599c2c9199701f86fbc70e20Douglas GregorDecl *ASTImporter::Import(Decl *FromD) { 60989bed8798964d9f07599c2c9199701f86fbc70e20Douglas Gregor if (!FromD) 60996bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return nullptr; 61009bed8798964d9f07599c2c9199701f86fbc70e20Douglas Gregor 61011cf038c516c5e1f56ea9cff61aac7f7841744a91Douglas Gregor ASTNodeImporter Importer(*this); 61021cf038c516c5e1f56ea9cff61aac7f7841744a91Douglas Gregor 61039bed8798964d9f07599c2c9199701f86fbc70e20Douglas Gregor // Check whether we've already imported this declaration. 61049bed8798964d9f07599c2c9199701f86fbc70e20Douglas Gregor llvm::DenseMap<Decl *, Decl *>::iterator Pos = ImportedDecls.find(FromD); 61051cf038c516c5e1f56ea9cff61aac7f7841744a91Douglas Gregor if (Pos != ImportedDecls.end()) { 61061cf038c516c5e1f56ea9cff61aac7f7841744a91Douglas Gregor Decl *ToD = Pos->second; 61071cf038c516c5e1f56ea9cff61aac7f7841744a91Douglas Gregor Importer.ImportDefinitionIfNeeded(FromD, ToD); 61081cf038c516c5e1f56ea9cff61aac7f7841744a91Douglas Gregor return ToD; 61091cf038c516c5e1f56ea9cff61aac7f7841744a91Douglas Gregor } 61109bed8798964d9f07599c2c9199701f86fbc70e20Douglas Gregor 61119bed8798964d9f07599c2c9199701f86fbc70e20Douglas Gregor // Import the type 61129bed8798964d9f07599c2c9199701f86fbc70e20Douglas Gregor Decl *ToD = Importer.Visit(FromD); 61139bed8798964d9f07599c2c9199701f86fbc70e20Douglas Gregor if (!ToD) 61146bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return nullptr; 61156bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 61169bed8798964d9f07599c2c9199701f86fbc70e20Douglas Gregor // Record the imported declaration. 61179bed8798964d9f07599c2c9199701f86fbc70e20Douglas Gregor ImportedDecls[FromD] = ToD; 6118ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor 6119ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor if (TagDecl *FromTag = dyn_cast<TagDecl>(FromD)) { 6120ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor // Keep track of anonymous tags that have an associated typedef. 6121162e1c1b487352434552147967c3dd296ebee2f7Richard Smith if (FromTag->getTypedefNameForAnonDecl()) 6122ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor AnonTagsWithPendingTypedefs.push_back(FromTag); 6123162e1c1b487352434552147967c3dd296ebee2f7Richard Smith } else if (TypedefNameDecl *FromTypedef = dyn_cast<TypedefNameDecl>(FromD)) { 6124ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor // When we've finished transforming a typedef, see whether it was the 6125ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor // typedef for an anonymous tag. 612609d19efaa147762f84aed55efa7930bb3616a4e5Craig Topper for (SmallVectorImpl<TagDecl *>::iterator 6127ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor FromTag = AnonTagsWithPendingTypedefs.begin(), 6128ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor FromTagEnd = AnonTagsWithPendingTypedefs.end(); 6129ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor FromTag != FromTagEnd; ++FromTag) { 6130162e1c1b487352434552147967c3dd296ebee2f7Richard Smith if ((*FromTag)->getTypedefNameForAnonDecl() == FromTypedef) { 6131ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor if (TagDecl *ToTag = cast_or_null<TagDecl>(Import(*FromTag))) { 6132ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor // We found the typedef for an anonymous tag; link them. 6133162e1c1b487352434552147967c3dd296ebee2f7Richard Smith ToTag->setTypedefNameForAnonDecl(cast<TypedefNameDecl>(ToD)); 6134ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor AnonTagsWithPendingTypedefs.erase(FromTag); 6135ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor break; 6136ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor } 6137ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor } 6138ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor } 6139ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor } 6140ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor 61419bed8798964d9f07599c2c9199701f86fbc70e20Douglas Gregor return ToD; 61429bed8798964d9f07599c2c9199701f86fbc70e20Douglas Gregor} 61439bed8798964d9f07599c2c9199701f86fbc70e20Douglas Gregor 61449bed8798964d9f07599c2c9199701f86fbc70e20Douglas GregorDeclContext *ASTImporter::ImportContext(DeclContext *FromDC) { 61459bed8798964d9f07599c2c9199701f86fbc70e20Douglas Gregor if (!FromDC) 61469bed8798964d9f07599c2c9199701f86fbc70e20Douglas Gregor return FromDC; 61479bed8798964d9f07599c2c9199701f86fbc70e20Douglas Gregor 6148cd0d56a523f877ffd1fe1575caf758b4357f1661Douglas Gregor DeclContext *ToDC = cast_or_null<DeclContext>(Import(cast<Decl>(FromDC))); 6149ac32ff9812e7d6bc31573b5499bfd005fc8b8f39Douglas Gregor if (!ToDC) 61506bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return nullptr; 61516bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 6152ac32ff9812e7d6bc31573b5499bfd005fc8b8f39Douglas Gregor // When we're using a record/enum/Objective-C class/protocol as a context, we 6153ac32ff9812e7d6bc31573b5499bfd005fc8b8f39Douglas Gregor // need it to have a definition. 6154ac32ff9812e7d6bc31573b5499bfd005fc8b8f39Douglas Gregor if (RecordDecl *ToRecord = dyn_cast<RecordDecl>(ToDC)) { 6155568991b62a29c1919e67438e0ac8216715b2c760Douglas Gregor RecordDecl *FromRecord = cast<RecordDecl>(FromDC); 6156ac32ff9812e7d6bc31573b5499bfd005fc8b8f39Douglas Gregor if (ToRecord->isCompleteDefinition()) { 6157ac32ff9812e7d6bc31573b5499bfd005fc8b8f39Douglas Gregor // Do nothing. 6158ac32ff9812e7d6bc31573b5499bfd005fc8b8f39Douglas Gregor } else if (FromRecord->isCompleteDefinition()) { 6159ac32ff9812e7d6bc31573b5499bfd005fc8b8f39Douglas Gregor ASTNodeImporter(*this).ImportDefinition(FromRecord, ToRecord, 6160ac32ff9812e7d6bc31573b5499bfd005fc8b8f39Douglas Gregor ASTNodeImporter::IDK_Basic); 6161ac32ff9812e7d6bc31573b5499bfd005fc8b8f39Douglas Gregor } else { 6162ac32ff9812e7d6bc31573b5499bfd005fc8b8f39Douglas Gregor CompleteDecl(ToRecord); 6163ac32ff9812e7d6bc31573b5499bfd005fc8b8f39Douglas Gregor } 6164ac32ff9812e7d6bc31573b5499bfd005fc8b8f39Douglas Gregor } else if (EnumDecl *ToEnum = dyn_cast<EnumDecl>(ToDC)) { 6165ac32ff9812e7d6bc31573b5499bfd005fc8b8f39Douglas Gregor EnumDecl *FromEnum = cast<EnumDecl>(FromDC); 6166ac32ff9812e7d6bc31573b5499bfd005fc8b8f39Douglas Gregor if (ToEnum->isCompleteDefinition()) { 6167ac32ff9812e7d6bc31573b5499bfd005fc8b8f39Douglas Gregor // Do nothing. 6168ac32ff9812e7d6bc31573b5499bfd005fc8b8f39Douglas Gregor } else if (FromEnum->isCompleteDefinition()) { 6169ac32ff9812e7d6bc31573b5499bfd005fc8b8f39Douglas Gregor ASTNodeImporter(*this).ImportDefinition(FromEnum, ToEnum, 6170ac32ff9812e7d6bc31573b5499bfd005fc8b8f39Douglas Gregor ASTNodeImporter::IDK_Basic); 6171ac32ff9812e7d6bc31573b5499bfd005fc8b8f39Douglas Gregor } else { 6172ac32ff9812e7d6bc31573b5499bfd005fc8b8f39Douglas Gregor CompleteDecl(ToEnum); 6173ac32ff9812e7d6bc31573b5499bfd005fc8b8f39Douglas Gregor } 6174ac32ff9812e7d6bc31573b5499bfd005fc8b8f39Douglas Gregor } else if (ObjCInterfaceDecl *ToClass = dyn_cast<ObjCInterfaceDecl>(ToDC)) { 6175ac32ff9812e7d6bc31573b5499bfd005fc8b8f39Douglas Gregor ObjCInterfaceDecl *FromClass = cast<ObjCInterfaceDecl>(FromDC); 6176ac32ff9812e7d6bc31573b5499bfd005fc8b8f39Douglas Gregor if (ToClass->getDefinition()) { 6177ac32ff9812e7d6bc31573b5499bfd005fc8b8f39Douglas Gregor // Do nothing. 6178ac32ff9812e7d6bc31573b5499bfd005fc8b8f39Douglas Gregor } else if (ObjCInterfaceDecl *FromDef = FromClass->getDefinition()) { 6179ac32ff9812e7d6bc31573b5499bfd005fc8b8f39Douglas Gregor ASTNodeImporter(*this).ImportDefinition(FromDef, ToClass, 6180ac32ff9812e7d6bc31573b5499bfd005fc8b8f39Douglas Gregor ASTNodeImporter::IDK_Basic); 6181ac32ff9812e7d6bc31573b5499bfd005fc8b8f39Douglas Gregor } else { 6182ac32ff9812e7d6bc31573b5499bfd005fc8b8f39Douglas Gregor CompleteDecl(ToClass); 6183ac32ff9812e7d6bc31573b5499bfd005fc8b8f39Douglas Gregor } 6184ac32ff9812e7d6bc31573b5499bfd005fc8b8f39Douglas Gregor } else if (ObjCProtocolDecl *ToProto = dyn_cast<ObjCProtocolDecl>(ToDC)) { 6185ac32ff9812e7d6bc31573b5499bfd005fc8b8f39Douglas Gregor ObjCProtocolDecl *FromProto = cast<ObjCProtocolDecl>(FromDC); 6186ac32ff9812e7d6bc31573b5499bfd005fc8b8f39Douglas Gregor if (ToProto->getDefinition()) { 6187ac32ff9812e7d6bc31573b5499bfd005fc8b8f39Douglas Gregor // Do nothing. 6188ac32ff9812e7d6bc31573b5499bfd005fc8b8f39Douglas Gregor } else if (ObjCProtocolDecl *FromDef = FromProto->getDefinition()) { 6189ac32ff9812e7d6bc31573b5499bfd005fc8b8f39Douglas Gregor ASTNodeImporter(*this).ImportDefinition(FromDef, ToProto, 6190ac32ff9812e7d6bc31573b5499bfd005fc8b8f39Douglas Gregor ASTNodeImporter::IDK_Basic); 6191ac32ff9812e7d6bc31573b5499bfd005fc8b8f39Douglas Gregor } else { 6192ac32ff9812e7d6bc31573b5499bfd005fc8b8f39Douglas Gregor CompleteDecl(ToProto); 6193ac32ff9812e7d6bc31573b5499bfd005fc8b8f39Douglas Gregor } 6194cd0d56a523f877ffd1fe1575caf758b4357f1661Douglas Gregor } 6195cd0d56a523f877ffd1fe1575caf758b4357f1661Douglas Gregor 6196cd0d56a523f877ffd1fe1575caf758b4357f1661Douglas Gregor return ToDC; 61979bed8798964d9f07599c2c9199701f86fbc70e20Douglas Gregor} 61989bed8798964d9f07599c2c9199701f86fbc70e20Douglas Gregor 61999bed8798964d9f07599c2c9199701f86fbc70e20Douglas GregorExpr *ASTImporter::Import(Expr *FromE) { 62009bed8798964d9f07599c2c9199701f86fbc70e20Douglas Gregor if (!FromE) 62016bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return nullptr; 62029bed8798964d9f07599c2c9199701f86fbc70e20Douglas Gregor 62039bed8798964d9f07599c2c9199701f86fbc70e20Douglas Gregor return cast_or_null<Expr>(Import(cast<Stmt>(FromE))); 62049bed8798964d9f07599c2c9199701f86fbc70e20Douglas Gregor} 62059bed8798964d9f07599c2c9199701f86fbc70e20Douglas Gregor 62069bed8798964d9f07599c2c9199701f86fbc70e20Douglas GregorStmt *ASTImporter::Import(Stmt *FromS) { 62079bed8798964d9f07599c2c9199701f86fbc70e20Douglas Gregor if (!FromS) 62086bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return nullptr; 62099bed8798964d9f07599c2c9199701f86fbc70e20Douglas Gregor 62104800d95d28b20eca5d57c108ae3d2e6e312c1182Douglas Gregor // Check whether we've already imported this declaration. 62114800d95d28b20eca5d57c108ae3d2e6e312c1182Douglas Gregor llvm::DenseMap<Stmt *, Stmt *>::iterator Pos = ImportedStmts.find(FromS); 62124800d95d28b20eca5d57c108ae3d2e6e312c1182Douglas Gregor if (Pos != ImportedStmts.end()) 62134800d95d28b20eca5d57c108ae3d2e6e312c1182Douglas Gregor return Pos->second; 62144800d95d28b20eca5d57c108ae3d2e6e312c1182Douglas Gregor 62154800d95d28b20eca5d57c108ae3d2e6e312c1182Douglas Gregor // Import the type 62164800d95d28b20eca5d57c108ae3d2e6e312c1182Douglas Gregor ASTNodeImporter Importer(*this); 62174800d95d28b20eca5d57c108ae3d2e6e312c1182Douglas Gregor Stmt *ToS = Importer.Visit(FromS); 62184800d95d28b20eca5d57c108ae3d2e6e312c1182Douglas Gregor if (!ToS) 62196bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return nullptr; 62206bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 62214800d95d28b20eca5d57c108ae3d2e6e312c1182Douglas Gregor // Record the imported declaration. 62224800d95d28b20eca5d57c108ae3d2e6e312c1182Douglas Gregor ImportedStmts[FromS] = ToS; 62234800d95d28b20eca5d57c108ae3d2e6e312c1182Douglas Gregor return ToS; 62249bed8798964d9f07599c2c9199701f86fbc70e20Douglas Gregor} 62259bed8798964d9f07599c2c9199701f86fbc70e20Douglas Gregor 62269bed8798964d9f07599c2c9199701f86fbc70e20Douglas GregorNestedNameSpecifier *ASTImporter::Import(NestedNameSpecifier *FromNNS) { 62279bed8798964d9f07599c2c9199701f86fbc70e20Douglas Gregor if (!FromNNS) 62286bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return nullptr; 62299bed8798964d9f07599c2c9199701f86fbc70e20Douglas Gregor 62308703b1c8f95a43c0208ae8acc6b209d99c11f386Douglas Gregor NestedNameSpecifier *prefix = Import(FromNNS->getPrefix()); 62318703b1c8f95a43c0208ae8acc6b209d99c11f386Douglas Gregor 62328703b1c8f95a43c0208ae8acc6b209d99c11f386Douglas Gregor switch (FromNNS->getKind()) { 62338703b1c8f95a43c0208ae8acc6b209d99c11f386Douglas Gregor case NestedNameSpecifier::Identifier: 62348703b1c8f95a43c0208ae8acc6b209d99c11f386Douglas Gregor if (IdentifierInfo *II = Import(FromNNS->getAsIdentifier())) { 62358703b1c8f95a43c0208ae8acc6b209d99c11f386Douglas Gregor return NestedNameSpecifier::Create(ToContext, prefix, II); 62368703b1c8f95a43c0208ae8acc6b209d99c11f386Douglas Gregor } 62376bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return nullptr; 62388703b1c8f95a43c0208ae8acc6b209d99c11f386Douglas Gregor 62398703b1c8f95a43c0208ae8acc6b209d99c11f386Douglas Gregor case NestedNameSpecifier::Namespace: 62408703b1c8f95a43c0208ae8acc6b209d99c11f386Douglas Gregor if (NamespaceDecl *NS = 62418703b1c8f95a43c0208ae8acc6b209d99c11f386Douglas Gregor cast<NamespaceDecl>(Import(FromNNS->getAsNamespace()))) { 62428703b1c8f95a43c0208ae8acc6b209d99c11f386Douglas Gregor return NestedNameSpecifier::Create(ToContext, prefix, NS); 62438703b1c8f95a43c0208ae8acc6b209d99c11f386Douglas Gregor } 62446bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return nullptr; 62458703b1c8f95a43c0208ae8acc6b209d99c11f386Douglas Gregor 62468703b1c8f95a43c0208ae8acc6b209d99c11f386Douglas Gregor case NestedNameSpecifier::NamespaceAlias: 62478703b1c8f95a43c0208ae8acc6b209d99c11f386Douglas Gregor if (NamespaceAliasDecl *NSAD = 62488703b1c8f95a43c0208ae8acc6b209d99c11f386Douglas Gregor cast<NamespaceAliasDecl>(Import(FromNNS->getAsNamespaceAlias()))) { 62498703b1c8f95a43c0208ae8acc6b209d99c11f386Douglas Gregor return NestedNameSpecifier::Create(ToContext, prefix, NSAD); 62508703b1c8f95a43c0208ae8acc6b209d99c11f386Douglas Gregor } 62516bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return nullptr; 62528703b1c8f95a43c0208ae8acc6b209d99c11f386Douglas Gregor 62538703b1c8f95a43c0208ae8acc6b209d99c11f386Douglas Gregor case NestedNameSpecifier::Global: 62548703b1c8f95a43c0208ae8acc6b209d99c11f386Douglas Gregor return NestedNameSpecifier::GlobalSpecifier(ToContext); 62558703b1c8f95a43c0208ae8acc6b209d99c11f386Douglas Gregor 6256176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines case NestedNameSpecifier::Super: 6257176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines if (CXXRecordDecl *RD = 6258176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines cast<CXXRecordDecl>(Import(FromNNS->getAsRecordDecl()))) { 6259176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines return NestedNameSpecifier::SuperSpecifier(ToContext, RD); 6260176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines } 6261176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines return nullptr; 6262176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines 62638703b1c8f95a43c0208ae8acc6b209d99c11f386Douglas Gregor case NestedNameSpecifier::TypeSpec: 62648703b1c8f95a43c0208ae8acc6b209d99c11f386Douglas Gregor case NestedNameSpecifier::TypeSpecWithTemplate: { 62658703b1c8f95a43c0208ae8acc6b209d99c11f386Douglas Gregor QualType T = Import(QualType(FromNNS->getAsType(), 0u)); 62668703b1c8f95a43c0208ae8acc6b209d99c11f386Douglas Gregor if (!T.isNull()) { 62678703b1c8f95a43c0208ae8acc6b209d99c11f386Douglas Gregor bool bTemplate = FromNNS->getKind() == 62688703b1c8f95a43c0208ae8acc6b209d99c11f386Douglas Gregor NestedNameSpecifier::TypeSpecWithTemplate; 62698703b1c8f95a43c0208ae8acc6b209d99c11f386Douglas Gregor return NestedNameSpecifier::Create(ToContext, prefix, 62708703b1c8f95a43c0208ae8acc6b209d99c11f386Douglas Gregor bTemplate, T.getTypePtr()); 62718703b1c8f95a43c0208ae8acc6b209d99c11f386Douglas Gregor } 62728703b1c8f95a43c0208ae8acc6b209d99c11f386Douglas Gregor } 62736bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return nullptr; 62748703b1c8f95a43c0208ae8acc6b209d99c11f386Douglas Gregor } 62758703b1c8f95a43c0208ae8acc6b209d99c11f386Douglas Gregor 62768703b1c8f95a43c0208ae8acc6b209d99c11f386Douglas Gregor llvm_unreachable("Invalid nested name specifier kind"); 62779bed8798964d9f07599c2c9199701f86fbc70e20Douglas Gregor} 62789bed8798964d9f07599c2c9199701f86fbc70e20Douglas Gregor 6279c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas GregorNestedNameSpecifierLoc ASTImporter::Import(NestedNameSpecifierLoc FromNNS) { 6280c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor // FIXME: Implement! 6281c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor return NestedNameSpecifierLoc(); 6282c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor} 6283c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor 6284d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas GregorTemplateName ASTImporter::Import(TemplateName From) { 6285d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor switch (From.getKind()) { 6286d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor case TemplateName::Template: 6287d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor if (TemplateDecl *ToTemplate 6288d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor = cast_or_null<TemplateDecl>(Import(From.getAsTemplateDecl()))) 6289d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor return TemplateName(ToTemplate); 6290d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor 6291d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor return TemplateName(); 6292d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor 6293d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor case TemplateName::OverloadedTemplate: { 6294d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor OverloadedTemplateStorage *FromStorage = From.getAsOverloadedTemplate(); 6295d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor UnresolvedSet<2> ToTemplates; 6296d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor for (OverloadedTemplateStorage::iterator I = FromStorage->begin(), 6297d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor E = FromStorage->end(); 6298d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor I != E; ++I) { 6299d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor if (NamedDecl *To = cast_or_null<NamedDecl>(Import(*I))) 6300d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor ToTemplates.addDecl(To); 6301d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor else 6302d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor return TemplateName(); 6303d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor } 6304d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor return ToContext.getOverloadedTemplateName(ToTemplates.begin(), 6305d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor ToTemplates.end()); 6306d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor } 6307d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor 6308d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor case TemplateName::QualifiedTemplate: { 6309d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor QualifiedTemplateName *QTN = From.getAsQualifiedTemplateName(); 6310d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor NestedNameSpecifier *Qualifier = Import(QTN->getQualifier()); 6311d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor if (!Qualifier) 6312d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor return TemplateName(); 6313d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor 6314d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor if (TemplateDecl *ToTemplate 6315d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor = cast_or_null<TemplateDecl>(Import(From.getAsTemplateDecl()))) 6316d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor return ToContext.getQualifiedTemplateName(Qualifier, 6317d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor QTN->hasTemplateKeyword(), 6318d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor ToTemplate); 6319d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor 6320d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor return TemplateName(); 6321d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor } 6322d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor 6323d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor case TemplateName::DependentTemplate: { 6324d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor DependentTemplateName *DTN = From.getAsDependentTemplateName(); 6325d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor NestedNameSpecifier *Qualifier = Import(DTN->getQualifier()); 6326d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor if (!Qualifier) 6327d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor return TemplateName(); 6328d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor 6329d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor if (DTN->isIdentifier()) { 6330d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor return ToContext.getDependentTemplateName(Qualifier, 6331d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor Import(DTN->getIdentifier())); 6332d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor } 6333d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor 6334d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor return ToContext.getDependentTemplateName(Qualifier, DTN->getOperator()); 6335d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor } 6336146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall 6337146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall case TemplateName::SubstTemplateTemplateParm: { 6338146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall SubstTemplateTemplateParmStorage *subst 6339146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall = From.getAsSubstTemplateTemplateParm(); 6340146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall TemplateTemplateParmDecl *param 6341146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall = cast_or_null<TemplateTemplateParmDecl>(Import(subst->getParameter())); 6342146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall if (!param) 6343146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall return TemplateName(); 6344146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall 6345146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall TemplateName replacement = Import(subst->getReplacement()); 6346146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall if (replacement.isNull()) return TemplateName(); 6347146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall 6348146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall return ToContext.getSubstTemplateTemplateParm(param, replacement); 6349146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall } 63501aee05d08b2184acadeb36de300e216390780d6cDouglas Gregor 63511aee05d08b2184acadeb36de300e216390780d6cDouglas Gregor case TemplateName::SubstTemplateTemplateParmPack: { 63521aee05d08b2184acadeb36de300e216390780d6cDouglas Gregor SubstTemplateTemplateParmPackStorage *SubstPack 63531aee05d08b2184acadeb36de300e216390780d6cDouglas Gregor = From.getAsSubstTemplateTemplateParmPack(); 63541aee05d08b2184acadeb36de300e216390780d6cDouglas Gregor TemplateTemplateParmDecl *Param 63551aee05d08b2184acadeb36de300e216390780d6cDouglas Gregor = cast_or_null<TemplateTemplateParmDecl>( 63561aee05d08b2184acadeb36de300e216390780d6cDouglas Gregor Import(SubstPack->getParameterPack())); 63571aee05d08b2184acadeb36de300e216390780d6cDouglas Gregor if (!Param) 63581aee05d08b2184acadeb36de300e216390780d6cDouglas Gregor return TemplateName(); 63591aee05d08b2184acadeb36de300e216390780d6cDouglas Gregor 63601aee05d08b2184acadeb36de300e216390780d6cDouglas Gregor ASTNodeImporter Importer(*this); 63611aee05d08b2184acadeb36de300e216390780d6cDouglas Gregor TemplateArgument ArgPack 63621aee05d08b2184acadeb36de300e216390780d6cDouglas Gregor = Importer.ImportTemplateArgument(SubstPack->getArgumentPack()); 63631aee05d08b2184acadeb36de300e216390780d6cDouglas Gregor if (ArgPack.isNull()) 63641aee05d08b2184acadeb36de300e216390780d6cDouglas Gregor return TemplateName(); 63651aee05d08b2184acadeb36de300e216390780d6cDouglas Gregor 63661aee05d08b2184acadeb36de300e216390780d6cDouglas Gregor return ToContext.getSubstTemplateTemplateParmPack(Param, ArgPack); 63671aee05d08b2184acadeb36de300e216390780d6cDouglas Gregor } 6368d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor } 6369d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor 6370d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor llvm_unreachable("Invalid template name kind"); 6371d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor} 6372d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor 63739bed8798964d9f07599c2c9199701f86fbc70e20Douglas GregorSourceLocation ASTImporter::Import(SourceLocation FromLoc) { 63749bed8798964d9f07599c2c9199701f86fbc70e20Douglas Gregor if (FromLoc.isInvalid()) 63759bed8798964d9f07599c2c9199701f86fbc70e20Douglas Gregor return SourceLocation(); 63769bed8798964d9f07599c2c9199701f86fbc70e20Douglas Gregor 6377885237354fd902998c6ae9d7cc3dc8de96b123dcDouglas Gregor SourceManager &FromSM = FromContext.getSourceManager(); 6378885237354fd902998c6ae9d7cc3dc8de96b123dcDouglas Gregor 6379885237354fd902998c6ae9d7cc3dc8de96b123dcDouglas Gregor // For now, map everything down to its spelling location, so that we 6380b10aa3e3a26f84d1a0dda6e4c057f83a11a3076cChandler Carruth // don't have to import macro expansions. 6381b10aa3e3a26f84d1a0dda6e4c057f83a11a3076cChandler Carruth // FIXME: Import macro expansions! 6382885237354fd902998c6ae9d7cc3dc8de96b123dcDouglas Gregor FromLoc = FromSM.getSpellingLoc(FromLoc); 6383885237354fd902998c6ae9d7cc3dc8de96b123dcDouglas Gregor std::pair<FileID, unsigned> Decomposed = FromSM.getDecomposedLoc(FromLoc); 6384885237354fd902998c6ae9d7cc3dc8de96b123dcDouglas Gregor SourceManager &ToSM = ToContext.getSourceManager(); 63850e2c34f92f00628d48968dfea096d36381f494cbStephen Hines FileID ToFileID = Import(Decomposed.first); 63860e2c34f92f00628d48968dfea096d36381f494cbStephen Hines if (ToFileID.isInvalid()) 63870e2c34f92f00628d48968dfea096d36381f494cbStephen Hines return SourceLocation(); 6388b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar SourceLocation ret = ToSM.getLocForStartOfFile(ToFileID) 6389b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar .getLocWithOffset(Decomposed.second); 6390b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar return ret; 63919bed8798964d9f07599c2c9199701f86fbc70e20Douglas Gregor} 63929bed8798964d9f07599c2c9199701f86fbc70e20Douglas Gregor 63939bed8798964d9f07599c2c9199701f86fbc70e20Douglas GregorSourceRange ASTImporter::Import(SourceRange FromRange) { 63949bed8798964d9f07599c2c9199701f86fbc70e20Douglas Gregor return SourceRange(Import(FromRange.getBegin()), Import(FromRange.getEnd())); 63959bed8798964d9f07599c2c9199701f86fbc70e20Douglas Gregor} 63969bed8798964d9f07599c2c9199701f86fbc70e20Douglas Gregor 6397885237354fd902998c6ae9d7cc3dc8de96b123dcDouglas GregorFileID ASTImporter::Import(FileID FromID) { 6398535a3e20104461c136654d59fb833ae80644ae79Sebastian Redl llvm::DenseMap<FileID, FileID>::iterator Pos 6399535a3e20104461c136654d59fb833ae80644ae79Sebastian Redl = ImportedFileIDs.find(FromID); 6400885237354fd902998c6ae9d7cc3dc8de96b123dcDouglas Gregor if (Pos != ImportedFileIDs.end()) 6401885237354fd902998c6ae9d7cc3dc8de96b123dcDouglas Gregor return Pos->second; 6402885237354fd902998c6ae9d7cc3dc8de96b123dcDouglas Gregor 6403885237354fd902998c6ae9d7cc3dc8de96b123dcDouglas Gregor SourceManager &FromSM = FromContext.getSourceManager(); 6404885237354fd902998c6ae9d7cc3dc8de96b123dcDouglas Gregor SourceManager &ToSM = ToContext.getSourceManager(); 6405885237354fd902998c6ae9d7cc3dc8de96b123dcDouglas Gregor const SrcMgr::SLocEntry &FromSLoc = FromSM.getSLocEntry(FromID); 6406b10aa3e3a26f84d1a0dda6e4c057f83a11a3076cChandler Carruth assert(FromSLoc.isFile() && "Cannot handle macro expansions yet"); 6407885237354fd902998c6ae9d7cc3dc8de96b123dcDouglas Gregor 6408885237354fd902998c6ae9d7cc3dc8de96b123dcDouglas Gregor // Include location of this file. 6409885237354fd902998c6ae9d7cc3dc8de96b123dcDouglas Gregor SourceLocation ToIncludeLoc = Import(FromSLoc.getFile().getIncludeLoc()); 6410885237354fd902998c6ae9d7cc3dc8de96b123dcDouglas Gregor 6411885237354fd902998c6ae9d7cc3dc8de96b123dcDouglas Gregor // Map the FileID for to the "to" source manager. 6412885237354fd902998c6ae9d7cc3dc8de96b123dcDouglas Gregor FileID ToID; 6413885237354fd902998c6ae9d7cc3dc8de96b123dcDouglas Gregor const SrcMgr::ContentCache *Cache = FromSLoc.getFile().getContentCache(); 6414b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar if (Cache->OrigEntry && Cache->OrigEntry->getDir()) { 6415885237354fd902998c6ae9d7cc3dc8de96b123dcDouglas Gregor // FIXME: We probably want to use getVirtualFile(), so we don't hit the 6416885237354fd902998c6ae9d7cc3dc8de96b123dcDouglas Gregor // disk again 6417885237354fd902998c6ae9d7cc3dc8de96b123dcDouglas Gregor // FIXME: We definitely want to re-use the existing MemoryBuffer, rather 6418885237354fd902998c6ae9d7cc3dc8de96b123dcDouglas Gregor // than mmap the files several times. 6419b1c86492f9a9bef01a4567408c22f961bbd604feArgyrios Kyrtzidis const FileEntry *Entry = ToFileManager.getFile(Cache->OrigEntry->getName()); 64200e2c34f92f00628d48968dfea096d36381f494cbStephen Hines if (!Entry) 64210e2c34f92f00628d48968dfea096d36381f494cbStephen Hines return FileID(); 6422885237354fd902998c6ae9d7cc3dc8de96b123dcDouglas Gregor ToID = ToSM.createFileID(Entry, ToIncludeLoc, 6423885237354fd902998c6ae9d7cc3dc8de96b123dcDouglas Gregor FromSLoc.getFile().getFileCharacteristic()); 6424885237354fd902998c6ae9d7cc3dc8de96b123dcDouglas Gregor } else { 6425885237354fd902998c6ae9d7cc3dc8de96b123dcDouglas Gregor // FIXME: We want to re-use the existing MemoryBuffer! 642633e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis const llvm::MemoryBuffer * 642733e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis FromBuf = Cache->getBuffer(FromContext.getDiagnostics(), FromSM); 6428176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines std::unique_ptr<llvm::MemoryBuffer> ToBuf 6429a0a270c0f1c0a4e3482438bdc5f4a7bd3d25f0a6Chris Lattner = llvm::MemoryBuffer::getMemBufferCopy(FromBuf->getBuffer(), 6430885237354fd902998c6ae9d7cc3dc8de96b123dcDouglas Gregor FromBuf->getBufferIdentifier()); 6431176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines ToID = ToSM.createFileID(std::move(ToBuf), 6432176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines FromSLoc.getFile().getFileCharacteristic()); 6433885237354fd902998c6ae9d7cc3dc8de96b123dcDouglas Gregor } 6434885237354fd902998c6ae9d7cc3dc8de96b123dcDouglas Gregor 6435885237354fd902998c6ae9d7cc3dc8de96b123dcDouglas Gregor 6436535a3e20104461c136654d59fb833ae80644ae79Sebastian Redl ImportedFileIDs[FromID] = ToID; 6437885237354fd902998c6ae9d7cc3dc8de96b123dcDouglas Gregor return ToID; 6438885237354fd902998c6ae9d7cc3dc8de96b123dcDouglas Gregor} 6439885237354fd902998c6ae9d7cc3dc8de96b123dcDouglas Gregor 64404967a710c84587c654b56c828382219c3937dacbPirama Arumuga NainarCXXCtorInitializer *ASTImporter::Import(CXXCtorInitializer *From) { 64414967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Expr *ToExpr = Import(From->getInit()); 64424967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar if (!ToExpr && From->getInit()) 64434967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar return nullptr; 64444967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar 64454967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar if (From->isBaseInitializer()) { 64464967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar TypeSourceInfo *ToTInfo = Import(From->getTypeSourceInfo()); 64474967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar if (!ToTInfo && From->getTypeSourceInfo()) 64484967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar return nullptr; 64494967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar 64504967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar return new (ToContext) CXXCtorInitializer( 64514967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar ToContext, ToTInfo, From->isBaseVirtual(), Import(From->getLParenLoc()), 64524967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar ToExpr, Import(From->getRParenLoc()), 64534967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar From->isPackExpansion() ? Import(From->getEllipsisLoc()) 64544967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar : SourceLocation()); 64554967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar } else if (From->isMemberInitializer()) { 64564967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar FieldDecl *ToField = 64574967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar llvm::cast_or_null<FieldDecl>(Import(From->getMember())); 64584967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar if (!ToField && From->getMember()) 64594967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar return nullptr; 64604967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar 64614967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar return new (ToContext) CXXCtorInitializer( 64624967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar ToContext, ToField, Import(From->getMemberLocation()), 64634967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Import(From->getLParenLoc()), ToExpr, Import(From->getRParenLoc())); 64644967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar } else if (From->isIndirectMemberInitializer()) { 64654967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar IndirectFieldDecl *ToIField = llvm::cast_or_null<IndirectFieldDecl>( 64664967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Import(From->getIndirectMember())); 64674967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar if (!ToIField && From->getIndirectMember()) 64684967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar return nullptr; 64694967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar 64704967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar return new (ToContext) CXXCtorInitializer( 64714967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar ToContext, ToIField, Import(From->getMemberLocation()), 64724967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Import(From->getLParenLoc()), ToExpr, Import(From->getRParenLoc())); 64734967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar } else if (From->isDelegatingInitializer()) { 64744967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar TypeSourceInfo *ToTInfo = Import(From->getTypeSourceInfo()); 64754967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar if (!ToTInfo && From->getTypeSourceInfo()) 64764967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar return nullptr; 64774967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar 64784967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar return new (ToContext) 64794967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar CXXCtorInitializer(ToContext, ToTInfo, Import(From->getLParenLoc()), 64804967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar ToExpr, Import(From->getRParenLoc())); 64814967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar } else if (unsigned NumArrayIndices = From->getNumArrayIndices()) { 64824967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar FieldDecl *ToField = 64834967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar llvm::cast_or_null<FieldDecl>(Import(From->getMember())); 64844967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar if (!ToField && From->getMember()) 64854967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar return nullptr; 64864967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar 64874967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar SmallVector<VarDecl *, 4> ToAIs(NumArrayIndices); 64884967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar 64894967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar for (unsigned AII = 0; AII < NumArrayIndices; ++AII) { 64904967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar VarDecl *ToArrayIndex = 64914967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar dyn_cast_or_null<VarDecl>(Import(From->getArrayIndex(AII))); 64924967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar if (!ToArrayIndex && From->getArrayIndex(AII)) 64934967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar return nullptr; 64944967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar } 64954967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar 64964967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar return CXXCtorInitializer::Create( 64974967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar ToContext, ToField, Import(From->getMemberLocation()), 64984967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Import(From->getLParenLoc()), ToExpr, Import(From->getRParenLoc()), 64994967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar ToAIs.data(), NumArrayIndices); 65004967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar } else { 65014967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar return nullptr; 65024967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar } 65034967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar} 65044967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar 65054967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar 6506d8868a634d4fd362243dc646e58c3cf956c81dcdDouglas Gregorvoid ASTImporter::ImportDefinition(Decl *From) { 6507d8868a634d4fd362243dc646e58c3cf956c81dcdDouglas Gregor Decl *To = Import(From); 6508d8868a634d4fd362243dc646e58c3cf956c81dcdDouglas Gregor if (!To) 6509d8868a634d4fd362243dc646e58c3cf956c81dcdDouglas Gregor return; 6510d8868a634d4fd362243dc646e58c3cf956c81dcdDouglas Gregor 6511d8868a634d4fd362243dc646e58c3cf956c81dcdDouglas Gregor if (DeclContext *FromDC = cast<DeclContext>(From)) { 6512d8868a634d4fd362243dc646e58c3cf956c81dcdDouglas Gregor ASTNodeImporter Importer(*this); 6513673e775beba71a69dbab4fcd733a84f4cfe2ebfcSean Callanan 6514673e775beba71a69dbab4fcd733a84f4cfe2ebfcSean Callanan if (RecordDecl *ToRecord = dyn_cast<RecordDecl>(To)) { 6515673e775beba71a69dbab4fcd733a84f4cfe2ebfcSean Callanan if (!ToRecord->getDefinition()) { 6516673e775beba71a69dbab4fcd733a84f4cfe2ebfcSean Callanan Importer.ImportDefinition(cast<RecordDecl>(FromDC), ToRecord, 6517cd0d56a523f877ffd1fe1575caf758b4357f1661Douglas Gregor ASTNodeImporter::IDK_Everything); 6518673e775beba71a69dbab4fcd733a84f4cfe2ebfcSean Callanan return; 6519673e775beba71a69dbab4fcd733a84f4cfe2ebfcSean Callanan } 6520673e775beba71a69dbab4fcd733a84f4cfe2ebfcSean Callanan } 65211cf038c516c5e1f56ea9cff61aac7f7841744a91Douglas Gregor 65221cf038c516c5e1f56ea9cff61aac7f7841744a91Douglas Gregor if (EnumDecl *ToEnum = dyn_cast<EnumDecl>(To)) { 65231cf038c516c5e1f56ea9cff61aac7f7841744a91Douglas Gregor if (!ToEnum->getDefinition()) { 65241cf038c516c5e1f56ea9cff61aac7f7841744a91Douglas Gregor Importer.ImportDefinition(cast<EnumDecl>(FromDC), ToEnum, 6525ac32ff9812e7d6bc31573b5499bfd005fc8b8f39Douglas Gregor ASTNodeImporter::IDK_Everything); 65261cf038c516c5e1f56ea9cff61aac7f7841744a91Douglas Gregor return; 65271cf038c516c5e1f56ea9cff61aac7f7841744a91Douglas Gregor } 65281cf038c516c5e1f56ea9cff61aac7f7841744a91Douglas Gregor } 65295602f7e77e975d780f84079532408c0064566c3bDouglas Gregor 65305602f7e77e975d780f84079532408c0064566c3bDouglas Gregor if (ObjCInterfaceDecl *ToIFace = dyn_cast<ObjCInterfaceDecl>(To)) { 65315602f7e77e975d780f84079532408c0064566c3bDouglas Gregor if (!ToIFace->getDefinition()) { 65325602f7e77e975d780f84079532408c0064566c3bDouglas Gregor Importer.ImportDefinition(cast<ObjCInterfaceDecl>(FromDC), ToIFace, 6533ac32ff9812e7d6bc31573b5499bfd005fc8b8f39Douglas Gregor ASTNodeImporter::IDK_Everything); 65345602f7e77e975d780f84079532408c0064566c3bDouglas Gregor return; 65355602f7e77e975d780f84079532408c0064566c3bDouglas Gregor } 65365602f7e77e975d780f84079532408c0064566c3bDouglas Gregor } 65371cf038c516c5e1f56ea9cff61aac7f7841744a91Douglas Gregor 65385602f7e77e975d780f84079532408c0064566c3bDouglas Gregor if (ObjCProtocolDecl *ToProto = dyn_cast<ObjCProtocolDecl>(To)) { 65395602f7e77e975d780f84079532408c0064566c3bDouglas Gregor if (!ToProto->getDefinition()) { 65405602f7e77e975d780f84079532408c0064566c3bDouglas Gregor Importer.ImportDefinition(cast<ObjCProtocolDecl>(FromDC), ToProto, 6541ac32ff9812e7d6bc31573b5499bfd005fc8b8f39Douglas Gregor ASTNodeImporter::IDK_Everything); 65425602f7e77e975d780f84079532408c0064566c3bDouglas Gregor return; 65435602f7e77e975d780f84079532408c0064566c3bDouglas Gregor } 65445602f7e77e975d780f84079532408c0064566c3bDouglas Gregor } 65455602f7e77e975d780f84079532408c0064566c3bDouglas Gregor 6546d8868a634d4fd362243dc646e58c3cf956c81dcdDouglas Gregor Importer.ImportDeclContext(FromDC, true); 6547d8868a634d4fd362243dc646e58c3cf956c81dcdDouglas Gregor } 6548d8868a634d4fd362243dc646e58c3cf956c81dcdDouglas Gregor} 6549d8868a634d4fd362243dc646e58c3cf956c81dcdDouglas Gregor 65501b2949d27ec72894dec017c330c0548af4bb2476Douglas GregorDeclarationName ASTImporter::Import(DeclarationName FromName) { 65511b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor if (!FromName) 65521b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor return DeclarationName(); 65531b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor 65541b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor switch (FromName.getNameKind()) { 65551b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor case DeclarationName::Identifier: 65561b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor return Import(FromName.getAsIdentifierInfo()); 65571b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor 65581b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor case DeclarationName::ObjCZeroArgSelector: 65591b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor case DeclarationName::ObjCOneArgSelector: 65601b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor case DeclarationName::ObjCMultiArgSelector: 65611b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor return Import(FromName.getObjCSelector()); 65621b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor 65631b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor case DeclarationName::CXXConstructorName: { 65641b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor QualType T = Import(FromName.getCXXNameType()); 65651b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor if (T.isNull()) 65661b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor return DeclarationName(); 65671b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor 65681b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor return ToContext.DeclarationNames.getCXXConstructorName( 65691b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor ToContext.getCanonicalType(T)); 65701b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor } 65711b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor 65721b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor case DeclarationName::CXXDestructorName: { 65731b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor QualType T = Import(FromName.getCXXNameType()); 65741b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor if (T.isNull()) 65751b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor return DeclarationName(); 65761b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor 65771b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor return ToContext.DeclarationNames.getCXXDestructorName( 65781b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor ToContext.getCanonicalType(T)); 65791b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor } 65801b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor 65811b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor case DeclarationName::CXXConversionFunctionName: { 65821b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor QualType T = Import(FromName.getCXXNameType()); 65831b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor if (T.isNull()) 65841b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor return DeclarationName(); 65851b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor 65861b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor return ToContext.DeclarationNames.getCXXConversionFunctionName( 65871b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor ToContext.getCanonicalType(T)); 65881b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor } 65891b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor 65901b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor case DeclarationName::CXXOperatorName: 65911b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor return ToContext.DeclarationNames.getCXXOperatorName( 65921b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor FromName.getCXXOverloadedOperator()); 65931b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor 65941b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor case DeclarationName::CXXLiteralOperatorName: 65951b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor return ToContext.DeclarationNames.getCXXLiteralOperatorName( 65961b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor Import(FromName.getCXXLiteralIdentifier())); 65971b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor 65981b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor case DeclarationName::CXXUsingDirective: 65991b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor // FIXME: STATICS! 66001b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor return DeclarationName::getUsingDirectiveName(); 66011b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor } 66021b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor 66033026348bd4c13a0f83b59839f64065e0fcbea253David Blaikie llvm_unreachable("Invalid DeclarationName Kind!"); 66041b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor} 66051b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor 6606d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas GregorIdentifierInfo *ASTImporter::Import(const IdentifierInfo *FromId) { 66071b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor if (!FromId) 66086bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return nullptr; 66091b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor 66104967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar IdentifierInfo *ToId = &ToContext.Idents.get(FromId->getName()); 66114967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar 66124967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar if (!ToId->getBuiltinID() && FromId->getBuiltinID()) 66134967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar ToId->setBuiltinID(FromId->getBuiltinID()); 66144967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar 66154967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar return ToId; 66161b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor} 6617089459a16bf7e9cd10617d1fac5ec0240a0a1ee6Douglas Gregor 6618c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas GregorSelector ASTImporter::Import(Selector FromSel) { 6619c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor if (FromSel.isNull()) 6620c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor return Selector(); 6621c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor 66225f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner SmallVector<IdentifierInfo *, 4> Idents; 6623c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor Idents.push_back(Import(FromSel.getIdentifierInfoForSlot(0))); 6624c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor for (unsigned I = 1, N = FromSel.getNumArgs(); I < N; ++I) 6625c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor Idents.push_back(Import(FromSel.getIdentifierInfoForSlot(I))); 6626c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor return ToContext.Selectors.getSelector(FromSel.getNumArgs(), Idents.data()); 6627c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor} 6628c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor 6629089459a16bf7e9cd10617d1fac5ec0240a0a1ee6Douglas GregorDeclarationName ASTImporter::HandleNameConflict(DeclarationName Name, 6630089459a16bf7e9cd10617d1fac5ec0240a0a1ee6Douglas Gregor DeclContext *DC, 6631089459a16bf7e9cd10617d1fac5ec0240a0a1ee6Douglas Gregor unsigned IDNS, 6632089459a16bf7e9cd10617d1fac5ec0240a0a1ee6Douglas Gregor NamedDecl **Decls, 6633089459a16bf7e9cd10617d1fac5ec0240a0a1ee6Douglas Gregor unsigned NumDecls) { 6634089459a16bf7e9cd10617d1fac5ec0240a0a1ee6Douglas Gregor return Name; 6635089459a16bf7e9cd10617d1fac5ec0240a0a1ee6Douglas Gregor} 6636089459a16bf7e9cd10617d1fac5ec0240a0a1ee6Douglas Gregor 6637089459a16bf7e9cd10617d1fac5ec0240a0a1ee6Douglas GregorDiagnosticBuilder ASTImporter::ToDiag(SourceLocation Loc, unsigned DiagID) { 66385b9268f26ac53a74d2c504279fe577d988d5615dRichard Smith if (LastDiagFromFrom) 66395b9268f26ac53a74d2c504279fe577d988d5615dRichard Smith ToContext.getDiagnostics().notePriorDiagnosticFrom( 66405b9268f26ac53a74d2c504279fe577d988d5615dRichard Smith FromContext.getDiagnostics()); 66415b9268f26ac53a74d2c504279fe577d988d5615dRichard Smith LastDiagFromFrom = false; 664233e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis return ToContext.getDiagnostics().Report(Loc, DiagID); 6643089459a16bf7e9cd10617d1fac5ec0240a0a1ee6Douglas Gregor} 6644089459a16bf7e9cd10617d1fac5ec0240a0a1ee6Douglas Gregor 6645089459a16bf7e9cd10617d1fac5ec0240a0a1ee6Douglas GregorDiagnosticBuilder ASTImporter::FromDiag(SourceLocation Loc, unsigned DiagID) { 66465b9268f26ac53a74d2c504279fe577d988d5615dRichard Smith if (!LastDiagFromFrom) 66475b9268f26ac53a74d2c504279fe577d988d5615dRichard Smith FromContext.getDiagnostics().notePriorDiagnosticFrom( 66485b9268f26ac53a74d2c504279fe577d988d5615dRichard Smith ToContext.getDiagnostics()); 66495b9268f26ac53a74d2c504279fe577d988d5615dRichard Smith LastDiagFromFrom = true; 665033e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis return FromContext.getDiagnostics().Report(Loc, DiagID); 6651089459a16bf7e9cd10617d1fac5ec0240a0a1ee6Douglas Gregor} 66525ce5dab3c30e4255b8f62b148b6a86f09a444aaaDouglas Gregor 6653ac32ff9812e7d6bc31573b5499bfd005fc8b8f39Douglas Gregorvoid ASTImporter::CompleteDecl (Decl *D) { 6654ac32ff9812e7d6bc31573b5499bfd005fc8b8f39Douglas Gregor if (ObjCInterfaceDecl *ID = dyn_cast<ObjCInterfaceDecl>(D)) { 6655ac32ff9812e7d6bc31573b5499bfd005fc8b8f39Douglas Gregor if (!ID->getDefinition()) 6656ac32ff9812e7d6bc31573b5499bfd005fc8b8f39Douglas Gregor ID->startDefinition(); 6657ac32ff9812e7d6bc31573b5499bfd005fc8b8f39Douglas Gregor } 6658ac32ff9812e7d6bc31573b5499bfd005fc8b8f39Douglas Gregor else if (ObjCProtocolDecl *PD = dyn_cast<ObjCProtocolDecl>(D)) { 6659ac32ff9812e7d6bc31573b5499bfd005fc8b8f39Douglas Gregor if (!PD->getDefinition()) 6660ac32ff9812e7d6bc31573b5499bfd005fc8b8f39Douglas Gregor PD->startDefinition(); 6661ac32ff9812e7d6bc31573b5499bfd005fc8b8f39Douglas Gregor } 6662ac32ff9812e7d6bc31573b5499bfd005fc8b8f39Douglas Gregor else if (TagDecl *TD = dyn_cast<TagDecl>(D)) { 6663ac32ff9812e7d6bc31573b5499bfd005fc8b8f39Douglas Gregor if (!TD->getDefinition() && !TD->isBeingDefined()) { 6664ac32ff9812e7d6bc31573b5499bfd005fc8b8f39Douglas Gregor TD->startDefinition(); 6665ac32ff9812e7d6bc31573b5499bfd005fc8b8f39Douglas Gregor TD->setCompleteDefinition(true); 6666ac32ff9812e7d6bc31573b5499bfd005fc8b8f39Douglas Gregor } 6667ac32ff9812e7d6bc31573b5499bfd005fc8b8f39Douglas Gregor } 6668ac32ff9812e7d6bc31573b5499bfd005fc8b8f39Douglas Gregor else { 6669ac32ff9812e7d6bc31573b5499bfd005fc8b8f39Douglas Gregor assert (0 && "CompleteDecl called on a Decl that can't be completed"); 6670ac32ff9812e7d6bc31573b5499bfd005fc8b8f39Douglas Gregor } 6671ac32ff9812e7d6bc31573b5499bfd005fc8b8f39Douglas Gregor} 6672ac32ff9812e7d6bc31573b5499bfd005fc8b8f39Douglas Gregor 66735ce5dab3c30e4255b8f62b148b6a86f09a444aaaDouglas GregorDecl *ASTImporter::Imported(Decl *From, Decl *To) { 66744967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar if (From->hasAttrs()) { 66754967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar for (Attr *FromAttr : From->getAttrs()) 66764967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar To->addAttr(FromAttr->clone(To->getASTContext())); 66774967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar } 66784967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar if (From->isUsed()) { 66794967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar To->setIsUsed(); 66804967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar } 66814967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar if (From->isImplicit()) { 66824967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar To->setImplicit(); 66834967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar } 66845ce5dab3c30e4255b8f62b148b6a86f09a444aaaDouglas Gregor ImportedDecls[From] = To; 66855ce5dab3c30e4255b8f62b148b6a86f09a444aaaDouglas Gregor return To; 6686af667588d53de22795c5304f1496ccaac2a71402Daniel Dunbar} 6687ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor 668893ed7cf05f900b9150dcf59c0e0f37f3bd325f62Douglas Gregorbool ASTImporter::IsStructurallyEquivalent(QualType From, QualType To, 668993ed7cf05f900b9150dcf59c0e0f37f3bd325f62Douglas Gregor bool Complain) { 6690f4c7371fb1d3cebcfb40abad4537bb82515704eaJohn McCall llvm::DenseMap<const Type *, const Type *>::iterator Pos 6691ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor = ImportedTypes.find(From.getTypePtr()); 6692ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor if (Pos != ImportedTypes.end() && ToContext.hasSameType(Import(From), To)) 6693ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor return true; 6694ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor 669593ed7cf05f900b9150dcf59c0e0f37f3bd325f62Douglas Gregor StructuralEquivalenceContext Ctx(FromContext, ToContext, NonEquivalentDecls, 669693ed7cf05f900b9150dcf59c0e0f37f3bd325f62Douglas Gregor false, Complain); 6697bb2d176c4f434e9e73f63f2f9d128f63ce3e10d0Benjamin Kramer return Ctx.IsStructurallyEquivalent(From, To); 6698ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor} 6699