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