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