ASTImporter.cpp revision 864c041e118155c2b1ce0ba36942a3da5a4a055e
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 161b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor#include "clang/AST/ASTContext.h" 17885237354fd902998c6ae9d7cc3dc8de96b123dcDouglas Gregor#include "clang/AST/ASTDiagnostic.h" 1896a01b4acf76fb8fe1e05341a97a27b39fb0b914Douglas Gregor#include "clang/AST/DeclCXX.h" 191b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor#include "clang/AST/DeclObjC.h" 20089459a16bf7e9cd10617d1fac5ec0240a0a1ee6Douglas Gregor#include "clang/AST/DeclVisitor.h" 214800d95d28b20eca5d57c108ae3d2e6e312c1182Douglas Gregor#include "clang/AST/StmtVisitor.h" 221b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor#include "clang/AST/TypeVisitor.h" 23885237354fd902998c6ae9d7cc3dc8de96b123dcDouglas Gregor#include "clang/Basic/FileManager.h" 24885237354fd902998c6ae9d7cc3dc8de96b123dcDouglas Gregor#include "clang/Basic/SourceManager.h" 25885237354fd902998c6ae9d7cc3dc8de96b123dcDouglas Gregor#include "llvm/Support/MemoryBuffer.h" 2673dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor#include <deque> 271b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor 281b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregorusing namespace clang; 291b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor 301b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregornamespace { 31089459a16bf7e9cd10617d1fac5ec0240a0a1ee6Douglas Gregor class ASTNodeImporter : public TypeVisitor<ASTNodeImporter, QualType>, 324800d95d28b20eca5d57c108ae3d2e6e312c1182Douglas Gregor public DeclVisitor<ASTNodeImporter, Decl *>, 334800d95d28b20eca5d57c108ae3d2e6e312c1182Douglas Gregor public StmtVisitor<ASTNodeImporter, Stmt *> { 341b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor ASTImporter &Importer; 351b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor 361b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor public: 371b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor explicit ASTNodeImporter(ASTImporter &Importer) : Importer(Importer) { } 381b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor 391b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor using TypeVisitor<ASTNodeImporter, QualType>::Visit; 409bed8798964d9f07599c2c9199701f86fbc70e20Douglas Gregor using DeclVisitor<ASTNodeImporter, Decl *>::Visit; 414800d95d28b20eca5d57c108ae3d2e6e312c1182Douglas Gregor using StmtVisitor<ASTNodeImporter, Stmt *>::Visit; 421b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor 431b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor // Importing types 44f4c7371fb1d3cebcfb40abad4537bb82515704eaJohn McCall QualType VisitType(const Type *T); 45f4c7371fb1d3cebcfb40abad4537bb82515704eaJohn McCall QualType VisitBuiltinType(const BuiltinType *T); 46f4c7371fb1d3cebcfb40abad4537bb82515704eaJohn McCall QualType VisitComplexType(const ComplexType *T); 47f4c7371fb1d3cebcfb40abad4537bb82515704eaJohn McCall QualType VisitPointerType(const PointerType *T); 48f4c7371fb1d3cebcfb40abad4537bb82515704eaJohn McCall QualType VisitBlockPointerType(const BlockPointerType *T); 49f4c7371fb1d3cebcfb40abad4537bb82515704eaJohn McCall QualType VisitLValueReferenceType(const LValueReferenceType *T); 50f4c7371fb1d3cebcfb40abad4537bb82515704eaJohn McCall QualType VisitRValueReferenceType(const RValueReferenceType *T); 51f4c7371fb1d3cebcfb40abad4537bb82515704eaJohn McCall QualType VisitMemberPointerType(const MemberPointerType *T); 52f4c7371fb1d3cebcfb40abad4537bb82515704eaJohn McCall QualType VisitConstantArrayType(const ConstantArrayType *T); 53f4c7371fb1d3cebcfb40abad4537bb82515704eaJohn McCall QualType VisitIncompleteArrayType(const IncompleteArrayType *T); 54f4c7371fb1d3cebcfb40abad4537bb82515704eaJohn McCall QualType VisitVariableArrayType(const VariableArrayType *T); 551b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor // FIXME: DependentSizedArrayType 561b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor // FIXME: DependentSizedExtVectorType 57f4c7371fb1d3cebcfb40abad4537bb82515704eaJohn McCall QualType VisitVectorType(const VectorType *T); 58f4c7371fb1d3cebcfb40abad4537bb82515704eaJohn McCall QualType VisitExtVectorType(const ExtVectorType *T); 59f4c7371fb1d3cebcfb40abad4537bb82515704eaJohn McCall QualType VisitFunctionNoProtoType(const FunctionNoProtoType *T); 60f4c7371fb1d3cebcfb40abad4537bb82515704eaJohn McCall QualType VisitFunctionProtoType(const FunctionProtoType *T); 611b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor // FIXME: UnresolvedUsingType 62f4c7371fb1d3cebcfb40abad4537bb82515704eaJohn McCall QualType VisitTypedefType(const TypedefType *T); 63f4c7371fb1d3cebcfb40abad4537bb82515704eaJohn McCall QualType VisitTypeOfExprType(const TypeOfExprType *T); 641b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor // FIXME: DependentTypeOfExprType 65f4c7371fb1d3cebcfb40abad4537bb82515704eaJohn McCall QualType VisitTypeOfType(const TypeOfType *T); 66f4c7371fb1d3cebcfb40abad4537bb82515704eaJohn McCall QualType VisitDecltypeType(const DecltypeType *T); 6734b41d939a1328f484511c6002ba2456db879a29Richard Smith QualType VisitAutoType(const AutoType *T); 681b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor // FIXME: DependentDecltypeType 69f4c7371fb1d3cebcfb40abad4537bb82515704eaJohn McCall QualType VisitRecordType(const RecordType *T); 70f4c7371fb1d3cebcfb40abad4537bb82515704eaJohn McCall QualType VisitEnumType(const EnumType *T); 711b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor // FIXME: TemplateTypeParmType 721b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor // FIXME: SubstTemplateTypeParmType 73f4c7371fb1d3cebcfb40abad4537bb82515704eaJohn McCall QualType VisitTemplateSpecializationType(const TemplateSpecializationType *T); 74f4c7371fb1d3cebcfb40abad4537bb82515704eaJohn McCall QualType VisitElaboratedType(const ElaboratedType *T); 754714c12a1ab759156b78be8f109ea4c12213af57Douglas Gregor // FIXME: DependentNameType 7633500955d731c73717af52088b7fc0e7a85681e7John McCall // FIXME: DependentTemplateSpecializationType 77f4c7371fb1d3cebcfb40abad4537bb82515704eaJohn McCall QualType VisitObjCInterfaceType(const ObjCInterfaceType *T); 78f4c7371fb1d3cebcfb40abad4537bb82515704eaJohn McCall QualType VisitObjCObjectType(const ObjCObjectType *T); 79f4c7371fb1d3cebcfb40abad4537bb82515704eaJohn McCall QualType VisitObjCObjectPointerType(const ObjCObjectPointerType *T); 80089459a16bf7e9cd10617d1fac5ec0240a0a1ee6Douglas Gregor 81089459a16bf7e9cd10617d1fac5ec0240a0a1ee6Douglas Gregor // Importing declarations 82a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor bool ImportDeclParts(NamedDecl *D, DeclContext *&DC, 83a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor DeclContext *&LexicalDC, DeclarationName &Name, 84788c62d1e87bfb596078817237f672a5f000999aDouglas Gregor SourceLocation &Loc); 852577743c5650c646fb705df01403707e94f2df04Abramo Bagnara void ImportDeclarationNameLoc(const DeclarationNameInfo &From, 862577743c5650c646fb705df01403707e94f2df04Abramo Bagnara DeclarationNameInfo& To); 87d8868a634d4fd362243dc646e58c3cf956c81dcdDouglas Gregor void ImportDeclContext(DeclContext *FromDC, bool ForceImport = false); 88d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor bool ImportDefinition(RecordDecl *From, RecordDecl *To); 89040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor TemplateParameterList *ImportTemplateParameterList( 90040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor TemplateParameterList *Params); 91d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor TemplateArgument ImportTemplateArgument(const TemplateArgument &From); 92d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor bool ImportTemplateArguments(const TemplateArgument *FromArgs, 93d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor unsigned NumFromArgs, 94d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor llvm::SmallVectorImpl<TemplateArgument> &ToArgs); 9596a01b4acf76fb8fe1e05341a97a27b39fb0b914Douglas Gregor bool IsStructuralMatch(RecordDecl *FromRecord, RecordDecl *ToRecord); 9673dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor bool IsStructuralMatch(EnumDecl *FromEnum, EnumDecl *ToRecord); 97040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor bool IsStructuralMatch(ClassTemplateDecl *From, ClassTemplateDecl *To); 9889cc9d6e2aaf794fbd2c228a3755c19062ca0ba0Douglas Gregor Decl *VisitDecl(Decl *D); 99788c62d1e87bfb596078817237f672a5f000999aDouglas Gregor Decl *VisitNamespaceDecl(NamespaceDecl *D); 100162e1c1b487352434552147967c3dd296ebee2f7Richard Smith Decl *VisitTypedefNameDecl(TypedefNameDecl *D, bool IsAlias); 1019e5d996444e40fdf5cce44ee82bec0d4e3df3d56Douglas Gregor Decl *VisitTypedefDecl(TypedefDecl *D); 102162e1c1b487352434552147967c3dd296ebee2f7Richard Smith Decl *VisitTypeAliasDecl(TypeAliasDecl *D); 10336ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas Gregor Decl *VisitEnumDecl(EnumDecl *D); 10496a01b4acf76fb8fe1e05341a97a27b39fb0b914Douglas Gregor Decl *VisitRecordDecl(RecordDecl *D); 10536ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas Gregor Decl *VisitEnumConstantDecl(EnumConstantDecl *D); 106a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor Decl *VisitFunctionDecl(FunctionDecl *D); 107c144f3534e2f7a70ea9ebf8dd83090a2883d61fbDouglas Gregor Decl *VisitCXXMethodDecl(CXXMethodDecl *D); 108c144f3534e2f7a70ea9ebf8dd83090a2883d61fbDouglas Gregor Decl *VisitCXXConstructorDecl(CXXConstructorDecl *D); 109c144f3534e2f7a70ea9ebf8dd83090a2883d61fbDouglas Gregor Decl *VisitCXXDestructorDecl(CXXDestructorDecl *D); 110c144f3534e2f7a70ea9ebf8dd83090a2883d61fbDouglas Gregor Decl *VisitCXXConversionDecl(CXXConversionDecl *D); 11196a01b4acf76fb8fe1e05341a97a27b39fb0b914Douglas Gregor Decl *VisitFieldDecl(FieldDecl *D); 11287c2e121cf0522fc266efe2922b58091cd2e0182Francois Pichet Decl *VisitIndirectFieldDecl(IndirectFieldDecl *D); 1132e55e3af2f6d6c0509495357fade95105dd144cdDouglas Gregor Decl *VisitObjCIvarDecl(ObjCIvarDecl *D); 114089459a16bf7e9cd10617d1fac5ec0240a0a1ee6Douglas Gregor Decl *VisitVarDecl(VarDecl *D); 1152cd00932b9b5403047139ce8cfaa3ae47966f894Douglas Gregor Decl *VisitImplicitParamDecl(ImplicitParamDecl *D); 116a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor Decl *VisitParmVarDecl(ParmVarDecl *D); 117c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor Decl *VisitObjCMethodDecl(ObjCMethodDecl *D); 118b4677b62a8e9bba0913dfe1456bd9d689cdbccacDouglas Gregor Decl *VisitObjCCategoryDecl(ObjCCategoryDecl *D); 1192e2a400383c7a64a927f61eeed596b08928e1d4bDouglas Gregor Decl *VisitObjCProtocolDecl(ObjCProtocolDecl *D); 120a12d294db5bd59cd8836b9bd0dafadaaa2e3dd8aDouglas Gregor Decl *VisitObjCInterfaceDecl(ObjCInterfaceDecl *D); 1213daef29bf390dbdb3603748280afd5827d1811daDouglas Gregor Decl *VisitObjCCategoryImplDecl(ObjCCategoryImplDecl *D); 122dd182ff10b9145e432dea1fd2fb67100ccca3b10Douglas Gregor Decl *VisitObjCImplementationDecl(ObjCImplementationDecl *D); 123e3261624c1870e52d7efc2ac83e647713361ac6cDouglas Gregor Decl *VisitObjCPropertyDecl(ObjCPropertyDecl *D); 124954e0c75c42f321945aff8b9ee96da43cd90c752Douglas Gregor Decl *VisitObjCPropertyImplDecl(ObjCPropertyImplDecl *D); 1252b785022973202ea6bafe304a50eb3cac1a0aeb8Douglas Gregor Decl *VisitObjCForwardProtocolDecl(ObjCForwardProtocolDecl *D); 126a2bc15b7463a9f85a5bff1531d833c278426a733Douglas Gregor Decl *VisitObjCClassDecl(ObjCClassDecl *D); 127040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor Decl *VisitTemplateTypeParmDecl(TemplateTypeParmDecl *D); 128040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor Decl *VisitNonTypeTemplateParmDecl(NonTypeTemplateParmDecl *D); 129040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor Decl *VisitTemplateTemplateParmDecl(TemplateTemplateParmDecl *D); 130040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor Decl *VisitClassTemplateDecl(ClassTemplateDecl *D); 131d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor Decl *VisitClassTemplateSpecializationDecl( 132d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor ClassTemplateSpecializationDecl *D); 133a2bc15b7463a9f85a5bff1531d833c278426a733Douglas Gregor 1344800d95d28b20eca5d57c108ae3d2e6e312c1182Douglas Gregor // Importing statements 1354800d95d28b20eca5d57c108ae3d2e6e312c1182Douglas Gregor Stmt *VisitStmt(Stmt *S); 1364800d95d28b20eca5d57c108ae3d2e6e312c1182Douglas Gregor 1374800d95d28b20eca5d57c108ae3d2e6e312c1182Douglas Gregor // Importing expressions 1384800d95d28b20eca5d57c108ae3d2e6e312c1182Douglas Gregor Expr *VisitExpr(Expr *E); 139440806306674e23ad74726208cbdc6f37849dd9dDouglas Gregor Expr *VisitDeclRefExpr(DeclRefExpr *E); 1404800d95d28b20eca5d57c108ae3d2e6e312c1182Douglas Gregor Expr *VisitIntegerLiteral(IntegerLiteral *E); 141b2e400aae8c62c4e1616016f40618baace0da065Douglas Gregor Expr *VisitCharacterLiteral(CharacterLiteral *E); 142f638f9580ba0da99a66668f00e1a1d4987067bddDouglas Gregor Expr *VisitParenExpr(ParenExpr *E); 143f638f9580ba0da99a66668f00e1a1d4987067bddDouglas Gregor Expr *VisitUnaryOperator(UnaryOperator *E); 144f4e3cfbe8abd124be6341ef5d714819b4fbd9082Peter Collingbourne Expr *VisitUnaryExprOrTypeTraitExpr(UnaryExprOrTypeTraitExpr *E); 145f638f9580ba0da99a66668f00e1a1d4987067bddDouglas Gregor Expr *VisitBinaryOperator(BinaryOperator *E); 146f638f9580ba0da99a66668f00e1a1d4987067bddDouglas Gregor Expr *VisitCompoundAssignOperator(CompoundAssignOperator *E); 14736ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas Gregor Expr *VisitImplicitCastExpr(ImplicitCastExpr *E); 148008847a70ab122a99911149199855060fb3753b4Douglas Gregor Expr *VisitCStyleCastExpr(CStyleCastExpr *E); 1491b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor }; 1501b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor} 1511b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor 1521b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor//---------------------------------------------------------------------------- 15373dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor// Structural Equivalence 15473dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor//---------------------------------------------------------------------------- 15573dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor 15673dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregornamespace { 15773dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor struct StructuralEquivalenceContext { 15873dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor /// \brief AST contexts for which we are checking structural equivalence. 15973dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor ASTContext &C1, &C2; 16073dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor 16173dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor /// \brief The set of "tentative" equivalences between two canonical 16273dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor /// declarations, mapping from a declaration in the first context to the 16373dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor /// declaration in the second context that we believe to be equivalent. 16473dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor llvm::DenseMap<Decl *, Decl *> TentativeEquivalences; 16573dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor 16673dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor /// \brief Queue of declarations in the first context whose equivalence 16773dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor /// with a declaration in the second context still needs to be verified. 16873dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor std::deque<Decl *> DeclsToCheck; 16973dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor 170ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor /// \brief Declaration (from, to) pairs that are known not to be equivalent 171ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor /// (which we have already complained about). 172ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor llvm::DenseSet<std::pair<Decl *, Decl *> > &NonEquivalentDecls; 173ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor 17473dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor /// \brief Whether we're being strict about the spelling of types when 17573dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor /// unifying two types. 17673dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor bool StrictTypeSpelling; 17773dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor 17873dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor StructuralEquivalenceContext(ASTContext &C1, ASTContext &C2, 179ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor llvm::DenseSet<std::pair<Decl *, Decl *> > &NonEquivalentDecls, 18073dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor bool StrictTypeSpelling = false) 18133e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis : C1(C1), C2(C2), NonEquivalentDecls(NonEquivalentDecls), 182ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor StrictTypeSpelling(StrictTypeSpelling) { } 18373dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor 18473dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor /// \brief Determine whether the two declarations are structurally 18573dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor /// equivalent. 18673dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor bool IsStructurallyEquivalent(Decl *D1, Decl *D2); 18773dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor 18873dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor /// \brief Determine whether the two types are structurally equivalent. 18973dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor bool IsStructurallyEquivalent(QualType T1, QualType T2); 19073dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor 19173dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor private: 19273dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor /// \brief Finish checking all of the structural equivalences. 19373dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor /// 19473dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor /// \returns true if an error occurred, false otherwise. 19573dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor bool Finish(); 19673dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor 19773dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor public: 19873dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor DiagnosticBuilder Diag1(SourceLocation Loc, unsigned DiagID) { 19933e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis return C1.getDiagnostics().Report(Loc, DiagID); 20073dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor } 20173dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor 20273dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor DiagnosticBuilder Diag2(SourceLocation Loc, unsigned DiagID) { 20333e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis return C2.getDiagnostics().Report(Loc, DiagID); 20473dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor } 20573dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor }; 20673dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor} 20773dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor 20873dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregorstatic bool IsStructurallyEquivalent(StructuralEquivalenceContext &Context, 20973dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor QualType T1, QualType T2); 21073dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregorstatic bool IsStructurallyEquivalent(StructuralEquivalenceContext &Context, 21173dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor Decl *D1, Decl *D2); 21273dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor 21373dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor/// \brief Determine if two APInts have the same value, after zero-extending 21473dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor/// one of them (if needed!) to ensure that the bit-widths match. 21573dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregorstatic bool IsSameValue(const llvm::APInt &I1, const llvm::APInt &I2) { 21673dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor if (I1.getBitWidth() == I2.getBitWidth()) 21773dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor return I1 == I2; 21873dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor 21973dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor if (I1.getBitWidth() > I2.getBitWidth()) 2209f71a8f4c7a182a5236da9e747d57cc1d1bd24c2Jay Foad return I1 == I2.zext(I1.getBitWidth()); 22173dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor 2229f71a8f4c7a182a5236da9e747d57cc1d1bd24c2Jay Foad return I1.zext(I2.getBitWidth()) == I2; 22373dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor} 22473dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor 22573dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor/// \brief Determine if two APSInts have the same value, zero- or sign-extending 22673dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor/// as needed. 22773dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregorstatic bool IsSameValue(const llvm::APSInt &I1, const llvm::APSInt &I2) { 22873dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor if (I1.getBitWidth() == I2.getBitWidth() && I1.isSigned() == I2.isSigned()) 22973dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor return I1 == I2; 23073dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor 23173dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor // Check for a bit-width mismatch. 23273dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor if (I1.getBitWidth() > I2.getBitWidth()) 2339f71a8f4c7a182a5236da9e747d57cc1d1bd24c2Jay Foad return IsSameValue(I1, I2.extend(I1.getBitWidth())); 23473dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor else if (I2.getBitWidth() > I1.getBitWidth()) 2359f71a8f4c7a182a5236da9e747d57cc1d1bd24c2Jay Foad return IsSameValue(I1.extend(I2.getBitWidth()), I2); 23673dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor 23773dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor // We have a signedness mismatch. Turn the signed value into an unsigned 23873dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor // value. 23973dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor if (I1.isSigned()) { 24073dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor if (I1.isNegative()) 24173dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor return false; 24273dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor 24373dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor return llvm::APSInt(I1, true) == I2; 24473dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor } 24573dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor 24673dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor if (I2.isNegative()) 24773dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor return false; 24873dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor 24973dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor return I1 == llvm::APSInt(I2, true); 25073dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor} 25173dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor 25273dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor/// \brief Determine structural equivalence of two expressions. 25373dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregorstatic bool IsStructurallyEquivalent(StructuralEquivalenceContext &Context, 25473dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor Expr *E1, Expr *E2) { 25573dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor if (!E1 || !E2) 25673dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor return E1 == E2; 25773dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor 25873dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor // FIXME: Actually perform a structural comparison! 25973dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor return true; 26073dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor} 26173dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor 26273dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor/// \brief Determine whether two identifiers are equivalent. 26373dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregorstatic bool IsStructurallyEquivalent(const IdentifierInfo *Name1, 26473dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor const IdentifierInfo *Name2) { 26573dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor if (!Name1 || !Name2) 26673dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor return Name1 == Name2; 26773dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor 26873dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor return Name1->getName() == Name2->getName(); 26973dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor} 27073dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor 27173dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor/// \brief Determine whether two nested-name-specifiers are equivalent. 27273dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregorstatic bool IsStructurallyEquivalent(StructuralEquivalenceContext &Context, 27373dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor NestedNameSpecifier *NNS1, 27473dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor NestedNameSpecifier *NNS2) { 27573dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor // FIXME: Implement! 27673dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor return true; 27773dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor} 27873dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor 27973dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor/// \brief Determine whether two template arguments are equivalent. 28073dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregorstatic bool IsStructurallyEquivalent(StructuralEquivalenceContext &Context, 28173dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor const TemplateArgument &Arg1, 28273dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor const TemplateArgument &Arg2) { 283d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor if (Arg1.getKind() != Arg2.getKind()) 284d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor return false; 285d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor 286d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor switch (Arg1.getKind()) { 287d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor case TemplateArgument::Null: 288d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor return true; 289d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor 290d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor case TemplateArgument::Type: 291d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor return Context.IsStructurallyEquivalent(Arg1.getAsType(), Arg2.getAsType()); 292d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor 293d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor case TemplateArgument::Integral: 294d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor if (!Context.IsStructurallyEquivalent(Arg1.getIntegralType(), 295d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor Arg2.getIntegralType())) 296d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor return false; 297d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor 298d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor return IsSameValue(*Arg1.getAsIntegral(), *Arg2.getAsIntegral()); 299d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor 300d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor case TemplateArgument::Declaration: 301d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor return Context.IsStructurallyEquivalent(Arg1.getAsDecl(), Arg2.getAsDecl()); 302d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor 303d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor case TemplateArgument::Template: 304d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor return IsStructurallyEquivalent(Context, 305d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor Arg1.getAsTemplate(), 306d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor Arg2.getAsTemplate()); 307a7fc901a2e39bfe55bfcff5934b2d9fdf9656491Douglas Gregor 308a7fc901a2e39bfe55bfcff5934b2d9fdf9656491Douglas Gregor case TemplateArgument::TemplateExpansion: 309a7fc901a2e39bfe55bfcff5934b2d9fdf9656491Douglas Gregor return IsStructurallyEquivalent(Context, 310a7fc901a2e39bfe55bfcff5934b2d9fdf9656491Douglas Gregor Arg1.getAsTemplateOrTemplatePattern(), 311a7fc901a2e39bfe55bfcff5934b2d9fdf9656491Douglas Gregor Arg2.getAsTemplateOrTemplatePattern()); 312a7fc901a2e39bfe55bfcff5934b2d9fdf9656491Douglas Gregor 313d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor case TemplateArgument::Expression: 314d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor return IsStructurallyEquivalent(Context, 315d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor Arg1.getAsExpr(), Arg2.getAsExpr()); 316d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor 317d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor case TemplateArgument::Pack: 318d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor if (Arg1.pack_size() != Arg2.pack_size()) 319d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor return false; 320d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor 321d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor for (unsigned I = 0, N = Arg1.pack_size(); I != N; ++I) 322d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor if (!IsStructurallyEquivalent(Context, 323d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor Arg1.pack_begin()[I], 324d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor Arg2.pack_begin()[I])) 325d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor return false; 326d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor 327d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor return true; 328d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor } 329d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor 330d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor llvm_unreachable("Invalid template argument kind"); 33173dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor return true; 33273dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor} 33373dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor 33473dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor/// \brief Determine structural equivalence for the common part of array 33573dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor/// types. 33673dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregorstatic bool IsArrayStructurallyEquivalent(StructuralEquivalenceContext &Context, 33773dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor const ArrayType *Array1, 33873dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor const ArrayType *Array2) { 33973dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor if (!IsStructurallyEquivalent(Context, 34073dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor Array1->getElementType(), 34173dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor Array2->getElementType())) 34273dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor return false; 34373dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor if (Array1->getSizeModifier() != Array2->getSizeModifier()) 34473dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor return false; 34573dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor if (Array1->getIndexTypeQualifiers() != Array2->getIndexTypeQualifiers()) 34673dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor return false; 34773dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor 34873dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor return true; 34973dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor} 35073dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor 35173dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor/// \brief Determine structural equivalence of two types. 35273dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregorstatic bool IsStructurallyEquivalent(StructuralEquivalenceContext &Context, 35373dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor QualType T1, QualType T2) { 35473dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor if (T1.isNull() || T2.isNull()) 35573dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor return T1.isNull() && T2.isNull(); 35673dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor 35773dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor if (!Context.StrictTypeSpelling) { 35873dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor // We aren't being strict about token-to-token equivalence of types, 35973dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor // so map down to the canonical type. 36073dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor T1 = Context.C1.getCanonicalType(T1); 36173dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor T2 = Context.C2.getCanonicalType(T2); 36273dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor } 36373dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor 36473dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor if (T1.getQualifiers() != T2.getQualifiers()) 36573dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor return false; 36673dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor 367ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor Type::TypeClass TC = T1->getTypeClass(); 368ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor 369ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor if (T1->getTypeClass() != T2->getTypeClass()) { 370ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor // Compare function types with prototypes vs. without prototypes as if 371ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor // both did not have prototypes. 372ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor if (T1->getTypeClass() == Type::FunctionProto && 373ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor T2->getTypeClass() == Type::FunctionNoProto) 374ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor TC = Type::FunctionNoProto; 375ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor else if (T1->getTypeClass() == Type::FunctionNoProto && 376ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor T2->getTypeClass() == Type::FunctionProto) 377ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor TC = Type::FunctionNoProto; 378ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor else 379ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor return false; 380ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor } 38173dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor 382ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor switch (TC) { 383ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor case Type::Builtin: 38473dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor // FIXME: Deal with Char_S/Char_U. 38573dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor if (cast<BuiltinType>(T1)->getKind() != cast<BuiltinType>(T2)->getKind()) 38673dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor return false; 38773dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor break; 38873dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor 38973dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor case Type::Complex: 39073dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor if (!IsStructurallyEquivalent(Context, 39173dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor cast<ComplexType>(T1)->getElementType(), 39273dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor cast<ComplexType>(T2)->getElementType())) 39373dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor return false; 39473dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor break; 39573dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor 39673dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor case Type::Pointer: 39773dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor if (!IsStructurallyEquivalent(Context, 39873dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor cast<PointerType>(T1)->getPointeeType(), 39973dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor cast<PointerType>(T2)->getPointeeType())) 40073dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor return false; 40173dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor break; 40273dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor 40373dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor case Type::BlockPointer: 40473dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor if (!IsStructurallyEquivalent(Context, 40573dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor cast<BlockPointerType>(T1)->getPointeeType(), 40673dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor cast<BlockPointerType>(T2)->getPointeeType())) 40773dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor return false; 40873dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor break; 40973dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor 41073dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor case Type::LValueReference: 41173dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor case Type::RValueReference: { 41273dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor const ReferenceType *Ref1 = cast<ReferenceType>(T1); 41373dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor const ReferenceType *Ref2 = cast<ReferenceType>(T2); 41473dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor if (Ref1->isSpelledAsLValue() != Ref2->isSpelledAsLValue()) 41573dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor return false; 41673dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor if (Ref1->isInnerRef() != Ref2->isInnerRef()) 41773dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor return false; 41873dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor if (!IsStructurallyEquivalent(Context, 41973dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor Ref1->getPointeeTypeAsWritten(), 42073dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor Ref2->getPointeeTypeAsWritten())) 42173dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor return false; 42273dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor break; 42373dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor } 42473dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor 42573dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor case Type::MemberPointer: { 42673dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor const MemberPointerType *MemPtr1 = cast<MemberPointerType>(T1); 42773dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor const MemberPointerType *MemPtr2 = cast<MemberPointerType>(T2); 42873dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor if (!IsStructurallyEquivalent(Context, 42973dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor MemPtr1->getPointeeType(), 43073dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor MemPtr2->getPointeeType())) 43173dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor return false; 43273dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor if (!IsStructurallyEquivalent(Context, 43373dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor QualType(MemPtr1->getClass(), 0), 43473dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor QualType(MemPtr2->getClass(), 0))) 43573dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor return false; 43673dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor break; 43773dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor } 43873dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor 43973dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor case Type::ConstantArray: { 44073dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor const ConstantArrayType *Array1 = cast<ConstantArrayType>(T1); 44173dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor const ConstantArrayType *Array2 = cast<ConstantArrayType>(T2); 44273dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor if (!IsSameValue(Array1->getSize(), Array2->getSize())) 44373dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor return false; 44473dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor 44573dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor if (!IsArrayStructurallyEquivalent(Context, Array1, Array2)) 44673dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor return false; 44773dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor break; 44873dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor } 44973dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor 45073dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor case Type::IncompleteArray: 45173dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor if (!IsArrayStructurallyEquivalent(Context, 45273dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor cast<ArrayType>(T1), 45373dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor cast<ArrayType>(T2))) 45473dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor return false; 45573dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor break; 45673dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor 45773dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor case Type::VariableArray: { 45873dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor const VariableArrayType *Array1 = cast<VariableArrayType>(T1); 45973dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor const VariableArrayType *Array2 = cast<VariableArrayType>(T2); 46073dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor if (!IsStructurallyEquivalent(Context, 46173dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor Array1->getSizeExpr(), Array2->getSizeExpr())) 46273dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor return false; 46373dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor 46473dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor if (!IsArrayStructurallyEquivalent(Context, Array1, Array2)) 46573dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor return false; 46673dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor 46773dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor break; 46873dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor } 46973dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor 47073dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor case Type::DependentSizedArray: { 47173dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor const DependentSizedArrayType *Array1 = cast<DependentSizedArrayType>(T1); 47273dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor const DependentSizedArrayType *Array2 = cast<DependentSizedArrayType>(T2); 47373dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor if (!IsStructurallyEquivalent(Context, 47473dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor Array1->getSizeExpr(), Array2->getSizeExpr())) 47573dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor return false; 47673dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor 47773dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor if (!IsArrayStructurallyEquivalent(Context, Array1, Array2)) 47873dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor return false; 47973dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor 48073dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor break; 48173dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor } 48273dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor 48373dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor case Type::DependentSizedExtVector: { 48473dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor const DependentSizedExtVectorType *Vec1 48573dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor = cast<DependentSizedExtVectorType>(T1); 48673dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor const DependentSizedExtVectorType *Vec2 48773dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor = cast<DependentSizedExtVectorType>(T2); 48873dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor if (!IsStructurallyEquivalent(Context, 48973dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor Vec1->getSizeExpr(), Vec2->getSizeExpr())) 49073dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor return false; 49173dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor if (!IsStructurallyEquivalent(Context, 49273dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor Vec1->getElementType(), 49373dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor Vec2->getElementType())) 49473dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor return false; 49573dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor break; 49673dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor } 49773dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor 49873dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor case Type::Vector: 49973dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor case Type::ExtVector: { 50073dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor const VectorType *Vec1 = cast<VectorType>(T1); 50173dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor const VectorType *Vec2 = cast<VectorType>(T2); 50273dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor if (!IsStructurallyEquivalent(Context, 50373dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor Vec1->getElementType(), 50473dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor Vec2->getElementType())) 50573dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor return false; 50673dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor if (Vec1->getNumElements() != Vec2->getNumElements()) 50773dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor return false; 508e86d78cf4754a6aef2cf9a33d847aa15338e276fBob Wilson if (Vec1->getVectorKind() != Vec2->getVectorKind()) 50973dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor return false; 5100e12b44081c6395a6d60a05a85a6012f7bb23b16Douglas Gregor break; 51173dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor } 51273dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor 51373dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor case Type::FunctionProto: { 51473dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor const FunctionProtoType *Proto1 = cast<FunctionProtoType>(T1); 51573dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor const FunctionProtoType *Proto2 = cast<FunctionProtoType>(T2); 51673dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor if (Proto1->getNumArgs() != Proto2->getNumArgs()) 51773dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor return false; 51873dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor for (unsigned I = 0, N = Proto1->getNumArgs(); I != N; ++I) { 51973dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor if (!IsStructurallyEquivalent(Context, 52073dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor Proto1->getArgType(I), 52173dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor Proto2->getArgType(I))) 52273dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor return false; 52373dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor } 52473dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor if (Proto1->isVariadic() != Proto2->isVariadic()) 52573dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor return false; 52660618fa7f88d5162bb5b40988b6b38d4d75d6fc6Sebastian Redl if (Proto1->getExceptionSpecType() != Proto2->getExceptionSpecType()) 52773dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor return false; 52860618fa7f88d5162bb5b40988b6b38d4d75d6fc6Sebastian Redl if (Proto1->getExceptionSpecType() == EST_Dynamic) { 52960618fa7f88d5162bb5b40988b6b38d4d75d6fc6Sebastian Redl if (Proto1->getNumExceptions() != Proto2->getNumExceptions()) 53060618fa7f88d5162bb5b40988b6b38d4d75d6fc6Sebastian Redl return false; 53160618fa7f88d5162bb5b40988b6b38d4d75d6fc6Sebastian Redl for (unsigned I = 0, N = Proto1->getNumExceptions(); I != N; ++I) { 53260618fa7f88d5162bb5b40988b6b38d4d75d6fc6Sebastian Redl if (!IsStructurallyEquivalent(Context, 53360618fa7f88d5162bb5b40988b6b38d4d75d6fc6Sebastian Redl Proto1->getExceptionType(I), 53460618fa7f88d5162bb5b40988b6b38d4d75d6fc6Sebastian Redl Proto2->getExceptionType(I))) 53560618fa7f88d5162bb5b40988b6b38d4d75d6fc6Sebastian Redl return false; 53660618fa7f88d5162bb5b40988b6b38d4d75d6fc6Sebastian Redl } 53760618fa7f88d5162bb5b40988b6b38d4d75d6fc6Sebastian Redl } else if (Proto1->getExceptionSpecType() == EST_ComputedNoexcept) { 53873dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor if (!IsStructurallyEquivalent(Context, 53960618fa7f88d5162bb5b40988b6b38d4d75d6fc6Sebastian Redl Proto1->getNoexceptExpr(), 54060618fa7f88d5162bb5b40988b6b38d4d75d6fc6Sebastian Redl Proto2->getNoexceptExpr())) 54173dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor return false; 54273dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor } 54373dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor if (Proto1->getTypeQuals() != Proto2->getTypeQuals()) 54473dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor return false; 54573dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor 54673dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor // Fall through to check the bits common with FunctionNoProtoType. 54773dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor } 54873dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor 54973dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor case Type::FunctionNoProto: { 55073dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor const FunctionType *Function1 = cast<FunctionType>(T1); 55173dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor const FunctionType *Function2 = cast<FunctionType>(T2); 55273dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor if (!IsStructurallyEquivalent(Context, 55373dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor Function1->getResultType(), 55473dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor Function2->getResultType())) 55573dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor return false; 556264ba48dc98f3f843935a485d5b086f7e0fdc4f1Rafael Espindola if (Function1->getExtInfo() != Function2->getExtInfo()) 557264ba48dc98f3f843935a485d5b086f7e0fdc4f1Rafael Espindola return false; 55873dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor break; 55973dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor } 56073dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor 56173dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor case Type::UnresolvedUsing: 56273dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor if (!IsStructurallyEquivalent(Context, 56373dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor cast<UnresolvedUsingType>(T1)->getDecl(), 56473dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor cast<UnresolvedUsingType>(T2)->getDecl())) 56573dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor return false; 56673dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor 56773dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor break; 5689d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall 5699d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall case Type::Attributed: 5709d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall if (!IsStructurallyEquivalent(Context, 5719d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall cast<AttributedType>(T1)->getModifiedType(), 5729d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall cast<AttributedType>(T2)->getModifiedType())) 5739d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall return false; 5749d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall if (!IsStructurallyEquivalent(Context, 5759d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall cast<AttributedType>(T1)->getEquivalentType(), 5769d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall cast<AttributedType>(T2)->getEquivalentType())) 5779d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall return false; 5789d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall break; 57973dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor 580075f8f1b6bed4d1b224c74f87508534cc6392ce6Abramo Bagnara case Type::Paren: 581075f8f1b6bed4d1b224c74f87508534cc6392ce6Abramo Bagnara if (!IsStructurallyEquivalent(Context, 582075f8f1b6bed4d1b224c74f87508534cc6392ce6Abramo Bagnara cast<ParenType>(T1)->getInnerType(), 583075f8f1b6bed4d1b224c74f87508534cc6392ce6Abramo Bagnara cast<ParenType>(T2)->getInnerType())) 584075f8f1b6bed4d1b224c74f87508534cc6392ce6Abramo Bagnara return false; 585075f8f1b6bed4d1b224c74f87508534cc6392ce6Abramo Bagnara break; 586075f8f1b6bed4d1b224c74f87508534cc6392ce6Abramo Bagnara 58773dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor case Type::Typedef: 58873dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor if (!IsStructurallyEquivalent(Context, 58973dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor cast<TypedefType>(T1)->getDecl(), 59073dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor cast<TypedefType>(T2)->getDecl())) 59173dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor return false; 59273dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor break; 59373dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor 59473dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor case Type::TypeOfExpr: 59573dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor if (!IsStructurallyEquivalent(Context, 59673dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor cast<TypeOfExprType>(T1)->getUnderlyingExpr(), 59773dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor cast<TypeOfExprType>(T2)->getUnderlyingExpr())) 59873dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor return false; 59973dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor break; 60073dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor 60173dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor case Type::TypeOf: 60273dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor if (!IsStructurallyEquivalent(Context, 60373dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor cast<TypeOfType>(T1)->getUnderlyingType(), 60473dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor cast<TypeOfType>(T2)->getUnderlyingType())) 60573dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor return false; 60673dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor break; 60773dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor 60873dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor case Type::Decltype: 60973dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor if (!IsStructurallyEquivalent(Context, 61073dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor cast<DecltypeType>(T1)->getUnderlyingExpr(), 61173dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor cast<DecltypeType>(T2)->getUnderlyingExpr())) 61273dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor return false; 61373dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor break; 61473dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor 61534b41d939a1328f484511c6002ba2456db879a29Richard Smith case Type::Auto: 61634b41d939a1328f484511c6002ba2456db879a29Richard Smith if (!IsStructurallyEquivalent(Context, 61734b41d939a1328f484511c6002ba2456db879a29Richard Smith cast<AutoType>(T1)->getDeducedType(), 61834b41d939a1328f484511c6002ba2456db879a29Richard Smith cast<AutoType>(T2)->getDeducedType())) 61934b41d939a1328f484511c6002ba2456db879a29Richard Smith return false; 62034b41d939a1328f484511c6002ba2456db879a29Richard Smith break; 62134b41d939a1328f484511c6002ba2456db879a29Richard Smith 62273dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor case Type::Record: 62373dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor case Type::Enum: 62473dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor if (!IsStructurallyEquivalent(Context, 62573dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor cast<TagType>(T1)->getDecl(), 62673dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor cast<TagType>(T2)->getDecl())) 62773dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor return false; 62873dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor break; 629465d41b92b2c862f3062c412a0538db65c6a2661Abramo Bagnara 63073dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor case Type::TemplateTypeParm: { 63173dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor const TemplateTypeParmType *Parm1 = cast<TemplateTypeParmType>(T1); 63273dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor const TemplateTypeParmType *Parm2 = cast<TemplateTypeParmType>(T2); 63373dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor if (Parm1->getDepth() != Parm2->getDepth()) 63473dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor return false; 63573dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor if (Parm1->getIndex() != Parm2->getIndex()) 63673dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor return false; 63773dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor if (Parm1->isParameterPack() != Parm2->isParameterPack()) 63873dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor return false; 63973dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor 64073dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor // Names of template type parameters are never significant. 64173dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor break; 64273dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor } 64373dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor 64473dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor case Type::SubstTemplateTypeParm: { 64573dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor const SubstTemplateTypeParmType *Subst1 64673dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor = cast<SubstTemplateTypeParmType>(T1); 64773dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor const SubstTemplateTypeParmType *Subst2 64873dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor = cast<SubstTemplateTypeParmType>(T2); 64973dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor if (!IsStructurallyEquivalent(Context, 65073dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor QualType(Subst1->getReplacedParameter(), 0), 65173dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor QualType(Subst2->getReplacedParameter(), 0))) 65273dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor return false; 65373dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor if (!IsStructurallyEquivalent(Context, 65473dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor Subst1->getReplacementType(), 65573dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor Subst2->getReplacementType())) 65673dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor return false; 65773dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor break; 65873dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor } 65973dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor 6600bc15d92bf98cd01e7904d7fca9895dacc237618Douglas Gregor case Type::SubstTemplateTypeParmPack: { 6610bc15d92bf98cd01e7904d7fca9895dacc237618Douglas Gregor const SubstTemplateTypeParmPackType *Subst1 6620bc15d92bf98cd01e7904d7fca9895dacc237618Douglas Gregor = cast<SubstTemplateTypeParmPackType>(T1); 6630bc15d92bf98cd01e7904d7fca9895dacc237618Douglas Gregor const SubstTemplateTypeParmPackType *Subst2 6640bc15d92bf98cd01e7904d7fca9895dacc237618Douglas Gregor = cast<SubstTemplateTypeParmPackType>(T2); 6650bc15d92bf98cd01e7904d7fca9895dacc237618Douglas Gregor if (!IsStructurallyEquivalent(Context, 6660bc15d92bf98cd01e7904d7fca9895dacc237618Douglas Gregor QualType(Subst1->getReplacedParameter(), 0), 6670bc15d92bf98cd01e7904d7fca9895dacc237618Douglas Gregor QualType(Subst2->getReplacedParameter(), 0))) 6680bc15d92bf98cd01e7904d7fca9895dacc237618Douglas Gregor return false; 6690bc15d92bf98cd01e7904d7fca9895dacc237618Douglas Gregor if (!IsStructurallyEquivalent(Context, 6700bc15d92bf98cd01e7904d7fca9895dacc237618Douglas Gregor Subst1->getArgumentPack(), 6710bc15d92bf98cd01e7904d7fca9895dacc237618Douglas Gregor Subst2->getArgumentPack())) 6720bc15d92bf98cd01e7904d7fca9895dacc237618Douglas Gregor return false; 6730bc15d92bf98cd01e7904d7fca9895dacc237618Douglas Gregor break; 6740bc15d92bf98cd01e7904d7fca9895dacc237618Douglas Gregor } 67573dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor case Type::TemplateSpecialization: { 67673dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor const TemplateSpecializationType *Spec1 67773dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor = cast<TemplateSpecializationType>(T1); 67873dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor const TemplateSpecializationType *Spec2 67973dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor = cast<TemplateSpecializationType>(T2); 68073dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor if (!IsStructurallyEquivalent(Context, 68173dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor Spec1->getTemplateName(), 68273dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor Spec2->getTemplateName())) 68373dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor return false; 68473dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor if (Spec1->getNumArgs() != Spec2->getNumArgs()) 68573dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor return false; 68673dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor for (unsigned I = 0, N = Spec1->getNumArgs(); I != N; ++I) { 68773dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor if (!IsStructurallyEquivalent(Context, 68873dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor Spec1->getArg(I), Spec2->getArg(I))) 68973dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor return false; 69073dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor } 69173dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor break; 69273dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor } 69373dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor 694465d41b92b2c862f3062c412a0538db65c6a2661Abramo Bagnara case Type::Elaborated: { 695465d41b92b2c862f3062c412a0538db65c6a2661Abramo Bagnara const ElaboratedType *Elab1 = cast<ElaboratedType>(T1); 696465d41b92b2c862f3062c412a0538db65c6a2661Abramo Bagnara const ElaboratedType *Elab2 = cast<ElaboratedType>(T2); 697465d41b92b2c862f3062c412a0538db65c6a2661Abramo Bagnara // CHECKME: what if a keyword is ETK_None or ETK_typename ? 698465d41b92b2c862f3062c412a0538db65c6a2661Abramo Bagnara if (Elab1->getKeyword() != Elab2->getKeyword()) 699465d41b92b2c862f3062c412a0538db65c6a2661Abramo Bagnara return false; 70073dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor if (!IsStructurallyEquivalent(Context, 701465d41b92b2c862f3062c412a0538db65c6a2661Abramo Bagnara Elab1->getQualifier(), 702465d41b92b2c862f3062c412a0538db65c6a2661Abramo Bagnara Elab2->getQualifier())) 70373dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor return false; 70473dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor if (!IsStructurallyEquivalent(Context, 705465d41b92b2c862f3062c412a0538db65c6a2661Abramo Bagnara Elab1->getNamedType(), 706465d41b92b2c862f3062c412a0538db65c6a2661Abramo Bagnara Elab2->getNamedType())) 70773dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor return false; 70873dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor break; 70973dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor } 71073dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor 7113cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall case Type::InjectedClassName: { 7123cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall const InjectedClassNameType *Inj1 = cast<InjectedClassNameType>(T1); 7133cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall const InjectedClassNameType *Inj2 = cast<InjectedClassNameType>(T2); 7143cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall if (!IsStructurallyEquivalent(Context, 71531f17ecbef57b5679c017c375db330546b7b5145John McCall Inj1->getInjectedSpecializationType(), 71631f17ecbef57b5679c017c375db330546b7b5145John McCall Inj2->getInjectedSpecializationType())) 7173cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall return false; 7183cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall break; 7193cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall } 7203cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall 7214714c12a1ab759156b78be8f109ea4c12213af57Douglas Gregor case Type::DependentName: { 7224714c12a1ab759156b78be8f109ea4c12213af57Douglas Gregor const DependentNameType *Typename1 = cast<DependentNameType>(T1); 7234714c12a1ab759156b78be8f109ea4c12213af57Douglas Gregor const DependentNameType *Typename2 = cast<DependentNameType>(T2); 72473dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor if (!IsStructurallyEquivalent(Context, 72573dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor Typename1->getQualifier(), 72673dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor Typename2->getQualifier())) 72773dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor return false; 72873dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor if (!IsStructurallyEquivalent(Typename1->getIdentifier(), 72973dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor Typename2->getIdentifier())) 73073dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor return false; 73173dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor 73273dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor break; 73373dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor } 73473dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor 73533500955d731c73717af52088b7fc0e7a85681e7John McCall case Type::DependentTemplateSpecialization: { 73633500955d731c73717af52088b7fc0e7a85681e7John McCall const DependentTemplateSpecializationType *Spec1 = 73733500955d731c73717af52088b7fc0e7a85681e7John McCall cast<DependentTemplateSpecializationType>(T1); 73833500955d731c73717af52088b7fc0e7a85681e7John McCall const DependentTemplateSpecializationType *Spec2 = 73933500955d731c73717af52088b7fc0e7a85681e7John McCall cast<DependentTemplateSpecializationType>(T2); 74033500955d731c73717af52088b7fc0e7a85681e7John McCall if (!IsStructurallyEquivalent(Context, 74133500955d731c73717af52088b7fc0e7a85681e7John McCall Spec1->getQualifier(), 74233500955d731c73717af52088b7fc0e7a85681e7John McCall Spec2->getQualifier())) 74333500955d731c73717af52088b7fc0e7a85681e7John McCall return false; 74433500955d731c73717af52088b7fc0e7a85681e7John McCall if (!IsStructurallyEquivalent(Spec1->getIdentifier(), 74533500955d731c73717af52088b7fc0e7a85681e7John McCall Spec2->getIdentifier())) 74633500955d731c73717af52088b7fc0e7a85681e7John McCall return false; 74733500955d731c73717af52088b7fc0e7a85681e7John McCall if (Spec1->getNumArgs() != Spec2->getNumArgs()) 74833500955d731c73717af52088b7fc0e7a85681e7John McCall return false; 74933500955d731c73717af52088b7fc0e7a85681e7John McCall for (unsigned I = 0, N = Spec1->getNumArgs(); I != N; ++I) { 75033500955d731c73717af52088b7fc0e7a85681e7John McCall if (!IsStructurallyEquivalent(Context, 75133500955d731c73717af52088b7fc0e7a85681e7John McCall Spec1->getArg(I), Spec2->getArg(I))) 75233500955d731c73717af52088b7fc0e7a85681e7John McCall return false; 75333500955d731c73717af52088b7fc0e7a85681e7John McCall } 75433500955d731c73717af52088b7fc0e7a85681e7John McCall break; 75533500955d731c73717af52088b7fc0e7a85681e7John McCall } 7567536dd5e6c99584481b7dab68b7e7d8df9c54054Douglas Gregor 7577536dd5e6c99584481b7dab68b7e7d8df9c54054Douglas Gregor case Type::PackExpansion: 7587536dd5e6c99584481b7dab68b7e7d8df9c54054Douglas Gregor if (!IsStructurallyEquivalent(Context, 7597536dd5e6c99584481b7dab68b7e7d8df9c54054Douglas Gregor cast<PackExpansionType>(T1)->getPattern(), 7607536dd5e6c99584481b7dab68b7e7d8df9c54054Douglas Gregor cast<PackExpansionType>(T2)->getPattern())) 7617536dd5e6c99584481b7dab68b7e7d8df9c54054Douglas Gregor return false; 7627536dd5e6c99584481b7dab68b7e7d8df9c54054Douglas Gregor break; 7637536dd5e6c99584481b7dab68b7e7d8df9c54054Douglas Gregor 76473dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor case Type::ObjCInterface: { 76573dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor const ObjCInterfaceType *Iface1 = cast<ObjCInterfaceType>(T1); 76673dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor const ObjCInterfaceType *Iface2 = cast<ObjCInterfaceType>(T2); 76773dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor if (!IsStructurallyEquivalent(Context, 76873dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor Iface1->getDecl(), Iface2->getDecl())) 76973dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor return false; 770c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall break; 771c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall } 772c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall 773c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall case Type::ObjCObject: { 774c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall const ObjCObjectType *Obj1 = cast<ObjCObjectType>(T1); 775c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall const ObjCObjectType *Obj2 = cast<ObjCObjectType>(T2); 776c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall if (!IsStructurallyEquivalent(Context, 777c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall Obj1->getBaseType(), 778c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall Obj2->getBaseType())) 779c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall return false; 780c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall if (Obj1->getNumProtocols() != Obj2->getNumProtocols()) 78173dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor return false; 782c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall for (unsigned I = 0, N = Obj1->getNumProtocols(); I != N; ++I) { 78373dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor if (!IsStructurallyEquivalent(Context, 784c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall Obj1->getProtocol(I), 785c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall Obj2->getProtocol(I))) 78673dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor return false; 78773dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor } 78873dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor break; 78973dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor } 79073dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor 79173dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor case Type::ObjCObjectPointer: { 79273dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor const ObjCObjectPointerType *Ptr1 = cast<ObjCObjectPointerType>(T1); 79373dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor const ObjCObjectPointerType *Ptr2 = cast<ObjCObjectPointerType>(T2); 79473dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor if (!IsStructurallyEquivalent(Context, 79573dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor Ptr1->getPointeeType(), 79673dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor Ptr2->getPointeeType())) 79773dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor return false; 79873dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor break; 79973dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor } 80073dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor 80173dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor } // end switch 80273dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor 80373dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor return true; 80473dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor} 80573dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor 80673dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor/// \brief Determine structural equivalence of two records. 80773dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregorstatic bool IsStructurallyEquivalent(StructuralEquivalenceContext &Context, 80873dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor RecordDecl *D1, RecordDecl *D2) { 80973dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor if (D1->isUnion() != D2->isUnion()) { 81073dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor Context.Diag2(D2->getLocation(), diag::warn_odr_tag_type_inconsistent) 81173dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor << Context.C2.getTypeDeclType(D2); 81273dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor Context.Diag1(D1->getLocation(), diag::note_odr_tag_kind_here) 81373dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor << D1->getDeclName() << (unsigned)D1->getTagKind(); 81473dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor return false; 81573dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor } 81673dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor 817d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor // If both declarations are class template specializations, we know 818d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor // the ODR applies, so check the template and template arguments. 819d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor ClassTemplateSpecializationDecl *Spec1 820d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor = dyn_cast<ClassTemplateSpecializationDecl>(D1); 821d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor ClassTemplateSpecializationDecl *Spec2 822d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor = dyn_cast<ClassTemplateSpecializationDecl>(D2); 823d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor if (Spec1 && Spec2) { 824d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor // Check that the specialized templates are the same. 825d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor if (!IsStructurallyEquivalent(Context, Spec1->getSpecializedTemplate(), 826d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor Spec2->getSpecializedTemplate())) 827d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor return false; 828d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor 829d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor // Check that the template arguments are the same. 830d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor if (Spec1->getTemplateArgs().size() != Spec2->getTemplateArgs().size()) 831d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor return false; 832d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor 833d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor for (unsigned I = 0, N = Spec1->getTemplateArgs().size(); I != N; ++I) 834d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor if (!IsStructurallyEquivalent(Context, 835d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor Spec1->getTemplateArgs().get(I), 836d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor Spec2->getTemplateArgs().get(I))) 837d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor return false; 838d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor } 839d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor // If one is a class template specialization and the other is not, these 840fc8f0e14ad142ed811e90fbd9a30e419e301c717Chris Lattner // structures are different. 841d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor else if (Spec1 || Spec2) 842d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor return false; 843d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor 844ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor // Compare the definitions of these two records. If either or both are 845ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor // incomplete, we assume that they are equivalent. 846ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor D1 = D1->getDefinition(); 847ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor D2 = D2->getDefinition(); 848ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor if (!D1 || !D2) 849ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor return true; 850ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor 85173dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor if (CXXRecordDecl *D1CXX = dyn_cast<CXXRecordDecl>(D1)) { 85273dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor if (CXXRecordDecl *D2CXX = dyn_cast<CXXRecordDecl>(D2)) { 85373dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor if (D1CXX->getNumBases() != D2CXX->getNumBases()) { 85473dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor Context.Diag2(D2->getLocation(), diag::warn_odr_tag_type_inconsistent) 855040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor << Context.C2.getTypeDeclType(D2); 85673dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor Context.Diag2(D2->getLocation(), diag::note_odr_number_of_bases) 857040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor << D2CXX->getNumBases(); 85873dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor Context.Diag1(D1->getLocation(), diag::note_odr_number_of_bases) 859040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor << D1CXX->getNumBases(); 86073dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor return false; 86173dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor } 86273dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor 86373dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor // Check the base classes. 86473dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor for (CXXRecordDecl::base_class_iterator Base1 = D1CXX->bases_begin(), 86573dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor BaseEnd1 = D1CXX->bases_end(), 86673dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor Base2 = D2CXX->bases_begin(); 86773dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor Base1 != BaseEnd1; 86873dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor ++Base1, ++Base2) { 86973dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor if (!IsStructurallyEquivalent(Context, 87073dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor Base1->getType(), Base2->getType())) { 87173dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor Context.Diag2(D2->getLocation(), diag::warn_odr_tag_type_inconsistent) 87273dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor << Context.C2.getTypeDeclType(D2); 87373dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor Context.Diag2(Base2->getSourceRange().getBegin(), diag::note_odr_base) 87473dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor << Base2->getType() 87573dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor << Base2->getSourceRange(); 87673dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor Context.Diag1(Base1->getSourceRange().getBegin(), diag::note_odr_base) 87773dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor << Base1->getType() 87873dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor << Base1->getSourceRange(); 87973dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor return false; 88073dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor } 88173dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor 88273dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor // Check virtual vs. non-virtual inheritance mismatch. 88373dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor if (Base1->isVirtual() != Base2->isVirtual()) { 88473dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor Context.Diag2(D2->getLocation(), diag::warn_odr_tag_type_inconsistent) 88573dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor << Context.C2.getTypeDeclType(D2); 88673dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor Context.Diag2(Base2->getSourceRange().getBegin(), 88773dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor diag::note_odr_virtual_base) 88873dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor << Base2->isVirtual() << Base2->getSourceRange(); 88973dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor Context.Diag1(Base1->getSourceRange().getBegin(), diag::note_odr_base) 89073dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor << Base1->isVirtual() 89173dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor << Base1->getSourceRange(); 89273dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor return false; 89373dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor } 89473dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor } 89573dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor } else if (D1CXX->getNumBases() > 0) { 89673dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor Context.Diag2(D2->getLocation(), diag::warn_odr_tag_type_inconsistent) 89773dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor << Context.C2.getTypeDeclType(D2); 89873dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor const CXXBaseSpecifier *Base1 = D1CXX->bases_begin(); 89973dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor Context.Diag1(Base1->getSourceRange().getBegin(), diag::note_odr_base) 90073dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor << Base1->getType() 90173dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor << Base1->getSourceRange(); 90273dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor Context.Diag2(D2->getLocation(), diag::note_odr_missing_base); 90373dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor return false; 90473dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor } 90573dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor } 90673dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor 90773dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor // Check the fields for consistency. 90873dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor CXXRecordDecl::field_iterator Field2 = D2->field_begin(), 90973dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor Field2End = D2->field_end(); 91073dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor for (CXXRecordDecl::field_iterator Field1 = D1->field_begin(), 91173dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor Field1End = D1->field_end(); 91273dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor Field1 != Field1End; 91373dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor ++Field1, ++Field2) { 91473dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor if (Field2 == Field2End) { 91573dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor Context.Diag2(D2->getLocation(), diag::warn_odr_tag_type_inconsistent) 91673dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor << Context.C2.getTypeDeclType(D2); 91773dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor Context.Diag1(Field1->getLocation(), diag::note_odr_field) 91873dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor << Field1->getDeclName() << Field1->getType(); 91973dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor Context.Diag2(D2->getLocation(), diag::note_odr_missing_field); 92073dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor return false; 92173dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor } 92273dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor 92373dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor if (!IsStructurallyEquivalent(Context, 92473dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor Field1->getType(), Field2->getType())) { 92573dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor Context.Diag2(D2->getLocation(), diag::warn_odr_tag_type_inconsistent) 92673dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor << Context.C2.getTypeDeclType(D2); 92773dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor Context.Diag2(Field2->getLocation(), diag::note_odr_field) 92873dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor << Field2->getDeclName() << Field2->getType(); 92973dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor Context.Diag1(Field1->getLocation(), diag::note_odr_field) 93073dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor << Field1->getDeclName() << Field1->getType(); 93173dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor return false; 93273dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor } 93373dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor 93473dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor if (Field1->isBitField() != Field2->isBitField()) { 93573dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor Context.Diag2(D2->getLocation(), diag::warn_odr_tag_type_inconsistent) 93673dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor << Context.C2.getTypeDeclType(D2); 93773dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor if (Field1->isBitField()) { 93873dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor llvm::APSInt Bits; 93973dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor Field1->getBitWidth()->isIntegerConstantExpr(Bits, Context.C1); 94073dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor Context.Diag1(Field1->getLocation(), diag::note_odr_bit_field) 94173dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor << Field1->getDeclName() << Field1->getType() 94273dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor << Bits.toString(10, false); 94373dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor Context.Diag2(Field2->getLocation(), diag::note_odr_not_bit_field) 94473dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor << Field2->getDeclName(); 94573dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor } else { 94673dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor llvm::APSInt Bits; 94773dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor Field2->getBitWidth()->isIntegerConstantExpr(Bits, Context.C2); 94873dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor Context.Diag2(Field2->getLocation(), diag::note_odr_bit_field) 94973dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor << Field2->getDeclName() << Field2->getType() 95073dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor << Bits.toString(10, false); 95173dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor Context.Diag1(Field1->getLocation(), 95273dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor diag::note_odr_not_bit_field) 95373dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor << Field1->getDeclName(); 95473dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor } 95573dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor return false; 95673dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor } 95773dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor 95873dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor if (Field1->isBitField()) { 95973dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor // Make sure that the bit-fields are the same length. 96073dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor llvm::APSInt Bits1, Bits2; 96173dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor if (!Field1->getBitWidth()->isIntegerConstantExpr(Bits1, Context.C1)) 96273dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor return false; 96373dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor if (!Field2->getBitWidth()->isIntegerConstantExpr(Bits2, Context.C2)) 96473dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor return false; 96573dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor 96673dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor if (!IsSameValue(Bits1, Bits2)) { 96773dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor Context.Diag2(D2->getLocation(), diag::warn_odr_tag_type_inconsistent) 96873dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor << Context.C2.getTypeDeclType(D2); 96973dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor Context.Diag2(Field2->getLocation(), diag::note_odr_bit_field) 97073dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor << Field2->getDeclName() << Field2->getType() 97173dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor << Bits2.toString(10, false); 97273dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor Context.Diag1(Field1->getLocation(), diag::note_odr_bit_field) 97373dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor << Field1->getDeclName() << Field1->getType() 97473dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor << Bits1.toString(10, false); 97573dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor return false; 97673dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor } 97773dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor } 97873dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor } 97973dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor 98073dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor if (Field2 != Field2End) { 98173dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor Context.Diag2(D2->getLocation(), diag::warn_odr_tag_type_inconsistent) 98273dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor << Context.C2.getTypeDeclType(D2); 98373dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor Context.Diag2(Field2->getLocation(), diag::note_odr_field) 98473dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor << Field2->getDeclName() << Field2->getType(); 98573dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor Context.Diag1(D1->getLocation(), diag::note_odr_missing_field); 98673dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor return false; 98773dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor } 98873dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor 98973dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor return true; 99073dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor} 99173dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor 99273dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor/// \brief Determine structural equivalence of two enums. 99373dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregorstatic bool IsStructurallyEquivalent(StructuralEquivalenceContext &Context, 99473dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor EnumDecl *D1, EnumDecl *D2) { 99573dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor EnumDecl::enumerator_iterator EC2 = D2->enumerator_begin(), 99673dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor EC2End = D2->enumerator_end(); 99773dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor for (EnumDecl::enumerator_iterator EC1 = D1->enumerator_begin(), 99873dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor EC1End = D1->enumerator_end(); 99973dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor EC1 != EC1End; ++EC1, ++EC2) { 100073dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor if (EC2 == EC2End) { 100173dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor Context.Diag2(D2->getLocation(), diag::warn_odr_tag_type_inconsistent) 100273dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor << Context.C2.getTypeDeclType(D2); 100373dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor Context.Diag1(EC1->getLocation(), diag::note_odr_enumerator) 100473dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor << EC1->getDeclName() 100573dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor << EC1->getInitVal().toString(10); 100673dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor Context.Diag2(D2->getLocation(), diag::note_odr_missing_enumerator); 100773dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor return false; 100873dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor } 100973dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor 101073dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor llvm::APSInt Val1 = EC1->getInitVal(); 101173dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor llvm::APSInt Val2 = EC2->getInitVal(); 101273dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor if (!IsSameValue(Val1, Val2) || 101373dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor !IsStructurallyEquivalent(EC1->getIdentifier(), EC2->getIdentifier())) { 101473dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor Context.Diag2(D2->getLocation(), diag::warn_odr_tag_type_inconsistent) 101573dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor << Context.C2.getTypeDeclType(D2); 101673dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor Context.Diag2(EC2->getLocation(), diag::note_odr_enumerator) 101773dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor << EC2->getDeclName() 101873dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor << EC2->getInitVal().toString(10); 101973dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor Context.Diag1(EC1->getLocation(), diag::note_odr_enumerator) 102073dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor << EC1->getDeclName() 102173dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor << EC1->getInitVal().toString(10); 102273dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor return false; 102373dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor } 102473dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor } 102573dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor 102673dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor if (EC2 != EC2End) { 102773dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor Context.Diag2(D2->getLocation(), diag::warn_odr_tag_type_inconsistent) 102873dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor << Context.C2.getTypeDeclType(D2); 102973dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor Context.Diag2(EC2->getLocation(), diag::note_odr_enumerator) 103073dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor << EC2->getDeclName() 103173dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor << EC2->getInitVal().toString(10); 103273dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor Context.Diag1(D1->getLocation(), diag::note_odr_missing_enumerator); 103373dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor return false; 103473dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor } 103573dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor 103673dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor return true; 103773dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor} 1038040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor 1039040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregorstatic bool IsStructurallyEquivalent(StructuralEquivalenceContext &Context, 1040040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor TemplateParameterList *Params1, 1041040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor TemplateParameterList *Params2) { 1042040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor if (Params1->size() != Params2->size()) { 1043040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor Context.Diag2(Params2->getTemplateLoc(), 1044040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor diag::err_odr_different_num_template_parameters) 1045040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor << Params1->size() << Params2->size(); 1046040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor Context.Diag1(Params1->getTemplateLoc(), 1047040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor diag::note_odr_template_parameter_list); 1048040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor return false; 1049040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor } 1050040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor 1051040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor for (unsigned I = 0, N = Params1->size(); I != N; ++I) { 1052040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor if (Params1->getParam(I)->getKind() != Params2->getParam(I)->getKind()) { 1053040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor Context.Diag2(Params2->getParam(I)->getLocation(), 1054040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor diag::err_odr_different_template_parameter_kind); 1055040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor Context.Diag1(Params1->getParam(I)->getLocation(), 1056040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor diag::note_odr_template_parameter_here); 1057040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor return false; 1058040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor } 1059040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor 1060040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor if (!Context.IsStructurallyEquivalent(Params1->getParam(I), 1061040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor Params2->getParam(I))) { 1062040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor 1063040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor return false; 1064040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor } 1065040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor } 1066040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor 1067040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor return true; 1068040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor} 1069040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor 1070040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregorstatic bool IsStructurallyEquivalent(StructuralEquivalenceContext &Context, 1071040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor TemplateTypeParmDecl *D1, 1072040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor TemplateTypeParmDecl *D2) { 1073040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor if (D1->isParameterPack() != D2->isParameterPack()) { 1074040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor Context.Diag2(D2->getLocation(), diag::err_odr_parameter_pack_non_pack) 1075040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor << D2->isParameterPack(); 1076040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor Context.Diag1(D1->getLocation(), diag::note_odr_parameter_pack_non_pack) 1077040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor << D1->isParameterPack(); 1078040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor return false; 1079040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor } 1080040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor 1081040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor return true; 1082040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor} 1083040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor 1084040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregorstatic bool IsStructurallyEquivalent(StructuralEquivalenceContext &Context, 1085040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor NonTypeTemplateParmDecl *D1, 1086040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor NonTypeTemplateParmDecl *D2) { 1087040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor // FIXME: Enable once we have variadic templates. 1088040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor#if 0 1089040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor if (D1->isParameterPack() != D2->isParameterPack()) { 1090040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor Context.Diag2(D2->getLocation(), diag::err_odr_parameter_pack_non_pack) 1091040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor << D2->isParameterPack(); 1092040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor Context.Diag1(D1->getLocation(), diag::note_odr_parameter_pack_non_pack) 1093040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor << D1->isParameterPack(); 1094040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor return false; 1095040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor } 1096040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor#endif 1097040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor 1098040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor // Check types. 1099040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor if (!Context.IsStructurallyEquivalent(D1->getType(), D2->getType())) { 1100040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor Context.Diag2(D2->getLocation(), 1101040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor diag::err_odr_non_type_parameter_type_inconsistent) 1102040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor << D2->getType() << D1->getType(); 1103040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor Context.Diag1(D1->getLocation(), diag::note_odr_value_here) 1104040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor << D1->getType(); 1105040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor return false; 1106040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor } 1107040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor 1108040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor return true; 1109040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor} 1110040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor 1111040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregorstatic bool IsStructurallyEquivalent(StructuralEquivalenceContext &Context, 1112040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor TemplateTemplateParmDecl *D1, 1113040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor TemplateTemplateParmDecl *D2) { 1114040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor // FIXME: Enable once we have variadic templates. 1115040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor#if 0 1116040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor if (D1->isParameterPack() != D2->isParameterPack()) { 1117040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor Context.Diag2(D2->getLocation(), diag::err_odr_parameter_pack_non_pack) 1118040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor << D2->isParameterPack(); 1119040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor Context.Diag1(D1->getLocation(), diag::note_odr_parameter_pack_non_pack) 1120040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor << D1->isParameterPack(); 1121040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor return false; 1122040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor } 1123040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor#endif 1124040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor 1125040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor // Check template parameter lists. 1126040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor return IsStructurallyEquivalent(Context, D1->getTemplateParameters(), 1127040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor D2->getTemplateParameters()); 1128040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor} 1129040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor 1130040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregorstatic bool IsStructurallyEquivalent(StructuralEquivalenceContext &Context, 1131040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor ClassTemplateDecl *D1, 1132040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor ClassTemplateDecl *D2) { 1133040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor // Check template parameters. 1134040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor if (!IsStructurallyEquivalent(Context, 1135040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor D1->getTemplateParameters(), 1136040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor D2->getTemplateParameters())) 1137040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor return false; 113873dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor 1139040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor // Check the templated declaration. 1140040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor return Context.IsStructurallyEquivalent(D1->getTemplatedDecl(), 1141040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor D2->getTemplatedDecl()); 1142040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor} 1143040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor 114473dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor/// \brief Determine structural equivalence of two declarations. 114573dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregorstatic bool IsStructurallyEquivalent(StructuralEquivalenceContext &Context, 114673dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor Decl *D1, Decl *D2) { 114773dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor // FIXME: Check for known structural equivalences via a callback of some sort. 114873dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor 1149ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor // Check whether we already know that these two declarations are not 1150ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor // structurally equivalent. 1151ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor if (Context.NonEquivalentDecls.count(std::make_pair(D1->getCanonicalDecl(), 1152ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor D2->getCanonicalDecl()))) 1153ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor return false; 1154ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor 115573dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor // Determine whether we've already produced a tentative equivalence for D1. 115673dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor Decl *&EquivToD1 = Context.TentativeEquivalences[D1->getCanonicalDecl()]; 115773dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor if (EquivToD1) 115873dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor return EquivToD1 == D2->getCanonicalDecl(); 115973dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor 116073dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor // Produce a tentative equivalence D1 <-> D2, which will be checked later. 116173dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor EquivToD1 = D2->getCanonicalDecl(); 116273dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor Context.DeclsToCheck.push_back(D1->getCanonicalDecl()); 116373dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor return true; 116473dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor} 116573dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor 116673dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregorbool StructuralEquivalenceContext::IsStructurallyEquivalent(Decl *D1, 116773dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor Decl *D2) { 116873dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor if (!::IsStructurallyEquivalent(*this, D1, D2)) 116973dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor return false; 117073dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor 117173dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor return !Finish(); 117273dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor} 117373dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor 117473dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregorbool StructuralEquivalenceContext::IsStructurallyEquivalent(QualType T1, 117573dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor QualType T2) { 117673dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor if (!::IsStructurallyEquivalent(*this, T1, T2)) 117773dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor return false; 117873dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor 117973dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor return !Finish(); 118073dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor} 118173dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor 118273dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregorbool StructuralEquivalenceContext::Finish() { 118373dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor while (!DeclsToCheck.empty()) { 118473dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor // Check the next declaration. 118573dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor Decl *D1 = DeclsToCheck.front(); 118673dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor DeclsToCheck.pop_front(); 118773dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor 118873dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor Decl *D2 = TentativeEquivalences[D1]; 118973dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor assert(D2 && "Unrecorded tentative equivalence?"); 119073dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor 1191ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor bool Equivalent = true; 1192ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor 119373dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor // FIXME: Switch on all declaration kinds. For now, we're just going to 119473dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor // check the obvious ones. 119573dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor if (RecordDecl *Record1 = dyn_cast<RecordDecl>(D1)) { 119673dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor if (RecordDecl *Record2 = dyn_cast<RecordDecl>(D2)) { 119773dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor // Check for equivalent structure names. 119873dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor IdentifierInfo *Name1 = Record1->getIdentifier(); 1199162e1c1b487352434552147967c3dd296ebee2f7Richard Smith if (!Name1 && Record1->getTypedefNameForAnonDecl()) 1200162e1c1b487352434552147967c3dd296ebee2f7Richard Smith Name1 = Record1->getTypedefNameForAnonDecl()->getIdentifier(); 120173dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor IdentifierInfo *Name2 = Record2->getIdentifier(); 1202162e1c1b487352434552147967c3dd296ebee2f7Richard Smith if (!Name2 && Record2->getTypedefNameForAnonDecl()) 1203162e1c1b487352434552147967c3dd296ebee2f7Richard Smith Name2 = Record2->getTypedefNameForAnonDecl()->getIdentifier(); 1204ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor if (!::IsStructurallyEquivalent(Name1, Name2) || 1205ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor !::IsStructurallyEquivalent(*this, Record1, Record2)) 1206ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor Equivalent = false; 120773dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor } else { 120873dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor // Record/non-record mismatch. 1209ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor Equivalent = false; 121073dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor } 1211ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor } else if (EnumDecl *Enum1 = dyn_cast<EnumDecl>(D1)) { 121273dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor if (EnumDecl *Enum2 = dyn_cast<EnumDecl>(D2)) { 121373dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor // Check for equivalent enum names. 121473dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor IdentifierInfo *Name1 = Enum1->getIdentifier(); 1215162e1c1b487352434552147967c3dd296ebee2f7Richard Smith if (!Name1 && Enum1->getTypedefNameForAnonDecl()) 1216162e1c1b487352434552147967c3dd296ebee2f7Richard Smith Name1 = Enum1->getTypedefNameForAnonDecl()->getIdentifier(); 121773dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor IdentifierInfo *Name2 = Enum2->getIdentifier(); 1218162e1c1b487352434552147967c3dd296ebee2f7Richard Smith if (!Name2 && Enum2->getTypedefNameForAnonDecl()) 1219162e1c1b487352434552147967c3dd296ebee2f7Richard Smith Name2 = Enum2->getTypedefNameForAnonDecl()->getIdentifier(); 1220ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor if (!::IsStructurallyEquivalent(Name1, Name2) || 1221ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor !::IsStructurallyEquivalent(*this, Enum1, Enum2)) 1222ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor Equivalent = false; 122373dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor } else { 122473dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor // Enum/non-enum mismatch 1225ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor Equivalent = false; 122673dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor } 1227162e1c1b487352434552147967c3dd296ebee2f7Richard Smith } else if (TypedefNameDecl *Typedef1 = dyn_cast<TypedefNameDecl>(D1)) { 1228162e1c1b487352434552147967c3dd296ebee2f7Richard Smith if (TypedefNameDecl *Typedef2 = dyn_cast<TypedefNameDecl>(D2)) { 122973dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor if (!::IsStructurallyEquivalent(Typedef1->getIdentifier(), 1230ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor Typedef2->getIdentifier()) || 1231ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor !::IsStructurallyEquivalent(*this, 123273dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor Typedef1->getUnderlyingType(), 123373dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor Typedef2->getUnderlyingType())) 1234ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor Equivalent = false; 123573dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor } else { 123673dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor // Typedef/non-typedef mismatch. 1237ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor Equivalent = false; 123873dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor } 1239040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor } else if (ClassTemplateDecl *ClassTemplate1 1240040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor = dyn_cast<ClassTemplateDecl>(D1)) { 1241040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor if (ClassTemplateDecl *ClassTemplate2 = dyn_cast<ClassTemplateDecl>(D2)) { 1242040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor if (!::IsStructurallyEquivalent(ClassTemplate1->getIdentifier(), 1243040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor ClassTemplate2->getIdentifier()) || 1244040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor !::IsStructurallyEquivalent(*this, ClassTemplate1, ClassTemplate2)) 1245040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor Equivalent = false; 1246040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor } else { 1247040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor // Class template/non-class-template mismatch. 1248040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor Equivalent = false; 1249040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor } 1250040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor } else if (TemplateTypeParmDecl *TTP1= dyn_cast<TemplateTypeParmDecl>(D1)) { 1251040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor if (TemplateTypeParmDecl *TTP2 = dyn_cast<TemplateTypeParmDecl>(D2)) { 1252040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor if (!::IsStructurallyEquivalent(*this, TTP1, TTP2)) 1253040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor Equivalent = false; 1254040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor } else { 1255040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor // Kind mismatch. 1256040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor Equivalent = false; 1257040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor } 1258040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor } else if (NonTypeTemplateParmDecl *NTTP1 1259040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor = dyn_cast<NonTypeTemplateParmDecl>(D1)) { 1260040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor if (NonTypeTemplateParmDecl *NTTP2 1261040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor = dyn_cast<NonTypeTemplateParmDecl>(D2)) { 1262040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor if (!::IsStructurallyEquivalent(*this, NTTP1, NTTP2)) 1263040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor Equivalent = false; 1264040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor } else { 1265040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor // Kind mismatch. 1266040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor Equivalent = false; 1267040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor } 1268040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor } else if (TemplateTemplateParmDecl *TTP1 1269040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor = dyn_cast<TemplateTemplateParmDecl>(D1)) { 1270040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor if (TemplateTemplateParmDecl *TTP2 1271040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor = dyn_cast<TemplateTemplateParmDecl>(D2)) { 1272040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor if (!::IsStructurallyEquivalent(*this, TTP1, TTP2)) 1273040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor Equivalent = false; 1274040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor } else { 1275040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor // Kind mismatch. 1276040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor Equivalent = false; 1277040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor } 1278040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor } 1279040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor 1280ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor if (!Equivalent) { 1281ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor // Note that these two declarations are not equivalent (and we already 1282ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor // know about it). 1283ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor NonEquivalentDecls.insert(std::make_pair(D1->getCanonicalDecl(), 1284ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor D2->getCanonicalDecl())); 1285ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor return true; 1286ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor } 128773dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor // FIXME: Check other declaration kinds! 128873dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor } 128973dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor 129073dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor return false; 129173dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor} 129273dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor 129373dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor//---------------------------------------------------------------------------- 12941b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor// Import Types 12951b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor//---------------------------------------------------------------------------- 12961b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor 1297f4c7371fb1d3cebcfb40abad4537bb82515704eaJohn McCallQualType ASTNodeImporter::VisitType(const Type *T) { 129889cc9d6e2aaf794fbd2c228a3755c19062ca0ba0Douglas Gregor Importer.FromDiag(SourceLocation(), diag::err_unsupported_ast_node) 129989cc9d6e2aaf794fbd2c228a3755c19062ca0ba0Douglas Gregor << T->getTypeClassName(); 130089cc9d6e2aaf794fbd2c228a3755c19062ca0ba0Douglas Gregor return QualType(); 130189cc9d6e2aaf794fbd2c228a3755c19062ca0ba0Douglas Gregor} 130289cc9d6e2aaf794fbd2c228a3755c19062ca0ba0Douglas Gregor 1303f4c7371fb1d3cebcfb40abad4537bb82515704eaJohn McCallQualType ASTNodeImporter::VisitBuiltinType(const BuiltinType *T) { 13041b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor switch (T->getKind()) { 13051b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor case BuiltinType::Void: return Importer.getToContext().VoidTy; 13061b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor case BuiltinType::Bool: return Importer.getToContext().BoolTy; 13071b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor 13081b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor case BuiltinType::Char_U: 13091b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor // The context we're importing from has an unsigned 'char'. If we're 13101b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor // importing into a context with a signed 'char', translate to 13111b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor // 'unsigned char' instead. 13121b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor if (Importer.getToContext().getLangOptions().CharIsSigned) 13131b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor return Importer.getToContext().UnsignedCharTy; 13141b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor 13151b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor return Importer.getToContext().CharTy; 13161b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor 13171b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor case BuiltinType::UChar: return Importer.getToContext().UnsignedCharTy; 13181b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor 13191b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor case BuiltinType::Char16: 13201b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor // FIXME: Make sure that the "to" context supports C++! 13211b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor return Importer.getToContext().Char16Ty; 13221b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor 13231b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor case BuiltinType::Char32: 13241b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor // FIXME: Make sure that the "to" context supports C++! 13251b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor return Importer.getToContext().Char32Ty; 13261b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor 13271b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor case BuiltinType::UShort: return Importer.getToContext().UnsignedShortTy; 13281b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor case BuiltinType::UInt: return Importer.getToContext().UnsignedIntTy; 13291b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor case BuiltinType::ULong: return Importer.getToContext().UnsignedLongTy; 13301b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor case BuiltinType::ULongLong: 13311b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor return Importer.getToContext().UnsignedLongLongTy; 13321b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor case BuiltinType::UInt128: return Importer.getToContext().UnsignedInt128Ty; 13331b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor 13341b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor case BuiltinType::Char_S: 13351b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor // The context we're importing from has an unsigned 'char'. If we're 13361b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor // importing into a context with a signed 'char', translate to 13371b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor // 'unsigned char' instead. 13381b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor if (!Importer.getToContext().getLangOptions().CharIsSigned) 13391b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor return Importer.getToContext().SignedCharTy; 13401b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor 13411b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor return Importer.getToContext().CharTy; 13421b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor 13431b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor case BuiltinType::SChar: return Importer.getToContext().SignedCharTy; 13443f59c975aa5d047f7edd1b900b5e885c38af0ef7Chris Lattner case BuiltinType::WChar_S: 13453f59c975aa5d047f7edd1b900b5e885c38af0ef7Chris Lattner case BuiltinType::WChar_U: 13461b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor // FIXME: If not in C++, shall we translate to the C equivalent of 13471b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor // wchar_t? 13481b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor return Importer.getToContext().WCharTy; 13491b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor 13501b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor case BuiltinType::Short : return Importer.getToContext().ShortTy; 13511b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor case BuiltinType::Int : return Importer.getToContext().IntTy; 13521b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor case BuiltinType::Long : return Importer.getToContext().LongTy; 13531b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor case BuiltinType::LongLong : return Importer.getToContext().LongLongTy; 13541b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor case BuiltinType::Int128 : return Importer.getToContext().Int128Ty; 13551b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor case BuiltinType::Float: return Importer.getToContext().FloatTy; 13561b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor case BuiltinType::Double: return Importer.getToContext().DoubleTy; 13571b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor case BuiltinType::LongDouble: return Importer.getToContext().LongDoubleTy; 13581b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor 13591b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor case BuiltinType::NullPtr: 13601b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor // FIXME: Make sure that the "to" context supports C++0x! 13611b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor return Importer.getToContext().NullPtrTy; 13621b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor 13631b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor case BuiltinType::Overload: return Importer.getToContext().OverloadTy; 13641b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor case BuiltinType::Dependent: return Importer.getToContext().DependentTy; 13651de4d4e8cb2e9c88809fea8092bc6e835a5473d2John McCall case BuiltinType::UnknownAny: return Importer.getToContext().UnknownAnyTy; 1366864c041e118155c2b1ce0ba36942a3da5a4a055eJohn McCall case BuiltinType::BoundMember: return Importer.getToContext().BoundMemberTy; 13671b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor 13681b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor case BuiltinType::ObjCId: 13691b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor // FIXME: Make sure that the "to" context supports Objective-C! 13701b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor return Importer.getToContext().ObjCBuiltinIdTy; 13711b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor 13721b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor case BuiltinType::ObjCClass: 13731b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor return Importer.getToContext().ObjCBuiltinClassTy; 13741b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor 13751b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor case BuiltinType::ObjCSel: 13761b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor return Importer.getToContext().ObjCBuiltinSelTy; 13771b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor } 13781b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor 13791b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor return QualType(); 13801b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor} 13811b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor 1382f4c7371fb1d3cebcfb40abad4537bb82515704eaJohn McCallQualType ASTNodeImporter::VisitComplexType(const ComplexType *T) { 13831b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor QualType ToElementType = Importer.Import(T->getElementType()); 13841b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor if (ToElementType.isNull()) 13851b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor return QualType(); 13861b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor 13871b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor return Importer.getToContext().getComplexType(ToElementType); 13881b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor} 13891b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor 1390f4c7371fb1d3cebcfb40abad4537bb82515704eaJohn McCallQualType ASTNodeImporter::VisitPointerType(const PointerType *T) { 13911b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor QualType ToPointeeType = Importer.Import(T->getPointeeType()); 13921b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor if (ToPointeeType.isNull()) 13931b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor return QualType(); 13941b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor 13951b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor return Importer.getToContext().getPointerType(ToPointeeType); 13961b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor} 13971b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor 1398f4c7371fb1d3cebcfb40abad4537bb82515704eaJohn McCallQualType ASTNodeImporter::VisitBlockPointerType(const BlockPointerType *T) { 13991b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor // FIXME: Check for blocks support in "to" context. 14001b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor QualType ToPointeeType = Importer.Import(T->getPointeeType()); 14011b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor if (ToPointeeType.isNull()) 14021b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor return QualType(); 14031b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor 14041b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor return Importer.getToContext().getBlockPointerType(ToPointeeType); 14051b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor} 14061b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor 1407f4c7371fb1d3cebcfb40abad4537bb82515704eaJohn McCallQualType 1408f4c7371fb1d3cebcfb40abad4537bb82515704eaJohn McCallASTNodeImporter::VisitLValueReferenceType(const LValueReferenceType *T) { 14091b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor // FIXME: Check for C++ support in "to" context. 14101b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor QualType ToPointeeType = Importer.Import(T->getPointeeTypeAsWritten()); 14111b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor if (ToPointeeType.isNull()) 14121b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor return QualType(); 14131b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor 14141b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor return Importer.getToContext().getLValueReferenceType(ToPointeeType); 14151b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor} 14161b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor 1417f4c7371fb1d3cebcfb40abad4537bb82515704eaJohn McCallQualType 1418f4c7371fb1d3cebcfb40abad4537bb82515704eaJohn McCallASTNodeImporter::VisitRValueReferenceType(const RValueReferenceType *T) { 14191b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor // FIXME: Check for C++0x support in "to" context. 14201b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor QualType ToPointeeType = Importer.Import(T->getPointeeTypeAsWritten()); 14211b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor if (ToPointeeType.isNull()) 14221b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor return QualType(); 14231b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor 14241b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor return Importer.getToContext().getRValueReferenceType(ToPointeeType); 14251b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor} 14261b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor 1427f4c7371fb1d3cebcfb40abad4537bb82515704eaJohn McCallQualType ASTNodeImporter::VisitMemberPointerType(const MemberPointerType *T) { 14281b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor // FIXME: Check for C++ support in "to" context. 14291b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor QualType ToPointeeType = Importer.Import(T->getPointeeType()); 14301b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor if (ToPointeeType.isNull()) 14311b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor return QualType(); 14321b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor 14331b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor QualType ClassType = Importer.Import(QualType(T->getClass(), 0)); 14341b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor return Importer.getToContext().getMemberPointerType(ToPointeeType, 14351b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor ClassType.getTypePtr()); 14361b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor} 14371b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor 1438f4c7371fb1d3cebcfb40abad4537bb82515704eaJohn McCallQualType ASTNodeImporter::VisitConstantArrayType(const ConstantArrayType *T) { 14391b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor QualType ToElementType = Importer.Import(T->getElementType()); 14401b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor if (ToElementType.isNull()) 14411b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor return QualType(); 14421b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor 14431b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor return Importer.getToContext().getConstantArrayType(ToElementType, 14441b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor T->getSize(), 14451b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor T->getSizeModifier(), 14461b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor T->getIndexTypeCVRQualifiers()); 14471b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor} 14481b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor 1449f4c7371fb1d3cebcfb40abad4537bb82515704eaJohn McCallQualType 1450f4c7371fb1d3cebcfb40abad4537bb82515704eaJohn McCallASTNodeImporter::VisitIncompleteArrayType(const IncompleteArrayType *T) { 14511b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor QualType ToElementType = Importer.Import(T->getElementType()); 14521b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor if (ToElementType.isNull()) 14531b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor return QualType(); 14541b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor 14551b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor return Importer.getToContext().getIncompleteArrayType(ToElementType, 14561b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor T->getSizeModifier(), 14571b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor T->getIndexTypeCVRQualifiers()); 14581b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor} 14591b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor 1460f4c7371fb1d3cebcfb40abad4537bb82515704eaJohn McCallQualType ASTNodeImporter::VisitVariableArrayType(const VariableArrayType *T) { 14611b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor QualType ToElementType = Importer.Import(T->getElementType()); 14621b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor if (ToElementType.isNull()) 14631b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor return QualType(); 14641b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor 14651b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor Expr *Size = Importer.Import(T->getSizeExpr()); 14661b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor if (!Size) 14671b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor return QualType(); 14681b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor 14691b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor SourceRange Brackets = Importer.Import(T->getBracketsRange()); 14701b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor return Importer.getToContext().getVariableArrayType(ToElementType, Size, 14711b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor T->getSizeModifier(), 14721b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor T->getIndexTypeCVRQualifiers(), 14731b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor Brackets); 14741b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor} 14751b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor 1476f4c7371fb1d3cebcfb40abad4537bb82515704eaJohn McCallQualType ASTNodeImporter::VisitVectorType(const VectorType *T) { 14771b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor QualType ToElementType = Importer.Import(T->getElementType()); 14781b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor if (ToElementType.isNull()) 14791b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor return QualType(); 14801b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor 14811b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor return Importer.getToContext().getVectorType(ToElementType, 14821b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor T->getNumElements(), 1483e86d78cf4754a6aef2cf9a33d847aa15338e276fBob Wilson T->getVectorKind()); 14841b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor} 14851b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor 1486f4c7371fb1d3cebcfb40abad4537bb82515704eaJohn McCallQualType ASTNodeImporter::VisitExtVectorType(const ExtVectorType *T) { 14871b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor QualType ToElementType = Importer.Import(T->getElementType()); 14881b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor if (ToElementType.isNull()) 14891b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor return QualType(); 14901b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor 14911b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor return Importer.getToContext().getExtVectorType(ToElementType, 14921b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor T->getNumElements()); 14931b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor} 14941b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor 1495f4c7371fb1d3cebcfb40abad4537bb82515704eaJohn McCallQualType 1496f4c7371fb1d3cebcfb40abad4537bb82515704eaJohn McCallASTNodeImporter::VisitFunctionNoProtoType(const FunctionNoProtoType *T) { 14971b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor // FIXME: What happens if we're importing a function without a prototype 14981b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor // into C++? Should we make it variadic? 14991b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor QualType ToResultType = Importer.Import(T->getResultType()); 15001b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor if (ToResultType.isNull()) 15011b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor return QualType(); 1502264ba48dc98f3f843935a485d5b086f7e0fdc4f1Rafael Espindola 15031b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor return Importer.getToContext().getFunctionNoProtoType(ToResultType, 1504264ba48dc98f3f843935a485d5b086f7e0fdc4f1Rafael Espindola T->getExtInfo()); 15051b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor} 15061b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor 1507f4c7371fb1d3cebcfb40abad4537bb82515704eaJohn McCallQualType ASTNodeImporter::VisitFunctionProtoType(const FunctionProtoType *T) { 15081b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor QualType ToResultType = Importer.Import(T->getResultType()); 15091b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor if (ToResultType.isNull()) 15101b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor return QualType(); 15111b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor 15121b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor // Import argument types 15131b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor llvm::SmallVector<QualType, 4> ArgTypes; 15141b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor for (FunctionProtoType::arg_type_iterator A = T->arg_type_begin(), 15151b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor AEnd = T->arg_type_end(); 15161b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor A != AEnd; ++A) { 15171b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor QualType ArgType = Importer.Import(*A); 15181b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor if (ArgType.isNull()) 15191b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor return QualType(); 15201b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor ArgTypes.push_back(ArgType); 15211b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor } 15221b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor 15231b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor // Import exception types 15241b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor llvm::SmallVector<QualType, 4> ExceptionTypes; 15251b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor for (FunctionProtoType::exception_iterator E = T->exception_begin(), 15261b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor EEnd = T->exception_end(); 15271b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor E != EEnd; ++E) { 15281b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor QualType ExceptionType = Importer.Import(*E); 15291b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor if (ExceptionType.isNull()) 15301b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor return QualType(); 15311b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor ExceptionTypes.push_back(ExceptionType); 15321b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor } 1533e23cf437fe76b1ed02d63c3f61b456fd48a915f5John McCall 1534e23cf437fe76b1ed02d63c3f61b456fd48a915f5John McCall FunctionProtoType::ExtProtoInfo EPI = T->getExtProtoInfo(); 1535e23cf437fe76b1ed02d63c3f61b456fd48a915f5John McCall EPI.Exceptions = ExceptionTypes.data(); 15361b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor 15371b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor return Importer.getToContext().getFunctionType(ToResultType, ArgTypes.data(), 1538e23cf437fe76b1ed02d63c3f61b456fd48a915f5John McCall ArgTypes.size(), EPI); 15391b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor} 15401b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor 1541f4c7371fb1d3cebcfb40abad4537bb82515704eaJohn McCallQualType ASTNodeImporter::VisitTypedefType(const TypedefType *T) { 1542162e1c1b487352434552147967c3dd296ebee2f7Richard Smith TypedefNameDecl *ToDecl 1543162e1c1b487352434552147967c3dd296ebee2f7Richard Smith = dyn_cast_or_null<TypedefNameDecl>(Importer.Import(T->getDecl())); 15441b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor if (!ToDecl) 15451b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor return QualType(); 15461b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor 15471b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor return Importer.getToContext().getTypeDeclType(ToDecl); 15481b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor} 15491b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor 1550f4c7371fb1d3cebcfb40abad4537bb82515704eaJohn McCallQualType ASTNodeImporter::VisitTypeOfExprType(const TypeOfExprType *T) { 15511b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor Expr *ToExpr = Importer.Import(T->getUnderlyingExpr()); 15521b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor if (!ToExpr) 15531b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor return QualType(); 15541b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor 15551b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor return Importer.getToContext().getTypeOfExprType(ToExpr); 15561b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor} 15571b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor 1558f4c7371fb1d3cebcfb40abad4537bb82515704eaJohn McCallQualType ASTNodeImporter::VisitTypeOfType(const TypeOfType *T) { 15591b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor QualType ToUnderlyingType = Importer.Import(T->getUnderlyingType()); 15601b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor if (ToUnderlyingType.isNull()) 15611b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor return QualType(); 15621b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor 15631b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor return Importer.getToContext().getTypeOfType(ToUnderlyingType); 15641b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor} 15651b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor 1566f4c7371fb1d3cebcfb40abad4537bb82515704eaJohn McCallQualType ASTNodeImporter::VisitDecltypeType(const DecltypeType *T) { 156734b41d939a1328f484511c6002ba2456db879a29Richard Smith // FIXME: Make sure that the "to" context supports C++0x! 15681b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor Expr *ToExpr = Importer.Import(T->getUnderlyingExpr()); 15691b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor if (!ToExpr) 15701b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor return QualType(); 15711b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor 15721b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor return Importer.getToContext().getDecltypeType(ToExpr); 15731b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor} 15741b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor 157534b41d939a1328f484511c6002ba2456db879a29Richard SmithQualType ASTNodeImporter::VisitAutoType(const AutoType *T) { 157634b41d939a1328f484511c6002ba2456db879a29Richard Smith // FIXME: Make sure that the "to" context supports C++0x! 157734b41d939a1328f484511c6002ba2456db879a29Richard Smith QualType FromDeduced = T->getDeducedType(); 157834b41d939a1328f484511c6002ba2456db879a29Richard Smith QualType ToDeduced; 157934b41d939a1328f484511c6002ba2456db879a29Richard Smith if (!FromDeduced.isNull()) { 158034b41d939a1328f484511c6002ba2456db879a29Richard Smith ToDeduced = Importer.Import(FromDeduced); 158134b41d939a1328f484511c6002ba2456db879a29Richard Smith if (ToDeduced.isNull()) 158234b41d939a1328f484511c6002ba2456db879a29Richard Smith return QualType(); 158334b41d939a1328f484511c6002ba2456db879a29Richard Smith } 158434b41d939a1328f484511c6002ba2456db879a29Richard Smith 158534b41d939a1328f484511c6002ba2456db879a29Richard Smith return Importer.getToContext().getAutoType(ToDeduced); 158634b41d939a1328f484511c6002ba2456db879a29Richard Smith} 158734b41d939a1328f484511c6002ba2456db879a29Richard Smith 1588f4c7371fb1d3cebcfb40abad4537bb82515704eaJohn McCallQualType ASTNodeImporter::VisitRecordType(const RecordType *T) { 15891b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor RecordDecl *ToDecl 15901b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor = dyn_cast_or_null<RecordDecl>(Importer.Import(T->getDecl())); 15911b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor if (!ToDecl) 15921b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor return QualType(); 15931b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor 15941b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor return Importer.getToContext().getTagDeclType(ToDecl); 15951b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor} 15961b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor 1597f4c7371fb1d3cebcfb40abad4537bb82515704eaJohn McCallQualType ASTNodeImporter::VisitEnumType(const EnumType *T) { 15981b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor EnumDecl *ToDecl 15991b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor = dyn_cast_or_null<EnumDecl>(Importer.Import(T->getDecl())); 16001b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor if (!ToDecl) 16011b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor return QualType(); 16021b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor 16031b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor return Importer.getToContext().getTagDeclType(ToDecl); 16041b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor} 16051b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor 1606d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas GregorQualType ASTNodeImporter::VisitTemplateSpecializationType( 1607f4c7371fb1d3cebcfb40abad4537bb82515704eaJohn McCall const TemplateSpecializationType *T) { 1608d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor TemplateName ToTemplate = Importer.Import(T->getTemplateName()); 1609d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor if (ToTemplate.isNull()) 1610d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor return QualType(); 1611d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor 1612d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor llvm::SmallVector<TemplateArgument, 2> ToTemplateArgs; 1613d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor if (ImportTemplateArguments(T->getArgs(), T->getNumArgs(), ToTemplateArgs)) 1614d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor return QualType(); 1615d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor 1616d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor QualType ToCanonType; 1617d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor if (!QualType(T, 0).isCanonical()) { 1618d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor QualType FromCanonType 1619d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor = Importer.getFromContext().getCanonicalType(QualType(T, 0)); 1620d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor ToCanonType =Importer.Import(FromCanonType); 1621d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor if (ToCanonType.isNull()) 1622d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor return QualType(); 1623d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor } 1624d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor return Importer.getToContext().getTemplateSpecializationType(ToTemplate, 1625d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor ToTemplateArgs.data(), 1626d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor ToTemplateArgs.size(), 1627d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor ToCanonType); 1628d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor} 1629d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor 1630f4c7371fb1d3cebcfb40abad4537bb82515704eaJohn McCallQualType ASTNodeImporter::VisitElaboratedType(const ElaboratedType *T) { 1631465d41b92b2c862f3062c412a0538db65c6a2661Abramo Bagnara NestedNameSpecifier *ToQualifier = 0; 1632465d41b92b2c862f3062c412a0538db65c6a2661Abramo Bagnara // Note: the qualifier in an ElaboratedType is optional. 1633465d41b92b2c862f3062c412a0538db65c6a2661Abramo Bagnara if (T->getQualifier()) { 1634465d41b92b2c862f3062c412a0538db65c6a2661Abramo Bagnara ToQualifier = Importer.Import(T->getQualifier()); 1635465d41b92b2c862f3062c412a0538db65c6a2661Abramo Bagnara if (!ToQualifier) 1636465d41b92b2c862f3062c412a0538db65c6a2661Abramo Bagnara return QualType(); 1637465d41b92b2c862f3062c412a0538db65c6a2661Abramo Bagnara } 16381b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor 16391b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor QualType ToNamedType = Importer.Import(T->getNamedType()); 16401b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor if (ToNamedType.isNull()) 16411b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor return QualType(); 16421b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor 1643465d41b92b2c862f3062c412a0538db65c6a2661Abramo Bagnara return Importer.getToContext().getElaboratedType(T->getKeyword(), 1644465d41b92b2c862f3062c412a0538db65c6a2661Abramo Bagnara ToQualifier, ToNamedType); 16451b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor} 16461b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor 1647f4c7371fb1d3cebcfb40abad4537bb82515704eaJohn McCallQualType ASTNodeImporter::VisitObjCInterfaceType(const ObjCInterfaceType *T) { 16481b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor ObjCInterfaceDecl *Class 16491b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor = dyn_cast_or_null<ObjCInterfaceDecl>(Importer.Import(T->getDecl())); 16501b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor if (!Class) 16511b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor return QualType(); 16521b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor 1653c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall return Importer.getToContext().getObjCInterfaceType(Class); 1654c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall} 1655c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall 1656f4c7371fb1d3cebcfb40abad4537bb82515704eaJohn McCallQualType ASTNodeImporter::VisitObjCObjectType(const ObjCObjectType *T) { 1657c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall QualType ToBaseType = Importer.Import(T->getBaseType()); 1658c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall if (ToBaseType.isNull()) 1659c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall return QualType(); 1660c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall 16611b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor llvm::SmallVector<ObjCProtocolDecl *, 4> Protocols; 1662c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall for (ObjCObjectType::qual_iterator P = T->qual_begin(), 16631b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor PEnd = T->qual_end(); 16641b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor P != PEnd; ++P) { 16651b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor ObjCProtocolDecl *Protocol 16661b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor = dyn_cast_or_null<ObjCProtocolDecl>(Importer.Import(*P)); 16671b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor if (!Protocol) 16681b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor return QualType(); 16691b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor Protocols.push_back(Protocol); 16701b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor } 16711b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor 1672c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall return Importer.getToContext().getObjCObjectType(ToBaseType, 1673c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall Protocols.data(), 1674c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall Protocols.size()); 16751b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor} 16761b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor 1677f4c7371fb1d3cebcfb40abad4537bb82515704eaJohn McCallQualType 1678f4c7371fb1d3cebcfb40abad4537bb82515704eaJohn McCallASTNodeImporter::VisitObjCObjectPointerType(const ObjCObjectPointerType *T) { 16791b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor QualType ToPointeeType = Importer.Import(T->getPointeeType()); 16801b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor if (ToPointeeType.isNull()) 16811b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor return QualType(); 16821b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor 1683c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall return Importer.getToContext().getObjCObjectPointerType(ToPointeeType); 16841b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor} 16851b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor 1686089459a16bf7e9cd10617d1fac5ec0240a0a1ee6Douglas Gregor//---------------------------------------------------------------------------- 1687089459a16bf7e9cd10617d1fac5ec0240a0a1ee6Douglas Gregor// Import Declarations 1688089459a16bf7e9cd10617d1fac5ec0240a0a1ee6Douglas Gregor//---------------------------------------------------------------------------- 1689a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregorbool ASTNodeImporter::ImportDeclParts(NamedDecl *D, DeclContext *&DC, 1690a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor DeclContext *&LexicalDC, 1691a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor DeclarationName &Name, 1692a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor SourceLocation &Loc) { 1693089459a16bf7e9cd10617d1fac5ec0240a0a1ee6Douglas Gregor // Import the context of this declaration. 1694a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor DC = Importer.ImportContext(D->getDeclContext()); 1695089459a16bf7e9cd10617d1fac5ec0240a0a1ee6Douglas Gregor if (!DC) 1696a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor return true; 1697a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor 1698a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor LexicalDC = DC; 16999bed8798964d9f07599c2c9199701f86fbc70e20Douglas Gregor if (D->getDeclContext() != D->getLexicalDeclContext()) { 17009bed8798964d9f07599c2c9199701f86fbc70e20Douglas Gregor LexicalDC = Importer.ImportContext(D->getLexicalDeclContext()); 17019bed8798964d9f07599c2c9199701f86fbc70e20Douglas Gregor if (!LexicalDC) 1702a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor return true; 17039bed8798964d9f07599c2c9199701f86fbc70e20Douglas Gregor } 1704a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor 1705089459a16bf7e9cd10617d1fac5ec0240a0a1ee6Douglas Gregor // Import the name of this declaration. 1706a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor Name = Importer.Import(D->getDeclName()); 1707089459a16bf7e9cd10617d1fac5ec0240a0a1ee6Douglas Gregor if (D->getDeclName() && !Name) 1708a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor return true; 1709a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor 1710a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor // Import the location of this declaration. 1711a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor Loc = Importer.Import(D->getLocation()); 1712a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor return false; 1713a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor} 1714a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor 17152577743c5650c646fb705df01403707e94f2df04Abramo Bagnaravoid 17162577743c5650c646fb705df01403707e94f2df04Abramo BagnaraASTNodeImporter::ImportDeclarationNameLoc(const DeclarationNameInfo &From, 17172577743c5650c646fb705df01403707e94f2df04Abramo Bagnara DeclarationNameInfo& To) { 17182577743c5650c646fb705df01403707e94f2df04Abramo Bagnara // NOTE: To.Name and To.Loc are already imported. 17192577743c5650c646fb705df01403707e94f2df04Abramo Bagnara // We only have to import To.LocInfo. 17202577743c5650c646fb705df01403707e94f2df04Abramo Bagnara switch (To.getName().getNameKind()) { 17212577743c5650c646fb705df01403707e94f2df04Abramo Bagnara case DeclarationName::Identifier: 17222577743c5650c646fb705df01403707e94f2df04Abramo Bagnara case DeclarationName::ObjCZeroArgSelector: 17232577743c5650c646fb705df01403707e94f2df04Abramo Bagnara case DeclarationName::ObjCOneArgSelector: 17242577743c5650c646fb705df01403707e94f2df04Abramo Bagnara case DeclarationName::ObjCMultiArgSelector: 17252577743c5650c646fb705df01403707e94f2df04Abramo Bagnara case DeclarationName::CXXUsingDirective: 17262577743c5650c646fb705df01403707e94f2df04Abramo Bagnara return; 17272577743c5650c646fb705df01403707e94f2df04Abramo Bagnara 17282577743c5650c646fb705df01403707e94f2df04Abramo Bagnara case DeclarationName::CXXOperatorName: { 17292577743c5650c646fb705df01403707e94f2df04Abramo Bagnara SourceRange Range = From.getCXXOperatorNameRange(); 17302577743c5650c646fb705df01403707e94f2df04Abramo Bagnara To.setCXXOperatorNameRange(Importer.Import(Range)); 17312577743c5650c646fb705df01403707e94f2df04Abramo Bagnara return; 17322577743c5650c646fb705df01403707e94f2df04Abramo Bagnara } 17332577743c5650c646fb705df01403707e94f2df04Abramo Bagnara case DeclarationName::CXXLiteralOperatorName: { 17342577743c5650c646fb705df01403707e94f2df04Abramo Bagnara SourceLocation Loc = From.getCXXLiteralOperatorNameLoc(); 17352577743c5650c646fb705df01403707e94f2df04Abramo Bagnara To.setCXXLiteralOperatorNameLoc(Importer.Import(Loc)); 17362577743c5650c646fb705df01403707e94f2df04Abramo Bagnara return; 17372577743c5650c646fb705df01403707e94f2df04Abramo Bagnara } 17382577743c5650c646fb705df01403707e94f2df04Abramo Bagnara case DeclarationName::CXXConstructorName: 17392577743c5650c646fb705df01403707e94f2df04Abramo Bagnara case DeclarationName::CXXDestructorName: 17402577743c5650c646fb705df01403707e94f2df04Abramo Bagnara case DeclarationName::CXXConversionFunctionName: { 17412577743c5650c646fb705df01403707e94f2df04Abramo Bagnara TypeSourceInfo *FromTInfo = From.getNamedTypeInfo(); 17422577743c5650c646fb705df01403707e94f2df04Abramo Bagnara To.setNamedTypeInfo(Importer.Import(FromTInfo)); 17432577743c5650c646fb705df01403707e94f2df04Abramo Bagnara return; 17442577743c5650c646fb705df01403707e94f2df04Abramo Bagnara } 17452577743c5650c646fb705df01403707e94f2df04Abramo Bagnara assert(0 && "Unknown name kind."); 17462577743c5650c646fb705df01403707e94f2df04Abramo Bagnara } 17472577743c5650c646fb705df01403707e94f2df04Abramo Bagnara} 17482577743c5650c646fb705df01403707e94f2df04Abramo Bagnara 1749d8868a634d4fd362243dc646e58c3cf956c81dcdDouglas Gregorvoid ASTNodeImporter::ImportDeclContext(DeclContext *FromDC, bool ForceImport) { 1750d8868a634d4fd362243dc646e58c3cf956c81dcdDouglas Gregor if (Importer.isMinimalImport() && !ForceImport) { 1751d8868a634d4fd362243dc646e58c3cf956c81dcdDouglas Gregor if (DeclContext *ToDC = Importer.ImportContext(FromDC)) { 1752d8868a634d4fd362243dc646e58c3cf956c81dcdDouglas Gregor ToDC->setHasExternalLexicalStorage(); 1753d8868a634d4fd362243dc646e58c3cf956c81dcdDouglas Gregor ToDC->setHasExternalVisibleStorage(); 1754d8868a634d4fd362243dc646e58c3cf956c81dcdDouglas Gregor } 1755d8868a634d4fd362243dc646e58c3cf956c81dcdDouglas Gregor return; 1756d8868a634d4fd362243dc646e58c3cf956c81dcdDouglas Gregor } 1757d8868a634d4fd362243dc646e58c3cf956c81dcdDouglas Gregor 1758083a821bbd02bbc521275a2f144abe39a6c2745cDouglas Gregor for (DeclContext::decl_iterator From = FromDC->decls_begin(), 1759083a821bbd02bbc521275a2f144abe39a6c2745cDouglas Gregor FromEnd = FromDC->decls_end(); 1760083a821bbd02bbc521275a2f144abe39a6c2745cDouglas Gregor From != FromEnd; 1761083a821bbd02bbc521275a2f144abe39a6c2745cDouglas Gregor ++From) 1762083a821bbd02bbc521275a2f144abe39a6c2745cDouglas Gregor Importer.Import(*From); 1763083a821bbd02bbc521275a2f144abe39a6c2745cDouglas Gregor} 1764083a821bbd02bbc521275a2f144abe39a6c2745cDouglas Gregor 1765d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregorbool ASTNodeImporter::ImportDefinition(RecordDecl *From, RecordDecl *To) { 1766d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor if (To->getDefinition()) 1767d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor return false; 1768d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor 1769d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor To->startDefinition(); 1770d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor 1771d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor // Add base classes. 1772d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor if (CXXRecordDecl *ToCXX = dyn_cast<CXXRecordDecl>(To)) { 1773d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor CXXRecordDecl *FromCXX = cast<CXXRecordDecl>(From); 1774d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor 1775d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor llvm::SmallVector<CXXBaseSpecifier *, 4> Bases; 1776d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor for (CXXRecordDecl::base_class_iterator 1777d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor Base1 = FromCXX->bases_begin(), 1778d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor FromBaseEnd = FromCXX->bases_end(); 1779d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor Base1 != FromBaseEnd; 1780d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor ++Base1) { 1781d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor QualType T = Importer.Import(Base1->getType()); 1782d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor if (T.isNull()) 1783c04d9d1be026cb201a716df1cd28a88878958beeDouglas Gregor return true; 1784f90b27ad077c3339b62befc892382845339f9490Douglas Gregor 1785f90b27ad077c3339b62befc892382845339f9490Douglas Gregor SourceLocation EllipsisLoc; 1786f90b27ad077c3339b62befc892382845339f9490Douglas Gregor if (Base1->isPackExpansion()) 1787f90b27ad077c3339b62befc892382845339f9490Douglas Gregor EllipsisLoc = Importer.Import(Base1->getEllipsisLoc()); 1788d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor 1789d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor Bases.push_back( 1790d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor new (Importer.getToContext()) 1791d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor CXXBaseSpecifier(Importer.Import(Base1->getSourceRange()), 1792d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor Base1->isVirtual(), 1793d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor Base1->isBaseOfClass(), 1794d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor Base1->getAccessSpecifierAsWritten(), 1795f90b27ad077c3339b62befc892382845339f9490Douglas Gregor Importer.Import(Base1->getTypeSourceInfo()), 1796f90b27ad077c3339b62befc892382845339f9490Douglas Gregor EllipsisLoc)); 1797d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor } 1798d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor if (!Bases.empty()) 1799d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor ToCXX->setBases(Bases.data(), Bases.size()); 1800d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor } 1801d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor 1802d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor ImportDeclContext(From); 1803d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor To->completeDefinition(); 1804c04d9d1be026cb201a716df1cd28a88878958beeDouglas Gregor return false; 1805d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor} 1806d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor 1807040afaeea2313dc69fd532995ac88cccdd62da56Douglas GregorTemplateParameterList *ASTNodeImporter::ImportTemplateParameterList( 1808040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor TemplateParameterList *Params) { 1809040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor llvm::SmallVector<NamedDecl *, 4> ToParams; 1810040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor ToParams.reserve(Params->size()); 1811040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor for (TemplateParameterList::iterator P = Params->begin(), 1812040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor PEnd = Params->end(); 1813040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor P != PEnd; ++P) { 1814040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor Decl *To = Importer.Import(*P); 1815040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor if (!To) 1816040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor return 0; 1817040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor 1818040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor ToParams.push_back(cast<NamedDecl>(To)); 1819040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor } 1820040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor 1821040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor return TemplateParameterList::Create(Importer.getToContext(), 1822040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor Importer.Import(Params->getTemplateLoc()), 1823040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor Importer.Import(Params->getLAngleLoc()), 1824040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor ToParams.data(), ToParams.size(), 1825040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor Importer.Import(Params->getRAngleLoc())); 1826040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor} 1827040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor 1828d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas GregorTemplateArgument 1829d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas GregorASTNodeImporter::ImportTemplateArgument(const TemplateArgument &From) { 1830d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor switch (From.getKind()) { 1831d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor case TemplateArgument::Null: 1832d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor return TemplateArgument(); 1833d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor 1834d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor case TemplateArgument::Type: { 1835d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor QualType ToType = Importer.Import(From.getAsType()); 1836d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor if (ToType.isNull()) 1837d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor return TemplateArgument(); 1838d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor return TemplateArgument(ToType); 1839d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor } 1840d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor 1841d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor case TemplateArgument::Integral: { 1842d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor QualType ToType = Importer.Import(From.getIntegralType()); 1843d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor if (ToType.isNull()) 1844d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor return TemplateArgument(); 1845d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor return TemplateArgument(*From.getAsIntegral(), ToType); 1846d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor } 1847d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor 1848d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor case TemplateArgument::Declaration: 1849d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor if (Decl *To = Importer.Import(From.getAsDecl())) 1850d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor return TemplateArgument(To); 1851d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor return TemplateArgument(); 1852d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor 1853d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor case TemplateArgument::Template: { 1854d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor TemplateName ToTemplate = Importer.Import(From.getAsTemplate()); 1855d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor if (ToTemplate.isNull()) 1856d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor return TemplateArgument(); 1857d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor 1858d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor return TemplateArgument(ToTemplate); 1859d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor } 1860a7fc901a2e39bfe55bfcff5934b2d9fdf9656491Douglas Gregor 1861a7fc901a2e39bfe55bfcff5934b2d9fdf9656491Douglas Gregor case TemplateArgument::TemplateExpansion: { 1862a7fc901a2e39bfe55bfcff5934b2d9fdf9656491Douglas Gregor TemplateName ToTemplate 1863a7fc901a2e39bfe55bfcff5934b2d9fdf9656491Douglas Gregor = Importer.Import(From.getAsTemplateOrTemplatePattern()); 1864a7fc901a2e39bfe55bfcff5934b2d9fdf9656491Douglas Gregor if (ToTemplate.isNull()) 1865a7fc901a2e39bfe55bfcff5934b2d9fdf9656491Douglas Gregor return TemplateArgument(); 1866a7fc901a2e39bfe55bfcff5934b2d9fdf9656491Douglas Gregor 18672be29f423acad3bbe39099a78db2805acb5bdf17Douglas Gregor return TemplateArgument(ToTemplate, From.getNumTemplateExpansions()); 1868a7fc901a2e39bfe55bfcff5934b2d9fdf9656491Douglas Gregor } 1869a7fc901a2e39bfe55bfcff5934b2d9fdf9656491Douglas Gregor 1870d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor case TemplateArgument::Expression: 1871d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor if (Expr *ToExpr = Importer.Import(From.getAsExpr())) 1872d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor return TemplateArgument(ToExpr); 1873d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor return TemplateArgument(); 1874d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor 1875d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor case TemplateArgument::Pack: { 1876d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor llvm::SmallVector<TemplateArgument, 2> ToPack; 1877d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor ToPack.reserve(From.pack_size()); 1878d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor if (ImportTemplateArguments(From.pack_begin(), From.pack_size(), ToPack)) 1879d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor return TemplateArgument(); 1880d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor 1881d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor TemplateArgument *ToArgs 1882d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor = new (Importer.getToContext()) TemplateArgument[ToPack.size()]; 1883d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor std::copy(ToPack.begin(), ToPack.end(), ToArgs); 1884d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor return TemplateArgument(ToArgs, ToPack.size()); 1885d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor } 1886d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor } 1887d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor 1888d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor llvm_unreachable("Invalid template argument kind"); 1889d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor return TemplateArgument(); 1890d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor} 1891d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor 1892d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregorbool ASTNodeImporter::ImportTemplateArguments(const TemplateArgument *FromArgs, 1893d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor unsigned NumFromArgs, 1894d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor llvm::SmallVectorImpl<TemplateArgument> &ToArgs) { 1895d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor for (unsigned I = 0; I != NumFromArgs; ++I) { 1896d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor TemplateArgument To = ImportTemplateArgument(FromArgs[I]); 1897d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor if (To.isNull() && !FromArgs[I].isNull()) 1898d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor return true; 1899d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor 1900d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor ToArgs.push_back(To); 1901d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor } 1902d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor 1903d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor return false; 1904d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor} 1905d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor 190696a01b4acf76fb8fe1e05341a97a27b39fb0b914Douglas Gregorbool ASTNodeImporter::IsStructuralMatch(RecordDecl *FromRecord, 190773dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor RecordDecl *ToRecord) { 1908bb2d176c4f434e9e73f63f2f9d128f63ce3e10d0Benjamin Kramer StructuralEquivalenceContext Ctx(Importer.getFromContext(), 190973dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor Importer.getToContext(), 1910ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor Importer.getNonEquivalentDecls()); 1911bb2d176c4f434e9e73f63f2f9d128f63ce3e10d0Benjamin Kramer return Ctx.IsStructurallyEquivalent(FromRecord, ToRecord); 191296a01b4acf76fb8fe1e05341a97a27b39fb0b914Douglas Gregor} 191396a01b4acf76fb8fe1e05341a97a27b39fb0b914Douglas Gregor 191436ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas Gregorbool ASTNodeImporter::IsStructuralMatch(EnumDecl *FromEnum, EnumDecl *ToEnum) { 1915bb2d176c4f434e9e73f63f2f9d128f63ce3e10d0Benjamin Kramer StructuralEquivalenceContext Ctx(Importer.getFromContext(), 191673dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor Importer.getToContext(), 1917ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor Importer.getNonEquivalentDecls()); 1918bb2d176c4f434e9e73f63f2f9d128f63ce3e10d0Benjamin Kramer return Ctx.IsStructurallyEquivalent(FromEnum, ToEnum); 191936ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas Gregor} 192036ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas Gregor 1921040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregorbool ASTNodeImporter::IsStructuralMatch(ClassTemplateDecl *From, 1922040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor ClassTemplateDecl *To) { 1923040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor StructuralEquivalenceContext Ctx(Importer.getFromContext(), 1924040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor Importer.getToContext(), 1925040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor Importer.getNonEquivalentDecls()); 1926040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor return Ctx.IsStructurallyEquivalent(From, To); 1927040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor} 1928040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor 1929a404ea673cbee5e74af710a5f1ab571e71580b67Douglas GregorDecl *ASTNodeImporter::VisitDecl(Decl *D) { 1930a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor Importer.FromDiag(D->getLocation(), diag::err_unsupported_ast_node) 1931a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor << D->getDeclKindName(); 1932a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor return 0; 1933a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor} 1934a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor 1935788c62d1e87bfb596078817237f672a5f000999aDouglas GregorDecl *ASTNodeImporter::VisitNamespaceDecl(NamespaceDecl *D) { 1936788c62d1e87bfb596078817237f672a5f000999aDouglas Gregor // Import the major distinguishing characteristics of this namespace. 1937788c62d1e87bfb596078817237f672a5f000999aDouglas Gregor DeclContext *DC, *LexicalDC; 1938788c62d1e87bfb596078817237f672a5f000999aDouglas Gregor DeclarationName Name; 1939788c62d1e87bfb596078817237f672a5f000999aDouglas Gregor SourceLocation Loc; 1940788c62d1e87bfb596078817237f672a5f000999aDouglas Gregor if (ImportDeclParts(D, DC, LexicalDC, Name, Loc)) 1941788c62d1e87bfb596078817237f672a5f000999aDouglas Gregor return 0; 1942788c62d1e87bfb596078817237f672a5f000999aDouglas Gregor 1943788c62d1e87bfb596078817237f672a5f000999aDouglas Gregor NamespaceDecl *MergeWithNamespace = 0; 1944788c62d1e87bfb596078817237f672a5f000999aDouglas Gregor if (!Name) { 1945788c62d1e87bfb596078817237f672a5f000999aDouglas Gregor // This is an anonymous namespace. Adopt an existing anonymous 1946788c62d1e87bfb596078817237f672a5f000999aDouglas Gregor // namespace if we can. 1947788c62d1e87bfb596078817237f672a5f000999aDouglas Gregor // FIXME: Not testable. 1948788c62d1e87bfb596078817237f672a5f000999aDouglas Gregor if (TranslationUnitDecl *TU = dyn_cast<TranslationUnitDecl>(DC)) 1949788c62d1e87bfb596078817237f672a5f000999aDouglas Gregor MergeWithNamespace = TU->getAnonymousNamespace(); 1950788c62d1e87bfb596078817237f672a5f000999aDouglas Gregor else 1951788c62d1e87bfb596078817237f672a5f000999aDouglas Gregor MergeWithNamespace = cast<NamespaceDecl>(DC)->getAnonymousNamespace(); 1952788c62d1e87bfb596078817237f672a5f000999aDouglas Gregor } else { 1953788c62d1e87bfb596078817237f672a5f000999aDouglas Gregor llvm::SmallVector<NamedDecl *, 4> ConflictingDecls; 1954788c62d1e87bfb596078817237f672a5f000999aDouglas Gregor for (DeclContext::lookup_result Lookup = DC->lookup(Name); 1955788c62d1e87bfb596078817237f672a5f000999aDouglas Gregor Lookup.first != Lookup.second; 1956788c62d1e87bfb596078817237f672a5f000999aDouglas Gregor ++Lookup.first) { 19570d6b1640eb4d1a4a0203235cfdfcdaf3335af36dJohn McCall if (!(*Lookup.first)->isInIdentifierNamespace(Decl::IDNS_Namespace)) 1958788c62d1e87bfb596078817237f672a5f000999aDouglas Gregor continue; 1959788c62d1e87bfb596078817237f672a5f000999aDouglas Gregor 1960788c62d1e87bfb596078817237f672a5f000999aDouglas Gregor if (NamespaceDecl *FoundNS = dyn_cast<NamespaceDecl>(*Lookup.first)) { 1961788c62d1e87bfb596078817237f672a5f000999aDouglas Gregor MergeWithNamespace = FoundNS; 1962788c62d1e87bfb596078817237f672a5f000999aDouglas Gregor ConflictingDecls.clear(); 1963788c62d1e87bfb596078817237f672a5f000999aDouglas Gregor break; 1964788c62d1e87bfb596078817237f672a5f000999aDouglas Gregor } 1965788c62d1e87bfb596078817237f672a5f000999aDouglas Gregor 1966788c62d1e87bfb596078817237f672a5f000999aDouglas Gregor ConflictingDecls.push_back(*Lookup.first); 1967788c62d1e87bfb596078817237f672a5f000999aDouglas Gregor } 1968788c62d1e87bfb596078817237f672a5f000999aDouglas Gregor 1969788c62d1e87bfb596078817237f672a5f000999aDouglas Gregor if (!ConflictingDecls.empty()) { 19700d6b1640eb4d1a4a0203235cfdfcdaf3335af36dJohn McCall Name = Importer.HandleNameConflict(Name, DC, Decl::IDNS_Namespace, 1971788c62d1e87bfb596078817237f672a5f000999aDouglas Gregor ConflictingDecls.data(), 1972788c62d1e87bfb596078817237f672a5f000999aDouglas Gregor ConflictingDecls.size()); 1973788c62d1e87bfb596078817237f672a5f000999aDouglas Gregor } 1974788c62d1e87bfb596078817237f672a5f000999aDouglas Gregor } 1975788c62d1e87bfb596078817237f672a5f000999aDouglas Gregor 1976788c62d1e87bfb596078817237f672a5f000999aDouglas Gregor // Create the "to" namespace, if needed. 1977788c62d1e87bfb596078817237f672a5f000999aDouglas Gregor NamespaceDecl *ToNamespace = MergeWithNamespace; 1978788c62d1e87bfb596078817237f672a5f000999aDouglas Gregor if (!ToNamespace) { 1979acba90f30876b4140b738f0d3dd0e50724053a96Abramo Bagnara ToNamespace = NamespaceDecl::Create(Importer.getToContext(), DC, 1980acba90f30876b4140b738f0d3dd0e50724053a96Abramo Bagnara Importer.Import(D->getLocStart()), 1981acba90f30876b4140b738f0d3dd0e50724053a96Abramo Bagnara Loc, Name.getAsIdentifierInfo()); 1982788c62d1e87bfb596078817237f672a5f000999aDouglas Gregor ToNamespace->setLexicalDeclContext(LexicalDC); 1983788c62d1e87bfb596078817237f672a5f000999aDouglas Gregor LexicalDC->addDecl(ToNamespace); 1984788c62d1e87bfb596078817237f672a5f000999aDouglas Gregor 1985788c62d1e87bfb596078817237f672a5f000999aDouglas Gregor // If this is an anonymous namespace, register it as the anonymous 1986788c62d1e87bfb596078817237f672a5f000999aDouglas Gregor // namespace within its context. 1987788c62d1e87bfb596078817237f672a5f000999aDouglas Gregor if (!Name) { 1988788c62d1e87bfb596078817237f672a5f000999aDouglas Gregor if (TranslationUnitDecl *TU = dyn_cast<TranslationUnitDecl>(DC)) 1989788c62d1e87bfb596078817237f672a5f000999aDouglas Gregor TU->setAnonymousNamespace(ToNamespace); 1990788c62d1e87bfb596078817237f672a5f000999aDouglas Gregor else 1991788c62d1e87bfb596078817237f672a5f000999aDouglas Gregor cast<NamespaceDecl>(DC)->setAnonymousNamespace(ToNamespace); 1992788c62d1e87bfb596078817237f672a5f000999aDouglas Gregor } 1993788c62d1e87bfb596078817237f672a5f000999aDouglas Gregor } 1994788c62d1e87bfb596078817237f672a5f000999aDouglas Gregor Importer.Imported(D, ToNamespace); 1995788c62d1e87bfb596078817237f672a5f000999aDouglas Gregor 1996788c62d1e87bfb596078817237f672a5f000999aDouglas Gregor ImportDeclContext(D); 1997788c62d1e87bfb596078817237f672a5f000999aDouglas Gregor 1998788c62d1e87bfb596078817237f672a5f000999aDouglas Gregor return ToNamespace; 1999788c62d1e87bfb596078817237f672a5f000999aDouglas Gregor} 2000788c62d1e87bfb596078817237f672a5f000999aDouglas Gregor 2001162e1c1b487352434552147967c3dd296ebee2f7Richard SmithDecl *ASTNodeImporter::VisitTypedefNameDecl(TypedefNameDecl *D, bool IsAlias) { 20029e5d996444e40fdf5cce44ee82bec0d4e3df3d56Douglas Gregor // Import the major distinguishing characteristics of this typedef. 20039e5d996444e40fdf5cce44ee82bec0d4e3df3d56Douglas Gregor DeclContext *DC, *LexicalDC; 20049e5d996444e40fdf5cce44ee82bec0d4e3df3d56Douglas Gregor DeclarationName Name; 20059e5d996444e40fdf5cce44ee82bec0d4e3df3d56Douglas Gregor SourceLocation Loc; 20069e5d996444e40fdf5cce44ee82bec0d4e3df3d56Douglas Gregor if (ImportDeclParts(D, DC, LexicalDC, Name, Loc)) 20079e5d996444e40fdf5cce44ee82bec0d4e3df3d56Douglas Gregor return 0; 20089e5d996444e40fdf5cce44ee82bec0d4e3df3d56Douglas Gregor 20099e5d996444e40fdf5cce44ee82bec0d4e3df3d56Douglas Gregor // If this typedef is not in block scope, determine whether we've 20109e5d996444e40fdf5cce44ee82bec0d4e3df3d56Douglas Gregor // seen a typedef with the same name (that we can merge with) or any 20119e5d996444e40fdf5cce44ee82bec0d4e3df3d56Douglas Gregor // other entity by that name (which name lookup could conflict with). 20129e5d996444e40fdf5cce44ee82bec0d4e3df3d56Douglas Gregor if (!DC->isFunctionOrMethod()) { 20139e5d996444e40fdf5cce44ee82bec0d4e3df3d56Douglas Gregor llvm::SmallVector<NamedDecl *, 4> ConflictingDecls; 20149e5d996444e40fdf5cce44ee82bec0d4e3df3d56Douglas Gregor unsigned IDNS = Decl::IDNS_Ordinary; 20159e5d996444e40fdf5cce44ee82bec0d4e3df3d56Douglas Gregor for (DeclContext::lookup_result Lookup = DC->lookup(Name); 20169e5d996444e40fdf5cce44ee82bec0d4e3df3d56Douglas Gregor Lookup.first != Lookup.second; 20179e5d996444e40fdf5cce44ee82bec0d4e3df3d56Douglas Gregor ++Lookup.first) { 20189e5d996444e40fdf5cce44ee82bec0d4e3df3d56Douglas Gregor if (!(*Lookup.first)->isInIdentifierNamespace(IDNS)) 20199e5d996444e40fdf5cce44ee82bec0d4e3df3d56Douglas Gregor continue; 2020162e1c1b487352434552147967c3dd296ebee2f7Richard Smith if (TypedefNameDecl *FoundTypedef = 2021162e1c1b487352434552147967c3dd296ebee2f7Richard Smith dyn_cast<TypedefNameDecl>(*Lookup.first)) { 2022ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor if (Importer.IsStructurallyEquivalent(D->getUnderlyingType(), 2023ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor FoundTypedef->getUnderlyingType())) 20245ce5dab3c30e4255b8f62b148b6a86f09a444aaaDouglas Gregor return Importer.Imported(D, FoundTypedef); 20259e5d996444e40fdf5cce44ee82bec0d4e3df3d56Douglas Gregor } 20269e5d996444e40fdf5cce44ee82bec0d4e3df3d56Douglas Gregor 20279e5d996444e40fdf5cce44ee82bec0d4e3df3d56Douglas Gregor ConflictingDecls.push_back(*Lookup.first); 20289e5d996444e40fdf5cce44ee82bec0d4e3df3d56Douglas Gregor } 20299e5d996444e40fdf5cce44ee82bec0d4e3df3d56Douglas Gregor 20309e5d996444e40fdf5cce44ee82bec0d4e3df3d56Douglas Gregor if (!ConflictingDecls.empty()) { 20319e5d996444e40fdf5cce44ee82bec0d4e3df3d56Douglas Gregor Name = Importer.HandleNameConflict(Name, DC, IDNS, 20329e5d996444e40fdf5cce44ee82bec0d4e3df3d56Douglas Gregor ConflictingDecls.data(), 20339e5d996444e40fdf5cce44ee82bec0d4e3df3d56Douglas Gregor ConflictingDecls.size()); 20349e5d996444e40fdf5cce44ee82bec0d4e3df3d56Douglas Gregor if (!Name) 20359e5d996444e40fdf5cce44ee82bec0d4e3df3d56Douglas Gregor return 0; 20369e5d996444e40fdf5cce44ee82bec0d4e3df3d56Douglas Gregor } 20379e5d996444e40fdf5cce44ee82bec0d4e3df3d56Douglas Gregor } 20389e5d996444e40fdf5cce44ee82bec0d4e3df3d56Douglas Gregor 2039ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor // Import the underlying type of this typedef; 2040ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor QualType T = Importer.Import(D->getUnderlyingType()); 2041ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor if (T.isNull()) 2042ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor return 0; 2043ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor 20449e5d996444e40fdf5cce44ee82bec0d4e3df3d56Douglas Gregor // Create the new typedef node. 20459e5d996444e40fdf5cce44ee82bec0d4e3df3d56Douglas Gregor TypeSourceInfo *TInfo = Importer.Import(D->getTypeSourceInfo()); 2046344577e6b58f42d18dc8118c8903b49a85dc005eAbramo Bagnara SourceLocation StartL = Importer.Import(D->getLocStart()); 2047162e1c1b487352434552147967c3dd296ebee2f7Richard Smith TypedefNameDecl *ToTypedef; 2048162e1c1b487352434552147967c3dd296ebee2f7Richard Smith if (IsAlias) 2049162e1c1b487352434552147967c3dd296ebee2f7Richard Smith ToTypedef = TypedefDecl::Create(Importer.getToContext(), DC, 2050162e1c1b487352434552147967c3dd296ebee2f7Richard Smith StartL, Loc, 2051162e1c1b487352434552147967c3dd296ebee2f7Richard Smith Name.getAsIdentifierInfo(), 2052162e1c1b487352434552147967c3dd296ebee2f7Richard Smith TInfo); 2053162e1c1b487352434552147967c3dd296ebee2f7Richard Smith else 2054162e1c1b487352434552147967c3dd296ebee2f7Richard Smith ToTypedef = TypeAliasDecl::Create(Importer.getToContext(), DC, 2055162e1c1b487352434552147967c3dd296ebee2f7Richard Smith StartL, Loc, 2056162e1c1b487352434552147967c3dd296ebee2f7Richard Smith Name.getAsIdentifierInfo(), 2057162e1c1b487352434552147967c3dd296ebee2f7Richard Smith TInfo); 2058325bf177ac0f1db7888e2d7b194515466ba91762Douglas Gregor ToTypedef->setAccess(D->getAccess()); 20599e5d996444e40fdf5cce44ee82bec0d4e3df3d56Douglas Gregor ToTypedef->setLexicalDeclContext(LexicalDC); 20605ce5dab3c30e4255b8f62b148b6a86f09a444aaaDouglas Gregor Importer.Imported(D, ToTypedef); 20619e5d996444e40fdf5cce44ee82bec0d4e3df3d56Douglas Gregor LexicalDC->addDecl(ToTypedef); 2062ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor 20639e5d996444e40fdf5cce44ee82bec0d4e3df3d56Douglas Gregor return ToTypedef; 20649e5d996444e40fdf5cce44ee82bec0d4e3df3d56Douglas Gregor} 20659e5d996444e40fdf5cce44ee82bec0d4e3df3d56Douglas Gregor 2066162e1c1b487352434552147967c3dd296ebee2f7Richard SmithDecl *ASTNodeImporter::VisitTypedefDecl(TypedefDecl *D) { 2067162e1c1b487352434552147967c3dd296ebee2f7Richard Smith return VisitTypedefNameDecl(D, /*IsAlias=*/false); 2068162e1c1b487352434552147967c3dd296ebee2f7Richard Smith} 2069162e1c1b487352434552147967c3dd296ebee2f7Richard Smith 2070162e1c1b487352434552147967c3dd296ebee2f7Richard SmithDecl *ASTNodeImporter::VisitTypeAliasDecl(TypeAliasDecl *D) { 2071162e1c1b487352434552147967c3dd296ebee2f7Richard Smith return VisitTypedefNameDecl(D, /*IsAlias=*/true); 2072162e1c1b487352434552147967c3dd296ebee2f7Richard Smith} 2073162e1c1b487352434552147967c3dd296ebee2f7Richard Smith 207436ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas GregorDecl *ASTNodeImporter::VisitEnumDecl(EnumDecl *D) { 207536ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas Gregor // Import the major distinguishing characteristics of this enum. 207636ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas Gregor DeclContext *DC, *LexicalDC; 207736ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas Gregor DeclarationName Name; 207836ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas Gregor SourceLocation Loc; 207936ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas Gregor if (ImportDeclParts(D, DC, LexicalDC, Name, Loc)) 208036ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas Gregor return 0; 208136ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas Gregor 208236ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas Gregor // Figure out what enum name we're looking for. 208336ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas Gregor unsigned IDNS = Decl::IDNS_Tag; 208436ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas Gregor DeclarationName SearchName = Name; 2085162e1c1b487352434552147967c3dd296ebee2f7Richard Smith if (!SearchName && D->getTypedefNameForAnonDecl()) { 2086162e1c1b487352434552147967c3dd296ebee2f7Richard Smith SearchName = Importer.Import(D->getTypedefNameForAnonDecl()->getDeclName()); 208736ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas Gregor IDNS = Decl::IDNS_Ordinary; 208836ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas Gregor } else if (Importer.getToContext().getLangOptions().CPlusPlus) 208936ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas Gregor IDNS |= Decl::IDNS_Ordinary; 209036ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas Gregor 209136ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas Gregor // We may already have an enum of the same name; try to find and match it. 209236ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas Gregor if (!DC->isFunctionOrMethod() && SearchName) { 209336ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas Gregor llvm::SmallVector<NamedDecl *, 4> ConflictingDecls; 209436ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas Gregor for (DeclContext::lookup_result Lookup = DC->lookup(Name); 209536ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas Gregor Lookup.first != Lookup.second; 209636ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas Gregor ++Lookup.first) { 209736ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas Gregor if (!(*Lookup.first)->isInIdentifierNamespace(IDNS)) 209836ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas Gregor continue; 209936ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas Gregor 210036ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas Gregor Decl *Found = *Lookup.first; 2101162e1c1b487352434552147967c3dd296ebee2f7Richard Smith if (TypedefNameDecl *Typedef = dyn_cast<TypedefNameDecl>(Found)) { 210236ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas Gregor if (const TagType *Tag = Typedef->getUnderlyingType()->getAs<TagType>()) 210336ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas Gregor Found = Tag->getDecl(); 210436ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas Gregor } 210536ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas Gregor 210636ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas Gregor if (EnumDecl *FoundEnum = dyn_cast<EnumDecl>(Found)) { 21075ce5dab3c30e4255b8f62b148b6a86f09a444aaaDouglas Gregor if (IsStructuralMatch(D, FoundEnum)) 21085ce5dab3c30e4255b8f62b148b6a86f09a444aaaDouglas Gregor return Importer.Imported(D, FoundEnum); 210936ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas Gregor } 211036ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas Gregor 211136ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas Gregor ConflictingDecls.push_back(*Lookup.first); 211236ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas Gregor } 211336ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas Gregor 211436ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas Gregor if (!ConflictingDecls.empty()) { 211536ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas Gregor Name = Importer.HandleNameConflict(Name, DC, IDNS, 211636ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas Gregor ConflictingDecls.data(), 211736ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas Gregor ConflictingDecls.size()); 211836ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas Gregor } 211936ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas Gregor } 212036ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas Gregor 212136ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas Gregor // Create the enum declaration. 2122ba877adeb49ed6dc17f27fa3a3bcd0cca713fd68Abramo Bagnara EnumDecl *D2 = EnumDecl::Create(Importer.getToContext(), DC, 2123ba877adeb49ed6dc17f27fa3a3bcd0cca713fd68Abramo Bagnara Importer.Import(D->getLocStart()), 2124ba877adeb49ed6dc17f27fa3a3bcd0cca713fd68Abramo Bagnara Loc, Name.getAsIdentifierInfo(), 0, 2125a88cefd266c428be33cc06f7e8b00ff8fc97c1ffAbramo Bagnara D->isScoped(), D->isScopedUsingClassTag(), 2126a88cefd266c428be33cc06f7e8b00ff8fc97c1ffAbramo Bagnara D->isFixed()); 2127b6217665c6a987f2d6c8665fd70365d7719ac4dfJohn McCall // Import the qualifier, if any. 2128c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor D2->setQualifierInfo(Importer.Import(D->getQualifierLoc())); 2129325bf177ac0f1db7888e2d7b194515466ba91762Douglas Gregor D2->setAccess(D->getAccess()); 213073dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor D2->setLexicalDeclContext(LexicalDC); 213173dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor Importer.Imported(D, D2); 213273dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor LexicalDC->addDecl(D2); 213336ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas Gregor 213436ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas Gregor // Import the integer type. 213536ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas Gregor QualType ToIntegerType = Importer.Import(D->getIntegerType()); 213636ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas Gregor if (ToIntegerType.isNull()) 213736ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas Gregor return 0; 213873dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor D2->setIntegerType(ToIntegerType); 213936ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas Gregor 214036ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas Gregor // Import the definition 214136ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas Gregor if (D->isDefinition()) { 214236ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas Gregor QualType T = Importer.Import(Importer.getFromContext().getTypeDeclType(D)); 214336ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas Gregor if (T.isNull()) 214436ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas Gregor return 0; 214536ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas Gregor 214636ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas Gregor QualType ToPromotionType = Importer.Import(D->getPromotionType()); 214736ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas Gregor if (ToPromotionType.isNull()) 214836ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas Gregor return 0; 214936ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas Gregor 215073dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor D2->startDefinition(); 2151083a821bbd02bbc521275a2f144abe39a6c2745cDouglas Gregor ImportDeclContext(D); 21521b5a618c59025898806160ed5e7f0ff5bb79e482John McCall 21531b5a618c59025898806160ed5e7f0ff5bb79e482John McCall // FIXME: we might need to merge the number of positive or negative bits 21541b5a618c59025898806160ed5e7f0ff5bb79e482John McCall // if the enumerator lists don't match. 21551b5a618c59025898806160ed5e7f0ff5bb79e482John McCall D2->completeDefinition(T, ToPromotionType, 21561b5a618c59025898806160ed5e7f0ff5bb79e482John McCall D->getNumPositiveBits(), 21571b5a618c59025898806160ed5e7f0ff5bb79e482John McCall D->getNumNegativeBits()); 215836ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas Gregor } 215936ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas Gregor 216073dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor return D2; 216136ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas Gregor} 216236ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas Gregor 216396a01b4acf76fb8fe1e05341a97a27b39fb0b914Douglas GregorDecl *ASTNodeImporter::VisitRecordDecl(RecordDecl *D) { 216496a01b4acf76fb8fe1e05341a97a27b39fb0b914Douglas Gregor // If this record has a definition in the translation unit we're coming from, 216596a01b4acf76fb8fe1e05341a97a27b39fb0b914Douglas Gregor // but this particular declaration is not that definition, import the 216696a01b4acf76fb8fe1e05341a97a27b39fb0b914Douglas Gregor // definition and map to that. 2167952b017601f9c82b51119c3a1600f1312a833db9Douglas Gregor TagDecl *Definition = D->getDefinition(); 216896a01b4acf76fb8fe1e05341a97a27b39fb0b914Douglas Gregor if (Definition && Definition != D) { 216996a01b4acf76fb8fe1e05341a97a27b39fb0b914Douglas Gregor Decl *ImportedDef = Importer.Import(Definition); 21705ce5dab3c30e4255b8f62b148b6a86f09a444aaaDouglas Gregor if (!ImportedDef) 21715ce5dab3c30e4255b8f62b148b6a86f09a444aaaDouglas Gregor return 0; 21725ce5dab3c30e4255b8f62b148b6a86f09a444aaaDouglas Gregor 21735ce5dab3c30e4255b8f62b148b6a86f09a444aaaDouglas Gregor return Importer.Imported(D, ImportedDef); 217496a01b4acf76fb8fe1e05341a97a27b39fb0b914Douglas Gregor } 217596a01b4acf76fb8fe1e05341a97a27b39fb0b914Douglas Gregor 217696a01b4acf76fb8fe1e05341a97a27b39fb0b914Douglas Gregor // Import the major distinguishing characteristics of this record. 217796a01b4acf76fb8fe1e05341a97a27b39fb0b914Douglas Gregor DeclContext *DC, *LexicalDC; 217896a01b4acf76fb8fe1e05341a97a27b39fb0b914Douglas Gregor DeclarationName Name; 217996a01b4acf76fb8fe1e05341a97a27b39fb0b914Douglas Gregor SourceLocation Loc; 218096a01b4acf76fb8fe1e05341a97a27b39fb0b914Douglas Gregor if (ImportDeclParts(D, DC, LexicalDC, Name, Loc)) 218196a01b4acf76fb8fe1e05341a97a27b39fb0b914Douglas Gregor return 0; 218296a01b4acf76fb8fe1e05341a97a27b39fb0b914Douglas Gregor 218396a01b4acf76fb8fe1e05341a97a27b39fb0b914Douglas Gregor // Figure out what structure name we're looking for. 218496a01b4acf76fb8fe1e05341a97a27b39fb0b914Douglas Gregor unsigned IDNS = Decl::IDNS_Tag; 218596a01b4acf76fb8fe1e05341a97a27b39fb0b914Douglas Gregor DeclarationName SearchName = Name; 2186162e1c1b487352434552147967c3dd296ebee2f7Richard Smith if (!SearchName && D->getTypedefNameForAnonDecl()) { 2187162e1c1b487352434552147967c3dd296ebee2f7Richard Smith SearchName = Importer.Import(D->getTypedefNameForAnonDecl()->getDeclName()); 218896a01b4acf76fb8fe1e05341a97a27b39fb0b914Douglas Gregor IDNS = Decl::IDNS_Ordinary; 218996a01b4acf76fb8fe1e05341a97a27b39fb0b914Douglas Gregor } else if (Importer.getToContext().getLangOptions().CPlusPlus) 219096a01b4acf76fb8fe1e05341a97a27b39fb0b914Douglas Gregor IDNS |= Decl::IDNS_Ordinary; 219196a01b4acf76fb8fe1e05341a97a27b39fb0b914Douglas Gregor 219296a01b4acf76fb8fe1e05341a97a27b39fb0b914Douglas Gregor // We may already have a record of the same name; try to find and match it. 2193e72b5dc556805ea4c91f0ae6d8f8404fc341b687Douglas Gregor RecordDecl *AdoptDecl = 0; 219496a01b4acf76fb8fe1e05341a97a27b39fb0b914Douglas Gregor if (!DC->isFunctionOrMethod() && SearchName) { 219596a01b4acf76fb8fe1e05341a97a27b39fb0b914Douglas Gregor llvm::SmallVector<NamedDecl *, 4> ConflictingDecls; 219696a01b4acf76fb8fe1e05341a97a27b39fb0b914Douglas Gregor for (DeclContext::lookup_result Lookup = DC->lookup(Name); 219796a01b4acf76fb8fe1e05341a97a27b39fb0b914Douglas Gregor Lookup.first != Lookup.second; 219896a01b4acf76fb8fe1e05341a97a27b39fb0b914Douglas Gregor ++Lookup.first) { 219996a01b4acf76fb8fe1e05341a97a27b39fb0b914Douglas Gregor if (!(*Lookup.first)->isInIdentifierNamespace(IDNS)) 220096a01b4acf76fb8fe1e05341a97a27b39fb0b914Douglas Gregor continue; 220196a01b4acf76fb8fe1e05341a97a27b39fb0b914Douglas Gregor 220296a01b4acf76fb8fe1e05341a97a27b39fb0b914Douglas Gregor Decl *Found = *Lookup.first; 2203162e1c1b487352434552147967c3dd296ebee2f7Richard Smith if (TypedefNameDecl *Typedef = dyn_cast<TypedefNameDecl>(Found)) { 220496a01b4acf76fb8fe1e05341a97a27b39fb0b914Douglas Gregor if (const TagType *Tag = Typedef->getUnderlyingType()->getAs<TagType>()) 220596a01b4acf76fb8fe1e05341a97a27b39fb0b914Douglas Gregor Found = Tag->getDecl(); 220696a01b4acf76fb8fe1e05341a97a27b39fb0b914Douglas Gregor } 220796a01b4acf76fb8fe1e05341a97a27b39fb0b914Douglas Gregor 220896a01b4acf76fb8fe1e05341a97a27b39fb0b914Douglas Gregor if (RecordDecl *FoundRecord = dyn_cast<RecordDecl>(Found)) { 2209e72b5dc556805ea4c91f0ae6d8f8404fc341b687Douglas Gregor if (RecordDecl *FoundDef = FoundRecord->getDefinition()) { 2210e72b5dc556805ea4c91f0ae6d8f8404fc341b687Douglas Gregor if (!D->isDefinition() || IsStructuralMatch(D, FoundDef)) { 2211e72b5dc556805ea4c91f0ae6d8f8404fc341b687Douglas Gregor // The record types structurally match, or the "from" translation 2212e72b5dc556805ea4c91f0ae6d8f8404fc341b687Douglas Gregor // unit only had a forward declaration anyway; call it the same 2213e72b5dc556805ea4c91f0ae6d8f8404fc341b687Douglas Gregor // function. 2214e72b5dc556805ea4c91f0ae6d8f8404fc341b687Douglas Gregor // FIXME: For C++, we should also merge methods here. 22155ce5dab3c30e4255b8f62b148b6a86f09a444aaaDouglas Gregor return Importer.Imported(D, FoundDef); 2216e72b5dc556805ea4c91f0ae6d8f8404fc341b687Douglas Gregor } 2217e72b5dc556805ea4c91f0ae6d8f8404fc341b687Douglas Gregor } else { 2218e72b5dc556805ea4c91f0ae6d8f8404fc341b687Douglas Gregor // We have a forward declaration of this type, so adopt that forward 2219e72b5dc556805ea4c91f0ae6d8f8404fc341b687Douglas Gregor // declaration rather than building a new one. 2220e72b5dc556805ea4c91f0ae6d8f8404fc341b687Douglas Gregor AdoptDecl = FoundRecord; 2221e72b5dc556805ea4c91f0ae6d8f8404fc341b687Douglas Gregor continue; 2222e72b5dc556805ea4c91f0ae6d8f8404fc341b687Douglas Gregor } 222396a01b4acf76fb8fe1e05341a97a27b39fb0b914Douglas Gregor } 222496a01b4acf76fb8fe1e05341a97a27b39fb0b914Douglas Gregor 222596a01b4acf76fb8fe1e05341a97a27b39fb0b914Douglas Gregor ConflictingDecls.push_back(*Lookup.first); 222696a01b4acf76fb8fe1e05341a97a27b39fb0b914Douglas Gregor } 222796a01b4acf76fb8fe1e05341a97a27b39fb0b914Douglas Gregor 222896a01b4acf76fb8fe1e05341a97a27b39fb0b914Douglas Gregor if (!ConflictingDecls.empty()) { 222996a01b4acf76fb8fe1e05341a97a27b39fb0b914Douglas Gregor Name = Importer.HandleNameConflict(Name, DC, IDNS, 223096a01b4acf76fb8fe1e05341a97a27b39fb0b914Douglas Gregor ConflictingDecls.data(), 223196a01b4acf76fb8fe1e05341a97a27b39fb0b914Douglas Gregor ConflictingDecls.size()); 223296a01b4acf76fb8fe1e05341a97a27b39fb0b914Douglas Gregor } 223396a01b4acf76fb8fe1e05341a97a27b39fb0b914Douglas Gregor } 223496a01b4acf76fb8fe1e05341a97a27b39fb0b914Douglas Gregor 223596a01b4acf76fb8fe1e05341a97a27b39fb0b914Douglas Gregor // Create the record declaration. 223673dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor RecordDecl *D2 = AdoptDecl; 2237ba877adeb49ed6dc17f27fa3a3bcd0cca713fd68Abramo Bagnara SourceLocation StartLoc = Importer.Import(D->getLocStart()); 223873dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor if (!D2) { 22395250f27420386452a21692a6292c99ee7febdac4John McCall if (isa<CXXRecordDecl>(D)) { 224073dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor CXXRecordDecl *D2CXX = CXXRecordDecl::Create(Importer.getToContext(), 2241e72b5dc556805ea4c91f0ae6d8f8404fc341b687Douglas Gregor D->getTagKind(), 2242ba877adeb49ed6dc17f27fa3a3bcd0cca713fd68Abramo Bagnara DC, StartLoc, Loc, 2243ba877adeb49ed6dc17f27fa3a3bcd0cca713fd68Abramo Bagnara Name.getAsIdentifierInfo()); 224473dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor D2 = D2CXX; 2245325bf177ac0f1db7888e2d7b194515466ba91762Douglas Gregor D2->setAccess(D->getAccess()); 2246e72b5dc556805ea4c91f0ae6d8f8404fc341b687Douglas Gregor } else { 224773dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor D2 = RecordDecl::Create(Importer.getToContext(), D->getTagKind(), 2248ba877adeb49ed6dc17f27fa3a3bcd0cca713fd68Abramo Bagnara DC, StartLoc, Loc, Name.getAsIdentifierInfo()); 224996a01b4acf76fb8fe1e05341a97a27b39fb0b914Douglas Gregor } 2250c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor 2251c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor D2->setQualifierInfo(Importer.Import(D->getQualifierLoc())); 225273dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor D2->setLexicalDeclContext(LexicalDC); 225373dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor LexicalDC->addDecl(D2); 225496a01b4acf76fb8fe1e05341a97a27b39fb0b914Douglas Gregor } 22555ce5dab3c30e4255b8f62b148b6a86f09a444aaaDouglas Gregor 225673dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor Importer.Imported(D, D2); 2257e72b5dc556805ea4c91f0ae6d8f8404fc341b687Douglas Gregor 2258d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor if (D->isDefinition() && ImportDefinition(D, D2)) 2259d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor return 0; 226096a01b4acf76fb8fe1e05341a97a27b39fb0b914Douglas Gregor 226173dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor return D2; 226296a01b4acf76fb8fe1e05341a97a27b39fb0b914Douglas Gregor} 226396a01b4acf76fb8fe1e05341a97a27b39fb0b914Douglas Gregor 226436ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas GregorDecl *ASTNodeImporter::VisitEnumConstantDecl(EnumConstantDecl *D) { 226536ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas Gregor // Import the major distinguishing characteristics of this enumerator. 226636ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas Gregor DeclContext *DC, *LexicalDC; 226736ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas Gregor DeclarationName Name; 226836ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas Gregor SourceLocation Loc; 2269ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor if (ImportDeclParts(D, DC, LexicalDC, Name, Loc)) 227036ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas Gregor return 0; 2271ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor 2272ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor QualType T = Importer.Import(D->getType()); 2273ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor if (T.isNull()) 2274ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor return 0; 2275ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor 227636ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas Gregor // Determine whether there are any other declarations with the same name and 227736ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas Gregor // in the same context. 227836ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas Gregor if (!LexicalDC->isFunctionOrMethod()) { 227936ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas Gregor llvm::SmallVector<NamedDecl *, 4> ConflictingDecls; 228036ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas Gregor unsigned IDNS = Decl::IDNS_Ordinary; 228136ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas Gregor for (DeclContext::lookup_result Lookup = DC->lookup(Name); 228236ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas Gregor Lookup.first != Lookup.second; 228336ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas Gregor ++Lookup.first) { 228436ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas Gregor if (!(*Lookup.first)->isInIdentifierNamespace(IDNS)) 228536ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas Gregor continue; 228636ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas Gregor 228736ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas Gregor ConflictingDecls.push_back(*Lookup.first); 228836ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas Gregor } 228936ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas Gregor 229036ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas Gregor if (!ConflictingDecls.empty()) { 229136ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas Gregor Name = Importer.HandleNameConflict(Name, DC, IDNS, 229236ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas Gregor ConflictingDecls.data(), 229336ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas Gregor ConflictingDecls.size()); 229436ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas Gregor if (!Name) 229536ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas Gregor return 0; 229636ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas Gregor } 229736ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas Gregor } 229836ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas Gregor 229936ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas Gregor Expr *Init = Importer.Import(D->getInitExpr()); 230036ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas Gregor if (D->getInitExpr() && !Init) 230136ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas Gregor return 0; 230236ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas Gregor 230336ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas Gregor EnumConstantDecl *ToEnumerator 230436ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas Gregor = EnumConstantDecl::Create(Importer.getToContext(), cast<EnumDecl>(DC), Loc, 230536ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas Gregor Name.getAsIdentifierInfo(), T, 230636ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas Gregor Init, D->getInitVal()); 2307325bf177ac0f1db7888e2d7b194515466ba91762Douglas Gregor ToEnumerator->setAccess(D->getAccess()); 230836ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas Gregor ToEnumerator->setLexicalDeclContext(LexicalDC); 23095ce5dab3c30e4255b8f62b148b6a86f09a444aaaDouglas Gregor Importer.Imported(D, ToEnumerator); 231036ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas Gregor LexicalDC->addDecl(ToEnumerator); 231136ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas Gregor return ToEnumerator; 231236ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas Gregor} 231396a01b4acf76fb8fe1e05341a97a27b39fb0b914Douglas Gregor 2314a404ea673cbee5e74af710a5f1ab571e71580b67Douglas GregorDecl *ASTNodeImporter::VisitFunctionDecl(FunctionDecl *D) { 2315a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor // Import the major distinguishing characteristics of this function. 2316a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor DeclContext *DC, *LexicalDC; 2317a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor DeclarationName Name; 2318a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor SourceLocation Loc; 2319ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor if (ImportDeclParts(D, DC, LexicalDC, Name, Loc)) 2320089459a16bf7e9cd10617d1fac5ec0240a0a1ee6Douglas Gregor return 0; 23212577743c5650c646fb705df01403707e94f2df04Abramo Bagnara 2322a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor // Try to find a function in our own ("to") context with the same name, same 2323a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor // type, and in the same context as the function we're importing. 2324a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor if (!LexicalDC->isFunctionOrMethod()) { 2325a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor llvm::SmallVector<NamedDecl *, 4> ConflictingDecls; 2326a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor unsigned IDNS = Decl::IDNS_Ordinary; 2327a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor for (DeclContext::lookup_result Lookup = DC->lookup(Name); 2328a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor Lookup.first != Lookup.second; 2329a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor ++Lookup.first) { 2330a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor if (!(*Lookup.first)->isInIdentifierNamespace(IDNS)) 2331a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor continue; 2332a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor 2333a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor if (FunctionDecl *FoundFunction = dyn_cast<FunctionDecl>(*Lookup.first)) { 2334a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor if (isExternalLinkage(FoundFunction->getLinkage()) && 2335a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor isExternalLinkage(D->getLinkage())) { 2336ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor if (Importer.IsStructurallyEquivalent(D->getType(), 2337ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor FoundFunction->getType())) { 2338a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor // FIXME: Actually try to merge the body and other attributes. 23395ce5dab3c30e4255b8f62b148b6a86f09a444aaaDouglas Gregor return Importer.Imported(D, FoundFunction); 2340a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor } 2341a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor 2342a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor // FIXME: Check for overloading more carefully, e.g., by boosting 2343a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor // Sema::IsOverload out to the AST library. 2344a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor 2345a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor // Function overloading is okay in C++. 2346a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor if (Importer.getToContext().getLangOptions().CPlusPlus) 2347a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor continue; 2348a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor 2349a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor // Complain about inconsistent function types. 2350a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor Importer.ToDiag(Loc, diag::err_odr_function_type_inconsistent) 2351ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor << Name << D->getType() << FoundFunction->getType(); 2352a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor Importer.ToDiag(FoundFunction->getLocation(), 2353a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor diag::note_odr_value_here) 2354a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor << FoundFunction->getType(); 2355a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor } 2356a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor } 2357a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor 2358a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor ConflictingDecls.push_back(*Lookup.first); 2359a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor } 2360a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor 2361a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor if (!ConflictingDecls.empty()) { 2362a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor Name = Importer.HandleNameConflict(Name, DC, IDNS, 2363a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor ConflictingDecls.data(), 2364a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor ConflictingDecls.size()); 2365a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor if (!Name) 2366a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor return 0; 2367a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor } 2368a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor } 2369ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor 23702577743c5650c646fb705df01403707e94f2df04Abramo Bagnara DeclarationNameInfo NameInfo(Name, Loc); 23712577743c5650c646fb705df01403707e94f2df04Abramo Bagnara // Import additional name location/type info. 23722577743c5650c646fb705df01403707e94f2df04Abramo Bagnara ImportDeclarationNameLoc(D->getNameInfo(), NameInfo); 23732577743c5650c646fb705df01403707e94f2df04Abramo Bagnara 2374ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor // Import the type. 2375ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor QualType T = Importer.Import(D->getType()); 2376ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor if (T.isNull()) 2377ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor return 0; 2378a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor 2379a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor // Import the function parameters. 2380a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor llvm::SmallVector<ParmVarDecl *, 8> Parameters; 2381a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor for (FunctionDecl::param_iterator P = D->param_begin(), PEnd = D->param_end(); 2382a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor P != PEnd; ++P) { 2383a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor ParmVarDecl *ToP = cast_or_null<ParmVarDecl>(Importer.Import(*P)); 2384a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor if (!ToP) 2385a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor return 0; 2386a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor 2387a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor Parameters.push_back(ToP); 2388a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor } 2389a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor 2390a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor // Create the imported function. 2391a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor TypeSourceInfo *TInfo = Importer.Import(D->getTypeSourceInfo()); 2392c144f3534e2f7a70ea9ebf8dd83090a2883d61fbDouglas Gregor FunctionDecl *ToFunction = 0; 2393c144f3534e2f7a70ea9ebf8dd83090a2883d61fbDouglas Gregor if (CXXConstructorDecl *FromConstructor = dyn_cast<CXXConstructorDecl>(D)) { 2394c144f3534e2f7a70ea9ebf8dd83090a2883d61fbDouglas Gregor ToFunction = CXXConstructorDecl::Create(Importer.getToContext(), 2395c144f3534e2f7a70ea9ebf8dd83090a2883d61fbDouglas Gregor cast<CXXRecordDecl>(DC), 2396ff676cb48fe8bf7be2feaa251dc7c5fb15af4730Abramo Bagnara D->getInnerLocStart(), 23972577743c5650c646fb705df01403707e94f2df04Abramo Bagnara NameInfo, T, TInfo, 2398c144f3534e2f7a70ea9ebf8dd83090a2883d61fbDouglas Gregor FromConstructor->isExplicit(), 2399c144f3534e2f7a70ea9ebf8dd83090a2883d61fbDouglas Gregor D->isInlineSpecified(), 2400c144f3534e2f7a70ea9ebf8dd83090a2883d61fbDouglas Gregor D->isImplicit()); 2401c144f3534e2f7a70ea9ebf8dd83090a2883d61fbDouglas Gregor } else if (isa<CXXDestructorDecl>(D)) { 2402c144f3534e2f7a70ea9ebf8dd83090a2883d61fbDouglas Gregor ToFunction = CXXDestructorDecl::Create(Importer.getToContext(), 2403c144f3534e2f7a70ea9ebf8dd83090a2883d61fbDouglas Gregor cast<CXXRecordDecl>(DC), 2404ff676cb48fe8bf7be2feaa251dc7c5fb15af4730Abramo Bagnara D->getInnerLocStart(), 2405b41d899a6023385c00a61eb9dd3e44db9dc7994eCraig Silverstein NameInfo, T, TInfo, 2406c144f3534e2f7a70ea9ebf8dd83090a2883d61fbDouglas Gregor D->isInlineSpecified(), 2407c144f3534e2f7a70ea9ebf8dd83090a2883d61fbDouglas Gregor D->isImplicit()); 2408c144f3534e2f7a70ea9ebf8dd83090a2883d61fbDouglas Gregor } else if (CXXConversionDecl *FromConversion 2409c144f3534e2f7a70ea9ebf8dd83090a2883d61fbDouglas Gregor = dyn_cast<CXXConversionDecl>(D)) { 2410c144f3534e2f7a70ea9ebf8dd83090a2883d61fbDouglas Gregor ToFunction = CXXConversionDecl::Create(Importer.getToContext(), 2411c144f3534e2f7a70ea9ebf8dd83090a2883d61fbDouglas Gregor cast<CXXRecordDecl>(DC), 2412ff676cb48fe8bf7be2feaa251dc7c5fb15af4730Abramo Bagnara D->getInnerLocStart(), 24132577743c5650c646fb705df01403707e94f2df04Abramo Bagnara NameInfo, T, TInfo, 2414c144f3534e2f7a70ea9ebf8dd83090a2883d61fbDouglas Gregor D->isInlineSpecified(), 2415f52516038ab5d0b1b90a6dd32f46b7d6dabd04c8Douglas Gregor FromConversion->isExplicit(), 2416f52516038ab5d0b1b90a6dd32f46b7d6dabd04c8Douglas Gregor Importer.Import(D->getLocEnd())); 24170629cbe86b6d890076548778ed8597ee298adcbaDouglas Gregor } else if (CXXMethodDecl *Method = dyn_cast<CXXMethodDecl>(D)) { 24180629cbe86b6d890076548778ed8597ee298adcbaDouglas Gregor ToFunction = CXXMethodDecl::Create(Importer.getToContext(), 24190629cbe86b6d890076548778ed8597ee298adcbaDouglas Gregor cast<CXXRecordDecl>(DC), 2420ff676cb48fe8bf7be2feaa251dc7c5fb15af4730Abramo Bagnara D->getInnerLocStart(), 24210629cbe86b6d890076548778ed8597ee298adcbaDouglas Gregor NameInfo, T, TInfo, 24220629cbe86b6d890076548778ed8597ee298adcbaDouglas Gregor Method->isStatic(), 24230629cbe86b6d890076548778ed8597ee298adcbaDouglas Gregor Method->getStorageClassAsWritten(), 2424f52516038ab5d0b1b90a6dd32f46b7d6dabd04c8Douglas Gregor Method->isInlineSpecified(), 2425f52516038ab5d0b1b90a6dd32f46b7d6dabd04c8Douglas Gregor Importer.Import(D->getLocEnd())); 2426c144f3534e2f7a70ea9ebf8dd83090a2883d61fbDouglas Gregor } else { 24272577743c5650c646fb705df01403707e94f2df04Abramo Bagnara ToFunction = FunctionDecl::Create(Importer.getToContext(), DC, 2428ff676cb48fe8bf7be2feaa251dc7c5fb15af4730Abramo Bagnara D->getInnerLocStart(), 24292577743c5650c646fb705df01403707e94f2df04Abramo Bagnara NameInfo, T, TInfo, D->getStorageClass(), 243016573fa9705b546b7597c273b25b85d6321e2b33Douglas Gregor D->getStorageClassAsWritten(), 2431c144f3534e2f7a70ea9ebf8dd83090a2883d61fbDouglas Gregor D->isInlineSpecified(), 2432c144f3534e2f7a70ea9ebf8dd83090a2883d61fbDouglas Gregor D->hasWrittenPrototype()); 2433c144f3534e2f7a70ea9ebf8dd83090a2883d61fbDouglas Gregor } 2434b6217665c6a987f2d6c8665fd70365d7719ac4dfJohn McCall 2435b6217665c6a987f2d6c8665fd70365d7719ac4dfJohn McCall // Import the qualifier, if any. 2436c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor ToFunction->setQualifierInfo(Importer.Import(D->getQualifierLoc())); 2437325bf177ac0f1db7888e2d7b194515466ba91762Douglas Gregor ToFunction->setAccess(D->getAccess()); 2438c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor ToFunction->setLexicalDeclContext(LexicalDC); 2439f2eca2cf302c50b79891f24b3861d64ea9263831John McCall ToFunction->setVirtualAsWritten(D->isVirtualAsWritten()); 2440f2eca2cf302c50b79891f24b3861d64ea9263831John McCall ToFunction->setTrivial(D->isTrivial()); 2441f2eca2cf302c50b79891f24b3861d64ea9263831John McCall ToFunction->setPure(D->isPure()); 2442c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor Importer.Imported(D, ToFunction); 2443a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor 2444a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor // Set the parameters. 2445a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor for (unsigned I = 0, N = Parameters.size(); I != N; ++I) { 2446c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor Parameters[I]->setOwningFunction(ToFunction); 2447c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor ToFunction->addDecl(Parameters[I]); 2448a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor } 2449c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor ToFunction->setParams(Parameters.data(), Parameters.size()); 2450a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor 2451a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor // FIXME: Other bits to merge? 245281134ad7a056e45b7cb4ee1b562ab8c8413d65b7Douglas Gregor 245381134ad7a056e45b7cb4ee1b562ab8c8413d65b7Douglas Gregor // Add this function to the lexical context. 245481134ad7a056e45b7cb4ee1b562ab8c8413d65b7Douglas Gregor LexicalDC->addDecl(ToFunction); 245581134ad7a056e45b7cb4ee1b562ab8c8413d65b7Douglas Gregor 2456c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor return ToFunction; 2457a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor} 2458a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor 2459c144f3534e2f7a70ea9ebf8dd83090a2883d61fbDouglas GregorDecl *ASTNodeImporter::VisitCXXMethodDecl(CXXMethodDecl *D) { 2460c144f3534e2f7a70ea9ebf8dd83090a2883d61fbDouglas Gregor return VisitFunctionDecl(D); 2461c144f3534e2f7a70ea9ebf8dd83090a2883d61fbDouglas Gregor} 2462c144f3534e2f7a70ea9ebf8dd83090a2883d61fbDouglas Gregor 2463c144f3534e2f7a70ea9ebf8dd83090a2883d61fbDouglas GregorDecl *ASTNodeImporter::VisitCXXConstructorDecl(CXXConstructorDecl *D) { 2464c144f3534e2f7a70ea9ebf8dd83090a2883d61fbDouglas Gregor return VisitCXXMethodDecl(D); 2465c144f3534e2f7a70ea9ebf8dd83090a2883d61fbDouglas Gregor} 2466c144f3534e2f7a70ea9ebf8dd83090a2883d61fbDouglas Gregor 2467c144f3534e2f7a70ea9ebf8dd83090a2883d61fbDouglas GregorDecl *ASTNodeImporter::VisitCXXDestructorDecl(CXXDestructorDecl *D) { 2468c144f3534e2f7a70ea9ebf8dd83090a2883d61fbDouglas Gregor return VisitCXXMethodDecl(D); 2469c144f3534e2f7a70ea9ebf8dd83090a2883d61fbDouglas Gregor} 2470c144f3534e2f7a70ea9ebf8dd83090a2883d61fbDouglas Gregor 2471c144f3534e2f7a70ea9ebf8dd83090a2883d61fbDouglas GregorDecl *ASTNodeImporter::VisitCXXConversionDecl(CXXConversionDecl *D) { 2472c144f3534e2f7a70ea9ebf8dd83090a2883d61fbDouglas Gregor return VisitCXXMethodDecl(D); 2473c144f3534e2f7a70ea9ebf8dd83090a2883d61fbDouglas Gregor} 2474c144f3534e2f7a70ea9ebf8dd83090a2883d61fbDouglas Gregor 247596a01b4acf76fb8fe1e05341a97a27b39fb0b914Douglas GregorDecl *ASTNodeImporter::VisitFieldDecl(FieldDecl *D) { 247696a01b4acf76fb8fe1e05341a97a27b39fb0b914Douglas Gregor // Import the major distinguishing characteristics of a variable. 247796a01b4acf76fb8fe1e05341a97a27b39fb0b914Douglas Gregor DeclContext *DC, *LexicalDC; 247896a01b4acf76fb8fe1e05341a97a27b39fb0b914Douglas Gregor DeclarationName Name; 247996a01b4acf76fb8fe1e05341a97a27b39fb0b914Douglas Gregor SourceLocation Loc; 2480ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor if (ImportDeclParts(D, DC, LexicalDC, Name, Loc)) 2481ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor return 0; 2482ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor 2483ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor // Import the type. 2484ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor QualType T = Importer.Import(D->getType()); 2485ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor if (T.isNull()) 248696a01b4acf76fb8fe1e05341a97a27b39fb0b914Douglas Gregor return 0; 248796a01b4acf76fb8fe1e05341a97a27b39fb0b914Douglas Gregor 248896a01b4acf76fb8fe1e05341a97a27b39fb0b914Douglas Gregor TypeSourceInfo *TInfo = Importer.Import(D->getTypeSourceInfo()); 248996a01b4acf76fb8fe1e05341a97a27b39fb0b914Douglas Gregor Expr *BitWidth = Importer.Import(D->getBitWidth()); 249096a01b4acf76fb8fe1e05341a97a27b39fb0b914Douglas Gregor if (!BitWidth && D->getBitWidth()) 249196a01b4acf76fb8fe1e05341a97a27b39fb0b914Douglas Gregor return 0; 249296a01b4acf76fb8fe1e05341a97a27b39fb0b914Douglas Gregor 2493ff676cb48fe8bf7be2feaa251dc7c5fb15af4730Abramo Bagnara FieldDecl *ToField = FieldDecl::Create(Importer.getToContext(), DC, 2494ff676cb48fe8bf7be2feaa251dc7c5fb15af4730Abramo Bagnara Importer.Import(D->getInnerLocStart()), 249596a01b4acf76fb8fe1e05341a97a27b39fb0b914Douglas Gregor Loc, Name.getAsIdentifierInfo(), 249696a01b4acf76fb8fe1e05341a97a27b39fb0b914Douglas Gregor T, TInfo, BitWidth, D->isMutable()); 2497325bf177ac0f1db7888e2d7b194515466ba91762Douglas Gregor ToField->setAccess(D->getAccess()); 249896a01b4acf76fb8fe1e05341a97a27b39fb0b914Douglas Gregor ToField->setLexicalDeclContext(LexicalDC); 24995ce5dab3c30e4255b8f62b148b6a86f09a444aaaDouglas Gregor Importer.Imported(D, ToField); 250096a01b4acf76fb8fe1e05341a97a27b39fb0b914Douglas Gregor LexicalDC->addDecl(ToField); 250196a01b4acf76fb8fe1e05341a97a27b39fb0b914Douglas Gregor return ToField; 250296a01b4acf76fb8fe1e05341a97a27b39fb0b914Douglas Gregor} 250396a01b4acf76fb8fe1e05341a97a27b39fb0b914Douglas Gregor 250487c2e121cf0522fc266efe2922b58091cd2e0182Francois PichetDecl *ASTNodeImporter::VisitIndirectFieldDecl(IndirectFieldDecl *D) { 250587c2e121cf0522fc266efe2922b58091cd2e0182Francois Pichet // Import the major distinguishing characteristics of a variable. 250687c2e121cf0522fc266efe2922b58091cd2e0182Francois Pichet DeclContext *DC, *LexicalDC; 250787c2e121cf0522fc266efe2922b58091cd2e0182Francois Pichet DeclarationName Name; 250887c2e121cf0522fc266efe2922b58091cd2e0182Francois Pichet SourceLocation Loc; 250987c2e121cf0522fc266efe2922b58091cd2e0182Francois Pichet if (ImportDeclParts(D, DC, LexicalDC, Name, Loc)) 251087c2e121cf0522fc266efe2922b58091cd2e0182Francois Pichet return 0; 251187c2e121cf0522fc266efe2922b58091cd2e0182Francois Pichet 251287c2e121cf0522fc266efe2922b58091cd2e0182Francois Pichet // Import the type. 251387c2e121cf0522fc266efe2922b58091cd2e0182Francois Pichet QualType T = Importer.Import(D->getType()); 251487c2e121cf0522fc266efe2922b58091cd2e0182Francois Pichet if (T.isNull()) 251587c2e121cf0522fc266efe2922b58091cd2e0182Francois Pichet return 0; 251687c2e121cf0522fc266efe2922b58091cd2e0182Francois Pichet 251787c2e121cf0522fc266efe2922b58091cd2e0182Francois Pichet NamedDecl **NamedChain = 251887c2e121cf0522fc266efe2922b58091cd2e0182Francois Pichet new (Importer.getToContext())NamedDecl*[D->getChainingSize()]; 251987c2e121cf0522fc266efe2922b58091cd2e0182Francois Pichet 252087c2e121cf0522fc266efe2922b58091cd2e0182Francois Pichet unsigned i = 0; 252187c2e121cf0522fc266efe2922b58091cd2e0182Francois Pichet for (IndirectFieldDecl::chain_iterator PI = D->chain_begin(), 252287c2e121cf0522fc266efe2922b58091cd2e0182Francois Pichet PE = D->chain_end(); PI != PE; ++PI) { 252387c2e121cf0522fc266efe2922b58091cd2e0182Francois Pichet Decl* D = Importer.Import(*PI); 252487c2e121cf0522fc266efe2922b58091cd2e0182Francois Pichet if (!D) 252587c2e121cf0522fc266efe2922b58091cd2e0182Francois Pichet return 0; 252687c2e121cf0522fc266efe2922b58091cd2e0182Francois Pichet NamedChain[i++] = cast<NamedDecl>(D); 252787c2e121cf0522fc266efe2922b58091cd2e0182Francois Pichet } 252887c2e121cf0522fc266efe2922b58091cd2e0182Francois Pichet 252987c2e121cf0522fc266efe2922b58091cd2e0182Francois Pichet IndirectFieldDecl *ToIndirectField = IndirectFieldDecl::Create( 253087c2e121cf0522fc266efe2922b58091cd2e0182Francois Pichet Importer.getToContext(), DC, 253187c2e121cf0522fc266efe2922b58091cd2e0182Francois Pichet Loc, Name.getAsIdentifierInfo(), T, 253287c2e121cf0522fc266efe2922b58091cd2e0182Francois Pichet NamedChain, D->getChainingSize()); 253387c2e121cf0522fc266efe2922b58091cd2e0182Francois Pichet ToIndirectField->setAccess(D->getAccess()); 253487c2e121cf0522fc266efe2922b58091cd2e0182Francois Pichet ToIndirectField->setLexicalDeclContext(LexicalDC); 253587c2e121cf0522fc266efe2922b58091cd2e0182Francois Pichet Importer.Imported(D, ToIndirectField); 253687c2e121cf0522fc266efe2922b58091cd2e0182Francois Pichet LexicalDC->addDecl(ToIndirectField); 253787c2e121cf0522fc266efe2922b58091cd2e0182Francois Pichet return ToIndirectField; 253887c2e121cf0522fc266efe2922b58091cd2e0182Francois Pichet} 253987c2e121cf0522fc266efe2922b58091cd2e0182Francois Pichet 25402e55e3af2f6d6c0509495357fade95105dd144cdDouglas GregorDecl *ASTNodeImporter::VisitObjCIvarDecl(ObjCIvarDecl *D) { 25412e55e3af2f6d6c0509495357fade95105dd144cdDouglas Gregor // Import the major distinguishing characteristics of an ivar. 25422e55e3af2f6d6c0509495357fade95105dd144cdDouglas Gregor DeclContext *DC, *LexicalDC; 25432e55e3af2f6d6c0509495357fade95105dd144cdDouglas Gregor DeclarationName Name; 25442e55e3af2f6d6c0509495357fade95105dd144cdDouglas Gregor SourceLocation Loc; 25452e55e3af2f6d6c0509495357fade95105dd144cdDouglas Gregor if (ImportDeclParts(D, DC, LexicalDC, Name, Loc)) 25462e55e3af2f6d6c0509495357fade95105dd144cdDouglas Gregor return 0; 25472e55e3af2f6d6c0509495357fade95105dd144cdDouglas Gregor 25482e55e3af2f6d6c0509495357fade95105dd144cdDouglas Gregor // Determine whether we've already imported this ivar 25492e55e3af2f6d6c0509495357fade95105dd144cdDouglas Gregor for (DeclContext::lookup_result Lookup = DC->lookup(Name); 25502e55e3af2f6d6c0509495357fade95105dd144cdDouglas Gregor Lookup.first != Lookup.second; 25512e55e3af2f6d6c0509495357fade95105dd144cdDouglas Gregor ++Lookup.first) { 25522e55e3af2f6d6c0509495357fade95105dd144cdDouglas Gregor if (ObjCIvarDecl *FoundIvar = dyn_cast<ObjCIvarDecl>(*Lookup.first)) { 25532e55e3af2f6d6c0509495357fade95105dd144cdDouglas Gregor if (Importer.IsStructurallyEquivalent(D->getType(), 25542e55e3af2f6d6c0509495357fade95105dd144cdDouglas Gregor FoundIvar->getType())) { 25552e55e3af2f6d6c0509495357fade95105dd144cdDouglas Gregor Importer.Imported(D, FoundIvar); 25562e55e3af2f6d6c0509495357fade95105dd144cdDouglas Gregor return FoundIvar; 25572e55e3af2f6d6c0509495357fade95105dd144cdDouglas Gregor } 25582e55e3af2f6d6c0509495357fade95105dd144cdDouglas Gregor 25592e55e3af2f6d6c0509495357fade95105dd144cdDouglas Gregor Importer.ToDiag(Loc, diag::err_odr_ivar_type_inconsistent) 25602e55e3af2f6d6c0509495357fade95105dd144cdDouglas Gregor << Name << D->getType() << FoundIvar->getType(); 25612e55e3af2f6d6c0509495357fade95105dd144cdDouglas Gregor Importer.ToDiag(FoundIvar->getLocation(), diag::note_odr_value_here) 25622e55e3af2f6d6c0509495357fade95105dd144cdDouglas Gregor << FoundIvar->getType(); 25632e55e3af2f6d6c0509495357fade95105dd144cdDouglas Gregor return 0; 25642e55e3af2f6d6c0509495357fade95105dd144cdDouglas Gregor } 25652e55e3af2f6d6c0509495357fade95105dd144cdDouglas Gregor } 25662e55e3af2f6d6c0509495357fade95105dd144cdDouglas Gregor 25672e55e3af2f6d6c0509495357fade95105dd144cdDouglas Gregor // Import the type. 25682e55e3af2f6d6c0509495357fade95105dd144cdDouglas Gregor QualType T = Importer.Import(D->getType()); 25692e55e3af2f6d6c0509495357fade95105dd144cdDouglas Gregor if (T.isNull()) 25702e55e3af2f6d6c0509495357fade95105dd144cdDouglas Gregor return 0; 25712e55e3af2f6d6c0509495357fade95105dd144cdDouglas Gregor 25722e55e3af2f6d6c0509495357fade95105dd144cdDouglas Gregor TypeSourceInfo *TInfo = Importer.Import(D->getTypeSourceInfo()); 25732e55e3af2f6d6c0509495357fade95105dd144cdDouglas Gregor Expr *BitWidth = Importer.Import(D->getBitWidth()); 25742e55e3af2f6d6c0509495357fade95105dd144cdDouglas Gregor if (!BitWidth && D->getBitWidth()) 25752e55e3af2f6d6c0509495357fade95105dd144cdDouglas Gregor return 0; 25762e55e3af2f6d6c0509495357fade95105dd144cdDouglas Gregor 2577a06549226f45d5b72169a3d054415616dd1014a2Daniel Dunbar ObjCIvarDecl *ToIvar = ObjCIvarDecl::Create(Importer.getToContext(), 2578a06549226f45d5b72169a3d054415616dd1014a2Daniel Dunbar cast<ObjCContainerDecl>(DC), 2579ff676cb48fe8bf7be2feaa251dc7c5fb15af4730Abramo Bagnara Importer.Import(D->getInnerLocStart()), 25802e55e3af2f6d6c0509495357fade95105dd144cdDouglas Gregor Loc, Name.getAsIdentifierInfo(), 25812e55e3af2f6d6c0509495357fade95105dd144cdDouglas Gregor T, TInfo, D->getAccessControl(), 2582ac0021ba802e193e0f9f8207768c7862c7603bc0Fariborz Jahanian BitWidth, D->getSynthesize()); 25832e55e3af2f6d6c0509495357fade95105dd144cdDouglas Gregor ToIvar->setLexicalDeclContext(LexicalDC); 25842e55e3af2f6d6c0509495357fade95105dd144cdDouglas Gregor Importer.Imported(D, ToIvar); 25852e55e3af2f6d6c0509495357fade95105dd144cdDouglas Gregor LexicalDC->addDecl(ToIvar); 25862e55e3af2f6d6c0509495357fade95105dd144cdDouglas Gregor return ToIvar; 25872e55e3af2f6d6c0509495357fade95105dd144cdDouglas Gregor 25882e55e3af2f6d6c0509495357fade95105dd144cdDouglas Gregor} 25892e55e3af2f6d6c0509495357fade95105dd144cdDouglas Gregor 2590a404ea673cbee5e74af710a5f1ab571e71580b67Douglas GregorDecl *ASTNodeImporter::VisitVarDecl(VarDecl *D) { 2591a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor // Import the major distinguishing characteristics of a variable. 2592a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor DeclContext *DC, *LexicalDC; 2593a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor DeclarationName Name; 2594a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor SourceLocation Loc; 2595ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor if (ImportDeclParts(D, DC, LexicalDC, Name, Loc)) 2596a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor return 0; 2597089459a16bf7e9cd10617d1fac5ec0240a0a1ee6Douglas Gregor 2598089459a16bf7e9cd10617d1fac5ec0240a0a1ee6Douglas Gregor // Try to find a variable in our own ("to") context with the same name and 2599089459a16bf7e9cd10617d1fac5ec0240a0a1ee6Douglas Gregor // in the same context as the variable we're importing. 26009bed8798964d9f07599c2c9199701f86fbc70e20Douglas Gregor if (D->isFileVarDecl()) { 2601089459a16bf7e9cd10617d1fac5ec0240a0a1ee6Douglas Gregor VarDecl *MergeWithVar = 0; 2602089459a16bf7e9cd10617d1fac5ec0240a0a1ee6Douglas Gregor llvm::SmallVector<NamedDecl *, 4> ConflictingDecls; 2603089459a16bf7e9cd10617d1fac5ec0240a0a1ee6Douglas Gregor unsigned IDNS = Decl::IDNS_Ordinary; 26049bed8798964d9f07599c2c9199701f86fbc70e20Douglas Gregor for (DeclContext::lookup_result Lookup = DC->lookup(Name); 2605089459a16bf7e9cd10617d1fac5ec0240a0a1ee6Douglas Gregor Lookup.first != Lookup.second; 2606089459a16bf7e9cd10617d1fac5ec0240a0a1ee6Douglas Gregor ++Lookup.first) { 2607089459a16bf7e9cd10617d1fac5ec0240a0a1ee6Douglas Gregor if (!(*Lookup.first)->isInIdentifierNamespace(IDNS)) 2608089459a16bf7e9cd10617d1fac5ec0240a0a1ee6Douglas Gregor continue; 2609089459a16bf7e9cd10617d1fac5ec0240a0a1ee6Douglas Gregor 2610089459a16bf7e9cd10617d1fac5ec0240a0a1ee6Douglas Gregor if (VarDecl *FoundVar = dyn_cast<VarDecl>(*Lookup.first)) { 2611089459a16bf7e9cd10617d1fac5ec0240a0a1ee6Douglas Gregor // We have found a variable that we may need to merge with. Check it. 2612089459a16bf7e9cd10617d1fac5ec0240a0a1ee6Douglas Gregor if (isExternalLinkage(FoundVar->getLinkage()) && 2613089459a16bf7e9cd10617d1fac5ec0240a0a1ee6Douglas Gregor isExternalLinkage(D->getLinkage())) { 2614ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor if (Importer.IsStructurallyEquivalent(D->getType(), 2615ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor FoundVar->getType())) { 2616089459a16bf7e9cd10617d1fac5ec0240a0a1ee6Douglas Gregor MergeWithVar = FoundVar; 2617089459a16bf7e9cd10617d1fac5ec0240a0a1ee6Douglas Gregor break; 2618089459a16bf7e9cd10617d1fac5ec0240a0a1ee6Douglas Gregor } 2619089459a16bf7e9cd10617d1fac5ec0240a0a1ee6Douglas Gregor 2620d014542e1c6710d2c230b65b0cfcb8302a596b21Douglas Gregor const ArrayType *FoundArray 2621d014542e1c6710d2c230b65b0cfcb8302a596b21Douglas Gregor = Importer.getToContext().getAsArrayType(FoundVar->getType()); 2622d014542e1c6710d2c230b65b0cfcb8302a596b21Douglas Gregor const ArrayType *TArray 2623ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor = Importer.getToContext().getAsArrayType(D->getType()); 2624d014542e1c6710d2c230b65b0cfcb8302a596b21Douglas Gregor if (FoundArray && TArray) { 2625d014542e1c6710d2c230b65b0cfcb8302a596b21Douglas Gregor if (isa<IncompleteArrayType>(FoundArray) && 2626d014542e1c6710d2c230b65b0cfcb8302a596b21Douglas Gregor isa<ConstantArrayType>(TArray)) { 2627ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor // Import the type. 2628ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor QualType T = Importer.Import(D->getType()); 2629ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor if (T.isNull()) 2630ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor return 0; 2631ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor 2632d014542e1c6710d2c230b65b0cfcb8302a596b21Douglas Gregor FoundVar->setType(T); 2633d014542e1c6710d2c230b65b0cfcb8302a596b21Douglas Gregor MergeWithVar = FoundVar; 2634d014542e1c6710d2c230b65b0cfcb8302a596b21Douglas Gregor break; 2635d014542e1c6710d2c230b65b0cfcb8302a596b21Douglas Gregor } else if (isa<IncompleteArrayType>(TArray) && 2636d014542e1c6710d2c230b65b0cfcb8302a596b21Douglas Gregor isa<ConstantArrayType>(FoundArray)) { 2637d014542e1c6710d2c230b65b0cfcb8302a596b21Douglas Gregor MergeWithVar = FoundVar; 2638d014542e1c6710d2c230b65b0cfcb8302a596b21Douglas Gregor break; 26390f962a8e61e1c094a89df17f9d3ad947d31c4e5cDouglas Gregor } 26400f962a8e61e1c094a89df17f9d3ad947d31c4e5cDouglas Gregor } 26410f962a8e61e1c094a89df17f9d3ad947d31c4e5cDouglas Gregor 2642089459a16bf7e9cd10617d1fac5ec0240a0a1ee6Douglas Gregor Importer.ToDiag(Loc, diag::err_odr_variable_type_inconsistent) 2643ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor << Name << D->getType() << FoundVar->getType(); 2644089459a16bf7e9cd10617d1fac5ec0240a0a1ee6Douglas Gregor Importer.ToDiag(FoundVar->getLocation(), diag::note_odr_value_here) 2645089459a16bf7e9cd10617d1fac5ec0240a0a1ee6Douglas Gregor << FoundVar->getType(); 2646089459a16bf7e9cd10617d1fac5ec0240a0a1ee6Douglas Gregor } 2647089459a16bf7e9cd10617d1fac5ec0240a0a1ee6Douglas Gregor } 2648089459a16bf7e9cd10617d1fac5ec0240a0a1ee6Douglas Gregor 2649089459a16bf7e9cd10617d1fac5ec0240a0a1ee6Douglas Gregor ConflictingDecls.push_back(*Lookup.first); 2650089459a16bf7e9cd10617d1fac5ec0240a0a1ee6Douglas Gregor } 2651089459a16bf7e9cd10617d1fac5ec0240a0a1ee6Douglas Gregor 2652089459a16bf7e9cd10617d1fac5ec0240a0a1ee6Douglas Gregor if (MergeWithVar) { 2653089459a16bf7e9cd10617d1fac5ec0240a0a1ee6Douglas Gregor // An equivalent variable with external linkage has been found. Link 2654089459a16bf7e9cd10617d1fac5ec0240a0a1ee6Douglas Gregor // the two declarations, then merge them. 26555ce5dab3c30e4255b8f62b148b6a86f09a444aaaDouglas Gregor Importer.Imported(D, MergeWithVar); 2656089459a16bf7e9cd10617d1fac5ec0240a0a1ee6Douglas Gregor 2657089459a16bf7e9cd10617d1fac5ec0240a0a1ee6Douglas Gregor if (VarDecl *DDef = D->getDefinition()) { 2658089459a16bf7e9cd10617d1fac5ec0240a0a1ee6Douglas Gregor if (VarDecl *ExistingDef = MergeWithVar->getDefinition()) { 2659089459a16bf7e9cd10617d1fac5ec0240a0a1ee6Douglas Gregor Importer.ToDiag(ExistingDef->getLocation(), 2660089459a16bf7e9cd10617d1fac5ec0240a0a1ee6Douglas Gregor diag::err_odr_variable_multiple_def) 2661089459a16bf7e9cd10617d1fac5ec0240a0a1ee6Douglas Gregor << Name; 2662089459a16bf7e9cd10617d1fac5ec0240a0a1ee6Douglas Gregor Importer.FromDiag(DDef->getLocation(), diag::note_odr_defined_here); 2663089459a16bf7e9cd10617d1fac5ec0240a0a1ee6Douglas Gregor } else { 2664089459a16bf7e9cd10617d1fac5ec0240a0a1ee6Douglas Gregor Expr *Init = Importer.Import(DDef->getInit()); 2665838db383b69b9fb55f55c8e9546477df198a4faaDouglas Gregor MergeWithVar->setInit(Init); 2666089459a16bf7e9cd10617d1fac5ec0240a0a1ee6Douglas Gregor } 2667089459a16bf7e9cd10617d1fac5ec0240a0a1ee6Douglas Gregor } 2668089459a16bf7e9cd10617d1fac5ec0240a0a1ee6Douglas Gregor 2669089459a16bf7e9cd10617d1fac5ec0240a0a1ee6Douglas Gregor return MergeWithVar; 2670089459a16bf7e9cd10617d1fac5ec0240a0a1ee6Douglas Gregor } 2671089459a16bf7e9cd10617d1fac5ec0240a0a1ee6Douglas Gregor 2672089459a16bf7e9cd10617d1fac5ec0240a0a1ee6Douglas Gregor if (!ConflictingDecls.empty()) { 2673089459a16bf7e9cd10617d1fac5ec0240a0a1ee6Douglas Gregor Name = Importer.HandleNameConflict(Name, DC, IDNS, 2674089459a16bf7e9cd10617d1fac5ec0240a0a1ee6Douglas Gregor ConflictingDecls.data(), 2675089459a16bf7e9cd10617d1fac5ec0240a0a1ee6Douglas Gregor ConflictingDecls.size()); 2676089459a16bf7e9cd10617d1fac5ec0240a0a1ee6Douglas Gregor if (!Name) 2677089459a16bf7e9cd10617d1fac5ec0240a0a1ee6Douglas Gregor return 0; 2678089459a16bf7e9cd10617d1fac5ec0240a0a1ee6Douglas Gregor } 2679089459a16bf7e9cd10617d1fac5ec0240a0a1ee6Douglas Gregor } 268082fc4bfa6f8ea35488b9038dd83d40766c3645cfDouglas Gregor 2681ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor // Import the type. 2682ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor QualType T = Importer.Import(D->getType()); 2683ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor if (T.isNull()) 2684ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor return 0; 2685ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor 2686089459a16bf7e9cd10617d1fac5ec0240a0a1ee6Douglas Gregor // Create the imported variable. 268782fc4bfa6f8ea35488b9038dd83d40766c3645cfDouglas Gregor TypeSourceInfo *TInfo = Importer.Import(D->getTypeSourceInfo()); 2688ff676cb48fe8bf7be2feaa251dc7c5fb15af4730Abramo Bagnara VarDecl *ToVar = VarDecl::Create(Importer.getToContext(), DC, 2689ff676cb48fe8bf7be2feaa251dc7c5fb15af4730Abramo Bagnara Importer.Import(D->getInnerLocStart()), 2690ff676cb48fe8bf7be2feaa251dc7c5fb15af4730Abramo Bagnara Loc, Name.getAsIdentifierInfo(), 2691ff676cb48fe8bf7be2feaa251dc7c5fb15af4730Abramo Bagnara T, TInfo, 269216573fa9705b546b7597c273b25b85d6321e2b33Douglas Gregor D->getStorageClass(), 269316573fa9705b546b7597c273b25b85d6321e2b33Douglas Gregor D->getStorageClassAsWritten()); 2694c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor ToVar->setQualifierInfo(Importer.Import(D->getQualifierLoc())); 2695325bf177ac0f1db7888e2d7b194515466ba91762Douglas Gregor ToVar->setAccess(D->getAccess()); 26969bed8798964d9f07599c2c9199701f86fbc70e20Douglas Gregor ToVar->setLexicalDeclContext(LexicalDC); 26975ce5dab3c30e4255b8f62b148b6a86f09a444aaaDouglas Gregor Importer.Imported(D, ToVar); 26989bed8798964d9f07599c2c9199701f86fbc70e20Douglas Gregor LexicalDC->addDecl(ToVar); 26999bed8798964d9f07599c2c9199701f86fbc70e20Douglas Gregor 2700089459a16bf7e9cd10617d1fac5ec0240a0a1ee6Douglas Gregor // Merge the initializer. 2701089459a16bf7e9cd10617d1fac5ec0240a0a1ee6Douglas Gregor // FIXME: Can we really import any initializer? Alternatively, we could force 2702089459a16bf7e9cd10617d1fac5ec0240a0a1ee6Douglas Gregor // ourselves to import every declaration of a variable and then only use 2703089459a16bf7e9cd10617d1fac5ec0240a0a1ee6Douglas Gregor // getInit() here. 2704838db383b69b9fb55f55c8e9546477df198a4faaDouglas Gregor ToVar->setInit(Importer.Import(const_cast<Expr *>(D->getAnyInitializer()))); 2705089459a16bf7e9cd10617d1fac5ec0240a0a1ee6Douglas Gregor 2706089459a16bf7e9cd10617d1fac5ec0240a0a1ee6Douglas Gregor // FIXME: Other bits to merge? 2707089459a16bf7e9cd10617d1fac5ec0240a0a1ee6Douglas Gregor 2708089459a16bf7e9cd10617d1fac5ec0240a0a1ee6Douglas Gregor return ToVar; 2709089459a16bf7e9cd10617d1fac5ec0240a0a1ee6Douglas Gregor} 2710089459a16bf7e9cd10617d1fac5ec0240a0a1ee6Douglas Gregor 27112cd00932b9b5403047139ce8cfaa3ae47966f894Douglas GregorDecl *ASTNodeImporter::VisitImplicitParamDecl(ImplicitParamDecl *D) { 27122cd00932b9b5403047139ce8cfaa3ae47966f894Douglas Gregor // Parameters are created in the translation unit's context, then moved 27132cd00932b9b5403047139ce8cfaa3ae47966f894Douglas Gregor // into the function declaration's context afterward. 27142cd00932b9b5403047139ce8cfaa3ae47966f894Douglas Gregor DeclContext *DC = Importer.getToContext().getTranslationUnitDecl(); 27152cd00932b9b5403047139ce8cfaa3ae47966f894Douglas Gregor 27162cd00932b9b5403047139ce8cfaa3ae47966f894Douglas Gregor // Import the name of this declaration. 27172cd00932b9b5403047139ce8cfaa3ae47966f894Douglas Gregor DeclarationName Name = Importer.Import(D->getDeclName()); 27182cd00932b9b5403047139ce8cfaa3ae47966f894Douglas Gregor if (D->getDeclName() && !Name) 27192cd00932b9b5403047139ce8cfaa3ae47966f894Douglas Gregor return 0; 27202cd00932b9b5403047139ce8cfaa3ae47966f894Douglas Gregor 27212cd00932b9b5403047139ce8cfaa3ae47966f894Douglas Gregor // Import the location of this declaration. 27222cd00932b9b5403047139ce8cfaa3ae47966f894Douglas Gregor SourceLocation Loc = Importer.Import(D->getLocation()); 27232cd00932b9b5403047139ce8cfaa3ae47966f894Douglas Gregor 27242cd00932b9b5403047139ce8cfaa3ae47966f894Douglas Gregor // Import the parameter's type. 27252cd00932b9b5403047139ce8cfaa3ae47966f894Douglas Gregor QualType T = Importer.Import(D->getType()); 27262cd00932b9b5403047139ce8cfaa3ae47966f894Douglas Gregor if (T.isNull()) 27272cd00932b9b5403047139ce8cfaa3ae47966f894Douglas Gregor return 0; 27282cd00932b9b5403047139ce8cfaa3ae47966f894Douglas Gregor 27292cd00932b9b5403047139ce8cfaa3ae47966f894Douglas Gregor // Create the imported parameter. 27302cd00932b9b5403047139ce8cfaa3ae47966f894Douglas Gregor ImplicitParamDecl *ToParm 27312cd00932b9b5403047139ce8cfaa3ae47966f894Douglas Gregor = ImplicitParamDecl::Create(Importer.getToContext(), DC, 27322cd00932b9b5403047139ce8cfaa3ae47966f894Douglas Gregor Loc, Name.getAsIdentifierInfo(), 27332cd00932b9b5403047139ce8cfaa3ae47966f894Douglas Gregor T); 27342cd00932b9b5403047139ce8cfaa3ae47966f894Douglas Gregor return Importer.Imported(D, ToParm); 27352cd00932b9b5403047139ce8cfaa3ae47966f894Douglas Gregor} 27362cd00932b9b5403047139ce8cfaa3ae47966f894Douglas Gregor 2737a404ea673cbee5e74af710a5f1ab571e71580b67Douglas GregorDecl *ASTNodeImporter::VisitParmVarDecl(ParmVarDecl *D) { 2738a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor // Parameters are created in the translation unit's context, then moved 2739a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor // into the function declaration's context afterward. 2740a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor DeclContext *DC = Importer.getToContext().getTranslationUnitDecl(); 2741a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor 274282fc4bfa6f8ea35488b9038dd83d40766c3645cfDouglas Gregor // Import the name of this declaration. 274382fc4bfa6f8ea35488b9038dd83d40766c3645cfDouglas Gregor DeclarationName Name = Importer.Import(D->getDeclName()); 274482fc4bfa6f8ea35488b9038dd83d40766c3645cfDouglas Gregor if (D->getDeclName() && !Name) 274582fc4bfa6f8ea35488b9038dd83d40766c3645cfDouglas Gregor return 0; 274682fc4bfa6f8ea35488b9038dd83d40766c3645cfDouglas Gregor 2747a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor // Import the location of this declaration. 2748a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor SourceLocation Loc = Importer.Import(D->getLocation()); 2749a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor 2750a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor // Import the parameter's type. 2751a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor QualType T = Importer.Import(D->getType()); 275282fc4bfa6f8ea35488b9038dd83d40766c3645cfDouglas Gregor if (T.isNull()) 275382fc4bfa6f8ea35488b9038dd83d40766c3645cfDouglas Gregor return 0; 275482fc4bfa6f8ea35488b9038dd83d40766c3645cfDouglas Gregor 2755a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor // Create the imported parameter. 2756a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor TypeSourceInfo *TInfo = Importer.Import(D->getTypeSourceInfo()); 2757a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor ParmVarDecl *ToParm = ParmVarDecl::Create(Importer.getToContext(), DC, 2758ff676cb48fe8bf7be2feaa251dc7c5fb15af4730Abramo Bagnara Importer.Import(D->getInnerLocStart()), 2759a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor Loc, Name.getAsIdentifierInfo(), 2760a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor T, TInfo, D->getStorageClass(), 276116573fa9705b546b7597c273b25b85d6321e2b33Douglas Gregor D->getStorageClassAsWritten(), 2762a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor /*FIXME: Default argument*/ 0); 2763bf73b352acb7a2d041ce8b50171dd7f8e2b2c1bbJohn McCall ToParm->setHasInheritedDefaultArg(D->hasInheritedDefaultArg()); 27645ce5dab3c30e4255b8f62b148b6a86f09a444aaaDouglas Gregor return Importer.Imported(D, ToParm); 2765a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor} 276682fc4bfa6f8ea35488b9038dd83d40766c3645cfDouglas Gregor 2767c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas GregorDecl *ASTNodeImporter::VisitObjCMethodDecl(ObjCMethodDecl *D) { 2768c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor // Import the major distinguishing characteristics of a method. 2769c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor DeclContext *DC, *LexicalDC; 2770c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor DeclarationName Name; 2771c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor SourceLocation Loc; 2772c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor if (ImportDeclParts(D, DC, LexicalDC, Name, Loc)) 2773c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor return 0; 2774c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor 2775c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor for (DeclContext::lookup_result Lookup = DC->lookup(Name); 2776c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor Lookup.first != Lookup.second; 2777c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor ++Lookup.first) { 2778c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor if (ObjCMethodDecl *FoundMethod = dyn_cast<ObjCMethodDecl>(*Lookup.first)) { 2779c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor if (FoundMethod->isInstanceMethod() != D->isInstanceMethod()) 2780c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor continue; 2781c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor 2782c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor // Check return types. 2783c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor if (!Importer.IsStructurallyEquivalent(D->getResultType(), 2784c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor FoundMethod->getResultType())) { 2785c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor Importer.ToDiag(Loc, diag::err_odr_objc_method_result_type_inconsistent) 2786c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor << D->isInstanceMethod() << Name 2787c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor << D->getResultType() << FoundMethod->getResultType(); 2788c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor Importer.ToDiag(FoundMethod->getLocation(), 2789c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor diag::note_odr_objc_method_here) 2790c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor << D->isInstanceMethod() << Name; 2791c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor return 0; 2792c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor } 2793c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor 2794c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor // Check the number of parameters. 2795c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor if (D->param_size() != FoundMethod->param_size()) { 2796c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor Importer.ToDiag(Loc, diag::err_odr_objc_method_num_params_inconsistent) 2797c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor << D->isInstanceMethod() << Name 2798c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor << D->param_size() << FoundMethod->param_size(); 2799c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor Importer.ToDiag(FoundMethod->getLocation(), 2800c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor diag::note_odr_objc_method_here) 2801c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor << D->isInstanceMethod() << Name; 2802c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor return 0; 2803c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor } 2804c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor 2805c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor // Check parameter types. 2806c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor for (ObjCMethodDecl::param_iterator P = D->param_begin(), 2807c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor PEnd = D->param_end(), FoundP = FoundMethod->param_begin(); 2808c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor P != PEnd; ++P, ++FoundP) { 2809c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor if (!Importer.IsStructurallyEquivalent((*P)->getType(), 2810c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor (*FoundP)->getType())) { 2811c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor Importer.FromDiag((*P)->getLocation(), 2812c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor diag::err_odr_objc_method_param_type_inconsistent) 2813c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor << D->isInstanceMethod() << Name 2814c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor << (*P)->getType() << (*FoundP)->getType(); 2815c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor Importer.ToDiag((*FoundP)->getLocation(), diag::note_odr_value_here) 2816c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor << (*FoundP)->getType(); 2817c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor return 0; 2818c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor } 2819c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor } 2820c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor 2821c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor // Check variadic/non-variadic. 2822c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor // Check the number of parameters. 2823c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor if (D->isVariadic() != FoundMethod->isVariadic()) { 2824c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor Importer.ToDiag(Loc, diag::err_odr_objc_method_variadic_inconsistent) 2825c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor << D->isInstanceMethod() << Name; 2826c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor Importer.ToDiag(FoundMethod->getLocation(), 2827c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor diag::note_odr_objc_method_here) 2828c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor << D->isInstanceMethod() << Name; 2829c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor return 0; 2830c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor } 2831c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor 2832c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor // FIXME: Any other bits we need to merge? 2833c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor return Importer.Imported(D, FoundMethod); 2834c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor } 2835c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor } 2836c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor 2837c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor // Import the result type. 2838c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor QualType ResultTy = Importer.Import(D->getResultType()); 2839c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor if (ResultTy.isNull()) 2840c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor return 0; 2841c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor 28424bc1cb6aa635a5bf8fae99bf69c56c724c1e786cDouglas Gregor TypeSourceInfo *ResultTInfo = Importer.Import(D->getResultTypeSourceInfo()); 28434bc1cb6aa635a5bf8fae99bf69c56c724c1e786cDouglas Gregor 2844c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor ObjCMethodDecl *ToMethod 2845c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor = ObjCMethodDecl::Create(Importer.getToContext(), 2846c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor Loc, 2847c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor Importer.Import(D->getLocEnd()), 2848c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor Name.getObjCSelector(), 28494bc1cb6aa635a5bf8fae99bf69c56c724c1e786cDouglas Gregor ResultTy, ResultTInfo, DC, 2850c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor D->isInstanceMethod(), 2851c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor D->isVariadic(), 2852c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor D->isSynthesized(), 28533fe104154dd2e8ffb351142d74f308938b5c99bfFariborz Jahanian D->isDefined(), 2854c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor D->getImplementationControl()); 2855c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor 2856c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor // FIXME: When we decide to merge method definitions, we'll need to 2857c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor // deal with implicit parameters. 2858c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor 2859c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor // Import the parameters 2860c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor llvm::SmallVector<ParmVarDecl *, 5> ToParams; 2861c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor for (ObjCMethodDecl::param_iterator FromP = D->param_begin(), 2862c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor FromPEnd = D->param_end(); 2863c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor FromP != FromPEnd; 2864c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor ++FromP) { 2865c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor ParmVarDecl *ToP = cast_or_null<ParmVarDecl>(Importer.Import(*FromP)); 2866c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor if (!ToP) 2867c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor return 0; 2868c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor 2869c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor ToParams.push_back(ToP); 2870c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor } 2871c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor 2872c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor // Set the parameters. 2873c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor for (unsigned I = 0, N = ToParams.size(); I != N; ++I) { 2874c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor ToParams[I]->setOwningFunction(ToMethod); 2875c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor ToMethod->addDecl(ToParams[I]); 2876c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor } 2877c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor ToMethod->setMethodParams(Importer.getToContext(), 28784ecb25fa94897b2c03510292acace710e5262ba5Fariborz Jahanian ToParams.data(), ToParams.size(), 28794ecb25fa94897b2c03510292acace710e5262ba5Fariborz Jahanian ToParams.size()); 2880c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor 2881c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor ToMethod->setLexicalDeclContext(LexicalDC); 2882c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor Importer.Imported(D, ToMethod); 2883c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor LexicalDC->addDecl(ToMethod); 2884c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor return ToMethod; 2885c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor} 2886c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor 2887b4677b62a8e9bba0913dfe1456bd9d689cdbccacDouglas GregorDecl *ASTNodeImporter::VisitObjCCategoryDecl(ObjCCategoryDecl *D) { 2888b4677b62a8e9bba0913dfe1456bd9d689cdbccacDouglas Gregor // Import the major distinguishing characteristics of a category. 2889b4677b62a8e9bba0913dfe1456bd9d689cdbccacDouglas Gregor DeclContext *DC, *LexicalDC; 2890b4677b62a8e9bba0913dfe1456bd9d689cdbccacDouglas Gregor DeclarationName Name; 2891b4677b62a8e9bba0913dfe1456bd9d689cdbccacDouglas Gregor SourceLocation Loc; 2892b4677b62a8e9bba0913dfe1456bd9d689cdbccacDouglas Gregor if (ImportDeclParts(D, DC, LexicalDC, Name, Loc)) 2893b4677b62a8e9bba0913dfe1456bd9d689cdbccacDouglas Gregor return 0; 2894b4677b62a8e9bba0913dfe1456bd9d689cdbccacDouglas Gregor 2895b4677b62a8e9bba0913dfe1456bd9d689cdbccacDouglas Gregor ObjCInterfaceDecl *ToInterface 2896b4677b62a8e9bba0913dfe1456bd9d689cdbccacDouglas Gregor = cast_or_null<ObjCInterfaceDecl>(Importer.Import(D->getClassInterface())); 2897b4677b62a8e9bba0913dfe1456bd9d689cdbccacDouglas Gregor if (!ToInterface) 2898b4677b62a8e9bba0913dfe1456bd9d689cdbccacDouglas Gregor return 0; 2899b4677b62a8e9bba0913dfe1456bd9d689cdbccacDouglas Gregor 2900b4677b62a8e9bba0913dfe1456bd9d689cdbccacDouglas Gregor // Determine if we've already encountered this category. 2901b4677b62a8e9bba0913dfe1456bd9d689cdbccacDouglas Gregor ObjCCategoryDecl *MergeWithCategory 2902b4677b62a8e9bba0913dfe1456bd9d689cdbccacDouglas Gregor = ToInterface->FindCategoryDeclaration(Name.getAsIdentifierInfo()); 2903b4677b62a8e9bba0913dfe1456bd9d689cdbccacDouglas Gregor ObjCCategoryDecl *ToCategory = MergeWithCategory; 2904b4677b62a8e9bba0913dfe1456bd9d689cdbccacDouglas Gregor if (!ToCategory) { 2905b4677b62a8e9bba0913dfe1456bd9d689cdbccacDouglas Gregor ToCategory = ObjCCategoryDecl::Create(Importer.getToContext(), DC, 2906b4677b62a8e9bba0913dfe1456bd9d689cdbccacDouglas Gregor Importer.Import(D->getAtLoc()), 2907b4677b62a8e9bba0913dfe1456bd9d689cdbccacDouglas Gregor Loc, 2908b4677b62a8e9bba0913dfe1456bd9d689cdbccacDouglas Gregor Importer.Import(D->getCategoryNameLoc()), 2909b4677b62a8e9bba0913dfe1456bd9d689cdbccacDouglas Gregor Name.getAsIdentifierInfo()); 2910b4677b62a8e9bba0913dfe1456bd9d689cdbccacDouglas Gregor ToCategory->setLexicalDeclContext(LexicalDC); 2911b4677b62a8e9bba0913dfe1456bd9d689cdbccacDouglas Gregor LexicalDC->addDecl(ToCategory); 2912b4677b62a8e9bba0913dfe1456bd9d689cdbccacDouglas Gregor Importer.Imported(D, ToCategory); 2913b4677b62a8e9bba0913dfe1456bd9d689cdbccacDouglas Gregor 2914b4677b62a8e9bba0913dfe1456bd9d689cdbccacDouglas Gregor // Link this category into its class's category list. 2915b4677b62a8e9bba0913dfe1456bd9d689cdbccacDouglas Gregor ToCategory->setClassInterface(ToInterface); 2916b4677b62a8e9bba0913dfe1456bd9d689cdbccacDouglas Gregor ToCategory->insertNextClassCategory(); 2917b4677b62a8e9bba0913dfe1456bd9d689cdbccacDouglas Gregor 2918b4677b62a8e9bba0913dfe1456bd9d689cdbccacDouglas Gregor // Import protocols 2919b4677b62a8e9bba0913dfe1456bd9d689cdbccacDouglas Gregor llvm::SmallVector<ObjCProtocolDecl *, 4> Protocols; 2920b4677b62a8e9bba0913dfe1456bd9d689cdbccacDouglas Gregor llvm::SmallVector<SourceLocation, 4> ProtocolLocs; 2921b4677b62a8e9bba0913dfe1456bd9d689cdbccacDouglas Gregor ObjCCategoryDecl::protocol_loc_iterator FromProtoLoc 2922b4677b62a8e9bba0913dfe1456bd9d689cdbccacDouglas Gregor = D->protocol_loc_begin(); 2923b4677b62a8e9bba0913dfe1456bd9d689cdbccacDouglas Gregor for (ObjCCategoryDecl::protocol_iterator FromProto = D->protocol_begin(), 2924b4677b62a8e9bba0913dfe1456bd9d689cdbccacDouglas Gregor FromProtoEnd = D->protocol_end(); 2925b4677b62a8e9bba0913dfe1456bd9d689cdbccacDouglas Gregor FromProto != FromProtoEnd; 2926b4677b62a8e9bba0913dfe1456bd9d689cdbccacDouglas Gregor ++FromProto, ++FromProtoLoc) { 2927b4677b62a8e9bba0913dfe1456bd9d689cdbccacDouglas Gregor ObjCProtocolDecl *ToProto 2928b4677b62a8e9bba0913dfe1456bd9d689cdbccacDouglas Gregor = cast_or_null<ObjCProtocolDecl>(Importer.Import(*FromProto)); 2929b4677b62a8e9bba0913dfe1456bd9d689cdbccacDouglas Gregor if (!ToProto) 2930b4677b62a8e9bba0913dfe1456bd9d689cdbccacDouglas Gregor return 0; 2931b4677b62a8e9bba0913dfe1456bd9d689cdbccacDouglas Gregor Protocols.push_back(ToProto); 2932b4677b62a8e9bba0913dfe1456bd9d689cdbccacDouglas Gregor ProtocolLocs.push_back(Importer.Import(*FromProtoLoc)); 2933b4677b62a8e9bba0913dfe1456bd9d689cdbccacDouglas Gregor } 2934b4677b62a8e9bba0913dfe1456bd9d689cdbccacDouglas Gregor 2935b4677b62a8e9bba0913dfe1456bd9d689cdbccacDouglas Gregor // FIXME: If we're merging, make sure that the protocol list is the same. 2936b4677b62a8e9bba0913dfe1456bd9d689cdbccacDouglas Gregor ToCategory->setProtocolList(Protocols.data(), Protocols.size(), 2937b4677b62a8e9bba0913dfe1456bd9d689cdbccacDouglas Gregor ProtocolLocs.data(), Importer.getToContext()); 2938b4677b62a8e9bba0913dfe1456bd9d689cdbccacDouglas Gregor 2939b4677b62a8e9bba0913dfe1456bd9d689cdbccacDouglas Gregor } else { 2940b4677b62a8e9bba0913dfe1456bd9d689cdbccacDouglas Gregor Importer.Imported(D, ToCategory); 2941b4677b62a8e9bba0913dfe1456bd9d689cdbccacDouglas Gregor } 2942b4677b62a8e9bba0913dfe1456bd9d689cdbccacDouglas Gregor 2943b4677b62a8e9bba0913dfe1456bd9d689cdbccacDouglas Gregor // Import all of the members of this category. 2944083a821bbd02bbc521275a2f144abe39a6c2745cDouglas Gregor ImportDeclContext(D); 2945b4677b62a8e9bba0913dfe1456bd9d689cdbccacDouglas Gregor 2946b4677b62a8e9bba0913dfe1456bd9d689cdbccacDouglas Gregor // If we have an implementation, import it as well. 2947b4677b62a8e9bba0913dfe1456bd9d689cdbccacDouglas Gregor if (D->getImplementation()) { 2948b4677b62a8e9bba0913dfe1456bd9d689cdbccacDouglas Gregor ObjCCategoryImplDecl *Impl 2949cad2c59b0c087edea83d0fbf6eabde4a7960c778Douglas Gregor = cast_or_null<ObjCCategoryImplDecl>( 2950cad2c59b0c087edea83d0fbf6eabde4a7960c778Douglas Gregor Importer.Import(D->getImplementation())); 2951b4677b62a8e9bba0913dfe1456bd9d689cdbccacDouglas Gregor if (!Impl) 2952b4677b62a8e9bba0913dfe1456bd9d689cdbccacDouglas Gregor return 0; 2953b4677b62a8e9bba0913dfe1456bd9d689cdbccacDouglas Gregor 2954b4677b62a8e9bba0913dfe1456bd9d689cdbccacDouglas Gregor ToCategory->setImplementation(Impl); 2955b4677b62a8e9bba0913dfe1456bd9d689cdbccacDouglas Gregor } 2956b4677b62a8e9bba0913dfe1456bd9d689cdbccacDouglas Gregor 2957b4677b62a8e9bba0913dfe1456bd9d689cdbccacDouglas Gregor return ToCategory; 2958b4677b62a8e9bba0913dfe1456bd9d689cdbccacDouglas Gregor} 2959b4677b62a8e9bba0913dfe1456bd9d689cdbccacDouglas Gregor 29602e2a400383c7a64a927f61eeed596b08928e1d4bDouglas GregorDecl *ASTNodeImporter::VisitObjCProtocolDecl(ObjCProtocolDecl *D) { 2961b4677b62a8e9bba0913dfe1456bd9d689cdbccacDouglas Gregor // Import the major distinguishing characteristics of a protocol. 29622e2a400383c7a64a927f61eeed596b08928e1d4bDouglas Gregor DeclContext *DC, *LexicalDC; 29632e2a400383c7a64a927f61eeed596b08928e1d4bDouglas Gregor DeclarationName Name; 29642e2a400383c7a64a927f61eeed596b08928e1d4bDouglas Gregor SourceLocation Loc; 29652e2a400383c7a64a927f61eeed596b08928e1d4bDouglas Gregor if (ImportDeclParts(D, DC, LexicalDC, Name, Loc)) 29662e2a400383c7a64a927f61eeed596b08928e1d4bDouglas Gregor return 0; 29672e2a400383c7a64a927f61eeed596b08928e1d4bDouglas Gregor 29682e2a400383c7a64a927f61eeed596b08928e1d4bDouglas Gregor ObjCProtocolDecl *MergeWithProtocol = 0; 29692e2a400383c7a64a927f61eeed596b08928e1d4bDouglas Gregor for (DeclContext::lookup_result Lookup = DC->lookup(Name); 29702e2a400383c7a64a927f61eeed596b08928e1d4bDouglas Gregor Lookup.first != Lookup.second; 29712e2a400383c7a64a927f61eeed596b08928e1d4bDouglas Gregor ++Lookup.first) { 29722e2a400383c7a64a927f61eeed596b08928e1d4bDouglas Gregor if (!(*Lookup.first)->isInIdentifierNamespace(Decl::IDNS_ObjCProtocol)) 29732e2a400383c7a64a927f61eeed596b08928e1d4bDouglas Gregor continue; 29742e2a400383c7a64a927f61eeed596b08928e1d4bDouglas Gregor 29752e2a400383c7a64a927f61eeed596b08928e1d4bDouglas Gregor if ((MergeWithProtocol = dyn_cast<ObjCProtocolDecl>(*Lookup.first))) 29762e2a400383c7a64a927f61eeed596b08928e1d4bDouglas Gregor break; 29772e2a400383c7a64a927f61eeed596b08928e1d4bDouglas Gregor } 29782e2a400383c7a64a927f61eeed596b08928e1d4bDouglas Gregor 29792e2a400383c7a64a927f61eeed596b08928e1d4bDouglas Gregor ObjCProtocolDecl *ToProto = MergeWithProtocol; 29802e2a400383c7a64a927f61eeed596b08928e1d4bDouglas Gregor if (!ToProto || ToProto->isForwardDecl()) { 29812e2a400383c7a64a927f61eeed596b08928e1d4bDouglas Gregor if (!ToProto) { 29822e2a400383c7a64a927f61eeed596b08928e1d4bDouglas Gregor ToProto = ObjCProtocolDecl::Create(Importer.getToContext(), DC, Loc, 29832e2a400383c7a64a927f61eeed596b08928e1d4bDouglas Gregor Name.getAsIdentifierInfo()); 29842e2a400383c7a64a927f61eeed596b08928e1d4bDouglas Gregor ToProto->setForwardDecl(D->isForwardDecl()); 29852e2a400383c7a64a927f61eeed596b08928e1d4bDouglas Gregor ToProto->setLexicalDeclContext(LexicalDC); 29862e2a400383c7a64a927f61eeed596b08928e1d4bDouglas Gregor LexicalDC->addDecl(ToProto); 29872e2a400383c7a64a927f61eeed596b08928e1d4bDouglas Gregor } 29882e2a400383c7a64a927f61eeed596b08928e1d4bDouglas Gregor Importer.Imported(D, ToProto); 29892e2a400383c7a64a927f61eeed596b08928e1d4bDouglas Gregor 29902e2a400383c7a64a927f61eeed596b08928e1d4bDouglas Gregor // Import protocols 29912e2a400383c7a64a927f61eeed596b08928e1d4bDouglas Gregor llvm::SmallVector<ObjCProtocolDecl *, 4> Protocols; 29922e2a400383c7a64a927f61eeed596b08928e1d4bDouglas Gregor llvm::SmallVector<SourceLocation, 4> ProtocolLocs; 29932e2a400383c7a64a927f61eeed596b08928e1d4bDouglas Gregor ObjCProtocolDecl::protocol_loc_iterator 29942e2a400383c7a64a927f61eeed596b08928e1d4bDouglas Gregor FromProtoLoc = D->protocol_loc_begin(); 29952e2a400383c7a64a927f61eeed596b08928e1d4bDouglas Gregor for (ObjCProtocolDecl::protocol_iterator FromProto = D->protocol_begin(), 29962e2a400383c7a64a927f61eeed596b08928e1d4bDouglas Gregor FromProtoEnd = D->protocol_end(); 29972e2a400383c7a64a927f61eeed596b08928e1d4bDouglas Gregor FromProto != FromProtoEnd; 29982e2a400383c7a64a927f61eeed596b08928e1d4bDouglas Gregor ++FromProto, ++FromProtoLoc) { 29992e2a400383c7a64a927f61eeed596b08928e1d4bDouglas Gregor ObjCProtocolDecl *ToProto 30002e2a400383c7a64a927f61eeed596b08928e1d4bDouglas Gregor = cast_or_null<ObjCProtocolDecl>(Importer.Import(*FromProto)); 30012e2a400383c7a64a927f61eeed596b08928e1d4bDouglas Gregor if (!ToProto) 30022e2a400383c7a64a927f61eeed596b08928e1d4bDouglas Gregor return 0; 30032e2a400383c7a64a927f61eeed596b08928e1d4bDouglas Gregor Protocols.push_back(ToProto); 30042e2a400383c7a64a927f61eeed596b08928e1d4bDouglas Gregor ProtocolLocs.push_back(Importer.Import(*FromProtoLoc)); 30052e2a400383c7a64a927f61eeed596b08928e1d4bDouglas Gregor } 30062e2a400383c7a64a927f61eeed596b08928e1d4bDouglas Gregor 30072e2a400383c7a64a927f61eeed596b08928e1d4bDouglas Gregor // FIXME: If we're merging, make sure that the protocol list is the same. 30082e2a400383c7a64a927f61eeed596b08928e1d4bDouglas Gregor ToProto->setProtocolList(Protocols.data(), Protocols.size(), 30092e2a400383c7a64a927f61eeed596b08928e1d4bDouglas Gregor ProtocolLocs.data(), Importer.getToContext()); 30102e2a400383c7a64a927f61eeed596b08928e1d4bDouglas Gregor } else { 30112e2a400383c7a64a927f61eeed596b08928e1d4bDouglas Gregor Importer.Imported(D, ToProto); 30122e2a400383c7a64a927f61eeed596b08928e1d4bDouglas Gregor } 30132e2a400383c7a64a927f61eeed596b08928e1d4bDouglas Gregor 3014b4677b62a8e9bba0913dfe1456bd9d689cdbccacDouglas Gregor // Import all of the members of this protocol. 3015083a821bbd02bbc521275a2f144abe39a6c2745cDouglas Gregor ImportDeclContext(D); 30162e2a400383c7a64a927f61eeed596b08928e1d4bDouglas Gregor 30172e2a400383c7a64a927f61eeed596b08928e1d4bDouglas Gregor return ToProto; 30182e2a400383c7a64a927f61eeed596b08928e1d4bDouglas Gregor} 30192e2a400383c7a64a927f61eeed596b08928e1d4bDouglas Gregor 3020a12d294db5bd59cd8836b9bd0dafadaaa2e3dd8aDouglas GregorDecl *ASTNodeImporter::VisitObjCInterfaceDecl(ObjCInterfaceDecl *D) { 3021a12d294db5bd59cd8836b9bd0dafadaaa2e3dd8aDouglas Gregor // Import the major distinguishing characteristics of an @interface. 3022a12d294db5bd59cd8836b9bd0dafadaaa2e3dd8aDouglas Gregor DeclContext *DC, *LexicalDC; 3023a12d294db5bd59cd8836b9bd0dafadaaa2e3dd8aDouglas Gregor DeclarationName Name; 3024a12d294db5bd59cd8836b9bd0dafadaaa2e3dd8aDouglas Gregor SourceLocation Loc; 3025a12d294db5bd59cd8836b9bd0dafadaaa2e3dd8aDouglas Gregor if (ImportDeclParts(D, DC, LexicalDC, Name, Loc)) 3026a12d294db5bd59cd8836b9bd0dafadaaa2e3dd8aDouglas Gregor return 0; 3027a12d294db5bd59cd8836b9bd0dafadaaa2e3dd8aDouglas Gregor 3028a12d294db5bd59cd8836b9bd0dafadaaa2e3dd8aDouglas Gregor ObjCInterfaceDecl *MergeWithIface = 0; 3029a12d294db5bd59cd8836b9bd0dafadaaa2e3dd8aDouglas Gregor for (DeclContext::lookup_result Lookup = DC->lookup(Name); 3030a12d294db5bd59cd8836b9bd0dafadaaa2e3dd8aDouglas Gregor Lookup.first != Lookup.second; 3031a12d294db5bd59cd8836b9bd0dafadaaa2e3dd8aDouglas Gregor ++Lookup.first) { 3032a12d294db5bd59cd8836b9bd0dafadaaa2e3dd8aDouglas Gregor if (!(*Lookup.first)->isInIdentifierNamespace(Decl::IDNS_Ordinary)) 3033a12d294db5bd59cd8836b9bd0dafadaaa2e3dd8aDouglas Gregor continue; 3034a12d294db5bd59cd8836b9bd0dafadaaa2e3dd8aDouglas Gregor 3035a12d294db5bd59cd8836b9bd0dafadaaa2e3dd8aDouglas Gregor if ((MergeWithIface = dyn_cast<ObjCInterfaceDecl>(*Lookup.first))) 3036a12d294db5bd59cd8836b9bd0dafadaaa2e3dd8aDouglas Gregor break; 3037a12d294db5bd59cd8836b9bd0dafadaaa2e3dd8aDouglas Gregor } 3038a12d294db5bd59cd8836b9bd0dafadaaa2e3dd8aDouglas Gregor 3039a12d294db5bd59cd8836b9bd0dafadaaa2e3dd8aDouglas Gregor ObjCInterfaceDecl *ToIface = MergeWithIface; 3040a12d294db5bd59cd8836b9bd0dafadaaa2e3dd8aDouglas Gregor if (!ToIface || ToIface->isForwardDecl()) { 3041a12d294db5bd59cd8836b9bd0dafadaaa2e3dd8aDouglas Gregor if (!ToIface) { 3042a12d294db5bd59cd8836b9bd0dafadaaa2e3dd8aDouglas Gregor ToIface = ObjCInterfaceDecl::Create(Importer.getToContext(), 3043a12d294db5bd59cd8836b9bd0dafadaaa2e3dd8aDouglas Gregor DC, Loc, 3044a12d294db5bd59cd8836b9bd0dafadaaa2e3dd8aDouglas Gregor Name.getAsIdentifierInfo(), 3045deacbdca554298ccdf636f19c6094a8825ec6b34Douglas Gregor Importer.Import(D->getClassLoc()), 3046a12d294db5bd59cd8836b9bd0dafadaaa2e3dd8aDouglas Gregor D->isForwardDecl(), 3047a12d294db5bd59cd8836b9bd0dafadaaa2e3dd8aDouglas Gregor D->isImplicitInterfaceDecl()); 30482e2a400383c7a64a927f61eeed596b08928e1d4bDouglas Gregor ToIface->setForwardDecl(D->isForwardDecl()); 3049a12d294db5bd59cd8836b9bd0dafadaaa2e3dd8aDouglas Gregor ToIface->setLexicalDeclContext(LexicalDC); 3050a12d294db5bd59cd8836b9bd0dafadaaa2e3dd8aDouglas Gregor LexicalDC->addDecl(ToIface); 3051a12d294db5bd59cd8836b9bd0dafadaaa2e3dd8aDouglas Gregor } 3052a12d294db5bd59cd8836b9bd0dafadaaa2e3dd8aDouglas Gregor Importer.Imported(D, ToIface); 3053a12d294db5bd59cd8836b9bd0dafadaaa2e3dd8aDouglas Gregor 3054a12d294db5bd59cd8836b9bd0dafadaaa2e3dd8aDouglas Gregor if (D->getSuperClass()) { 3055a12d294db5bd59cd8836b9bd0dafadaaa2e3dd8aDouglas Gregor ObjCInterfaceDecl *Super 3056a12d294db5bd59cd8836b9bd0dafadaaa2e3dd8aDouglas Gregor = cast_or_null<ObjCInterfaceDecl>(Importer.Import(D->getSuperClass())); 3057a12d294db5bd59cd8836b9bd0dafadaaa2e3dd8aDouglas Gregor if (!Super) 3058a12d294db5bd59cd8836b9bd0dafadaaa2e3dd8aDouglas Gregor return 0; 3059a12d294db5bd59cd8836b9bd0dafadaaa2e3dd8aDouglas Gregor 3060a12d294db5bd59cd8836b9bd0dafadaaa2e3dd8aDouglas Gregor ToIface->setSuperClass(Super); 3061a12d294db5bd59cd8836b9bd0dafadaaa2e3dd8aDouglas Gregor ToIface->setSuperClassLoc(Importer.Import(D->getSuperClassLoc())); 3062a12d294db5bd59cd8836b9bd0dafadaaa2e3dd8aDouglas Gregor } 3063a12d294db5bd59cd8836b9bd0dafadaaa2e3dd8aDouglas Gregor 3064a12d294db5bd59cd8836b9bd0dafadaaa2e3dd8aDouglas Gregor // Import protocols 3065a12d294db5bd59cd8836b9bd0dafadaaa2e3dd8aDouglas Gregor llvm::SmallVector<ObjCProtocolDecl *, 4> Protocols; 3066a12d294db5bd59cd8836b9bd0dafadaaa2e3dd8aDouglas Gregor llvm::SmallVector<SourceLocation, 4> ProtocolLocs; 3067a12d294db5bd59cd8836b9bd0dafadaaa2e3dd8aDouglas Gregor ObjCInterfaceDecl::protocol_loc_iterator 3068a12d294db5bd59cd8836b9bd0dafadaaa2e3dd8aDouglas Gregor FromProtoLoc = D->protocol_loc_begin(); 306953b9441b5a81a24fa1f66f3f6416f1e36baa9c2fTed Kremenek 307053b9441b5a81a24fa1f66f3f6416f1e36baa9c2fTed Kremenek // FIXME: Should we be usng all_referenced_protocol_begin() here? 3071a12d294db5bd59cd8836b9bd0dafadaaa2e3dd8aDouglas Gregor for (ObjCInterfaceDecl::protocol_iterator FromProto = D->protocol_begin(), 3072a12d294db5bd59cd8836b9bd0dafadaaa2e3dd8aDouglas Gregor FromProtoEnd = D->protocol_end(); 3073a12d294db5bd59cd8836b9bd0dafadaaa2e3dd8aDouglas Gregor FromProto != FromProtoEnd; 3074a12d294db5bd59cd8836b9bd0dafadaaa2e3dd8aDouglas Gregor ++FromProto, ++FromProtoLoc) { 3075a12d294db5bd59cd8836b9bd0dafadaaa2e3dd8aDouglas Gregor ObjCProtocolDecl *ToProto 3076a12d294db5bd59cd8836b9bd0dafadaaa2e3dd8aDouglas Gregor = cast_or_null<ObjCProtocolDecl>(Importer.Import(*FromProto)); 3077a12d294db5bd59cd8836b9bd0dafadaaa2e3dd8aDouglas Gregor if (!ToProto) 3078a12d294db5bd59cd8836b9bd0dafadaaa2e3dd8aDouglas Gregor return 0; 3079a12d294db5bd59cd8836b9bd0dafadaaa2e3dd8aDouglas Gregor Protocols.push_back(ToProto); 3080a12d294db5bd59cd8836b9bd0dafadaaa2e3dd8aDouglas Gregor ProtocolLocs.push_back(Importer.Import(*FromProtoLoc)); 3081a12d294db5bd59cd8836b9bd0dafadaaa2e3dd8aDouglas Gregor } 3082a12d294db5bd59cd8836b9bd0dafadaaa2e3dd8aDouglas Gregor 3083a12d294db5bd59cd8836b9bd0dafadaaa2e3dd8aDouglas Gregor // FIXME: If we're merging, make sure that the protocol list is the same. 3084a12d294db5bd59cd8836b9bd0dafadaaa2e3dd8aDouglas Gregor ToIface->setProtocolList(Protocols.data(), Protocols.size(), 3085a12d294db5bd59cd8836b9bd0dafadaaa2e3dd8aDouglas Gregor ProtocolLocs.data(), Importer.getToContext()); 3086a12d294db5bd59cd8836b9bd0dafadaaa2e3dd8aDouglas Gregor 3087a12d294db5bd59cd8836b9bd0dafadaaa2e3dd8aDouglas Gregor // Import @end range 3088a12d294db5bd59cd8836b9bd0dafadaaa2e3dd8aDouglas Gregor ToIface->setAtEndRange(Importer.Import(D->getAtEndRange())); 3089a12d294db5bd59cd8836b9bd0dafadaaa2e3dd8aDouglas Gregor } else { 3090a12d294db5bd59cd8836b9bd0dafadaaa2e3dd8aDouglas Gregor Importer.Imported(D, ToIface); 30912e55e3af2f6d6c0509495357fade95105dd144cdDouglas Gregor 30922e55e3af2f6d6c0509495357fade95105dd144cdDouglas Gregor // Check for consistency of superclasses. 30932e55e3af2f6d6c0509495357fade95105dd144cdDouglas Gregor DeclarationName FromSuperName, ToSuperName; 30942e55e3af2f6d6c0509495357fade95105dd144cdDouglas Gregor if (D->getSuperClass()) 30952e55e3af2f6d6c0509495357fade95105dd144cdDouglas Gregor FromSuperName = Importer.Import(D->getSuperClass()->getDeclName()); 30962e55e3af2f6d6c0509495357fade95105dd144cdDouglas Gregor if (ToIface->getSuperClass()) 30972e55e3af2f6d6c0509495357fade95105dd144cdDouglas Gregor ToSuperName = ToIface->getSuperClass()->getDeclName(); 30982e55e3af2f6d6c0509495357fade95105dd144cdDouglas Gregor if (FromSuperName != ToSuperName) { 30992e55e3af2f6d6c0509495357fade95105dd144cdDouglas Gregor Importer.ToDiag(ToIface->getLocation(), 31002e55e3af2f6d6c0509495357fade95105dd144cdDouglas Gregor diag::err_odr_objc_superclass_inconsistent) 31012e55e3af2f6d6c0509495357fade95105dd144cdDouglas Gregor << ToIface->getDeclName(); 31022e55e3af2f6d6c0509495357fade95105dd144cdDouglas Gregor if (ToIface->getSuperClass()) 31032e55e3af2f6d6c0509495357fade95105dd144cdDouglas Gregor Importer.ToDiag(ToIface->getSuperClassLoc(), 31042e55e3af2f6d6c0509495357fade95105dd144cdDouglas Gregor diag::note_odr_objc_superclass) 31052e55e3af2f6d6c0509495357fade95105dd144cdDouglas Gregor << ToIface->getSuperClass()->getDeclName(); 31062e55e3af2f6d6c0509495357fade95105dd144cdDouglas Gregor else 31072e55e3af2f6d6c0509495357fade95105dd144cdDouglas Gregor Importer.ToDiag(ToIface->getLocation(), 31082e55e3af2f6d6c0509495357fade95105dd144cdDouglas Gregor diag::note_odr_objc_missing_superclass); 31092e55e3af2f6d6c0509495357fade95105dd144cdDouglas Gregor if (D->getSuperClass()) 31102e55e3af2f6d6c0509495357fade95105dd144cdDouglas Gregor Importer.FromDiag(D->getSuperClassLoc(), 31112e55e3af2f6d6c0509495357fade95105dd144cdDouglas Gregor diag::note_odr_objc_superclass) 31122e55e3af2f6d6c0509495357fade95105dd144cdDouglas Gregor << D->getSuperClass()->getDeclName(); 31132e55e3af2f6d6c0509495357fade95105dd144cdDouglas Gregor else 31142e55e3af2f6d6c0509495357fade95105dd144cdDouglas Gregor Importer.FromDiag(D->getLocation(), 31152e55e3af2f6d6c0509495357fade95105dd144cdDouglas Gregor diag::note_odr_objc_missing_superclass); 31162e55e3af2f6d6c0509495357fade95105dd144cdDouglas Gregor return 0; 31172e55e3af2f6d6c0509495357fade95105dd144cdDouglas Gregor } 3118a12d294db5bd59cd8836b9bd0dafadaaa2e3dd8aDouglas Gregor } 3119a12d294db5bd59cd8836b9bd0dafadaaa2e3dd8aDouglas Gregor 3120b4677b62a8e9bba0913dfe1456bd9d689cdbccacDouglas Gregor // Import categories. When the categories themselves are imported, they'll 3121b4677b62a8e9bba0913dfe1456bd9d689cdbccacDouglas Gregor // hook themselves into this interface. 3122b4677b62a8e9bba0913dfe1456bd9d689cdbccacDouglas Gregor for (ObjCCategoryDecl *FromCat = D->getCategoryList(); FromCat; 3123b4677b62a8e9bba0913dfe1456bd9d689cdbccacDouglas Gregor FromCat = FromCat->getNextClassCategory()) 3124b4677b62a8e9bba0913dfe1456bd9d689cdbccacDouglas Gregor Importer.Import(FromCat); 3125b4677b62a8e9bba0913dfe1456bd9d689cdbccacDouglas Gregor 3126a12d294db5bd59cd8836b9bd0dafadaaa2e3dd8aDouglas Gregor // Import all of the members of this class. 3127083a821bbd02bbc521275a2f144abe39a6c2745cDouglas Gregor ImportDeclContext(D); 3128a12d294db5bd59cd8836b9bd0dafadaaa2e3dd8aDouglas Gregor 3129a12d294db5bd59cd8836b9bd0dafadaaa2e3dd8aDouglas Gregor // If we have an @implementation, import it as well. 3130a12d294db5bd59cd8836b9bd0dafadaaa2e3dd8aDouglas Gregor if (D->getImplementation()) { 3131dd182ff10b9145e432dea1fd2fb67100ccca3b10Douglas Gregor ObjCImplementationDecl *Impl = cast_or_null<ObjCImplementationDecl>( 3132dd182ff10b9145e432dea1fd2fb67100ccca3b10Douglas Gregor Importer.Import(D->getImplementation())); 3133a12d294db5bd59cd8836b9bd0dafadaaa2e3dd8aDouglas Gregor if (!Impl) 3134a12d294db5bd59cd8836b9bd0dafadaaa2e3dd8aDouglas Gregor return 0; 3135a12d294db5bd59cd8836b9bd0dafadaaa2e3dd8aDouglas Gregor 3136a12d294db5bd59cd8836b9bd0dafadaaa2e3dd8aDouglas Gregor ToIface->setImplementation(Impl); 3137a12d294db5bd59cd8836b9bd0dafadaaa2e3dd8aDouglas Gregor } 3138a12d294db5bd59cd8836b9bd0dafadaaa2e3dd8aDouglas Gregor 31392e2a400383c7a64a927f61eeed596b08928e1d4bDouglas Gregor return ToIface; 3140a12d294db5bd59cd8836b9bd0dafadaaa2e3dd8aDouglas Gregor} 3141a12d294db5bd59cd8836b9bd0dafadaaa2e3dd8aDouglas Gregor 31423daef29bf390dbdb3603748280afd5827d1811daDouglas GregorDecl *ASTNodeImporter::VisitObjCCategoryImplDecl(ObjCCategoryImplDecl *D) { 31433daef29bf390dbdb3603748280afd5827d1811daDouglas Gregor ObjCCategoryDecl *Category = cast_or_null<ObjCCategoryDecl>( 31443daef29bf390dbdb3603748280afd5827d1811daDouglas Gregor Importer.Import(D->getCategoryDecl())); 31453daef29bf390dbdb3603748280afd5827d1811daDouglas Gregor if (!Category) 31463daef29bf390dbdb3603748280afd5827d1811daDouglas Gregor return 0; 31473daef29bf390dbdb3603748280afd5827d1811daDouglas Gregor 31483daef29bf390dbdb3603748280afd5827d1811daDouglas Gregor ObjCCategoryImplDecl *ToImpl = Category->getImplementation(); 31493daef29bf390dbdb3603748280afd5827d1811daDouglas Gregor if (!ToImpl) { 31503daef29bf390dbdb3603748280afd5827d1811daDouglas Gregor DeclContext *DC = Importer.ImportContext(D->getDeclContext()); 31513daef29bf390dbdb3603748280afd5827d1811daDouglas Gregor if (!DC) 31523daef29bf390dbdb3603748280afd5827d1811daDouglas Gregor return 0; 31533daef29bf390dbdb3603748280afd5827d1811daDouglas Gregor 31543daef29bf390dbdb3603748280afd5827d1811daDouglas Gregor ToImpl = ObjCCategoryImplDecl::Create(Importer.getToContext(), DC, 31553daef29bf390dbdb3603748280afd5827d1811daDouglas Gregor Importer.Import(D->getLocation()), 31563daef29bf390dbdb3603748280afd5827d1811daDouglas Gregor Importer.Import(D->getIdentifier()), 31573daef29bf390dbdb3603748280afd5827d1811daDouglas Gregor Category->getClassInterface()); 31583daef29bf390dbdb3603748280afd5827d1811daDouglas Gregor 31593daef29bf390dbdb3603748280afd5827d1811daDouglas Gregor DeclContext *LexicalDC = DC; 31603daef29bf390dbdb3603748280afd5827d1811daDouglas Gregor if (D->getDeclContext() != D->getLexicalDeclContext()) { 31613daef29bf390dbdb3603748280afd5827d1811daDouglas Gregor LexicalDC = Importer.ImportContext(D->getLexicalDeclContext()); 31623daef29bf390dbdb3603748280afd5827d1811daDouglas Gregor if (!LexicalDC) 31633daef29bf390dbdb3603748280afd5827d1811daDouglas Gregor return 0; 31643daef29bf390dbdb3603748280afd5827d1811daDouglas Gregor 31653daef29bf390dbdb3603748280afd5827d1811daDouglas Gregor ToImpl->setLexicalDeclContext(LexicalDC); 31663daef29bf390dbdb3603748280afd5827d1811daDouglas Gregor } 31673daef29bf390dbdb3603748280afd5827d1811daDouglas Gregor 31683daef29bf390dbdb3603748280afd5827d1811daDouglas Gregor LexicalDC->addDecl(ToImpl); 31693daef29bf390dbdb3603748280afd5827d1811daDouglas Gregor Category->setImplementation(ToImpl); 31703daef29bf390dbdb3603748280afd5827d1811daDouglas Gregor } 31713daef29bf390dbdb3603748280afd5827d1811daDouglas Gregor 31723daef29bf390dbdb3603748280afd5827d1811daDouglas Gregor Importer.Imported(D, ToImpl); 3173cad2c59b0c087edea83d0fbf6eabde4a7960c778Douglas Gregor ImportDeclContext(D); 31743daef29bf390dbdb3603748280afd5827d1811daDouglas Gregor return ToImpl; 31753daef29bf390dbdb3603748280afd5827d1811daDouglas Gregor} 31763daef29bf390dbdb3603748280afd5827d1811daDouglas Gregor 3177dd182ff10b9145e432dea1fd2fb67100ccca3b10Douglas GregorDecl *ASTNodeImporter::VisitObjCImplementationDecl(ObjCImplementationDecl *D) { 3178dd182ff10b9145e432dea1fd2fb67100ccca3b10Douglas Gregor // Find the corresponding interface. 3179dd182ff10b9145e432dea1fd2fb67100ccca3b10Douglas Gregor ObjCInterfaceDecl *Iface = cast_or_null<ObjCInterfaceDecl>( 3180dd182ff10b9145e432dea1fd2fb67100ccca3b10Douglas Gregor Importer.Import(D->getClassInterface())); 3181dd182ff10b9145e432dea1fd2fb67100ccca3b10Douglas Gregor if (!Iface) 3182dd182ff10b9145e432dea1fd2fb67100ccca3b10Douglas Gregor return 0; 3183dd182ff10b9145e432dea1fd2fb67100ccca3b10Douglas Gregor 3184dd182ff10b9145e432dea1fd2fb67100ccca3b10Douglas Gregor // Import the superclass, if any. 3185dd182ff10b9145e432dea1fd2fb67100ccca3b10Douglas Gregor ObjCInterfaceDecl *Super = 0; 3186dd182ff10b9145e432dea1fd2fb67100ccca3b10Douglas Gregor if (D->getSuperClass()) { 3187dd182ff10b9145e432dea1fd2fb67100ccca3b10Douglas Gregor Super = cast_or_null<ObjCInterfaceDecl>( 3188dd182ff10b9145e432dea1fd2fb67100ccca3b10Douglas Gregor Importer.Import(D->getSuperClass())); 3189dd182ff10b9145e432dea1fd2fb67100ccca3b10Douglas Gregor if (!Super) 3190dd182ff10b9145e432dea1fd2fb67100ccca3b10Douglas Gregor return 0; 3191dd182ff10b9145e432dea1fd2fb67100ccca3b10Douglas Gregor } 3192dd182ff10b9145e432dea1fd2fb67100ccca3b10Douglas Gregor 3193dd182ff10b9145e432dea1fd2fb67100ccca3b10Douglas Gregor ObjCImplementationDecl *Impl = Iface->getImplementation(); 3194dd182ff10b9145e432dea1fd2fb67100ccca3b10Douglas Gregor if (!Impl) { 3195dd182ff10b9145e432dea1fd2fb67100ccca3b10Douglas Gregor // We haven't imported an implementation yet. Create a new @implementation 3196dd182ff10b9145e432dea1fd2fb67100ccca3b10Douglas Gregor // now. 3197dd182ff10b9145e432dea1fd2fb67100ccca3b10Douglas Gregor Impl = ObjCImplementationDecl::Create(Importer.getToContext(), 3198dd182ff10b9145e432dea1fd2fb67100ccca3b10Douglas Gregor Importer.ImportContext(D->getDeclContext()), 3199dd182ff10b9145e432dea1fd2fb67100ccca3b10Douglas Gregor Importer.Import(D->getLocation()), 3200dd182ff10b9145e432dea1fd2fb67100ccca3b10Douglas Gregor Iface, Super); 3201dd182ff10b9145e432dea1fd2fb67100ccca3b10Douglas Gregor 3202dd182ff10b9145e432dea1fd2fb67100ccca3b10Douglas Gregor if (D->getDeclContext() != D->getLexicalDeclContext()) { 3203dd182ff10b9145e432dea1fd2fb67100ccca3b10Douglas Gregor DeclContext *LexicalDC 3204dd182ff10b9145e432dea1fd2fb67100ccca3b10Douglas Gregor = Importer.ImportContext(D->getLexicalDeclContext()); 3205dd182ff10b9145e432dea1fd2fb67100ccca3b10Douglas Gregor if (!LexicalDC) 3206dd182ff10b9145e432dea1fd2fb67100ccca3b10Douglas Gregor return 0; 3207dd182ff10b9145e432dea1fd2fb67100ccca3b10Douglas Gregor Impl->setLexicalDeclContext(LexicalDC); 3208dd182ff10b9145e432dea1fd2fb67100ccca3b10Douglas Gregor } 3209dd182ff10b9145e432dea1fd2fb67100ccca3b10Douglas Gregor 3210dd182ff10b9145e432dea1fd2fb67100ccca3b10Douglas Gregor // Associate the implementation with the class it implements. 3211dd182ff10b9145e432dea1fd2fb67100ccca3b10Douglas Gregor Iface->setImplementation(Impl); 3212dd182ff10b9145e432dea1fd2fb67100ccca3b10Douglas Gregor Importer.Imported(D, Iface->getImplementation()); 3213dd182ff10b9145e432dea1fd2fb67100ccca3b10Douglas Gregor } else { 3214dd182ff10b9145e432dea1fd2fb67100ccca3b10Douglas Gregor Importer.Imported(D, Iface->getImplementation()); 3215dd182ff10b9145e432dea1fd2fb67100ccca3b10Douglas Gregor 3216dd182ff10b9145e432dea1fd2fb67100ccca3b10Douglas Gregor // Verify that the existing @implementation has the same superclass. 3217dd182ff10b9145e432dea1fd2fb67100ccca3b10Douglas Gregor if ((Super && !Impl->getSuperClass()) || 3218dd182ff10b9145e432dea1fd2fb67100ccca3b10Douglas Gregor (!Super && Impl->getSuperClass()) || 3219dd182ff10b9145e432dea1fd2fb67100ccca3b10Douglas Gregor (Super && Impl->getSuperClass() && 3220dd182ff10b9145e432dea1fd2fb67100ccca3b10Douglas Gregor Super->getCanonicalDecl() != Impl->getSuperClass())) { 3221dd182ff10b9145e432dea1fd2fb67100ccca3b10Douglas Gregor Importer.ToDiag(Impl->getLocation(), 3222dd182ff10b9145e432dea1fd2fb67100ccca3b10Douglas Gregor diag::err_odr_objc_superclass_inconsistent) 3223dd182ff10b9145e432dea1fd2fb67100ccca3b10Douglas Gregor << Iface->getDeclName(); 3224dd182ff10b9145e432dea1fd2fb67100ccca3b10Douglas Gregor // FIXME: It would be nice to have the location of the superclass 3225dd182ff10b9145e432dea1fd2fb67100ccca3b10Douglas Gregor // below. 3226dd182ff10b9145e432dea1fd2fb67100ccca3b10Douglas Gregor if (Impl->getSuperClass()) 3227dd182ff10b9145e432dea1fd2fb67100ccca3b10Douglas Gregor Importer.ToDiag(Impl->getLocation(), 3228dd182ff10b9145e432dea1fd2fb67100ccca3b10Douglas Gregor diag::note_odr_objc_superclass) 3229dd182ff10b9145e432dea1fd2fb67100ccca3b10Douglas Gregor << Impl->getSuperClass()->getDeclName(); 3230dd182ff10b9145e432dea1fd2fb67100ccca3b10Douglas Gregor else 3231dd182ff10b9145e432dea1fd2fb67100ccca3b10Douglas Gregor Importer.ToDiag(Impl->getLocation(), 3232dd182ff10b9145e432dea1fd2fb67100ccca3b10Douglas Gregor diag::note_odr_objc_missing_superclass); 3233dd182ff10b9145e432dea1fd2fb67100ccca3b10Douglas Gregor if (D->getSuperClass()) 3234dd182ff10b9145e432dea1fd2fb67100ccca3b10Douglas Gregor Importer.FromDiag(D->getLocation(), 3235dd182ff10b9145e432dea1fd2fb67100ccca3b10Douglas Gregor diag::note_odr_objc_superclass) 3236dd182ff10b9145e432dea1fd2fb67100ccca3b10Douglas Gregor << D->getSuperClass()->getDeclName(); 3237dd182ff10b9145e432dea1fd2fb67100ccca3b10Douglas Gregor else 3238dd182ff10b9145e432dea1fd2fb67100ccca3b10Douglas Gregor Importer.FromDiag(D->getLocation(), 3239dd182ff10b9145e432dea1fd2fb67100ccca3b10Douglas Gregor diag::note_odr_objc_missing_superclass); 3240dd182ff10b9145e432dea1fd2fb67100ccca3b10Douglas Gregor return 0; 3241dd182ff10b9145e432dea1fd2fb67100ccca3b10Douglas Gregor } 3242dd182ff10b9145e432dea1fd2fb67100ccca3b10Douglas Gregor } 3243dd182ff10b9145e432dea1fd2fb67100ccca3b10Douglas Gregor 3244dd182ff10b9145e432dea1fd2fb67100ccca3b10Douglas Gregor // Import all of the members of this @implementation. 3245dd182ff10b9145e432dea1fd2fb67100ccca3b10Douglas Gregor ImportDeclContext(D); 3246dd182ff10b9145e432dea1fd2fb67100ccca3b10Douglas Gregor 3247dd182ff10b9145e432dea1fd2fb67100ccca3b10Douglas Gregor return Impl; 3248dd182ff10b9145e432dea1fd2fb67100ccca3b10Douglas Gregor} 3249dd182ff10b9145e432dea1fd2fb67100ccca3b10Douglas Gregor 3250e3261624c1870e52d7efc2ac83e647713361ac6cDouglas GregorDecl *ASTNodeImporter::VisitObjCPropertyDecl(ObjCPropertyDecl *D) { 3251e3261624c1870e52d7efc2ac83e647713361ac6cDouglas Gregor // Import the major distinguishing characteristics of an @property. 3252e3261624c1870e52d7efc2ac83e647713361ac6cDouglas Gregor DeclContext *DC, *LexicalDC; 3253e3261624c1870e52d7efc2ac83e647713361ac6cDouglas Gregor DeclarationName Name; 3254e3261624c1870e52d7efc2ac83e647713361ac6cDouglas Gregor SourceLocation Loc; 3255e3261624c1870e52d7efc2ac83e647713361ac6cDouglas Gregor if (ImportDeclParts(D, DC, LexicalDC, Name, Loc)) 3256e3261624c1870e52d7efc2ac83e647713361ac6cDouglas Gregor return 0; 3257e3261624c1870e52d7efc2ac83e647713361ac6cDouglas Gregor 3258e3261624c1870e52d7efc2ac83e647713361ac6cDouglas Gregor // Check whether we have already imported this property. 3259e3261624c1870e52d7efc2ac83e647713361ac6cDouglas Gregor for (DeclContext::lookup_result Lookup = DC->lookup(Name); 3260e3261624c1870e52d7efc2ac83e647713361ac6cDouglas Gregor Lookup.first != Lookup.second; 3261e3261624c1870e52d7efc2ac83e647713361ac6cDouglas Gregor ++Lookup.first) { 3262e3261624c1870e52d7efc2ac83e647713361ac6cDouglas Gregor if (ObjCPropertyDecl *FoundProp 3263e3261624c1870e52d7efc2ac83e647713361ac6cDouglas Gregor = dyn_cast<ObjCPropertyDecl>(*Lookup.first)) { 3264e3261624c1870e52d7efc2ac83e647713361ac6cDouglas Gregor // Check property types. 3265e3261624c1870e52d7efc2ac83e647713361ac6cDouglas Gregor if (!Importer.IsStructurallyEquivalent(D->getType(), 3266e3261624c1870e52d7efc2ac83e647713361ac6cDouglas Gregor FoundProp->getType())) { 3267e3261624c1870e52d7efc2ac83e647713361ac6cDouglas Gregor Importer.ToDiag(Loc, diag::err_odr_objc_property_type_inconsistent) 3268e3261624c1870e52d7efc2ac83e647713361ac6cDouglas Gregor << Name << D->getType() << FoundProp->getType(); 3269e3261624c1870e52d7efc2ac83e647713361ac6cDouglas Gregor Importer.ToDiag(FoundProp->getLocation(), diag::note_odr_value_here) 3270e3261624c1870e52d7efc2ac83e647713361ac6cDouglas Gregor << FoundProp->getType(); 3271e3261624c1870e52d7efc2ac83e647713361ac6cDouglas Gregor return 0; 3272e3261624c1870e52d7efc2ac83e647713361ac6cDouglas Gregor } 3273e3261624c1870e52d7efc2ac83e647713361ac6cDouglas Gregor 3274e3261624c1870e52d7efc2ac83e647713361ac6cDouglas Gregor // FIXME: Check property attributes, getters, setters, etc.? 3275e3261624c1870e52d7efc2ac83e647713361ac6cDouglas Gregor 3276e3261624c1870e52d7efc2ac83e647713361ac6cDouglas Gregor // Consider these properties to be equivalent. 3277e3261624c1870e52d7efc2ac83e647713361ac6cDouglas Gregor Importer.Imported(D, FoundProp); 3278e3261624c1870e52d7efc2ac83e647713361ac6cDouglas Gregor return FoundProp; 3279e3261624c1870e52d7efc2ac83e647713361ac6cDouglas Gregor } 3280e3261624c1870e52d7efc2ac83e647713361ac6cDouglas Gregor } 3281e3261624c1870e52d7efc2ac83e647713361ac6cDouglas Gregor 3282e3261624c1870e52d7efc2ac83e647713361ac6cDouglas Gregor // Import the type. 328383a230c83a54190366138c1a4f4310ef838b88fcJohn McCall TypeSourceInfo *T = Importer.Import(D->getTypeSourceInfo()); 328483a230c83a54190366138c1a4f4310ef838b88fcJohn McCall if (!T) 3285e3261624c1870e52d7efc2ac83e647713361ac6cDouglas Gregor return 0; 3286e3261624c1870e52d7efc2ac83e647713361ac6cDouglas Gregor 3287e3261624c1870e52d7efc2ac83e647713361ac6cDouglas Gregor // Create the new property. 3288e3261624c1870e52d7efc2ac83e647713361ac6cDouglas Gregor ObjCPropertyDecl *ToProperty 3289e3261624c1870e52d7efc2ac83e647713361ac6cDouglas Gregor = ObjCPropertyDecl::Create(Importer.getToContext(), DC, Loc, 3290e3261624c1870e52d7efc2ac83e647713361ac6cDouglas Gregor Name.getAsIdentifierInfo(), 3291e3261624c1870e52d7efc2ac83e647713361ac6cDouglas Gregor Importer.Import(D->getAtLoc()), 3292e3261624c1870e52d7efc2ac83e647713361ac6cDouglas Gregor T, 3293e3261624c1870e52d7efc2ac83e647713361ac6cDouglas Gregor D->getPropertyImplementation()); 3294e3261624c1870e52d7efc2ac83e647713361ac6cDouglas Gregor Importer.Imported(D, ToProperty); 3295e3261624c1870e52d7efc2ac83e647713361ac6cDouglas Gregor ToProperty->setLexicalDeclContext(LexicalDC); 3296e3261624c1870e52d7efc2ac83e647713361ac6cDouglas Gregor LexicalDC->addDecl(ToProperty); 3297e3261624c1870e52d7efc2ac83e647713361ac6cDouglas Gregor 3298e3261624c1870e52d7efc2ac83e647713361ac6cDouglas Gregor ToProperty->setPropertyAttributes(D->getPropertyAttributes()); 329980aa1cd7973561889e51c1c152c8990a8de9c953Fariborz Jahanian ToProperty->setPropertyAttributesAsWritten( 330080aa1cd7973561889e51c1c152c8990a8de9c953Fariborz Jahanian D->getPropertyAttributesAsWritten()); 3301e3261624c1870e52d7efc2ac83e647713361ac6cDouglas Gregor ToProperty->setGetterName(Importer.Import(D->getGetterName())); 3302e3261624c1870e52d7efc2ac83e647713361ac6cDouglas Gregor ToProperty->setSetterName(Importer.Import(D->getSetterName())); 3303e3261624c1870e52d7efc2ac83e647713361ac6cDouglas Gregor ToProperty->setGetterMethodDecl( 3304e3261624c1870e52d7efc2ac83e647713361ac6cDouglas Gregor cast_or_null<ObjCMethodDecl>(Importer.Import(D->getGetterMethodDecl()))); 3305e3261624c1870e52d7efc2ac83e647713361ac6cDouglas Gregor ToProperty->setSetterMethodDecl( 3306e3261624c1870e52d7efc2ac83e647713361ac6cDouglas Gregor cast_or_null<ObjCMethodDecl>(Importer.Import(D->getSetterMethodDecl()))); 3307e3261624c1870e52d7efc2ac83e647713361ac6cDouglas Gregor ToProperty->setPropertyIvarDecl( 3308e3261624c1870e52d7efc2ac83e647713361ac6cDouglas Gregor cast_or_null<ObjCIvarDecl>(Importer.Import(D->getPropertyIvarDecl()))); 3309e3261624c1870e52d7efc2ac83e647713361ac6cDouglas Gregor return ToProperty; 3310e3261624c1870e52d7efc2ac83e647713361ac6cDouglas Gregor} 3311e3261624c1870e52d7efc2ac83e647713361ac6cDouglas Gregor 3312954e0c75c42f321945aff8b9ee96da43cd90c752Douglas GregorDecl *ASTNodeImporter::VisitObjCPropertyImplDecl(ObjCPropertyImplDecl *D) { 3313954e0c75c42f321945aff8b9ee96da43cd90c752Douglas Gregor ObjCPropertyDecl *Property = cast_or_null<ObjCPropertyDecl>( 3314954e0c75c42f321945aff8b9ee96da43cd90c752Douglas Gregor Importer.Import(D->getPropertyDecl())); 3315954e0c75c42f321945aff8b9ee96da43cd90c752Douglas Gregor if (!Property) 3316954e0c75c42f321945aff8b9ee96da43cd90c752Douglas Gregor return 0; 3317954e0c75c42f321945aff8b9ee96da43cd90c752Douglas Gregor 3318954e0c75c42f321945aff8b9ee96da43cd90c752Douglas Gregor DeclContext *DC = Importer.ImportContext(D->getDeclContext()); 3319954e0c75c42f321945aff8b9ee96da43cd90c752Douglas Gregor if (!DC) 3320954e0c75c42f321945aff8b9ee96da43cd90c752Douglas Gregor return 0; 3321954e0c75c42f321945aff8b9ee96da43cd90c752Douglas Gregor 3322954e0c75c42f321945aff8b9ee96da43cd90c752Douglas Gregor // Import the lexical declaration context. 3323954e0c75c42f321945aff8b9ee96da43cd90c752Douglas Gregor DeclContext *LexicalDC = DC; 3324954e0c75c42f321945aff8b9ee96da43cd90c752Douglas Gregor if (D->getDeclContext() != D->getLexicalDeclContext()) { 3325954e0c75c42f321945aff8b9ee96da43cd90c752Douglas Gregor LexicalDC = Importer.ImportContext(D->getLexicalDeclContext()); 3326954e0c75c42f321945aff8b9ee96da43cd90c752Douglas Gregor if (!LexicalDC) 3327954e0c75c42f321945aff8b9ee96da43cd90c752Douglas Gregor return 0; 3328954e0c75c42f321945aff8b9ee96da43cd90c752Douglas Gregor } 3329954e0c75c42f321945aff8b9ee96da43cd90c752Douglas Gregor 3330954e0c75c42f321945aff8b9ee96da43cd90c752Douglas Gregor ObjCImplDecl *InImpl = dyn_cast<ObjCImplDecl>(LexicalDC); 3331954e0c75c42f321945aff8b9ee96da43cd90c752Douglas Gregor if (!InImpl) 3332954e0c75c42f321945aff8b9ee96da43cd90c752Douglas Gregor return 0; 3333954e0c75c42f321945aff8b9ee96da43cd90c752Douglas Gregor 3334954e0c75c42f321945aff8b9ee96da43cd90c752Douglas Gregor // Import the ivar (for an @synthesize). 3335954e0c75c42f321945aff8b9ee96da43cd90c752Douglas Gregor ObjCIvarDecl *Ivar = 0; 3336954e0c75c42f321945aff8b9ee96da43cd90c752Douglas Gregor if (D->getPropertyIvarDecl()) { 3337954e0c75c42f321945aff8b9ee96da43cd90c752Douglas Gregor Ivar = cast_or_null<ObjCIvarDecl>( 3338954e0c75c42f321945aff8b9ee96da43cd90c752Douglas Gregor Importer.Import(D->getPropertyIvarDecl())); 3339954e0c75c42f321945aff8b9ee96da43cd90c752Douglas Gregor if (!Ivar) 3340954e0c75c42f321945aff8b9ee96da43cd90c752Douglas Gregor return 0; 3341954e0c75c42f321945aff8b9ee96da43cd90c752Douglas Gregor } 3342954e0c75c42f321945aff8b9ee96da43cd90c752Douglas Gregor 3343954e0c75c42f321945aff8b9ee96da43cd90c752Douglas Gregor ObjCPropertyImplDecl *ToImpl 3344954e0c75c42f321945aff8b9ee96da43cd90c752Douglas Gregor = InImpl->FindPropertyImplDecl(Property->getIdentifier()); 3345954e0c75c42f321945aff8b9ee96da43cd90c752Douglas Gregor if (!ToImpl) { 3346954e0c75c42f321945aff8b9ee96da43cd90c752Douglas Gregor ToImpl = ObjCPropertyImplDecl::Create(Importer.getToContext(), DC, 3347954e0c75c42f321945aff8b9ee96da43cd90c752Douglas Gregor Importer.Import(D->getLocStart()), 3348954e0c75c42f321945aff8b9ee96da43cd90c752Douglas Gregor Importer.Import(D->getLocation()), 3349954e0c75c42f321945aff8b9ee96da43cd90c752Douglas Gregor Property, 3350954e0c75c42f321945aff8b9ee96da43cd90c752Douglas Gregor D->getPropertyImplementation(), 3351954e0c75c42f321945aff8b9ee96da43cd90c752Douglas Gregor Ivar, 3352954e0c75c42f321945aff8b9ee96da43cd90c752Douglas Gregor Importer.Import(D->getPropertyIvarDeclLoc())); 3353954e0c75c42f321945aff8b9ee96da43cd90c752Douglas Gregor ToImpl->setLexicalDeclContext(LexicalDC); 3354954e0c75c42f321945aff8b9ee96da43cd90c752Douglas Gregor Importer.Imported(D, ToImpl); 3355954e0c75c42f321945aff8b9ee96da43cd90c752Douglas Gregor LexicalDC->addDecl(ToImpl); 3356954e0c75c42f321945aff8b9ee96da43cd90c752Douglas Gregor } else { 3357954e0c75c42f321945aff8b9ee96da43cd90c752Douglas Gregor // Check that we have the same kind of property implementation (@synthesize 3358954e0c75c42f321945aff8b9ee96da43cd90c752Douglas Gregor // vs. @dynamic). 3359954e0c75c42f321945aff8b9ee96da43cd90c752Douglas Gregor if (D->getPropertyImplementation() != ToImpl->getPropertyImplementation()) { 3360954e0c75c42f321945aff8b9ee96da43cd90c752Douglas Gregor Importer.ToDiag(ToImpl->getLocation(), 3361954e0c75c42f321945aff8b9ee96da43cd90c752Douglas Gregor diag::err_odr_objc_property_impl_kind_inconsistent) 3362954e0c75c42f321945aff8b9ee96da43cd90c752Douglas Gregor << Property->getDeclName() 3363954e0c75c42f321945aff8b9ee96da43cd90c752Douglas Gregor << (ToImpl->getPropertyImplementation() 3364954e0c75c42f321945aff8b9ee96da43cd90c752Douglas Gregor == ObjCPropertyImplDecl::Dynamic); 3365954e0c75c42f321945aff8b9ee96da43cd90c752Douglas Gregor Importer.FromDiag(D->getLocation(), 3366954e0c75c42f321945aff8b9ee96da43cd90c752Douglas Gregor diag::note_odr_objc_property_impl_kind) 3367954e0c75c42f321945aff8b9ee96da43cd90c752Douglas Gregor << D->getPropertyDecl()->getDeclName() 3368954e0c75c42f321945aff8b9ee96da43cd90c752Douglas Gregor << (D->getPropertyImplementation() == ObjCPropertyImplDecl::Dynamic); 3369954e0c75c42f321945aff8b9ee96da43cd90c752Douglas Gregor return 0; 3370954e0c75c42f321945aff8b9ee96da43cd90c752Douglas Gregor } 3371954e0c75c42f321945aff8b9ee96da43cd90c752Douglas Gregor 3372954e0c75c42f321945aff8b9ee96da43cd90c752Douglas Gregor // For @synthesize, check that we have the same 3373954e0c75c42f321945aff8b9ee96da43cd90c752Douglas Gregor if (D->getPropertyImplementation() == ObjCPropertyImplDecl::Synthesize && 3374954e0c75c42f321945aff8b9ee96da43cd90c752Douglas Gregor Ivar != ToImpl->getPropertyIvarDecl()) { 3375954e0c75c42f321945aff8b9ee96da43cd90c752Douglas Gregor Importer.ToDiag(ToImpl->getPropertyIvarDeclLoc(), 3376954e0c75c42f321945aff8b9ee96da43cd90c752Douglas Gregor diag::err_odr_objc_synthesize_ivar_inconsistent) 3377954e0c75c42f321945aff8b9ee96da43cd90c752Douglas Gregor << Property->getDeclName() 3378954e0c75c42f321945aff8b9ee96da43cd90c752Douglas Gregor << ToImpl->getPropertyIvarDecl()->getDeclName() 3379954e0c75c42f321945aff8b9ee96da43cd90c752Douglas Gregor << Ivar->getDeclName(); 3380954e0c75c42f321945aff8b9ee96da43cd90c752Douglas Gregor Importer.FromDiag(D->getPropertyIvarDeclLoc(), 3381954e0c75c42f321945aff8b9ee96da43cd90c752Douglas Gregor diag::note_odr_objc_synthesize_ivar_here) 3382954e0c75c42f321945aff8b9ee96da43cd90c752Douglas Gregor << D->getPropertyIvarDecl()->getDeclName(); 3383954e0c75c42f321945aff8b9ee96da43cd90c752Douglas Gregor return 0; 3384954e0c75c42f321945aff8b9ee96da43cd90c752Douglas Gregor } 3385954e0c75c42f321945aff8b9ee96da43cd90c752Douglas Gregor 3386954e0c75c42f321945aff8b9ee96da43cd90c752Douglas Gregor // Merge the existing implementation with the new implementation. 3387954e0c75c42f321945aff8b9ee96da43cd90c752Douglas Gregor Importer.Imported(D, ToImpl); 3388954e0c75c42f321945aff8b9ee96da43cd90c752Douglas Gregor } 3389954e0c75c42f321945aff8b9ee96da43cd90c752Douglas Gregor 3390954e0c75c42f321945aff8b9ee96da43cd90c752Douglas Gregor return ToImpl; 3391954e0c75c42f321945aff8b9ee96da43cd90c752Douglas Gregor} 3392954e0c75c42f321945aff8b9ee96da43cd90c752Douglas Gregor 33932b785022973202ea6bafe304a50eb3cac1a0aeb8Douglas GregorDecl * 33942b785022973202ea6bafe304a50eb3cac1a0aeb8Douglas GregorASTNodeImporter::VisitObjCForwardProtocolDecl(ObjCForwardProtocolDecl *D) { 33952b785022973202ea6bafe304a50eb3cac1a0aeb8Douglas Gregor // Import the context of this declaration. 33962b785022973202ea6bafe304a50eb3cac1a0aeb8Douglas Gregor DeclContext *DC = Importer.ImportContext(D->getDeclContext()); 33972b785022973202ea6bafe304a50eb3cac1a0aeb8Douglas Gregor if (!DC) 33982b785022973202ea6bafe304a50eb3cac1a0aeb8Douglas Gregor return 0; 33992b785022973202ea6bafe304a50eb3cac1a0aeb8Douglas Gregor 34002b785022973202ea6bafe304a50eb3cac1a0aeb8Douglas Gregor DeclContext *LexicalDC = DC; 34012b785022973202ea6bafe304a50eb3cac1a0aeb8Douglas Gregor if (D->getDeclContext() != D->getLexicalDeclContext()) { 34022b785022973202ea6bafe304a50eb3cac1a0aeb8Douglas Gregor LexicalDC = Importer.ImportContext(D->getLexicalDeclContext()); 34032b785022973202ea6bafe304a50eb3cac1a0aeb8Douglas Gregor if (!LexicalDC) 34042b785022973202ea6bafe304a50eb3cac1a0aeb8Douglas Gregor return 0; 34052b785022973202ea6bafe304a50eb3cac1a0aeb8Douglas Gregor } 34062b785022973202ea6bafe304a50eb3cac1a0aeb8Douglas Gregor 34072b785022973202ea6bafe304a50eb3cac1a0aeb8Douglas Gregor // Import the location of this declaration. 34082b785022973202ea6bafe304a50eb3cac1a0aeb8Douglas Gregor SourceLocation Loc = Importer.Import(D->getLocation()); 34092b785022973202ea6bafe304a50eb3cac1a0aeb8Douglas Gregor 34102b785022973202ea6bafe304a50eb3cac1a0aeb8Douglas Gregor llvm::SmallVector<ObjCProtocolDecl *, 4> Protocols; 34112b785022973202ea6bafe304a50eb3cac1a0aeb8Douglas Gregor llvm::SmallVector<SourceLocation, 4> Locations; 34122b785022973202ea6bafe304a50eb3cac1a0aeb8Douglas Gregor ObjCForwardProtocolDecl::protocol_loc_iterator FromProtoLoc 34132b785022973202ea6bafe304a50eb3cac1a0aeb8Douglas Gregor = D->protocol_loc_begin(); 34142b785022973202ea6bafe304a50eb3cac1a0aeb8Douglas Gregor for (ObjCForwardProtocolDecl::protocol_iterator FromProto 34152b785022973202ea6bafe304a50eb3cac1a0aeb8Douglas Gregor = D->protocol_begin(), FromProtoEnd = D->protocol_end(); 34162b785022973202ea6bafe304a50eb3cac1a0aeb8Douglas Gregor FromProto != FromProtoEnd; 34172b785022973202ea6bafe304a50eb3cac1a0aeb8Douglas Gregor ++FromProto, ++FromProtoLoc) { 34182b785022973202ea6bafe304a50eb3cac1a0aeb8Douglas Gregor ObjCProtocolDecl *ToProto 34192b785022973202ea6bafe304a50eb3cac1a0aeb8Douglas Gregor = cast_or_null<ObjCProtocolDecl>(Importer.Import(*FromProto)); 34202b785022973202ea6bafe304a50eb3cac1a0aeb8Douglas Gregor if (!ToProto) 34212b785022973202ea6bafe304a50eb3cac1a0aeb8Douglas Gregor continue; 34222b785022973202ea6bafe304a50eb3cac1a0aeb8Douglas Gregor 34232b785022973202ea6bafe304a50eb3cac1a0aeb8Douglas Gregor Protocols.push_back(ToProto); 34242b785022973202ea6bafe304a50eb3cac1a0aeb8Douglas Gregor Locations.push_back(Importer.Import(*FromProtoLoc)); 34252b785022973202ea6bafe304a50eb3cac1a0aeb8Douglas Gregor } 34262b785022973202ea6bafe304a50eb3cac1a0aeb8Douglas Gregor 34272b785022973202ea6bafe304a50eb3cac1a0aeb8Douglas Gregor ObjCForwardProtocolDecl *ToForward 34282b785022973202ea6bafe304a50eb3cac1a0aeb8Douglas Gregor = ObjCForwardProtocolDecl::Create(Importer.getToContext(), DC, Loc, 34292b785022973202ea6bafe304a50eb3cac1a0aeb8Douglas Gregor Protocols.data(), Protocols.size(), 34302b785022973202ea6bafe304a50eb3cac1a0aeb8Douglas Gregor Locations.data()); 34312b785022973202ea6bafe304a50eb3cac1a0aeb8Douglas Gregor ToForward->setLexicalDeclContext(LexicalDC); 34322b785022973202ea6bafe304a50eb3cac1a0aeb8Douglas Gregor LexicalDC->addDecl(ToForward); 34332b785022973202ea6bafe304a50eb3cac1a0aeb8Douglas Gregor Importer.Imported(D, ToForward); 34342b785022973202ea6bafe304a50eb3cac1a0aeb8Douglas Gregor return ToForward; 34352b785022973202ea6bafe304a50eb3cac1a0aeb8Douglas Gregor} 34362b785022973202ea6bafe304a50eb3cac1a0aeb8Douglas Gregor 3437a2bc15b7463a9f85a5bff1531d833c278426a733Douglas GregorDecl *ASTNodeImporter::VisitObjCClassDecl(ObjCClassDecl *D) { 3438a2bc15b7463a9f85a5bff1531d833c278426a733Douglas Gregor // Import the context of this declaration. 3439a2bc15b7463a9f85a5bff1531d833c278426a733Douglas Gregor DeclContext *DC = Importer.ImportContext(D->getDeclContext()); 3440a2bc15b7463a9f85a5bff1531d833c278426a733Douglas Gregor if (!DC) 3441a2bc15b7463a9f85a5bff1531d833c278426a733Douglas Gregor return 0; 3442a2bc15b7463a9f85a5bff1531d833c278426a733Douglas Gregor 3443a2bc15b7463a9f85a5bff1531d833c278426a733Douglas Gregor DeclContext *LexicalDC = DC; 3444a2bc15b7463a9f85a5bff1531d833c278426a733Douglas Gregor if (D->getDeclContext() != D->getLexicalDeclContext()) { 3445a2bc15b7463a9f85a5bff1531d833c278426a733Douglas Gregor LexicalDC = Importer.ImportContext(D->getLexicalDeclContext()); 3446a2bc15b7463a9f85a5bff1531d833c278426a733Douglas Gregor if (!LexicalDC) 3447a2bc15b7463a9f85a5bff1531d833c278426a733Douglas Gregor return 0; 3448a2bc15b7463a9f85a5bff1531d833c278426a733Douglas Gregor } 3449a2bc15b7463a9f85a5bff1531d833c278426a733Douglas Gregor 3450a2bc15b7463a9f85a5bff1531d833c278426a733Douglas Gregor // Import the location of this declaration. 3451a2bc15b7463a9f85a5bff1531d833c278426a733Douglas Gregor SourceLocation Loc = Importer.Import(D->getLocation()); 3452a2bc15b7463a9f85a5bff1531d833c278426a733Douglas Gregor 3453a2bc15b7463a9f85a5bff1531d833c278426a733Douglas Gregor llvm::SmallVector<ObjCInterfaceDecl *, 4> Interfaces; 3454a2bc15b7463a9f85a5bff1531d833c278426a733Douglas Gregor llvm::SmallVector<SourceLocation, 4> Locations; 3455a2bc15b7463a9f85a5bff1531d833c278426a733Douglas Gregor for (ObjCClassDecl::iterator From = D->begin(), FromEnd = D->end(); 3456a2bc15b7463a9f85a5bff1531d833c278426a733Douglas Gregor From != FromEnd; ++From) { 3457a2bc15b7463a9f85a5bff1531d833c278426a733Douglas Gregor ObjCInterfaceDecl *ToIface 3458a2bc15b7463a9f85a5bff1531d833c278426a733Douglas Gregor = cast_or_null<ObjCInterfaceDecl>(Importer.Import(From->getInterface())); 3459a2bc15b7463a9f85a5bff1531d833c278426a733Douglas Gregor if (!ToIface) 3460a2bc15b7463a9f85a5bff1531d833c278426a733Douglas Gregor continue; 3461a2bc15b7463a9f85a5bff1531d833c278426a733Douglas Gregor 3462a2bc15b7463a9f85a5bff1531d833c278426a733Douglas Gregor Interfaces.push_back(ToIface); 3463a2bc15b7463a9f85a5bff1531d833c278426a733Douglas Gregor Locations.push_back(Importer.Import(From->getLocation())); 3464a2bc15b7463a9f85a5bff1531d833c278426a733Douglas Gregor } 3465a2bc15b7463a9f85a5bff1531d833c278426a733Douglas Gregor 3466a2bc15b7463a9f85a5bff1531d833c278426a733Douglas Gregor ObjCClassDecl *ToClass = ObjCClassDecl::Create(Importer.getToContext(), DC, 3467a2bc15b7463a9f85a5bff1531d833c278426a733Douglas Gregor Loc, 3468a2bc15b7463a9f85a5bff1531d833c278426a733Douglas Gregor Interfaces.data(), 3469a2bc15b7463a9f85a5bff1531d833c278426a733Douglas Gregor Locations.data(), 3470a2bc15b7463a9f85a5bff1531d833c278426a733Douglas Gregor Interfaces.size()); 3471a2bc15b7463a9f85a5bff1531d833c278426a733Douglas Gregor ToClass->setLexicalDeclContext(LexicalDC); 3472a2bc15b7463a9f85a5bff1531d833c278426a733Douglas Gregor LexicalDC->addDecl(ToClass); 3473a2bc15b7463a9f85a5bff1531d833c278426a733Douglas Gregor Importer.Imported(D, ToClass); 3474a2bc15b7463a9f85a5bff1531d833c278426a733Douglas Gregor return ToClass; 3475a2bc15b7463a9f85a5bff1531d833c278426a733Douglas Gregor} 3476a2bc15b7463a9f85a5bff1531d833c278426a733Douglas Gregor 3477040afaeea2313dc69fd532995ac88cccdd62da56Douglas GregorDecl *ASTNodeImporter::VisitTemplateTypeParmDecl(TemplateTypeParmDecl *D) { 3478040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor // For template arguments, we adopt the translation unit as our declaration 3479040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor // context. This context will be fixed when the actual template declaration 3480040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor // is created. 3481040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor 3482040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor // FIXME: Import default argument. 3483040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor return TemplateTypeParmDecl::Create(Importer.getToContext(), 3484040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor Importer.getToContext().getTranslationUnitDecl(), 3485344577e6b58f42d18dc8118c8903b49a85dc005eAbramo Bagnara Importer.Import(D->getLocStart()), 3486040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor Importer.Import(D->getLocation()), 3487040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor D->getDepth(), 3488040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor D->getIndex(), 3489040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor Importer.Import(D->getIdentifier()), 3490040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor D->wasDeclaredWithTypename(), 3491040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor D->isParameterPack()); 3492040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor} 3493040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor 3494040afaeea2313dc69fd532995ac88cccdd62da56Douglas GregorDecl * 3495040afaeea2313dc69fd532995ac88cccdd62da56Douglas GregorASTNodeImporter::VisitNonTypeTemplateParmDecl(NonTypeTemplateParmDecl *D) { 3496040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor // Import the name of this declaration. 3497040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor DeclarationName Name = Importer.Import(D->getDeclName()); 3498040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor if (D->getDeclName() && !Name) 3499040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor return 0; 3500040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor 3501040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor // Import the location of this declaration. 3502040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor SourceLocation Loc = Importer.Import(D->getLocation()); 3503040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor 3504040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor // Import the type of this declaration. 3505040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor QualType T = Importer.Import(D->getType()); 3506040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor if (T.isNull()) 3507040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor return 0; 3508040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor 3509040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor // Import type-source information. 3510040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor TypeSourceInfo *TInfo = Importer.Import(D->getTypeSourceInfo()); 3511040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor if (D->getTypeSourceInfo() && !TInfo) 3512040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor return 0; 3513040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor 3514040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor // FIXME: Import default argument. 3515040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor 3516040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor return NonTypeTemplateParmDecl::Create(Importer.getToContext(), 3517040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor Importer.getToContext().getTranslationUnitDecl(), 3518ff676cb48fe8bf7be2feaa251dc7c5fb15af4730Abramo Bagnara Importer.Import(D->getInnerLocStart()), 3519040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor Loc, D->getDepth(), D->getPosition(), 3520040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor Name.getAsIdentifierInfo(), 352110738d36b150aa65206890c1c845cdba076e4200Douglas Gregor T, D->isParameterPack(), TInfo); 3522040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor} 3523040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor 3524040afaeea2313dc69fd532995ac88cccdd62da56Douglas GregorDecl * 3525040afaeea2313dc69fd532995ac88cccdd62da56Douglas GregorASTNodeImporter::VisitTemplateTemplateParmDecl(TemplateTemplateParmDecl *D) { 3526040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor // Import the name of this declaration. 3527040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor DeclarationName Name = Importer.Import(D->getDeclName()); 3528040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor if (D->getDeclName() && !Name) 3529040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor return 0; 3530040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor 3531040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor // Import the location of this declaration. 3532040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor SourceLocation Loc = Importer.Import(D->getLocation()); 3533040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor 3534040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor // Import template parameters. 3535040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor TemplateParameterList *TemplateParams 3536040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor = ImportTemplateParameterList(D->getTemplateParameters()); 3537040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor if (!TemplateParams) 3538040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor return 0; 3539040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor 3540040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor // FIXME: Import default argument. 3541040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor 3542040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor return TemplateTemplateParmDecl::Create(Importer.getToContext(), 3543040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor Importer.getToContext().getTranslationUnitDecl(), 3544040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor Loc, D->getDepth(), D->getPosition(), 354561c4d28e36cd3f1be392cb77f07436d1fa6b0f9fDouglas Gregor D->isParameterPack(), 3546040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor Name.getAsIdentifierInfo(), 3547040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor TemplateParams); 3548040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor} 3549040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor 3550040afaeea2313dc69fd532995ac88cccdd62da56Douglas GregorDecl *ASTNodeImporter::VisitClassTemplateDecl(ClassTemplateDecl *D) { 3551040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor // If this record has a definition in the translation unit we're coming from, 3552040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor // but this particular declaration is not that definition, import the 3553040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor // definition and map to that. 3554040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor CXXRecordDecl *Definition 3555040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor = cast_or_null<CXXRecordDecl>(D->getTemplatedDecl()->getDefinition()); 3556040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor if (Definition && Definition != D->getTemplatedDecl()) { 3557040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor Decl *ImportedDef 3558040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor = Importer.Import(Definition->getDescribedClassTemplate()); 3559040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor if (!ImportedDef) 3560040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor return 0; 3561040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor 3562040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor return Importer.Imported(D, ImportedDef); 3563040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor } 3564040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor 3565040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor // Import the major distinguishing characteristics of this class template. 3566040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor DeclContext *DC, *LexicalDC; 3567040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor DeclarationName Name; 3568040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor SourceLocation Loc; 3569040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor if (ImportDeclParts(D, DC, LexicalDC, Name, Loc)) 3570040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor return 0; 3571040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor 3572040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor // We may already have a template of the same name; try to find and match it. 3573040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor if (!DC->isFunctionOrMethod()) { 3574040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor llvm::SmallVector<NamedDecl *, 4> ConflictingDecls; 3575040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor for (DeclContext::lookup_result Lookup = DC->lookup(Name); 3576040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor Lookup.first != Lookup.second; 3577040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor ++Lookup.first) { 3578040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor if (!(*Lookup.first)->isInIdentifierNamespace(Decl::IDNS_Ordinary)) 3579040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor continue; 3580040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor 3581040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor Decl *Found = *Lookup.first; 3582040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor if (ClassTemplateDecl *FoundTemplate 3583040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor = dyn_cast<ClassTemplateDecl>(Found)) { 3584040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor if (IsStructuralMatch(D, FoundTemplate)) { 3585040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor // The class templates structurally match; call it the same template. 3586040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor // FIXME: We may be filling in a forward declaration here. Handle 3587040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor // this case! 3588040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor Importer.Imported(D->getTemplatedDecl(), 3589040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor FoundTemplate->getTemplatedDecl()); 3590040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor return Importer.Imported(D, FoundTemplate); 3591040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor } 3592040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor } 3593040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor 3594040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor ConflictingDecls.push_back(*Lookup.first); 3595040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor } 3596040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor 3597040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor if (!ConflictingDecls.empty()) { 3598040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor Name = Importer.HandleNameConflict(Name, DC, Decl::IDNS_Ordinary, 3599040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor ConflictingDecls.data(), 3600040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor ConflictingDecls.size()); 3601040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor } 3602040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor 3603040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor if (!Name) 3604040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor return 0; 3605040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor } 3606040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor 3607040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor CXXRecordDecl *DTemplated = D->getTemplatedDecl(); 3608040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor 3609040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor // Create the declaration that is being templated. 3610ba877adeb49ed6dc17f27fa3a3bcd0cca713fd68Abramo Bagnara SourceLocation StartLoc = Importer.Import(DTemplated->getLocStart()); 3611ba877adeb49ed6dc17f27fa3a3bcd0cca713fd68Abramo Bagnara SourceLocation IdLoc = Importer.Import(DTemplated->getLocation()); 3612040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor CXXRecordDecl *D2Templated = CXXRecordDecl::Create(Importer.getToContext(), 3613040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor DTemplated->getTagKind(), 3614ba877adeb49ed6dc17f27fa3a3bcd0cca713fd68Abramo Bagnara DC, StartLoc, IdLoc, 3615ba877adeb49ed6dc17f27fa3a3bcd0cca713fd68Abramo Bagnara Name.getAsIdentifierInfo()); 3616040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor D2Templated->setAccess(DTemplated->getAccess()); 3617c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor D2Templated->setQualifierInfo(Importer.Import(DTemplated->getQualifierLoc())); 3618040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor D2Templated->setLexicalDeclContext(LexicalDC); 3619040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor 3620040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor // Create the class template declaration itself. 3621040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor TemplateParameterList *TemplateParams 3622040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor = ImportTemplateParameterList(D->getTemplateParameters()); 3623040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor if (!TemplateParams) 3624040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor return 0; 3625040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor 3626040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor ClassTemplateDecl *D2 = ClassTemplateDecl::Create(Importer.getToContext(), DC, 3627040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor Loc, Name, TemplateParams, 3628040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor D2Templated, 3629040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor /*PrevDecl=*/0); 3630040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor D2Templated->setDescribedClassTemplate(D2); 3631040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor 3632040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor D2->setAccess(D->getAccess()); 3633040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor D2->setLexicalDeclContext(LexicalDC); 3634040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor LexicalDC->addDecl(D2); 3635040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor 3636040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor // Note the relationship between the class templates. 3637040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor Importer.Imported(D, D2); 3638040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor Importer.Imported(DTemplated, D2Templated); 3639040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor 3640040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor if (DTemplated->isDefinition() && !D2Templated->isDefinition()) { 3641040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor // FIXME: Import definition! 3642040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor } 3643040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor 3644040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor return D2; 3645040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor} 3646040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor 3647d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas GregorDecl *ASTNodeImporter::VisitClassTemplateSpecializationDecl( 3648d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor ClassTemplateSpecializationDecl *D) { 3649d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor // If this record has a definition in the translation unit we're coming from, 3650d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor // but this particular declaration is not that definition, import the 3651d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor // definition and map to that. 3652d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor TagDecl *Definition = D->getDefinition(); 3653d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor if (Definition && Definition != D) { 3654d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor Decl *ImportedDef = Importer.Import(Definition); 3655d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor if (!ImportedDef) 3656d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor return 0; 3657d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor 3658d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor return Importer.Imported(D, ImportedDef); 3659d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor } 3660d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor 3661d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor ClassTemplateDecl *ClassTemplate 3662d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor = cast_or_null<ClassTemplateDecl>(Importer.Import( 3663d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor D->getSpecializedTemplate())); 3664d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor if (!ClassTemplate) 3665d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor return 0; 3666d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor 3667d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor // Import the context of this declaration. 3668d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor DeclContext *DC = ClassTemplate->getDeclContext(); 3669d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor if (!DC) 3670d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor return 0; 3671d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor 3672d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor DeclContext *LexicalDC = DC; 3673d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor if (D->getDeclContext() != D->getLexicalDeclContext()) { 3674d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor LexicalDC = Importer.ImportContext(D->getLexicalDeclContext()); 3675d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor if (!LexicalDC) 3676d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor return 0; 3677d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor } 3678d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor 3679d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor // Import the location of this declaration. 3680ba877adeb49ed6dc17f27fa3a3bcd0cca713fd68Abramo Bagnara SourceLocation StartLoc = Importer.Import(D->getLocStart()); 3681ba877adeb49ed6dc17f27fa3a3bcd0cca713fd68Abramo Bagnara SourceLocation IdLoc = Importer.Import(D->getLocation()); 3682d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor 3683d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor // Import template arguments. 3684d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor llvm::SmallVector<TemplateArgument, 2> TemplateArgs; 3685d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor if (ImportTemplateArguments(D->getTemplateArgs().data(), 3686d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor D->getTemplateArgs().size(), 3687d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor TemplateArgs)) 3688d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor return 0; 3689d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor 3690d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor // Try to find an existing specialization with these template arguments. 3691d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor void *InsertPos = 0; 3692d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor ClassTemplateSpecializationDecl *D2 3693d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor = ClassTemplate->findSpecialization(TemplateArgs.data(), 3694d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor TemplateArgs.size(), InsertPos); 3695d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor if (D2) { 3696d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor // We already have a class template specialization with these template 3697d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor // arguments. 3698d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor 3699d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor // FIXME: Check for specialization vs. instantiation errors. 3700d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor 3701d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor if (RecordDecl *FoundDef = D2->getDefinition()) { 3702d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor if (!D->isDefinition() || IsStructuralMatch(D, FoundDef)) { 3703d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor // The record types structurally match, or the "from" translation 3704d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor // unit only had a forward declaration anyway; call it the same 3705d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor // function. 3706d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor return Importer.Imported(D, FoundDef); 3707d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor } 3708d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor } 3709d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor } else { 3710d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor // Create a new specialization. 3711d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor D2 = ClassTemplateSpecializationDecl::Create(Importer.getToContext(), 3712d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor D->getTagKind(), DC, 3713ba877adeb49ed6dc17f27fa3a3bcd0cca713fd68Abramo Bagnara StartLoc, IdLoc, 3714ba877adeb49ed6dc17f27fa3a3bcd0cca713fd68Abramo Bagnara ClassTemplate, 3715d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor TemplateArgs.data(), 3716d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor TemplateArgs.size(), 3717d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor /*PrevDecl=*/0); 3718d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor D2->setSpecializationKind(D->getSpecializationKind()); 3719d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor 3720d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor // Add this specialization to the class template. 3721d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor ClassTemplate->AddSpecialization(D2, InsertPos); 3722d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor 3723d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor // Import the qualifier, if any. 3724c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor D2->setQualifierInfo(Importer.Import(D->getQualifierLoc())); 3725d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor 3726d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor // Add the specialization to this context. 3727d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor D2->setLexicalDeclContext(LexicalDC); 3728d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor LexicalDC->addDecl(D2); 3729d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor } 3730d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor Importer.Imported(D, D2); 3731d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor 3732d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor if (D->isDefinition() && ImportDefinition(D, D2)) 3733d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor return 0; 3734d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor 3735d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor return D2; 3736d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor} 3737d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor 37384800d95d28b20eca5d57c108ae3d2e6e312c1182Douglas Gregor//---------------------------------------------------------------------------- 37394800d95d28b20eca5d57c108ae3d2e6e312c1182Douglas Gregor// Import Statements 37404800d95d28b20eca5d57c108ae3d2e6e312c1182Douglas Gregor//---------------------------------------------------------------------------- 37414800d95d28b20eca5d57c108ae3d2e6e312c1182Douglas Gregor 37424800d95d28b20eca5d57c108ae3d2e6e312c1182Douglas GregorStmt *ASTNodeImporter::VisitStmt(Stmt *S) { 37434800d95d28b20eca5d57c108ae3d2e6e312c1182Douglas Gregor Importer.FromDiag(S->getLocStart(), diag::err_unsupported_ast_node) 37444800d95d28b20eca5d57c108ae3d2e6e312c1182Douglas Gregor << S->getStmtClassName(); 37454800d95d28b20eca5d57c108ae3d2e6e312c1182Douglas Gregor return 0; 37464800d95d28b20eca5d57c108ae3d2e6e312c1182Douglas Gregor} 37474800d95d28b20eca5d57c108ae3d2e6e312c1182Douglas Gregor 37484800d95d28b20eca5d57c108ae3d2e6e312c1182Douglas Gregor//---------------------------------------------------------------------------- 37494800d95d28b20eca5d57c108ae3d2e6e312c1182Douglas Gregor// Import Expressions 37504800d95d28b20eca5d57c108ae3d2e6e312c1182Douglas Gregor//---------------------------------------------------------------------------- 37514800d95d28b20eca5d57c108ae3d2e6e312c1182Douglas GregorExpr *ASTNodeImporter::VisitExpr(Expr *E) { 37524800d95d28b20eca5d57c108ae3d2e6e312c1182Douglas Gregor Importer.FromDiag(E->getLocStart(), diag::err_unsupported_ast_node) 37534800d95d28b20eca5d57c108ae3d2e6e312c1182Douglas Gregor << E->getStmtClassName(); 37544800d95d28b20eca5d57c108ae3d2e6e312c1182Douglas Gregor return 0; 37554800d95d28b20eca5d57c108ae3d2e6e312c1182Douglas Gregor} 37564800d95d28b20eca5d57c108ae3d2e6e312c1182Douglas Gregor 3757440806306674e23ad74726208cbdc6f37849dd9dDouglas GregorExpr *ASTNodeImporter::VisitDeclRefExpr(DeclRefExpr *E) { 3758440806306674e23ad74726208cbdc6f37849dd9dDouglas Gregor NestedNameSpecifier *Qualifier = 0; 3759440806306674e23ad74726208cbdc6f37849dd9dDouglas Gregor if (E->getQualifier()) { 3760440806306674e23ad74726208cbdc6f37849dd9dDouglas Gregor Qualifier = Importer.Import(E->getQualifier()); 3761440806306674e23ad74726208cbdc6f37849dd9dDouglas Gregor if (!E->getQualifier()) 3762440806306674e23ad74726208cbdc6f37849dd9dDouglas Gregor return 0; 3763440806306674e23ad74726208cbdc6f37849dd9dDouglas Gregor } 3764440806306674e23ad74726208cbdc6f37849dd9dDouglas Gregor 3765440806306674e23ad74726208cbdc6f37849dd9dDouglas Gregor ValueDecl *ToD = cast_or_null<ValueDecl>(Importer.Import(E->getDecl())); 3766440806306674e23ad74726208cbdc6f37849dd9dDouglas Gregor if (!ToD) 3767440806306674e23ad74726208cbdc6f37849dd9dDouglas Gregor return 0; 3768440806306674e23ad74726208cbdc6f37849dd9dDouglas Gregor 3769440806306674e23ad74726208cbdc6f37849dd9dDouglas Gregor QualType T = Importer.Import(E->getType()); 3770440806306674e23ad74726208cbdc6f37849dd9dDouglas Gregor if (T.isNull()) 3771440806306674e23ad74726208cbdc6f37849dd9dDouglas Gregor return 0; 3772440806306674e23ad74726208cbdc6f37849dd9dDouglas Gregor 377340d96a69c0e1e8c10f92d450c305a7aae696ca9cDouglas Gregor return DeclRefExpr::Create(Importer.getToContext(), 377440d96a69c0e1e8c10f92d450c305a7aae696ca9cDouglas Gregor Importer.Import(E->getQualifierLoc()), 3775440806306674e23ad74726208cbdc6f37849dd9dDouglas Gregor ToD, 3776440806306674e23ad74726208cbdc6f37849dd9dDouglas Gregor Importer.Import(E->getLocation()), 3777f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall T, E->getValueKind(), 3778440806306674e23ad74726208cbdc6f37849dd9dDouglas Gregor /*FIXME:TemplateArgs=*/0); 3779440806306674e23ad74726208cbdc6f37849dd9dDouglas Gregor} 3780440806306674e23ad74726208cbdc6f37849dd9dDouglas Gregor 37814800d95d28b20eca5d57c108ae3d2e6e312c1182Douglas GregorExpr *ASTNodeImporter::VisitIntegerLiteral(IntegerLiteral *E) { 37824800d95d28b20eca5d57c108ae3d2e6e312c1182Douglas Gregor QualType T = Importer.Import(E->getType()); 37834800d95d28b20eca5d57c108ae3d2e6e312c1182Douglas Gregor if (T.isNull()) 37844800d95d28b20eca5d57c108ae3d2e6e312c1182Douglas Gregor return 0; 37854800d95d28b20eca5d57c108ae3d2e6e312c1182Douglas Gregor 37869996a7f06a3c5b4554692e7177930cf4e8ef09afArgyrios Kyrtzidis return IntegerLiteral::Create(Importer.getToContext(), 37879996a7f06a3c5b4554692e7177930cf4e8ef09afArgyrios Kyrtzidis E->getValue(), T, 37889996a7f06a3c5b4554692e7177930cf4e8ef09afArgyrios Kyrtzidis Importer.Import(E->getLocation())); 37894800d95d28b20eca5d57c108ae3d2e6e312c1182Douglas Gregor} 37904800d95d28b20eca5d57c108ae3d2e6e312c1182Douglas Gregor 3791b2e400aae8c62c4e1616016f40618baace0da065Douglas GregorExpr *ASTNodeImporter::VisitCharacterLiteral(CharacterLiteral *E) { 3792b2e400aae8c62c4e1616016f40618baace0da065Douglas Gregor QualType T = Importer.Import(E->getType()); 3793b2e400aae8c62c4e1616016f40618baace0da065Douglas Gregor if (T.isNull()) 3794b2e400aae8c62c4e1616016f40618baace0da065Douglas Gregor return 0; 3795b2e400aae8c62c4e1616016f40618baace0da065Douglas Gregor 3796b2e400aae8c62c4e1616016f40618baace0da065Douglas Gregor return new (Importer.getToContext()) CharacterLiteral(E->getValue(), 3797b2e400aae8c62c4e1616016f40618baace0da065Douglas Gregor E->isWide(), T, 3798b2e400aae8c62c4e1616016f40618baace0da065Douglas Gregor Importer.Import(E->getLocation())); 3799b2e400aae8c62c4e1616016f40618baace0da065Douglas Gregor} 3800b2e400aae8c62c4e1616016f40618baace0da065Douglas Gregor 3801f638f9580ba0da99a66668f00e1a1d4987067bddDouglas GregorExpr *ASTNodeImporter::VisitParenExpr(ParenExpr *E) { 3802f638f9580ba0da99a66668f00e1a1d4987067bddDouglas Gregor Expr *SubExpr = Importer.Import(E->getSubExpr()); 3803f638f9580ba0da99a66668f00e1a1d4987067bddDouglas Gregor if (!SubExpr) 3804f638f9580ba0da99a66668f00e1a1d4987067bddDouglas Gregor return 0; 3805f638f9580ba0da99a66668f00e1a1d4987067bddDouglas Gregor 3806f638f9580ba0da99a66668f00e1a1d4987067bddDouglas Gregor return new (Importer.getToContext()) 3807f638f9580ba0da99a66668f00e1a1d4987067bddDouglas Gregor ParenExpr(Importer.Import(E->getLParen()), 3808f638f9580ba0da99a66668f00e1a1d4987067bddDouglas Gregor Importer.Import(E->getRParen()), 3809f638f9580ba0da99a66668f00e1a1d4987067bddDouglas Gregor SubExpr); 3810f638f9580ba0da99a66668f00e1a1d4987067bddDouglas Gregor} 3811f638f9580ba0da99a66668f00e1a1d4987067bddDouglas Gregor 3812f638f9580ba0da99a66668f00e1a1d4987067bddDouglas GregorExpr *ASTNodeImporter::VisitUnaryOperator(UnaryOperator *E) { 3813f638f9580ba0da99a66668f00e1a1d4987067bddDouglas Gregor QualType T = Importer.Import(E->getType()); 3814f638f9580ba0da99a66668f00e1a1d4987067bddDouglas Gregor if (T.isNull()) 3815f638f9580ba0da99a66668f00e1a1d4987067bddDouglas Gregor return 0; 3816f638f9580ba0da99a66668f00e1a1d4987067bddDouglas Gregor 3817f638f9580ba0da99a66668f00e1a1d4987067bddDouglas Gregor Expr *SubExpr = Importer.Import(E->getSubExpr()); 3818f638f9580ba0da99a66668f00e1a1d4987067bddDouglas Gregor if (!SubExpr) 3819f638f9580ba0da99a66668f00e1a1d4987067bddDouglas Gregor return 0; 3820f638f9580ba0da99a66668f00e1a1d4987067bddDouglas Gregor 3821f638f9580ba0da99a66668f00e1a1d4987067bddDouglas Gregor return new (Importer.getToContext()) UnaryOperator(SubExpr, E->getOpcode(), 3822f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall T, E->getValueKind(), 3823f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall E->getObjectKind(), 3824f638f9580ba0da99a66668f00e1a1d4987067bddDouglas Gregor Importer.Import(E->getOperatorLoc())); 3825f638f9580ba0da99a66668f00e1a1d4987067bddDouglas Gregor} 3826f638f9580ba0da99a66668f00e1a1d4987067bddDouglas Gregor 3827f4e3cfbe8abd124be6341ef5d714819b4fbd9082Peter CollingbourneExpr *ASTNodeImporter::VisitUnaryExprOrTypeTraitExpr( 3828f4e3cfbe8abd124be6341ef5d714819b4fbd9082Peter Collingbourne UnaryExprOrTypeTraitExpr *E) { 3829bd249a542878a626192746c1e0c0b21f164e6df7Douglas Gregor QualType ResultType = Importer.Import(E->getType()); 3830bd249a542878a626192746c1e0c0b21f164e6df7Douglas Gregor 3831bd249a542878a626192746c1e0c0b21f164e6df7Douglas Gregor if (E->isArgumentType()) { 3832bd249a542878a626192746c1e0c0b21f164e6df7Douglas Gregor TypeSourceInfo *TInfo = Importer.Import(E->getArgumentTypeInfo()); 3833bd249a542878a626192746c1e0c0b21f164e6df7Douglas Gregor if (!TInfo) 3834bd249a542878a626192746c1e0c0b21f164e6df7Douglas Gregor return 0; 3835bd249a542878a626192746c1e0c0b21f164e6df7Douglas Gregor 3836f4e3cfbe8abd124be6341ef5d714819b4fbd9082Peter Collingbourne return new (Importer.getToContext()) UnaryExprOrTypeTraitExpr(E->getKind(), 3837f4e3cfbe8abd124be6341ef5d714819b4fbd9082Peter Collingbourne TInfo, ResultType, 3838bd249a542878a626192746c1e0c0b21f164e6df7Douglas Gregor Importer.Import(E->getOperatorLoc()), 3839bd249a542878a626192746c1e0c0b21f164e6df7Douglas Gregor Importer.Import(E->getRParenLoc())); 3840bd249a542878a626192746c1e0c0b21f164e6df7Douglas Gregor } 3841bd249a542878a626192746c1e0c0b21f164e6df7Douglas Gregor 3842bd249a542878a626192746c1e0c0b21f164e6df7Douglas Gregor Expr *SubExpr = Importer.Import(E->getArgumentExpr()); 3843bd249a542878a626192746c1e0c0b21f164e6df7Douglas Gregor if (!SubExpr) 3844bd249a542878a626192746c1e0c0b21f164e6df7Douglas Gregor return 0; 3845bd249a542878a626192746c1e0c0b21f164e6df7Douglas Gregor 3846f4e3cfbe8abd124be6341ef5d714819b4fbd9082Peter Collingbourne return new (Importer.getToContext()) UnaryExprOrTypeTraitExpr(E->getKind(), 3847f4e3cfbe8abd124be6341ef5d714819b4fbd9082Peter Collingbourne SubExpr, ResultType, 3848bd249a542878a626192746c1e0c0b21f164e6df7Douglas Gregor Importer.Import(E->getOperatorLoc()), 3849bd249a542878a626192746c1e0c0b21f164e6df7Douglas Gregor Importer.Import(E->getRParenLoc())); 3850bd249a542878a626192746c1e0c0b21f164e6df7Douglas Gregor} 3851bd249a542878a626192746c1e0c0b21f164e6df7Douglas Gregor 3852f638f9580ba0da99a66668f00e1a1d4987067bddDouglas GregorExpr *ASTNodeImporter::VisitBinaryOperator(BinaryOperator *E) { 3853f638f9580ba0da99a66668f00e1a1d4987067bddDouglas Gregor QualType T = Importer.Import(E->getType()); 3854f638f9580ba0da99a66668f00e1a1d4987067bddDouglas Gregor if (T.isNull()) 3855f638f9580ba0da99a66668f00e1a1d4987067bddDouglas Gregor return 0; 3856f638f9580ba0da99a66668f00e1a1d4987067bddDouglas Gregor 3857f638f9580ba0da99a66668f00e1a1d4987067bddDouglas Gregor Expr *LHS = Importer.Import(E->getLHS()); 3858f638f9580ba0da99a66668f00e1a1d4987067bddDouglas Gregor if (!LHS) 3859f638f9580ba0da99a66668f00e1a1d4987067bddDouglas Gregor return 0; 3860f638f9580ba0da99a66668f00e1a1d4987067bddDouglas Gregor 3861f638f9580ba0da99a66668f00e1a1d4987067bddDouglas Gregor Expr *RHS = Importer.Import(E->getRHS()); 3862f638f9580ba0da99a66668f00e1a1d4987067bddDouglas Gregor if (!RHS) 3863f638f9580ba0da99a66668f00e1a1d4987067bddDouglas Gregor return 0; 3864f638f9580ba0da99a66668f00e1a1d4987067bddDouglas Gregor 3865f638f9580ba0da99a66668f00e1a1d4987067bddDouglas Gregor return new (Importer.getToContext()) BinaryOperator(LHS, RHS, E->getOpcode(), 3866f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall T, E->getValueKind(), 3867f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall E->getObjectKind(), 3868f638f9580ba0da99a66668f00e1a1d4987067bddDouglas Gregor Importer.Import(E->getOperatorLoc())); 3869f638f9580ba0da99a66668f00e1a1d4987067bddDouglas Gregor} 3870f638f9580ba0da99a66668f00e1a1d4987067bddDouglas Gregor 3871f638f9580ba0da99a66668f00e1a1d4987067bddDouglas GregorExpr *ASTNodeImporter::VisitCompoundAssignOperator(CompoundAssignOperator *E) { 3872f638f9580ba0da99a66668f00e1a1d4987067bddDouglas Gregor QualType T = Importer.Import(E->getType()); 3873f638f9580ba0da99a66668f00e1a1d4987067bddDouglas Gregor if (T.isNull()) 3874f638f9580ba0da99a66668f00e1a1d4987067bddDouglas Gregor return 0; 3875f638f9580ba0da99a66668f00e1a1d4987067bddDouglas Gregor 3876f638f9580ba0da99a66668f00e1a1d4987067bddDouglas Gregor QualType CompLHSType = Importer.Import(E->getComputationLHSType()); 3877f638f9580ba0da99a66668f00e1a1d4987067bddDouglas Gregor if (CompLHSType.isNull()) 3878f638f9580ba0da99a66668f00e1a1d4987067bddDouglas Gregor return 0; 3879f638f9580ba0da99a66668f00e1a1d4987067bddDouglas Gregor 3880f638f9580ba0da99a66668f00e1a1d4987067bddDouglas Gregor QualType CompResultType = Importer.Import(E->getComputationResultType()); 3881f638f9580ba0da99a66668f00e1a1d4987067bddDouglas Gregor if (CompResultType.isNull()) 3882f638f9580ba0da99a66668f00e1a1d4987067bddDouglas Gregor return 0; 3883f638f9580ba0da99a66668f00e1a1d4987067bddDouglas Gregor 3884f638f9580ba0da99a66668f00e1a1d4987067bddDouglas Gregor Expr *LHS = Importer.Import(E->getLHS()); 3885f638f9580ba0da99a66668f00e1a1d4987067bddDouglas Gregor if (!LHS) 3886f638f9580ba0da99a66668f00e1a1d4987067bddDouglas Gregor return 0; 3887f638f9580ba0da99a66668f00e1a1d4987067bddDouglas Gregor 3888f638f9580ba0da99a66668f00e1a1d4987067bddDouglas Gregor Expr *RHS = Importer.Import(E->getRHS()); 3889f638f9580ba0da99a66668f00e1a1d4987067bddDouglas Gregor if (!RHS) 3890f638f9580ba0da99a66668f00e1a1d4987067bddDouglas Gregor return 0; 3891f638f9580ba0da99a66668f00e1a1d4987067bddDouglas Gregor 3892f638f9580ba0da99a66668f00e1a1d4987067bddDouglas Gregor return new (Importer.getToContext()) 3893f638f9580ba0da99a66668f00e1a1d4987067bddDouglas Gregor CompoundAssignOperator(LHS, RHS, E->getOpcode(), 3894f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall T, E->getValueKind(), 3895f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall E->getObjectKind(), 3896f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall CompLHSType, CompResultType, 3897f638f9580ba0da99a66668f00e1a1d4987067bddDouglas Gregor Importer.Import(E->getOperatorLoc())); 3898f638f9580ba0da99a66668f00e1a1d4987067bddDouglas Gregor} 3899f638f9580ba0da99a66668f00e1a1d4987067bddDouglas Gregor 3900da57f3eeab7b7f7f6e6788956f0a0d9adf196a7dBenjamin Kramerstatic bool ImportCastPath(CastExpr *E, CXXCastPath &Path) { 3901f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall if (E->path_empty()) return false; 3902f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall 3903f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall // TODO: import cast paths 3904f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall return true; 3905f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall} 3906f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall 390736ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas GregorExpr *ASTNodeImporter::VisitImplicitCastExpr(ImplicitCastExpr *E) { 390836ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas Gregor QualType T = Importer.Import(E->getType()); 390936ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas Gregor if (T.isNull()) 391036ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas Gregor return 0; 391136ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas Gregor 391236ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas Gregor Expr *SubExpr = Importer.Import(E->getSubExpr()); 391336ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas Gregor if (!SubExpr) 391436ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas Gregor return 0; 3915f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall 3916f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall CXXCastPath BasePath; 3917f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall if (ImportCastPath(E, BasePath)) 3918f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall return 0; 3919f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall 3920f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall return ImplicitCastExpr::Create(Importer.getToContext(), T, E->getCastKind(), 39215baba9d98364a3525d6afa15a04cdad82fd6dd30John McCall SubExpr, &BasePath, E->getValueKind()); 392236ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas Gregor} 392336ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas Gregor 3924008847a70ab122a99911149199855060fb3753b4Douglas GregorExpr *ASTNodeImporter::VisitCStyleCastExpr(CStyleCastExpr *E) { 3925008847a70ab122a99911149199855060fb3753b4Douglas Gregor QualType T = Importer.Import(E->getType()); 3926008847a70ab122a99911149199855060fb3753b4Douglas Gregor if (T.isNull()) 3927008847a70ab122a99911149199855060fb3753b4Douglas Gregor return 0; 3928008847a70ab122a99911149199855060fb3753b4Douglas Gregor 3929008847a70ab122a99911149199855060fb3753b4Douglas Gregor Expr *SubExpr = Importer.Import(E->getSubExpr()); 3930008847a70ab122a99911149199855060fb3753b4Douglas Gregor if (!SubExpr) 3931008847a70ab122a99911149199855060fb3753b4Douglas Gregor return 0; 3932008847a70ab122a99911149199855060fb3753b4Douglas Gregor 3933008847a70ab122a99911149199855060fb3753b4Douglas Gregor TypeSourceInfo *TInfo = Importer.Import(E->getTypeInfoAsWritten()); 3934008847a70ab122a99911149199855060fb3753b4Douglas Gregor if (!TInfo && E->getTypeInfoAsWritten()) 3935008847a70ab122a99911149199855060fb3753b4Douglas Gregor return 0; 3936008847a70ab122a99911149199855060fb3753b4Douglas Gregor 3937f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall CXXCastPath BasePath; 3938f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall if (ImportCastPath(E, BasePath)) 3939f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall return 0; 3940f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall 3941f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall return CStyleCastExpr::Create(Importer.getToContext(), T, 3942f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall E->getValueKind(), E->getCastKind(), 3943f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall SubExpr, &BasePath, TInfo, 3944f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall Importer.Import(E->getLParenLoc()), 3945f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall Importer.Import(E->getRParenLoc())); 3946008847a70ab122a99911149199855060fb3753b4Douglas Gregor} 3947008847a70ab122a99911149199855060fb3753b4Douglas Gregor 394833e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios KyrtzidisASTImporter::ASTImporter(ASTContext &ToContext, FileManager &ToFileManager, 3949d8868a634d4fd362243dc646e58c3cf956c81dcdDouglas Gregor ASTContext &FromContext, FileManager &FromFileManager, 3950d8868a634d4fd362243dc646e58c3cf956c81dcdDouglas Gregor bool MinimalImport) 39511b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor : ToContext(ToContext), FromContext(FromContext), 3952d8868a634d4fd362243dc646e58c3cf956c81dcdDouglas Gregor ToFileManager(ToFileManager), FromFileManager(FromFileManager), 3953d8868a634d4fd362243dc646e58c3cf956c81dcdDouglas Gregor Minimal(MinimalImport) 3954d8868a634d4fd362243dc646e58c3cf956c81dcdDouglas Gregor{ 39559bed8798964d9f07599c2c9199701f86fbc70e20Douglas Gregor ImportedDecls[FromContext.getTranslationUnitDecl()] 39569bed8798964d9f07599c2c9199701f86fbc70e20Douglas Gregor = ToContext.getTranslationUnitDecl(); 39579bed8798964d9f07599c2c9199701f86fbc70e20Douglas Gregor} 39589bed8798964d9f07599c2c9199701f86fbc70e20Douglas Gregor 39599bed8798964d9f07599c2c9199701f86fbc70e20Douglas GregorASTImporter::~ASTImporter() { } 39601b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor 39611b2949d27ec72894dec017c330c0548af4bb2476Douglas GregorQualType ASTImporter::Import(QualType FromT) { 39621b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor if (FromT.isNull()) 39631b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor return QualType(); 3964f4c7371fb1d3cebcfb40abad4537bb82515704eaJohn McCall 3965f4c7371fb1d3cebcfb40abad4537bb82515704eaJohn McCall const Type *fromTy = FromT.getTypePtr(); 39661b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor 3967169fba50da76d71723cd1d91629cabb310f8bf9eDouglas Gregor // Check whether we've already imported this type. 3968f4c7371fb1d3cebcfb40abad4537bb82515704eaJohn McCall llvm::DenseMap<const Type *, const Type *>::iterator Pos 3969f4c7371fb1d3cebcfb40abad4537bb82515704eaJohn McCall = ImportedTypes.find(fromTy); 3970169fba50da76d71723cd1d91629cabb310f8bf9eDouglas Gregor if (Pos != ImportedTypes.end()) 3971f4c7371fb1d3cebcfb40abad4537bb82515704eaJohn McCall return ToContext.getQualifiedType(Pos->second, FromT.getLocalQualifiers()); 39721b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor 3973169fba50da76d71723cd1d91629cabb310f8bf9eDouglas Gregor // Import the type 39741b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor ASTNodeImporter Importer(*this); 3975f4c7371fb1d3cebcfb40abad4537bb82515704eaJohn McCall QualType ToT = Importer.Visit(fromTy); 39761b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor if (ToT.isNull()) 39771b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor return ToT; 39781b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor 3979169fba50da76d71723cd1d91629cabb310f8bf9eDouglas Gregor // Record the imported type. 3980f4c7371fb1d3cebcfb40abad4537bb82515704eaJohn McCall ImportedTypes[fromTy] = ToT.getTypePtr(); 3981169fba50da76d71723cd1d91629cabb310f8bf9eDouglas Gregor 3982f4c7371fb1d3cebcfb40abad4537bb82515704eaJohn McCall return ToContext.getQualifiedType(ToT, FromT.getLocalQualifiers()); 39831b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor} 39841b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor 39859bed8798964d9f07599c2c9199701f86fbc70e20Douglas GregorTypeSourceInfo *ASTImporter::Import(TypeSourceInfo *FromTSI) { 398682fc4bfa6f8ea35488b9038dd83d40766c3645cfDouglas Gregor if (!FromTSI) 398782fc4bfa6f8ea35488b9038dd83d40766c3645cfDouglas Gregor return FromTSI; 398882fc4bfa6f8ea35488b9038dd83d40766c3645cfDouglas Gregor 398982fc4bfa6f8ea35488b9038dd83d40766c3645cfDouglas Gregor // FIXME: For now we just create a "trivial" type source info based 39905606220447c7901ba8d80147ddab893bb7949dd5Nick Lewycky // on the type and a single location. Implement a real version of this. 399182fc4bfa6f8ea35488b9038dd83d40766c3645cfDouglas Gregor QualType T = Import(FromTSI->getType()); 399282fc4bfa6f8ea35488b9038dd83d40766c3645cfDouglas Gregor if (T.isNull()) 399382fc4bfa6f8ea35488b9038dd83d40766c3645cfDouglas Gregor return 0; 399482fc4bfa6f8ea35488b9038dd83d40766c3645cfDouglas Gregor 399582fc4bfa6f8ea35488b9038dd83d40766c3645cfDouglas Gregor return ToContext.getTrivialTypeSourceInfo(T, 3996bd054dba8a3023821f2a0951b0fae05e3522a7c9Abramo Bagnara FromTSI->getTypeLoc().getSourceRange().getBegin()); 39979bed8798964d9f07599c2c9199701f86fbc70e20Douglas Gregor} 39989bed8798964d9f07599c2c9199701f86fbc70e20Douglas Gregor 39999bed8798964d9f07599c2c9199701f86fbc70e20Douglas GregorDecl *ASTImporter::Import(Decl *FromD) { 40009bed8798964d9f07599c2c9199701f86fbc70e20Douglas Gregor if (!FromD) 40019bed8798964d9f07599c2c9199701f86fbc70e20Douglas Gregor return 0; 40029bed8798964d9f07599c2c9199701f86fbc70e20Douglas Gregor 40039bed8798964d9f07599c2c9199701f86fbc70e20Douglas Gregor // Check whether we've already imported this declaration. 40049bed8798964d9f07599c2c9199701f86fbc70e20Douglas Gregor llvm::DenseMap<Decl *, Decl *>::iterator Pos = ImportedDecls.find(FromD); 40059bed8798964d9f07599c2c9199701f86fbc70e20Douglas Gregor if (Pos != ImportedDecls.end()) 40069bed8798964d9f07599c2c9199701f86fbc70e20Douglas Gregor return Pos->second; 40079bed8798964d9f07599c2c9199701f86fbc70e20Douglas Gregor 40089bed8798964d9f07599c2c9199701f86fbc70e20Douglas Gregor // Import the type 40099bed8798964d9f07599c2c9199701f86fbc70e20Douglas Gregor ASTNodeImporter Importer(*this); 40109bed8798964d9f07599c2c9199701f86fbc70e20Douglas Gregor Decl *ToD = Importer.Visit(FromD); 40119bed8798964d9f07599c2c9199701f86fbc70e20Douglas Gregor if (!ToD) 40129bed8798964d9f07599c2c9199701f86fbc70e20Douglas Gregor return 0; 40139bed8798964d9f07599c2c9199701f86fbc70e20Douglas Gregor 40149bed8798964d9f07599c2c9199701f86fbc70e20Douglas Gregor // Record the imported declaration. 40159bed8798964d9f07599c2c9199701f86fbc70e20Douglas Gregor ImportedDecls[FromD] = ToD; 4016ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor 4017ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor if (TagDecl *FromTag = dyn_cast<TagDecl>(FromD)) { 4018ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor // Keep track of anonymous tags that have an associated typedef. 4019162e1c1b487352434552147967c3dd296ebee2f7Richard Smith if (FromTag->getTypedefNameForAnonDecl()) 4020ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor AnonTagsWithPendingTypedefs.push_back(FromTag); 4021162e1c1b487352434552147967c3dd296ebee2f7Richard Smith } else if (TypedefNameDecl *FromTypedef = dyn_cast<TypedefNameDecl>(FromD)) { 4022ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor // When we've finished transforming a typedef, see whether it was the 4023ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor // typedef for an anonymous tag. 4024ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor for (llvm::SmallVector<TagDecl *, 4>::iterator 4025ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor FromTag = AnonTagsWithPendingTypedefs.begin(), 4026ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor FromTagEnd = AnonTagsWithPendingTypedefs.end(); 4027ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor FromTag != FromTagEnd; ++FromTag) { 4028162e1c1b487352434552147967c3dd296ebee2f7Richard Smith if ((*FromTag)->getTypedefNameForAnonDecl() == FromTypedef) { 4029ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor if (TagDecl *ToTag = cast_or_null<TagDecl>(Import(*FromTag))) { 4030ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor // We found the typedef for an anonymous tag; link them. 4031162e1c1b487352434552147967c3dd296ebee2f7Richard Smith ToTag->setTypedefNameForAnonDecl(cast<TypedefNameDecl>(ToD)); 4032ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor AnonTagsWithPendingTypedefs.erase(FromTag); 4033ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor break; 4034ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor } 4035ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor } 4036ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor } 4037ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor } 4038ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor 40399bed8798964d9f07599c2c9199701f86fbc70e20Douglas Gregor return ToD; 40409bed8798964d9f07599c2c9199701f86fbc70e20Douglas Gregor} 40419bed8798964d9f07599c2c9199701f86fbc70e20Douglas Gregor 40429bed8798964d9f07599c2c9199701f86fbc70e20Douglas GregorDeclContext *ASTImporter::ImportContext(DeclContext *FromDC) { 40439bed8798964d9f07599c2c9199701f86fbc70e20Douglas Gregor if (!FromDC) 40449bed8798964d9f07599c2c9199701f86fbc70e20Douglas Gregor return FromDC; 40459bed8798964d9f07599c2c9199701f86fbc70e20Douglas Gregor 40469bed8798964d9f07599c2c9199701f86fbc70e20Douglas Gregor return cast_or_null<DeclContext>(Import(cast<Decl>(FromDC))); 40479bed8798964d9f07599c2c9199701f86fbc70e20Douglas Gregor} 40489bed8798964d9f07599c2c9199701f86fbc70e20Douglas Gregor 40499bed8798964d9f07599c2c9199701f86fbc70e20Douglas GregorExpr *ASTImporter::Import(Expr *FromE) { 40509bed8798964d9f07599c2c9199701f86fbc70e20Douglas Gregor if (!FromE) 40519bed8798964d9f07599c2c9199701f86fbc70e20Douglas Gregor return 0; 40529bed8798964d9f07599c2c9199701f86fbc70e20Douglas Gregor 40539bed8798964d9f07599c2c9199701f86fbc70e20Douglas Gregor return cast_or_null<Expr>(Import(cast<Stmt>(FromE))); 40549bed8798964d9f07599c2c9199701f86fbc70e20Douglas Gregor} 40559bed8798964d9f07599c2c9199701f86fbc70e20Douglas Gregor 40569bed8798964d9f07599c2c9199701f86fbc70e20Douglas GregorStmt *ASTImporter::Import(Stmt *FromS) { 40579bed8798964d9f07599c2c9199701f86fbc70e20Douglas Gregor if (!FromS) 40589bed8798964d9f07599c2c9199701f86fbc70e20Douglas Gregor return 0; 40599bed8798964d9f07599c2c9199701f86fbc70e20Douglas Gregor 40604800d95d28b20eca5d57c108ae3d2e6e312c1182Douglas Gregor // Check whether we've already imported this declaration. 40614800d95d28b20eca5d57c108ae3d2e6e312c1182Douglas Gregor llvm::DenseMap<Stmt *, Stmt *>::iterator Pos = ImportedStmts.find(FromS); 40624800d95d28b20eca5d57c108ae3d2e6e312c1182Douglas Gregor if (Pos != ImportedStmts.end()) 40634800d95d28b20eca5d57c108ae3d2e6e312c1182Douglas Gregor return Pos->second; 40644800d95d28b20eca5d57c108ae3d2e6e312c1182Douglas Gregor 40654800d95d28b20eca5d57c108ae3d2e6e312c1182Douglas Gregor // Import the type 40664800d95d28b20eca5d57c108ae3d2e6e312c1182Douglas Gregor ASTNodeImporter Importer(*this); 40674800d95d28b20eca5d57c108ae3d2e6e312c1182Douglas Gregor Stmt *ToS = Importer.Visit(FromS); 40684800d95d28b20eca5d57c108ae3d2e6e312c1182Douglas Gregor if (!ToS) 40694800d95d28b20eca5d57c108ae3d2e6e312c1182Douglas Gregor return 0; 40704800d95d28b20eca5d57c108ae3d2e6e312c1182Douglas Gregor 40714800d95d28b20eca5d57c108ae3d2e6e312c1182Douglas Gregor // Record the imported declaration. 40724800d95d28b20eca5d57c108ae3d2e6e312c1182Douglas Gregor ImportedStmts[FromS] = ToS; 40734800d95d28b20eca5d57c108ae3d2e6e312c1182Douglas Gregor return ToS; 40749bed8798964d9f07599c2c9199701f86fbc70e20Douglas Gregor} 40759bed8798964d9f07599c2c9199701f86fbc70e20Douglas Gregor 40769bed8798964d9f07599c2c9199701f86fbc70e20Douglas GregorNestedNameSpecifier *ASTImporter::Import(NestedNameSpecifier *FromNNS) { 40779bed8798964d9f07599c2c9199701f86fbc70e20Douglas Gregor if (!FromNNS) 40789bed8798964d9f07599c2c9199701f86fbc70e20Douglas Gregor return 0; 40799bed8798964d9f07599c2c9199701f86fbc70e20Douglas Gregor 40809bed8798964d9f07599c2c9199701f86fbc70e20Douglas Gregor // FIXME: Implement! 40819bed8798964d9f07599c2c9199701f86fbc70e20Douglas Gregor return 0; 40829bed8798964d9f07599c2c9199701f86fbc70e20Douglas Gregor} 40839bed8798964d9f07599c2c9199701f86fbc70e20Douglas Gregor 4084c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas GregorNestedNameSpecifierLoc ASTImporter::Import(NestedNameSpecifierLoc FromNNS) { 4085c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor // FIXME: Implement! 4086c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor return NestedNameSpecifierLoc(); 4087c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor} 4088c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor 4089d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas GregorTemplateName ASTImporter::Import(TemplateName From) { 4090d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor switch (From.getKind()) { 4091d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor case TemplateName::Template: 4092d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor if (TemplateDecl *ToTemplate 4093d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor = cast_or_null<TemplateDecl>(Import(From.getAsTemplateDecl()))) 4094d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor return TemplateName(ToTemplate); 4095d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor 4096d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor return TemplateName(); 4097d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor 4098d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor case TemplateName::OverloadedTemplate: { 4099d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor OverloadedTemplateStorage *FromStorage = From.getAsOverloadedTemplate(); 4100d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor UnresolvedSet<2> ToTemplates; 4101d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor for (OverloadedTemplateStorage::iterator I = FromStorage->begin(), 4102d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor E = FromStorage->end(); 4103d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor I != E; ++I) { 4104d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor if (NamedDecl *To = cast_or_null<NamedDecl>(Import(*I))) 4105d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor ToTemplates.addDecl(To); 4106d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor else 4107d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor return TemplateName(); 4108d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor } 4109d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor return ToContext.getOverloadedTemplateName(ToTemplates.begin(), 4110d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor ToTemplates.end()); 4111d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor } 4112d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor 4113d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor case TemplateName::QualifiedTemplate: { 4114d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor QualifiedTemplateName *QTN = From.getAsQualifiedTemplateName(); 4115d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor NestedNameSpecifier *Qualifier = Import(QTN->getQualifier()); 4116d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor if (!Qualifier) 4117d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor return TemplateName(); 4118d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor 4119d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor if (TemplateDecl *ToTemplate 4120d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor = cast_or_null<TemplateDecl>(Import(From.getAsTemplateDecl()))) 4121d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor return ToContext.getQualifiedTemplateName(Qualifier, 4122d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor QTN->hasTemplateKeyword(), 4123d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor ToTemplate); 4124d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor 4125d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor return TemplateName(); 4126d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor } 4127d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor 4128d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor case TemplateName::DependentTemplate: { 4129d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor DependentTemplateName *DTN = From.getAsDependentTemplateName(); 4130d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor NestedNameSpecifier *Qualifier = Import(DTN->getQualifier()); 4131d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor if (!Qualifier) 4132d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor return TemplateName(); 4133d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor 4134d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor if (DTN->isIdentifier()) { 4135d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor return ToContext.getDependentTemplateName(Qualifier, 4136d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor Import(DTN->getIdentifier())); 4137d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor } 4138d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor 4139d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor return ToContext.getDependentTemplateName(Qualifier, DTN->getOperator()); 4140d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor } 41411aee05d08b2184acadeb36de300e216390780d6cDouglas Gregor 41421aee05d08b2184acadeb36de300e216390780d6cDouglas Gregor case TemplateName::SubstTemplateTemplateParmPack: { 41431aee05d08b2184acadeb36de300e216390780d6cDouglas Gregor SubstTemplateTemplateParmPackStorage *SubstPack 41441aee05d08b2184acadeb36de300e216390780d6cDouglas Gregor = From.getAsSubstTemplateTemplateParmPack(); 41451aee05d08b2184acadeb36de300e216390780d6cDouglas Gregor TemplateTemplateParmDecl *Param 41461aee05d08b2184acadeb36de300e216390780d6cDouglas Gregor = cast_or_null<TemplateTemplateParmDecl>( 41471aee05d08b2184acadeb36de300e216390780d6cDouglas Gregor Import(SubstPack->getParameterPack())); 41481aee05d08b2184acadeb36de300e216390780d6cDouglas Gregor if (!Param) 41491aee05d08b2184acadeb36de300e216390780d6cDouglas Gregor return TemplateName(); 41501aee05d08b2184acadeb36de300e216390780d6cDouglas Gregor 41511aee05d08b2184acadeb36de300e216390780d6cDouglas Gregor ASTNodeImporter Importer(*this); 41521aee05d08b2184acadeb36de300e216390780d6cDouglas Gregor TemplateArgument ArgPack 41531aee05d08b2184acadeb36de300e216390780d6cDouglas Gregor = Importer.ImportTemplateArgument(SubstPack->getArgumentPack()); 41541aee05d08b2184acadeb36de300e216390780d6cDouglas Gregor if (ArgPack.isNull()) 41551aee05d08b2184acadeb36de300e216390780d6cDouglas Gregor return TemplateName(); 41561aee05d08b2184acadeb36de300e216390780d6cDouglas Gregor 41571aee05d08b2184acadeb36de300e216390780d6cDouglas Gregor return ToContext.getSubstTemplateTemplateParmPack(Param, ArgPack); 41581aee05d08b2184acadeb36de300e216390780d6cDouglas Gregor } 4159d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor } 4160d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor 4161d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor llvm_unreachable("Invalid template name kind"); 4162d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor return TemplateName(); 4163d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor} 4164d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor 41659bed8798964d9f07599c2c9199701f86fbc70e20Douglas GregorSourceLocation ASTImporter::Import(SourceLocation FromLoc) { 41669bed8798964d9f07599c2c9199701f86fbc70e20Douglas Gregor if (FromLoc.isInvalid()) 41679bed8798964d9f07599c2c9199701f86fbc70e20Douglas Gregor return SourceLocation(); 41689bed8798964d9f07599c2c9199701f86fbc70e20Douglas Gregor 4169885237354fd902998c6ae9d7cc3dc8de96b123dcDouglas Gregor SourceManager &FromSM = FromContext.getSourceManager(); 4170885237354fd902998c6ae9d7cc3dc8de96b123dcDouglas Gregor 4171885237354fd902998c6ae9d7cc3dc8de96b123dcDouglas Gregor // For now, map everything down to its spelling location, so that we 4172885237354fd902998c6ae9d7cc3dc8de96b123dcDouglas Gregor // don't have to import macro instantiations. 4173885237354fd902998c6ae9d7cc3dc8de96b123dcDouglas Gregor // FIXME: Import macro instantiations! 4174885237354fd902998c6ae9d7cc3dc8de96b123dcDouglas Gregor FromLoc = FromSM.getSpellingLoc(FromLoc); 4175885237354fd902998c6ae9d7cc3dc8de96b123dcDouglas Gregor std::pair<FileID, unsigned> Decomposed = FromSM.getDecomposedLoc(FromLoc); 4176885237354fd902998c6ae9d7cc3dc8de96b123dcDouglas Gregor SourceManager &ToSM = ToContext.getSourceManager(); 4177885237354fd902998c6ae9d7cc3dc8de96b123dcDouglas Gregor return ToSM.getLocForStartOfFile(Import(Decomposed.first)) 4178885237354fd902998c6ae9d7cc3dc8de96b123dcDouglas Gregor .getFileLocWithOffset(Decomposed.second); 41799bed8798964d9f07599c2c9199701f86fbc70e20Douglas Gregor} 41809bed8798964d9f07599c2c9199701f86fbc70e20Douglas Gregor 41819bed8798964d9f07599c2c9199701f86fbc70e20Douglas GregorSourceRange ASTImporter::Import(SourceRange FromRange) { 41829bed8798964d9f07599c2c9199701f86fbc70e20Douglas Gregor return SourceRange(Import(FromRange.getBegin()), Import(FromRange.getEnd())); 41839bed8798964d9f07599c2c9199701f86fbc70e20Douglas Gregor} 41849bed8798964d9f07599c2c9199701f86fbc70e20Douglas Gregor 4185885237354fd902998c6ae9d7cc3dc8de96b123dcDouglas GregorFileID ASTImporter::Import(FileID FromID) { 4186535a3e20104461c136654d59fb833ae80644ae79Sebastian Redl llvm::DenseMap<FileID, FileID>::iterator Pos 4187535a3e20104461c136654d59fb833ae80644ae79Sebastian Redl = ImportedFileIDs.find(FromID); 4188885237354fd902998c6ae9d7cc3dc8de96b123dcDouglas Gregor if (Pos != ImportedFileIDs.end()) 4189885237354fd902998c6ae9d7cc3dc8de96b123dcDouglas Gregor return Pos->second; 4190885237354fd902998c6ae9d7cc3dc8de96b123dcDouglas Gregor 4191885237354fd902998c6ae9d7cc3dc8de96b123dcDouglas Gregor SourceManager &FromSM = FromContext.getSourceManager(); 4192885237354fd902998c6ae9d7cc3dc8de96b123dcDouglas Gregor SourceManager &ToSM = ToContext.getSourceManager(); 4193885237354fd902998c6ae9d7cc3dc8de96b123dcDouglas Gregor const SrcMgr::SLocEntry &FromSLoc = FromSM.getSLocEntry(FromID); 4194885237354fd902998c6ae9d7cc3dc8de96b123dcDouglas Gregor assert(FromSLoc.isFile() && "Cannot handle macro instantiations yet"); 4195885237354fd902998c6ae9d7cc3dc8de96b123dcDouglas Gregor 4196885237354fd902998c6ae9d7cc3dc8de96b123dcDouglas Gregor // Include location of this file. 4197885237354fd902998c6ae9d7cc3dc8de96b123dcDouglas Gregor SourceLocation ToIncludeLoc = Import(FromSLoc.getFile().getIncludeLoc()); 4198885237354fd902998c6ae9d7cc3dc8de96b123dcDouglas Gregor 4199885237354fd902998c6ae9d7cc3dc8de96b123dcDouglas Gregor // Map the FileID for to the "to" source manager. 4200885237354fd902998c6ae9d7cc3dc8de96b123dcDouglas Gregor FileID ToID; 4201885237354fd902998c6ae9d7cc3dc8de96b123dcDouglas Gregor const SrcMgr::ContentCache *Cache = FromSLoc.getFile().getContentCache(); 4202b1c86492f9a9bef01a4567408c22f961bbd604feArgyrios Kyrtzidis if (Cache->OrigEntry) { 4203885237354fd902998c6ae9d7cc3dc8de96b123dcDouglas Gregor // FIXME: We probably want to use getVirtualFile(), so we don't hit the 4204885237354fd902998c6ae9d7cc3dc8de96b123dcDouglas Gregor // disk again 4205885237354fd902998c6ae9d7cc3dc8de96b123dcDouglas Gregor // FIXME: We definitely want to re-use the existing MemoryBuffer, rather 4206885237354fd902998c6ae9d7cc3dc8de96b123dcDouglas Gregor // than mmap the files several times. 4207b1c86492f9a9bef01a4567408c22f961bbd604feArgyrios Kyrtzidis const FileEntry *Entry = ToFileManager.getFile(Cache->OrigEntry->getName()); 4208885237354fd902998c6ae9d7cc3dc8de96b123dcDouglas Gregor ToID = ToSM.createFileID(Entry, ToIncludeLoc, 4209885237354fd902998c6ae9d7cc3dc8de96b123dcDouglas Gregor FromSLoc.getFile().getFileCharacteristic()); 4210885237354fd902998c6ae9d7cc3dc8de96b123dcDouglas Gregor } else { 4211885237354fd902998c6ae9d7cc3dc8de96b123dcDouglas Gregor // FIXME: We want to re-use the existing MemoryBuffer! 421233e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis const llvm::MemoryBuffer * 421333e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis FromBuf = Cache->getBuffer(FromContext.getDiagnostics(), FromSM); 4214885237354fd902998c6ae9d7cc3dc8de96b123dcDouglas Gregor llvm::MemoryBuffer *ToBuf 4215a0a270c0f1c0a4e3482438bdc5f4a7bd3d25f0a6Chris Lattner = llvm::MemoryBuffer::getMemBufferCopy(FromBuf->getBuffer(), 4216885237354fd902998c6ae9d7cc3dc8de96b123dcDouglas Gregor FromBuf->getBufferIdentifier()); 4217885237354fd902998c6ae9d7cc3dc8de96b123dcDouglas Gregor ToID = ToSM.createFileIDForMemBuffer(ToBuf); 4218885237354fd902998c6ae9d7cc3dc8de96b123dcDouglas Gregor } 4219885237354fd902998c6ae9d7cc3dc8de96b123dcDouglas Gregor 4220885237354fd902998c6ae9d7cc3dc8de96b123dcDouglas Gregor 4221535a3e20104461c136654d59fb833ae80644ae79Sebastian Redl ImportedFileIDs[FromID] = ToID; 4222885237354fd902998c6ae9d7cc3dc8de96b123dcDouglas Gregor return ToID; 4223885237354fd902998c6ae9d7cc3dc8de96b123dcDouglas Gregor} 4224885237354fd902998c6ae9d7cc3dc8de96b123dcDouglas Gregor 4225d8868a634d4fd362243dc646e58c3cf956c81dcdDouglas Gregorvoid ASTImporter::ImportDefinition(Decl *From) { 4226d8868a634d4fd362243dc646e58c3cf956c81dcdDouglas Gregor Decl *To = Import(From); 4227d8868a634d4fd362243dc646e58c3cf956c81dcdDouglas Gregor if (!To) 4228d8868a634d4fd362243dc646e58c3cf956c81dcdDouglas Gregor return; 4229d8868a634d4fd362243dc646e58c3cf956c81dcdDouglas Gregor 4230d8868a634d4fd362243dc646e58c3cf956c81dcdDouglas Gregor if (DeclContext *FromDC = cast<DeclContext>(From)) { 4231d8868a634d4fd362243dc646e58c3cf956c81dcdDouglas Gregor ASTNodeImporter Importer(*this); 4232d8868a634d4fd362243dc646e58c3cf956c81dcdDouglas Gregor Importer.ImportDeclContext(FromDC, true); 4233d8868a634d4fd362243dc646e58c3cf956c81dcdDouglas Gregor } 4234d8868a634d4fd362243dc646e58c3cf956c81dcdDouglas Gregor} 4235d8868a634d4fd362243dc646e58c3cf956c81dcdDouglas Gregor 42361b2949d27ec72894dec017c330c0548af4bb2476Douglas GregorDeclarationName ASTImporter::Import(DeclarationName FromName) { 42371b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor if (!FromName) 42381b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor return DeclarationName(); 42391b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor 42401b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor switch (FromName.getNameKind()) { 42411b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor case DeclarationName::Identifier: 42421b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor return Import(FromName.getAsIdentifierInfo()); 42431b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor 42441b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor case DeclarationName::ObjCZeroArgSelector: 42451b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor case DeclarationName::ObjCOneArgSelector: 42461b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor case DeclarationName::ObjCMultiArgSelector: 42471b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor return Import(FromName.getObjCSelector()); 42481b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor 42491b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor case DeclarationName::CXXConstructorName: { 42501b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor QualType T = Import(FromName.getCXXNameType()); 42511b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor if (T.isNull()) 42521b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor return DeclarationName(); 42531b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor 42541b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor return ToContext.DeclarationNames.getCXXConstructorName( 42551b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor ToContext.getCanonicalType(T)); 42561b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor } 42571b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor 42581b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor case DeclarationName::CXXDestructorName: { 42591b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor QualType T = Import(FromName.getCXXNameType()); 42601b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor if (T.isNull()) 42611b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor return DeclarationName(); 42621b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor 42631b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor return ToContext.DeclarationNames.getCXXDestructorName( 42641b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor ToContext.getCanonicalType(T)); 42651b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor } 42661b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor 42671b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor case DeclarationName::CXXConversionFunctionName: { 42681b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor QualType T = Import(FromName.getCXXNameType()); 42691b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor if (T.isNull()) 42701b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor return DeclarationName(); 42711b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor 42721b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor return ToContext.DeclarationNames.getCXXConversionFunctionName( 42731b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor ToContext.getCanonicalType(T)); 42741b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor } 42751b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor 42761b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor case DeclarationName::CXXOperatorName: 42771b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor return ToContext.DeclarationNames.getCXXOperatorName( 42781b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor FromName.getCXXOverloadedOperator()); 42791b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor 42801b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor case DeclarationName::CXXLiteralOperatorName: 42811b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor return ToContext.DeclarationNames.getCXXLiteralOperatorName( 42821b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor Import(FromName.getCXXLiteralIdentifier())); 42831b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor 42841b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor case DeclarationName::CXXUsingDirective: 42851b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor // FIXME: STATICS! 42861b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor return DeclarationName::getUsingDirectiveName(); 42871b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor } 42881b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor 42891b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor // Silence bogus GCC warning 42901b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor return DeclarationName(); 42911b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor} 42921b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor 4293d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas GregorIdentifierInfo *ASTImporter::Import(const IdentifierInfo *FromId) { 42941b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor if (!FromId) 42951b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor return 0; 42961b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor 42971b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor return &ToContext.Idents.get(FromId->getName()); 42981b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor} 4299089459a16bf7e9cd10617d1fac5ec0240a0a1ee6Douglas Gregor 4300c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas GregorSelector ASTImporter::Import(Selector FromSel) { 4301c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor if (FromSel.isNull()) 4302c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor return Selector(); 4303c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor 4304c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor llvm::SmallVector<IdentifierInfo *, 4> Idents; 4305c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor Idents.push_back(Import(FromSel.getIdentifierInfoForSlot(0))); 4306c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor for (unsigned I = 1, N = FromSel.getNumArgs(); I < N; ++I) 4307c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor Idents.push_back(Import(FromSel.getIdentifierInfoForSlot(I))); 4308c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor return ToContext.Selectors.getSelector(FromSel.getNumArgs(), Idents.data()); 4309c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor} 4310c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor 4311089459a16bf7e9cd10617d1fac5ec0240a0a1ee6Douglas GregorDeclarationName ASTImporter::HandleNameConflict(DeclarationName Name, 4312089459a16bf7e9cd10617d1fac5ec0240a0a1ee6Douglas Gregor DeclContext *DC, 4313089459a16bf7e9cd10617d1fac5ec0240a0a1ee6Douglas Gregor unsigned IDNS, 4314089459a16bf7e9cd10617d1fac5ec0240a0a1ee6Douglas Gregor NamedDecl **Decls, 4315089459a16bf7e9cd10617d1fac5ec0240a0a1ee6Douglas Gregor unsigned NumDecls) { 4316089459a16bf7e9cd10617d1fac5ec0240a0a1ee6Douglas Gregor return Name; 4317089459a16bf7e9cd10617d1fac5ec0240a0a1ee6Douglas Gregor} 4318089459a16bf7e9cd10617d1fac5ec0240a0a1ee6Douglas Gregor 4319089459a16bf7e9cd10617d1fac5ec0240a0a1ee6Douglas GregorDiagnosticBuilder ASTImporter::ToDiag(SourceLocation Loc, unsigned DiagID) { 432033e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis return ToContext.getDiagnostics().Report(Loc, DiagID); 4321089459a16bf7e9cd10617d1fac5ec0240a0a1ee6Douglas Gregor} 4322089459a16bf7e9cd10617d1fac5ec0240a0a1ee6Douglas Gregor 4323089459a16bf7e9cd10617d1fac5ec0240a0a1ee6Douglas GregorDiagnosticBuilder ASTImporter::FromDiag(SourceLocation Loc, unsigned DiagID) { 432433e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis return FromContext.getDiagnostics().Report(Loc, DiagID); 4325089459a16bf7e9cd10617d1fac5ec0240a0a1ee6Douglas Gregor} 43265ce5dab3c30e4255b8f62b148b6a86f09a444aaaDouglas Gregor 43275ce5dab3c30e4255b8f62b148b6a86f09a444aaaDouglas GregorDecl *ASTImporter::Imported(Decl *From, Decl *To) { 43285ce5dab3c30e4255b8f62b148b6a86f09a444aaaDouglas Gregor ImportedDecls[From] = To; 43295ce5dab3c30e4255b8f62b148b6a86f09a444aaaDouglas Gregor return To; 4330af667588d53de22795c5304f1496ccaac2a71402Daniel Dunbar} 4331ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor 4332ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregorbool ASTImporter::IsStructurallyEquivalent(QualType From, QualType To) { 4333f4c7371fb1d3cebcfb40abad4537bb82515704eaJohn McCall llvm::DenseMap<const Type *, const Type *>::iterator Pos 4334ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor = ImportedTypes.find(From.getTypePtr()); 4335ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor if (Pos != ImportedTypes.end() && ToContext.hasSameType(Import(From), To)) 4336ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor return true; 4337ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor 433833e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis StructuralEquivalenceContext Ctx(FromContext, ToContext, NonEquivalentDecls); 4339bb2d176c4f434e9e73f63f2f9d128f63ce3e10d0Benjamin Kramer return Ctx.IsStructurallyEquivalent(From, To); 4340ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor} 4341