]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - contrib/llvm/tools/clang/lib/AST/ASTImporter.cpp
MFV: tcpdump 4.4.0.
[FreeBSD/FreeBSD.git] / contrib / llvm / tools / clang / lib / AST / ASTImporter.cpp
1 //===--- ASTImporter.cpp - Importing ASTs from other Contexts ---*- C++ -*-===//
2 //
3 //                     The LLVM Compiler Infrastructure
4 //
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
7 //
8 //===----------------------------------------------------------------------===//
9 //
10 //  This file defines the ASTImporter class which imports AST nodes from one
11 //  context into another context.
12 //
13 //===----------------------------------------------------------------------===//
14 #include "clang/AST/ASTImporter.h"
15 #include "clang/AST/ASTContext.h"
16 #include "clang/AST/ASTDiagnostic.h"
17 #include "clang/AST/DeclCXX.h"
18 #include "clang/AST/DeclObjC.h"
19 #include "clang/AST/DeclVisitor.h"
20 #include "clang/AST/StmtVisitor.h"
21 #include "clang/AST/TypeVisitor.h"
22 #include "clang/Basic/FileManager.h"
23 #include "clang/Basic/SourceManager.h"
24 #include "llvm/Support/MemoryBuffer.h"
25 #include <deque>
26
27 namespace clang {
28   class ASTNodeImporter : public TypeVisitor<ASTNodeImporter, QualType>,
29                           public DeclVisitor<ASTNodeImporter, Decl *>,
30                           public StmtVisitor<ASTNodeImporter, Stmt *> {
31     ASTImporter &Importer;
32     
33   public:
34     explicit ASTNodeImporter(ASTImporter &Importer) : Importer(Importer) { }
35     
36     using TypeVisitor<ASTNodeImporter, QualType>::Visit;
37     using DeclVisitor<ASTNodeImporter, Decl *>::Visit;
38     using StmtVisitor<ASTNodeImporter, Stmt *>::Visit;
39
40     // Importing types
41     QualType VisitType(const Type *T);
42     QualType VisitBuiltinType(const BuiltinType *T);
43     QualType VisitComplexType(const ComplexType *T);
44     QualType VisitPointerType(const PointerType *T);
45     QualType VisitBlockPointerType(const BlockPointerType *T);
46     QualType VisitLValueReferenceType(const LValueReferenceType *T);
47     QualType VisitRValueReferenceType(const RValueReferenceType *T);
48     QualType VisitMemberPointerType(const MemberPointerType *T);
49     QualType VisitConstantArrayType(const ConstantArrayType *T);
50     QualType VisitIncompleteArrayType(const IncompleteArrayType *T);
51     QualType VisitVariableArrayType(const VariableArrayType *T);
52     // FIXME: DependentSizedArrayType
53     // FIXME: DependentSizedExtVectorType
54     QualType VisitVectorType(const VectorType *T);
55     QualType VisitExtVectorType(const ExtVectorType *T);
56     QualType VisitFunctionNoProtoType(const FunctionNoProtoType *T);
57     QualType VisitFunctionProtoType(const FunctionProtoType *T);
58     // FIXME: UnresolvedUsingType
59     QualType VisitParenType(const ParenType *T);
60     QualType VisitTypedefType(const TypedefType *T);
61     QualType VisitTypeOfExprType(const TypeOfExprType *T);
62     // FIXME: DependentTypeOfExprType
63     QualType VisitTypeOfType(const TypeOfType *T);
64     QualType VisitDecltypeType(const DecltypeType *T);
65     QualType VisitUnaryTransformType(const UnaryTransformType *T);
66     QualType VisitAutoType(const AutoType *T);
67     // FIXME: DependentDecltypeType
68     QualType VisitRecordType(const RecordType *T);
69     QualType VisitEnumType(const EnumType *T);
70     // FIXME: TemplateTypeParmType
71     // FIXME: SubstTemplateTypeParmType
72     QualType VisitTemplateSpecializationType(const TemplateSpecializationType *T);
73     QualType VisitElaboratedType(const ElaboratedType *T);
74     // FIXME: DependentNameType
75     // FIXME: DependentTemplateSpecializationType
76     QualType VisitObjCInterfaceType(const ObjCInterfaceType *T);
77     QualType VisitObjCObjectType(const ObjCObjectType *T);
78     QualType VisitObjCObjectPointerType(const ObjCObjectPointerType *T);
79                             
80     // Importing declarations                            
81     bool ImportDeclParts(NamedDecl *D, DeclContext *&DC, 
82                          DeclContext *&LexicalDC, DeclarationName &Name, 
83                          SourceLocation &Loc);
84     void ImportDefinitionIfNeeded(Decl *FromD, Decl *ToD = 0);
85     void ImportDeclarationNameLoc(const DeclarationNameInfo &From,
86                                   DeclarationNameInfo& To);
87     void ImportDeclContext(DeclContext *FromDC, bool ForceImport = false);
88                         
89     /// \brief What we should import from the definition.
90     enum ImportDefinitionKind { 
91       /// \brief Import the default subset of the definition, which might be
92       /// nothing (if minimal import is set) or might be everything (if minimal
93       /// import is not set).
94       IDK_Default,
95       /// \brief Import everything.
96       IDK_Everything,
97       /// \brief Import only the bare bones needed to establish a valid
98       /// DeclContext.
99       IDK_Basic
100     };
101
102     bool shouldForceImportDeclContext(ImportDefinitionKind IDK) {
103       return IDK == IDK_Everything ||
104              (IDK == IDK_Default && !Importer.isMinimalImport());
105     }
106
107     bool ImportDefinition(RecordDecl *From, RecordDecl *To, 
108                           ImportDefinitionKind Kind = IDK_Default);
109     bool ImportDefinition(EnumDecl *From, EnumDecl *To,
110                           ImportDefinitionKind Kind = IDK_Default);
111     bool ImportDefinition(ObjCInterfaceDecl *From, ObjCInterfaceDecl *To,
112                           ImportDefinitionKind Kind = IDK_Default);
113     bool ImportDefinition(ObjCProtocolDecl *From, ObjCProtocolDecl *To,
114                           ImportDefinitionKind Kind = IDK_Default);
115     TemplateParameterList *ImportTemplateParameterList(
116                                                  TemplateParameterList *Params);
117     TemplateArgument ImportTemplateArgument(const TemplateArgument &From);
118     bool ImportTemplateArguments(const TemplateArgument *FromArgs,
119                                  unsigned NumFromArgs,
120                                SmallVectorImpl<TemplateArgument> &ToArgs);
121     bool IsStructuralMatch(RecordDecl *FromRecord, RecordDecl *ToRecord,
122                            bool Complain = true);
123     bool IsStructuralMatch(EnumDecl *FromEnum, EnumDecl *ToRecord);
124     bool IsStructuralMatch(EnumConstantDecl *FromEC, EnumConstantDecl *ToEC);
125     bool IsStructuralMatch(ClassTemplateDecl *From, ClassTemplateDecl *To);
126     Decl *VisitDecl(Decl *D);
127     Decl *VisitTranslationUnitDecl(TranslationUnitDecl *D);
128     Decl *VisitNamespaceDecl(NamespaceDecl *D);
129     Decl *VisitTypedefNameDecl(TypedefNameDecl *D, bool IsAlias);
130     Decl *VisitTypedefDecl(TypedefDecl *D);
131     Decl *VisitTypeAliasDecl(TypeAliasDecl *D);
132     Decl *VisitEnumDecl(EnumDecl *D);
133     Decl *VisitRecordDecl(RecordDecl *D);
134     Decl *VisitEnumConstantDecl(EnumConstantDecl *D);
135     Decl *VisitFunctionDecl(FunctionDecl *D);
136     Decl *VisitCXXMethodDecl(CXXMethodDecl *D);
137     Decl *VisitCXXConstructorDecl(CXXConstructorDecl *D);
138     Decl *VisitCXXDestructorDecl(CXXDestructorDecl *D);
139     Decl *VisitCXXConversionDecl(CXXConversionDecl *D);
140     Decl *VisitFieldDecl(FieldDecl *D);
141     Decl *VisitIndirectFieldDecl(IndirectFieldDecl *D);
142     Decl *VisitObjCIvarDecl(ObjCIvarDecl *D);
143     Decl *VisitVarDecl(VarDecl *D);
144     Decl *VisitImplicitParamDecl(ImplicitParamDecl *D);
145     Decl *VisitParmVarDecl(ParmVarDecl *D);
146     Decl *VisitObjCMethodDecl(ObjCMethodDecl *D);
147     Decl *VisitObjCCategoryDecl(ObjCCategoryDecl *D);
148     Decl *VisitObjCProtocolDecl(ObjCProtocolDecl *D);
149     Decl *VisitObjCInterfaceDecl(ObjCInterfaceDecl *D);
150     Decl *VisitObjCCategoryImplDecl(ObjCCategoryImplDecl *D);
151     Decl *VisitObjCImplementationDecl(ObjCImplementationDecl *D);
152     Decl *VisitObjCPropertyDecl(ObjCPropertyDecl *D);
153     Decl *VisitObjCPropertyImplDecl(ObjCPropertyImplDecl *D);
154     Decl *VisitTemplateTypeParmDecl(TemplateTypeParmDecl *D);
155     Decl *VisitNonTypeTemplateParmDecl(NonTypeTemplateParmDecl *D);
156     Decl *VisitTemplateTemplateParmDecl(TemplateTemplateParmDecl *D);
157     Decl *VisitClassTemplateDecl(ClassTemplateDecl *D);
158     Decl *VisitClassTemplateSpecializationDecl(
159                                             ClassTemplateSpecializationDecl *D);
160                             
161     // Importing statements
162     Stmt *VisitStmt(Stmt *S);
163
164     // Importing expressions
165     Expr *VisitExpr(Expr *E);
166     Expr *VisitDeclRefExpr(DeclRefExpr *E);
167     Expr *VisitIntegerLiteral(IntegerLiteral *E);
168     Expr *VisitCharacterLiteral(CharacterLiteral *E);
169     Expr *VisitParenExpr(ParenExpr *E);
170     Expr *VisitUnaryOperator(UnaryOperator *E);
171     Expr *VisitUnaryExprOrTypeTraitExpr(UnaryExprOrTypeTraitExpr *E);
172     Expr *VisitBinaryOperator(BinaryOperator *E);
173     Expr *VisitCompoundAssignOperator(CompoundAssignOperator *E);
174     Expr *VisitImplicitCastExpr(ImplicitCastExpr *E);
175     Expr *VisitCStyleCastExpr(CStyleCastExpr *E);
176   };
177 }
178 using namespace clang;
179
180 //----------------------------------------------------------------------------
181 // Structural Equivalence
182 //----------------------------------------------------------------------------
183
184 namespace {
185   struct StructuralEquivalenceContext {
186     /// \brief AST contexts for which we are checking structural equivalence.
187     ASTContext &C1, &C2;
188     
189     /// \brief The set of "tentative" equivalences between two canonical 
190     /// declarations, mapping from a declaration in the first context to the
191     /// declaration in the second context that we believe to be equivalent.
192     llvm::DenseMap<Decl *, Decl *> TentativeEquivalences;
193     
194     /// \brief Queue of declarations in the first context whose equivalence
195     /// with a declaration in the second context still needs to be verified.
196     std::deque<Decl *> DeclsToCheck;
197     
198     /// \brief Declaration (from, to) pairs that are known not to be equivalent
199     /// (which we have already complained about).
200     llvm::DenseSet<std::pair<Decl *, Decl *> > &NonEquivalentDecls;
201     
202     /// \brief Whether we're being strict about the spelling of types when 
203     /// unifying two types.
204     bool StrictTypeSpelling;
205
206     /// \brief Whether to complain about failures.
207     bool Complain;
208
209     /// \brief \c true if the last diagnostic came from C2.
210     bool LastDiagFromC2;
211
212     StructuralEquivalenceContext(ASTContext &C1, ASTContext &C2,
213                llvm::DenseSet<std::pair<Decl *, Decl *> > &NonEquivalentDecls,
214                                  bool StrictTypeSpelling = false,
215                                  bool Complain = true)
216       : C1(C1), C2(C2), NonEquivalentDecls(NonEquivalentDecls),
217         StrictTypeSpelling(StrictTypeSpelling), Complain(Complain),
218         LastDiagFromC2(false) {}
219
220     /// \brief Determine whether the two declarations are structurally
221     /// equivalent.
222     bool IsStructurallyEquivalent(Decl *D1, Decl *D2);
223     
224     /// \brief Determine whether the two types are structurally equivalent.
225     bool IsStructurallyEquivalent(QualType T1, QualType T2);
226
227   private:
228     /// \brief Finish checking all of the structural equivalences.
229     ///
230     /// \returns true if an error occurred, false otherwise.
231     bool Finish();
232     
233   public:
234     DiagnosticBuilder Diag1(SourceLocation Loc, unsigned DiagID) {
235       assert(Complain && "Not allowed to complain");
236       if (LastDiagFromC2)
237         C1.getDiagnostics().notePriorDiagnosticFrom(C2.getDiagnostics());
238       LastDiagFromC2 = false;
239       return C1.getDiagnostics().Report(Loc, DiagID);
240     }
241
242     DiagnosticBuilder Diag2(SourceLocation Loc, unsigned DiagID) {
243       assert(Complain && "Not allowed to complain");
244       if (!LastDiagFromC2)
245         C2.getDiagnostics().notePriorDiagnosticFrom(C1.getDiagnostics());
246       LastDiagFromC2 = true;
247       return C2.getDiagnostics().Report(Loc, DiagID);
248     }
249   };
250 }
251
252 static bool IsStructurallyEquivalent(StructuralEquivalenceContext &Context,
253                                      QualType T1, QualType T2);
254 static bool IsStructurallyEquivalent(StructuralEquivalenceContext &Context,
255                                      Decl *D1, Decl *D2);
256
257 /// \brief Determine structural equivalence of two expressions.
258 static bool IsStructurallyEquivalent(StructuralEquivalenceContext &Context,
259                                      Expr *E1, Expr *E2) {
260   if (!E1 || !E2)
261     return E1 == E2;
262   
263   // FIXME: Actually perform a structural comparison!
264   return true;
265 }
266
267 /// \brief Determine whether two identifiers are equivalent.
268 static bool IsStructurallyEquivalent(const IdentifierInfo *Name1,
269                                      const IdentifierInfo *Name2) {
270   if (!Name1 || !Name2)
271     return Name1 == Name2;
272   
273   return Name1->getName() == Name2->getName();
274 }
275
276 /// \brief Determine whether two nested-name-specifiers are equivalent.
277 static bool IsStructurallyEquivalent(StructuralEquivalenceContext &Context,
278                                      NestedNameSpecifier *NNS1,
279                                      NestedNameSpecifier *NNS2) {
280   // FIXME: Implement!
281   return true;
282 }
283
284 /// \brief Determine whether two template arguments are equivalent.
285 static bool IsStructurallyEquivalent(StructuralEquivalenceContext &Context,
286                                      const TemplateArgument &Arg1,
287                                      const TemplateArgument &Arg2) {
288   if (Arg1.getKind() != Arg2.getKind())
289     return false;
290
291   switch (Arg1.getKind()) {
292   case TemplateArgument::Null:
293     return true;
294       
295   case TemplateArgument::Type:
296     return Context.IsStructurallyEquivalent(Arg1.getAsType(), Arg2.getAsType());
297
298   case TemplateArgument::Integral:
299     if (!Context.IsStructurallyEquivalent(Arg1.getIntegralType(), 
300                                           Arg2.getIntegralType()))
301       return false;
302     
303     return llvm::APSInt::isSameValue(Arg1.getAsIntegral(), Arg2.getAsIntegral());
304       
305   case TemplateArgument::Declaration:
306     return Context.IsStructurallyEquivalent(Arg1.getAsDecl(), Arg2.getAsDecl());
307
308   case TemplateArgument::NullPtr:
309     return true; // FIXME: Is this correct?
310
311   case TemplateArgument::Template:
312     return IsStructurallyEquivalent(Context, 
313                                     Arg1.getAsTemplate(), 
314                                     Arg2.getAsTemplate());
315
316   case TemplateArgument::TemplateExpansion:
317     return IsStructurallyEquivalent(Context, 
318                                     Arg1.getAsTemplateOrTemplatePattern(), 
319                                     Arg2.getAsTemplateOrTemplatePattern());
320
321   case TemplateArgument::Expression:
322     return IsStructurallyEquivalent(Context, 
323                                     Arg1.getAsExpr(), Arg2.getAsExpr());
324       
325   case TemplateArgument::Pack:
326     if (Arg1.pack_size() != Arg2.pack_size())
327       return false;
328       
329     for (unsigned I = 0, N = Arg1.pack_size(); I != N; ++I)
330       if (!IsStructurallyEquivalent(Context, 
331                                     Arg1.pack_begin()[I],
332                                     Arg2.pack_begin()[I]))
333         return false;
334       
335     return true;
336   }
337   
338   llvm_unreachable("Invalid template argument kind");
339 }
340
341 /// \brief Determine structural equivalence for the common part of array 
342 /// types.
343 static bool IsArrayStructurallyEquivalent(StructuralEquivalenceContext &Context,
344                                           const ArrayType *Array1, 
345                                           const ArrayType *Array2) {
346   if (!IsStructurallyEquivalent(Context, 
347                                 Array1->getElementType(), 
348                                 Array2->getElementType()))
349     return false;
350   if (Array1->getSizeModifier() != Array2->getSizeModifier())
351     return false;
352   if (Array1->getIndexTypeQualifiers() != Array2->getIndexTypeQualifiers())
353     return false;
354   
355   return true;
356 }
357
358 /// \brief Determine structural equivalence of two types.
359 static bool IsStructurallyEquivalent(StructuralEquivalenceContext &Context,
360                                      QualType T1, QualType T2) {
361   if (T1.isNull() || T2.isNull())
362     return T1.isNull() && T2.isNull();
363   
364   if (!Context.StrictTypeSpelling) {
365     // We aren't being strict about token-to-token equivalence of types,
366     // so map down to the canonical type.
367     T1 = Context.C1.getCanonicalType(T1);
368     T2 = Context.C2.getCanonicalType(T2);
369   }
370   
371   if (T1.getQualifiers() != T2.getQualifiers())
372     return false;
373   
374   Type::TypeClass TC = T1->getTypeClass();
375   
376   if (T1->getTypeClass() != T2->getTypeClass()) {
377     // Compare function types with prototypes vs. without prototypes as if
378     // both did not have prototypes.
379     if (T1->getTypeClass() == Type::FunctionProto &&
380         T2->getTypeClass() == Type::FunctionNoProto)
381       TC = Type::FunctionNoProto;
382     else if (T1->getTypeClass() == Type::FunctionNoProto &&
383              T2->getTypeClass() == Type::FunctionProto)
384       TC = Type::FunctionNoProto;
385     else
386       return false;
387   }
388   
389   switch (TC) {
390   case Type::Builtin:
391     // FIXME: Deal with Char_S/Char_U. 
392     if (cast<BuiltinType>(T1)->getKind() != cast<BuiltinType>(T2)->getKind())
393       return false;
394     break;
395   
396   case Type::Complex:
397     if (!IsStructurallyEquivalent(Context,
398                                   cast<ComplexType>(T1)->getElementType(),
399                                   cast<ComplexType>(T2)->getElementType()))
400       return false;
401     break;
402   
403   case Type::Pointer:
404     if (!IsStructurallyEquivalent(Context,
405                                   cast<PointerType>(T1)->getPointeeType(),
406                                   cast<PointerType>(T2)->getPointeeType()))
407       return false;
408     break;
409
410   case Type::BlockPointer:
411     if (!IsStructurallyEquivalent(Context,
412                                   cast<BlockPointerType>(T1)->getPointeeType(),
413                                   cast<BlockPointerType>(T2)->getPointeeType()))
414       return false;
415     break;
416
417   case Type::LValueReference:
418   case Type::RValueReference: {
419     const ReferenceType *Ref1 = cast<ReferenceType>(T1);
420     const ReferenceType *Ref2 = cast<ReferenceType>(T2);
421     if (Ref1->isSpelledAsLValue() != Ref2->isSpelledAsLValue())
422       return false;
423     if (Ref1->isInnerRef() != Ref2->isInnerRef())
424       return false;
425     if (!IsStructurallyEquivalent(Context,
426                                   Ref1->getPointeeTypeAsWritten(),
427                                   Ref2->getPointeeTypeAsWritten()))
428       return false;
429     break;
430   }
431       
432   case Type::MemberPointer: {
433     const MemberPointerType *MemPtr1 = cast<MemberPointerType>(T1);
434     const MemberPointerType *MemPtr2 = cast<MemberPointerType>(T2);
435     if (!IsStructurallyEquivalent(Context,
436                                   MemPtr1->getPointeeType(),
437                                   MemPtr2->getPointeeType()))
438       return false;
439     if (!IsStructurallyEquivalent(Context,
440                                   QualType(MemPtr1->getClass(), 0),
441                                   QualType(MemPtr2->getClass(), 0)))
442       return false;
443     break;
444   }
445       
446   case Type::ConstantArray: {
447     const ConstantArrayType *Array1 = cast<ConstantArrayType>(T1);
448     const ConstantArrayType *Array2 = cast<ConstantArrayType>(T2);
449     if (!llvm::APInt::isSameValue(Array1->getSize(), Array2->getSize()))
450       return false;
451     
452     if (!IsArrayStructurallyEquivalent(Context, Array1, Array2))
453       return false;
454     break;
455   }
456
457   case Type::IncompleteArray:
458     if (!IsArrayStructurallyEquivalent(Context, 
459                                        cast<ArrayType>(T1), 
460                                        cast<ArrayType>(T2)))
461       return false;
462     break;
463       
464   case Type::VariableArray: {
465     const VariableArrayType *Array1 = cast<VariableArrayType>(T1);
466     const VariableArrayType *Array2 = cast<VariableArrayType>(T2);
467     if (!IsStructurallyEquivalent(Context, 
468                                   Array1->getSizeExpr(), Array2->getSizeExpr()))
469       return false;
470     
471     if (!IsArrayStructurallyEquivalent(Context, Array1, Array2))
472       return false;
473     
474     break;
475   }
476   
477   case Type::DependentSizedArray: {
478     const DependentSizedArrayType *Array1 = cast<DependentSizedArrayType>(T1);
479     const DependentSizedArrayType *Array2 = cast<DependentSizedArrayType>(T2);
480     if (!IsStructurallyEquivalent(Context, 
481                                   Array1->getSizeExpr(), Array2->getSizeExpr()))
482       return false;
483     
484     if (!IsArrayStructurallyEquivalent(Context, Array1, Array2))
485       return false;
486     
487     break;
488   }
489       
490   case Type::DependentSizedExtVector: {
491     const DependentSizedExtVectorType *Vec1
492       = cast<DependentSizedExtVectorType>(T1);
493     const DependentSizedExtVectorType *Vec2
494       = cast<DependentSizedExtVectorType>(T2);
495     if (!IsStructurallyEquivalent(Context, 
496                                   Vec1->getSizeExpr(), Vec2->getSizeExpr()))
497       return false;
498     if (!IsStructurallyEquivalent(Context, 
499                                   Vec1->getElementType(), 
500                                   Vec2->getElementType()))
501       return false;
502     break;
503   }
504    
505   case Type::Vector: 
506   case Type::ExtVector: {
507     const VectorType *Vec1 = cast<VectorType>(T1);
508     const VectorType *Vec2 = cast<VectorType>(T2);
509     if (!IsStructurallyEquivalent(Context, 
510                                   Vec1->getElementType(),
511                                   Vec2->getElementType()))
512       return false;
513     if (Vec1->getNumElements() != Vec2->getNumElements())
514       return false;
515     if (Vec1->getVectorKind() != Vec2->getVectorKind())
516       return false;
517     break;
518   }
519
520   case Type::FunctionProto: {
521     const FunctionProtoType *Proto1 = cast<FunctionProtoType>(T1);
522     const FunctionProtoType *Proto2 = cast<FunctionProtoType>(T2);
523     if (Proto1->getNumArgs() != Proto2->getNumArgs())
524       return false;
525     for (unsigned I = 0, N = Proto1->getNumArgs(); I != N; ++I) {
526       if (!IsStructurallyEquivalent(Context, 
527                                     Proto1->getArgType(I),
528                                     Proto2->getArgType(I)))
529         return false;
530     }
531     if (Proto1->isVariadic() != Proto2->isVariadic())
532       return false;
533     if (Proto1->getExceptionSpecType() != Proto2->getExceptionSpecType())
534       return false;
535     if (Proto1->getExceptionSpecType() == EST_Dynamic) {
536       if (Proto1->getNumExceptions() != Proto2->getNumExceptions())
537         return false;
538       for (unsigned I = 0, N = Proto1->getNumExceptions(); I != N; ++I) {
539         if (!IsStructurallyEquivalent(Context,
540                                       Proto1->getExceptionType(I),
541                                       Proto2->getExceptionType(I)))
542           return false;
543       }
544     } else if (Proto1->getExceptionSpecType() == EST_ComputedNoexcept) {
545       if (!IsStructurallyEquivalent(Context,
546                                     Proto1->getNoexceptExpr(),
547                                     Proto2->getNoexceptExpr()))
548         return false;
549     }
550     if (Proto1->getTypeQuals() != Proto2->getTypeQuals())
551       return false;
552     
553     // Fall through to check the bits common with FunctionNoProtoType.
554   }
555       
556   case Type::FunctionNoProto: {
557     const FunctionType *Function1 = cast<FunctionType>(T1);
558     const FunctionType *Function2 = cast<FunctionType>(T2);
559     if (!IsStructurallyEquivalent(Context, 
560                                   Function1->getResultType(),
561                                   Function2->getResultType()))
562       return false;
563       if (Function1->getExtInfo() != Function2->getExtInfo())
564         return false;
565     break;
566   }
567    
568   case Type::UnresolvedUsing:
569     if (!IsStructurallyEquivalent(Context,
570                                   cast<UnresolvedUsingType>(T1)->getDecl(),
571                                   cast<UnresolvedUsingType>(T2)->getDecl()))
572       return false;
573       
574     break;
575
576   case Type::Attributed:
577     if (!IsStructurallyEquivalent(Context,
578                                   cast<AttributedType>(T1)->getModifiedType(),
579                                   cast<AttributedType>(T2)->getModifiedType()))
580       return false;
581     if (!IsStructurallyEquivalent(Context,
582                                 cast<AttributedType>(T1)->getEquivalentType(),
583                                 cast<AttributedType>(T2)->getEquivalentType()))
584       return false;
585     break;
586       
587   case Type::Paren:
588     if (!IsStructurallyEquivalent(Context,
589                                   cast<ParenType>(T1)->getInnerType(),
590                                   cast<ParenType>(T2)->getInnerType()))
591       return false;
592     break;
593
594   case Type::Typedef:
595     if (!IsStructurallyEquivalent(Context,
596                                   cast<TypedefType>(T1)->getDecl(),
597                                   cast<TypedefType>(T2)->getDecl()))
598       return false;
599     break;
600       
601   case Type::TypeOfExpr:
602     if (!IsStructurallyEquivalent(Context,
603                                 cast<TypeOfExprType>(T1)->getUnderlyingExpr(),
604                                 cast<TypeOfExprType>(T2)->getUnderlyingExpr()))
605       return false;
606     break;
607       
608   case Type::TypeOf:
609     if (!IsStructurallyEquivalent(Context,
610                                   cast<TypeOfType>(T1)->getUnderlyingType(),
611                                   cast<TypeOfType>(T2)->getUnderlyingType()))
612       return false;
613     break;
614
615   case Type::UnaryTransform:
616     if (!IsStructurallyEquivalent(Context,
617                              cast<UnaryTransformType>(T1)->getUnderlyingType(),
618                              cast<UnaryTransformType>(T1)->getUnderlyingType()))
619       return false;
620     break;
621
622   case Type::Decltype:
623     if (!IsStructurallyEquivalent(Context,
624                                   cast<DecltypeType>(T1)->getUnderlyingExpr(),
625                                   cast<DecltypeType>(T2)->getUnderlyingExpr()))
626       return false;
627     break;
628
629   case Type::Auto:
630     if (!IsStructurallyEquivalent(Context,
631                                   cast<AutoType>(T1)->getDeducedType(),
632                                   cast<AutoType>(T2)->getDeducedType()))
633       return false;
634     break;
635
636   case Type::Record:
637   case Type::Enum:
638     if (!IsStructurallyEquivalent(Context,
639                                   cast<TagType>(T1)->getDecl(),
640                                   cast<TagType>(T2)->getDecl()))
641       return false;
642     break;
643
644   case Type::TemplateTypeParm: {
645     const TemplateTypeParmType *Parm1 = cast<TemplateTypeParmType>(T1);
646     const TemplateTypeParmType *Parm2 = cast<TemplateTypeParmType>(T2);
647     if (Parm1->getDepth() != Parm2->getDepth())
648       return false;
649     if (Parm1->getIndex() != Parm2->getIndex())
650       return false;
651     if (Parm1->isParameterPack() != Parm2->isParameterPack())
652       return false;
653     
654     // Names of template type parameters are never significant.
655     break;
656   }
657       
658   case Type::SubstTemplateTypeParm: {
659     const SubstTemplateTypeParmType *Subst1
660       = cast<SubstTemplateTypeParmType>(T1);
661     const SubstTemplateTypeParmType *Subst2
662       = cast<SubstTemplateTypeParmType>(T2);
663     if (!IsStructurallyEquivalent(Context,
664                                   QualType(Subst1->getReplacedParameter(), 0),
665                                   QualType(Subst2->getReplacedParameter(), 0)))
666       return false;
667     if (!IsStructurallyEquivalent(Context, 
668                                   Subst1->getReplacementType(),
669                                   Subst2->getReplacementType()))
670       return false;
671     break;
672   }
673
674   case Type::SubstTemplateTypeParmPack: {
675     const SubstTemplateTypeParmPackType *Subst1
676       = cast<SubstTemplateTypeParmPackType>(T1);
677     const SubstTemplateTypeParmPackType *Subst2
678       = cast<SubstTemplateTypeParmPackType>(T2);
679     if (!IsStructurallyEquivalent(Context,
680                                   QualType(Subst1->getReplacedParameter(), 0),
681                                   QualType(Subst2->getReplacedParameter(), 0)))
682       return false;
683     if (!IsStructurallyEquivalent(Context, 
684                                   Subst1->getArgumentPack(),
685                                   Subst2->getArgumentPack()))
686       return false;
687     break;
688   }
689   case Type::TemplateSpecialization: {
690     const TemplateSpecializationType *Spec1
691       = cast<TemplateSpecializationType>(T1);
692     const TemplateSpecializationType *Spec2
693       = cast<TemplateSpecializationType>(T2);
694     if (!IsStructurallyEquivalent(Context,
695                                   Spec1->getTemplateName(),
696                                   Spec2->getTemplateName()))
697       return false;
698     if (Spec1->getNumArgs() != Spec2->getNumArgs())
699       return false;
700     for (unsigned I = 0, N = Spec1->getNumArgs(); I != N; ++I) {
701       if (!IsStructurallyEquivalent(Context, 
702                                     Spec1->getArg(I), Spec2->getArg(I)))
703         return false;
704     }
705     break;
706   }
707       
708   case Type::Elaborated: {
709     const ElaboratedType *Elab1 = cast<ElaboratedType>(T1);
710     const ElaboratedType *Elab2 = cast<ElaboratedType>(T2);
711     // CHECKME: what if a keyword is ETK_None or ETK_typename ?
712     if (Elab1->getKeyword() != Elab2->getKeyword())
713       return false;
714     if (!IsStructurallyEquivalent(Context, 
715                                   Elab1->getQualifier(), 
716                                   Elab2->getQualifier()))
717       return false;
718     if (!IsStructurallyEquivalent(Context,
719                                   Elab1->getNamedType(),
720                                   Elab2->getNamedType()))
721       return false;
722     break;
723   }
724
725   case Type::InjectedClassName: {
726     const InjectedClassNameType *Inj1 = cast<InjectedClassNameType>(T1);
727     const InjectedClassNameType *Inj2 = cast<InjectedClassNameType>(T2);
728     if (!IsStructurallyEquivalent(Context,
729                                   Inj1->getInjectedSpecializationType(),
730                                   Inj2->getInjectedSpecializationType()))
731       return false;
732     break;
733   }
734
735   case Type::DependentName: {
736     const DependentNameType *Typename1 = cast<DependentNameType>(T1);
737     const DependentNameType *Typename2 = cast<DependentNameType>(T2);
738     if (!IsStructurallyEquivalent(Context, 
739                                   Typename1->getQualifier(),
740                                   Typename2->getQualifier()))
741       return false;
742     if (!IsStructurallyEquivalent(Typename1->getIdentifier(),
743                                   Typename2->getIdentifier()))
744       return false;
745     
746     break;
747   }
748   
749   case Type::DependentTemplateSpecialization: {
750     const DependentTemplateSpecializationType *Spec1 =
751       cast<DependentTemplateSpecializationType>(T1);
752     const DependentTemplateSpecializationType *Spec2 =
753       cast<DependentTemplateSpecializationType>(T2);
754     if (!IsStructurallyEquivalent(Context, 
755                                   Spec1->getQualifier(),
756                                   Spec2->getQualifier()))
757       return false;
758     if (!IsStructurallyEquivalent(Spec1->getIdentifier(),
759                                   Spec2->getIdentifier()))
760       return false;
761     if (Spec1->getNumArgs() != Spec2->getNumArgs())
762       return false;
763     for (unsigned I = 0, N = Spec1->getNumArgs(); I != N; ++I) {
764       if (!IsStructurallyEquivalent(Context,
765                                     Spec1->getArg(I), Spec2->getArg(I)))
766         return false;
767     }
768     break;
769   }
770
771   case Type::PackExpansion:
772     if (!IsStructurallyEquivalent(Context,
773                                   cast<PackExpansionType>(T1)->getPattern(),
774                                   cast<PackExpansionType>(T2)->getPattern()))
775       return false;
776     break;
777
778   case Type::ObjCInterface: {
779     const ObjCInterfaceType *Iface1 = cast<ObjCInterfaceType>(T1);
780     const ObjCInterfaceType *Iface2 = cast<ObjCInterfaceType>(T2);
781     if (!IsStructurallyEquivalent(Context, 
782                                   Iface1->getDecl(), Iface2->getDecl()))
783       return false;
784     break;
785   }
786
787   case Type::ObjCObject: {
788     const ObjCObjectType *Obj1 = cast<ObjCObjectType>(T1);
789     const ObjCObjectType *Obj2 = cast<ObjCObjectType>(T2);
790     if (!IsStructurallyEquivalent(Context,
791                                   Obj1->getBaseType(),
792                                   Obj2->getBaseType()))
793       return false;
794     if (Obj1->getNumProtocols() != Obj2->getNumProtocols())
795       return false;
796     for (unsigned I = 0, N = Obj1->getNumProtocols(); I != N; ++I) {
797       if (!IsStructurallyEquivalent(Context,
798                                     Obj1->getProtocol(I),
799                                     Obj2->getProtocol(I)))
800         return false;
801     }
802     break;
803   }
804
805   case Type::ObjCObjectPointer: {
806     const ObjCObjectPointerType *Ptr1 = cast<ObjCObjectPointerType>(T1);
807     const ObjCObjectPointerType *Ptr2 = cast<ObjCObjectPointerType>(T2);
808     if (!IsStructurallyEquivalent(Context, 
809                                   Ptr1->getPointeeType(),
810                                   Ptr2->getPointeeType()))
811       return false;
812     break;
813   }
814
815   case Type::Atomic: {
816     if (!IsStructurallyEquivalent(Context,
817                                   cast<AtomicType>(T1)->getValueType(),
818                                   cast<AtomicType>(T2)->getValueType()))
819       return false;
820     break;
821   }
822
823   } // end switch
824
825   return true;
826 }
827
828 /// \brief Determine structural equivalence of two fields.
829 static bool IsStructurallyEquivalent(StructuralEquivalenceContext &Context,
830                                      FieldDecl *Field1, FieldDecl *Field2) {
831   RecordDecl *Owner2 = cast<RecordDecl>(Field2->getDeclContext());
832
833   // For anonymous structs/unions, match up the anonymous struct/union type
834   // declarations directly, so that we don't go off searching for anonymous
835   // types
836   if (Field1->isAnonymousStructOrUnion() &&
837       Field2->isAnonymousStructOrUnion()) {
838     RecordDecl *D1 = Field1->getType()->castAs<RecordType>()->getDecl();
839     RecordDecl *D2 = Field2->getType()->castAs<RecordType>()->getDecl();
840     return IsStructurallyEquivalent(Context, D1, D2);
841   }
842
843   if (!IsStructurallyEquivalent(Context,
844                                 Field1->getType(), Field2->getType())) {
845     if (Context.Complain) {
846       Context.Diag2(Owner2->getLocation(), diag::warn_odr_tag_type_inconsistent)
847         << Context.C2.getTypeDeclType(Owner2);
848       Context.Diag2(Field2->getLocation(), diag::note_odr_field)
849         << Field2->getDeclName() << Field2->getType();
850       Context.Diag1(Field1->getLocation(), diag::note_odr_field)
851         << Field1->getDeclName() << Field1->getType();
852     }
853     return false;
854   }
855   
856   if (Field1->isBitField() != Field2->isBitField()) {
857     if (Context.Complain) {
858       Context.Diag2(Owner2->getLocation(), diag::warn_odr_tag_type_inconsistent)
859         << Context.C2.getTypeDeclType(Owner2);
860       if (Field1->isBitField()) {
861         Context.Diag1(Field1->getLocation(), diag::note_odr_bit_field)
862         << Field1->getDeclName() << Field1->getType()
863         << Field1->getBitWidthValue(Context.C1);
864         Context.Diag2(Field2->getLocation(), diag::note_odr_not_bit_field)
865         << Field2->getDeclName();
866       } else {
867         Context.Diag2(Field2->getLocation(), diag::note_odr_bit_field)
868         << Field2->getDeclName() << Field2->getType()
869         << Field2->getBitWidthValue(Context.C2);
870         Context.Diag1(Field1->getLocation(), diag::note_odr_not_bit_field)
871         << Field1->getDeclName();
872       }
873     }
874     return false;
875   }
876   
877   if (Field1->isBitField()) {
878     // Make sure that the bit-fields are the same length.
879     unsigned Bits1 = Field1->getBitWidthValue(Context.C1);
880     unsigned Bits2 = Field2->getBitWidthValue(Context.C2);
881     
882     if (Bits1 != Bits2) {
883       if (Context.Complain) {
884         Context.Diag2(Owner2->getLocation(), diag::warn_odr_tag_type_inconsistent)
885           << Context.C2.getTypeDeclType(Owner2);
886         Context.Diag2(Field2->getLocation(), diag::note_odr_bit_field)
887           << Field2->getDeclName() << Field2->getType() << Bits2;
888         Context.Diag1(Field1->getLocation(), diag::note_odr_bit_field)
889           << Field1->getDeclName() << Field1->getType() << Bits1;
890       }
891       return false;
892     }
893   }
894
895   return true;
896 }
897
898 /// \brief Find the index of the given anonymous struct/union within its
899 /// context.
900 ///
901 /// \returns Returns the index of this anonymous struct/union in its context,
902 /// including the next assigned index (if none of them match). Returns an
903 /// empty option if the context is not a record, i.e.. if the anonymous
904 /// struct/union is at namespace or block scope.
905 static Optional<unsigned> findAnonymousStructOrUnionIndex(RecordDecl *Anon) {
906   ASTContext &Context = Anon->getASTContext();
907   QualType AnonTy = Context.getRecordType(Anon);
908
909   RecordDecl *Owner = dyn_cast<RecordDecl>(Anon->getDeclContext());
910   if (!Owner)
911     return None;
912
913   unsigned Index = 0;
914   for (DeclContext::decl_iterator D = Owner->noload_decls_begin(),
915                                DEnd = Owner->noload_decls_end();
916        D != DEnd; ++D) {
917     FieldDecl *F = dyn_cast<FieldDecl>(*D);
918     if (!F || !F->isAnonymousStructOrUnion())
919       continue;
920
921     if (Context.hasSameType(F->getType(), AnonTy))
922       break;
923
924     ++Index;
925   }
926
927   return Index;
928 }
929
930 /// \brief Determine structural equivalence of two records.
931 static bool IsStructurallyEquivalent(StructuralEquivalenceContext &Context,
932                                      RecordDecl *D1, RecordDecl *D2) {
933   if (D1->isUnion() != D2->isUnion()) {
934     if (Context.Complain) {
935       Context.Diag2(D2->getLocation(), diag::warn_odr_tag_type_inconsistent)
936         << Context.C2.getTypeDeclType(D2);
937       Context.Diag1(D1->getLocation(), diag::note_odr_tag_kind_here)
938         << D1->getDeclName() << (unsigned)D1->getTagKind();
939     }
940     return false;
941   }
942
943   if (D1->isAnonymousStructOrUnion() && D2->isAnonymousStructOrUnion()) {
944     // If both anonymous structs/unions are in a record context, make sure
945     // they occur in the same location in the context records.
946     if (Optional<unsigned> Index1 = findAnonymousStructOrUnionIndex(D1)) {
947       if (Optional<unsigned> Index2 = findAnonymousStructOrUnionIndex(D2)) {
948         if (*Index1 != *Index2)
949           return false;
950       }
951     }
952   }
953
954   // If both declarations are class template specializations, we know
955   // the ODR applies, so check the template and template arguments.
956   ClassTemplateSpecializationDecl *Spec1
957     = dyn_cast<ClassTemplateSpecializationDecl>(D1);
958   ClassTemplateSpecializationDecl *Spec2
959     = dyn_cast<ClassTemplateSpecializationDecl>(D2);
960   if (Spec1 && Spec2) {
961     // Check that the specialized templates are the same.
962     if (!IsStructurallyEquivalent(Context, Spec1->getSpecializedTemplate(),
963                                   Spec2->getSpecializedTemplate()))
964       return false;
965     
966     // Check that the template arguments are the same.
967     if (Spec1->getTemplateArgs().size() != Spec2->getTemplateArgs().size())
968       return false;
969     
970     for (unsigned I = 0, N = Spec1->getTemplateArgs().size(); I != N; ++I)
971       if (!IsStructurallyEquivalent(Context, 
972                                     Spec1->getTemplateArgs().get(I),
973                                     Spec2->getTemplateArgs().get(I)))
974         return false;
975   }  
976   // If one is a class template specialization and the other is not, these
977   // structures are different.
978   else if (Spec1 || Spec2)
979     return false;
980
981   // Compare the definitions of these two records. If either or both are
982   // incomplete, we assume that they are equivalent.
983   D1 = D1->getDefinition();
984   D2 = D2->getDefinition();
985   if (!D1 || !D2)
986     return true;
987   
988   if (CXXRecordDecl *D1CXX = dyn_cast<CXXRecordDecl>(D1)) {
989     if (CXXRecordDecl *D2CXX = dyn_cast<CXXRecordDecl>(D2)) {
990       if (D1CXX->getNumBases() != D2CXX->getNumBases()) {
991         if (Context.Complain) {
992           Context.Diag2(D2->getLocation(), diag::warn_odr_tag_type_inconsistent)
993             << Context.C2.getTypeDeclType(D2);
994           Context.Diag2(D2->getLocation(), diag::note_odr_number_of_bases)
995             << D2CXX->getNumBases();
996           Context.Diag1(D1->getLocation(), diag::note_odr_number_of_bases)
997             << D1CXX->getNumBases();
998         }
999         return false;
1000       }
1001       
1002       // Check the base classes. 
1003       for (CXXRecordDecl::base_class_iterator Base1 = D1CXX->bases_begin(), 
1004                                            BaseEnd1 = D1CXX->bases_end(),
1005                                                 Base2 = D2CXX->bases_begin();
1006            Base1 != BaseEnd1;
1007            ++Base1, ++Base2) {        
1008         if (!IsStructurallyEquivalent(Context, 
1009                                       Base1->getType(), Base2->getType())) {
1010           if (Context.Complain) {
1011             Context.Diag2(D2->getLocation(), diag::warn_odr_tag_type_inconsistent)
1012               << Context.C2.getTypeDeclType(D2);
1013             Context.Diag2(Base2->getLocStart(), diag::note_odr_base)
1014               << Base2->getType()
1015               << Base2->getSourceRange();
1016             Context.Diag1(Base1->getLocStart(), diag::note_odr_base)
1017               << Base1->getType()
1018               << Base1->getSourceRange();
1019           }
1020           return false;
1021         }
1022         
1023         // Check virtual vs. non-virtual inheritance mismatch.
1024         if (Base1->isVirtual() != Base2->isVirtual()) {
1025           if (Context.Complain) {
1026             Context.Diag2(D2->getLocation(), diag::warn_odr_tag_type_inconsistent)
1027               << Context.C2.getTypeDeclType(D2);
1028             Context.Diag2(Base2->getLocStart(),
1029                           diag::note_odr_virtual_base)
1030               << Base2->isVirtual() << Base2->getSourceRange();
1031             Context.Diag1(Base1->getLocStart(), diag::note_odr_base)
1032               << Base1->isVirtual()
1033               << Base1->getSourceRange();
1034           }
1035           return false;
1036         }
1037       }
1038     } else if (D1CXX->getNumBases() > 0) {
1039       if (Context.Complain) {
1040         Context.Diag2(D2->getLocation(), diag::warn_odr_tag_type_inconsistent)
1041           << Context.C2.getTypeDeclType(D2);
1042         const CXXBaseSpecifier *Base1 = D1CXX->bases_begin();
1043         Context.Diag1(Base1->getLocStart(), diag::note_odr_base)
1044           << Base1->getType()
1045           << Base1->getSourceRange();
1046         Context.Diag2(D2->getLocation(), diag::note_odr_missing_base);
1047       }
1048       return false;
1049     }
1050   }
1051   
1052   // Check the fields for consistency.
1053   RecordDecl::field_iterator Field2 = D2->field_begin(),
1054                              Field2End = D2->field_end();
1055   for (RecordDecl::field_iterator Field1 = D1->field_begin(),
1056                                   Field1End = D1->field_end();
1057        Field1 != Field1End;
1058        ++Field1, ++Field2) {
1059     if (Field2 == Field2End) {
1060       if (Context.Complain) {
1061         Context.Diag2(D2->getLocation(), diag::warn_odr_tag_type_inconsistent)
1062           << Context.C2.getTypeDeclType(D2);
1063         Context.Diag1(Field1->getLocation(), diag::note_odr_field)
1064           << Field1->getDeclName() << Field1->getType();
1065         Context.Diag2(D2->getLocation(), diag::note_odr_missing_field);
1066       }
1067       return false;
1068     }
1069     
1070     if (!IsStructurallyEquivalent(Context, *Field1, *Field2))
1071       return false;    
1072   }
1073   
1074   if (Field2 != Field2End) {
1075     if (Context.Complain) {
1076       Context.Diag2(D2->getLocation(), diag::warn_odr_tag_type_inconsistent)
1077         << Context.C2.getTypeDeclType(D2);
1078       Context.Diag2(Field2->getLocation(), diag::note_odr_field)
1079         << Field2->getDeclName() << Field2->getType();
1080       Context.Diag1(D1->getLocation(), diag::note_odr_missing_field);
1081     }
1082     return false;
1083   }
1084   
1085   return true;
1086 }
1087      
1088 /// \brief Determine structural equivalence of two enums.
1089 static bool IsStructurallyEquivalent(StructuralEquivalenceContext &Context,
1090                                      EnumDecl *D1, EnumDecl *D2) {
1091   EnumDecl::enumerator_iterator EC2 = D2->enumerator_begin(),
1092                              EC2End = D2->enumerator_end();
1093   for (EnumDecl::enumerator_iterator EC1 = D1->enumerator_begin(),
1094                                   EC1End = D1->enumerator_end();
1095        EC1 != EC1End; ++EC1, ++EC2) {
1096     if (EC2 == EC2End) {
1097       if (Context.Complain) {
1098         Context.Diag2(D2->getLocation(), diag::warn_odr_tag_type_inconsistent)
1099           << Context.C2.getTypeDeclType(D2);
1100         Context.Diag1(EC1->getLocation(), diag::note_odr_enumerator)
1101           << EC1->getDeclName() 
1102           << EC1->getInitVal().toString(10);
1103         Context.Diag2(D2->getLocation(), diag::note_odr_missing_enumerator);
1104       }
1105       return false;
1106     }
1107     
1108     llvm::APSInt Val1 = EC1->getInitVal();
1109     llvm::APSInt Val2 = EC2->getInitVal();
1110     if (!llvm::APSInt::isSameValue(Val1, Val2) || 
1111         !IsStructurallyEquivalent(EC1->getIdentifier(), EC2->getIdentifier())) {
1112       if (Context.Complain) {
1113         Context.Diag2(D2->getLocation(), diag::warn_odr_tag_type_inconsistent)
1114           << Context.C2.getTypeDeclType(D2);
1115         Context.Diag2(EC2->getLocation(), diag::note_odr_enumerator)
1116           << EC2->getDeclName() 
1117           << EC2->getInitVal().toString(10);
1118         Context.Diag1(EC1->getLocation(), diag::note_odr_enumerator)
1119           << EC1->getDeclName() 
1120           << EC1->getInitVal().toString(10);
1121       }
1122       return false;
1123     }
1124   }
1125   
1126   if (EC2 != EC2End) {
1127     if (Context.Complain) {
1128       Context.Diag2(D2->getLocation(), diag::warn_odr_tag_type_inconsistent)
1129         << Context.C2.getTypeDeclType(D2);
1130       Context.Diag2(EC2->getLocation(), diag::note_odr_enumerator)
1131         << EC2->getDeclName() 
1132         << EC2->getInitVal().toString(10);
1133       Context.Diag1(D1->getLocation(), diag::note_odr_missing_enumerator);
1134     }
1135     return false;
1136   }
1137   
1138   return true;
1139 }
1140
1141 static bool IsStructurallyEquivalent(StructuralEquivalenceContext &Context,
1142                                      TemplateParameterList *Params1,
1143                                      TemplateParameterList *Params2) {
1144   if (Params1->size() != Params2->size()) {
1145     if (Context.Complain) {
1146       Context.Diag2(Params2->getTemplateLoc(), 
1147                     diag::err_odr_different_num_template_parameters)
1148         << Params1->size() << Params2->size();
1149       Context.Diag1(Params1->getTemplateLoc(), 
1150                     diag::note_odr_template_parameter_list);
1151     }
1152     return false;
1153   }
1154   
1155   for (unsigned I = 0, N = Params1->size(); I != N; ++I) {
1156     if (Params1->getParam(I)->getKind() != Params2->getParam(I)->getKind()) {
1157       if (Context.Complain) {
1158         Context.Diag2(Params2->getParam(I)->getLocation(), 
1159                       diag::err_odr_different_template_parameter_kind);
1160         Context.Diag1(Params1->getParam(I)->getLocation(),
1161                       diag::note_odr_template_parameter_here);
1162       }
1163       return false;
1164     }
1165     
1166     if (!Context.IsStructurallyEquivalent(Params1->getParam(I),
1167                                           Params2->getParam(I))) {
1168       
1169       return false;
1170     }
1171   }
1172   
1173   return true;
1174 }
1175
1176 static bool IsStructurallyEquivalent(StructuralEquivalenceContext &Context,
1177                                      TemplateTypeParmDecl *D1,
1178                                      TemplateTypeParmDecl *D2) {
1179   if (D1->isParameterPack() != D2->isParameterPack()) {
1180     if (Context.Complain) {
1181       Context.Diag2(D2->getLocation(), diag::err_odr_parameter_pack_non_pack)
1182         << D2->isParameterPack();
1183       Context.Diag1(D1->getLocation(), diag::note_odr_parameter_pack_non_pack)
1184         << D1->isParameterPack();
1185     }
1186     return false;
1187   }
1188   
1189   return true;
1190 }
1191
1192 static bool IsStructurallyEquivalent(StructuralEquivalenceContext &Context,
1193                                      NonTypeTemplateParmDecl *D1,
1194                                      NonTypeTemplateParmDecl *D2) {
1195   if (D1->isParameterPack() != D2->isParameterPack()) {
1196     if (Context.Complain) {
1197       Context.Diag2(D2->getLocation(), diag::err_odr_parameter_pack_non_pack)
1198         << D2->isParameterPack();
1199       Context.Diag1(D1->getLocation(), diag::note_odr_parameter_pack_non_pack)
1200         << D1->isParameterPack();
1201     }
1202     return false;
1203   }
1204   
1205   // Check types.
1206   if (!Context.IsStructurallyEquivalent(D1->getType(), D2->getType())) {
1207     if (Context.Complain) {
1208       Context.Diag2(D2->getLocation(),
1209                     diag::err_odr_non_type_parameter_type_inconsistent)
1210         << D2->getType() << D1->getType();
1211       Context.Diag1(D1->getLocation(), diag::note_odr_value_here)
1212         << D1->getType();
1213     }
1214     return false;
1215   }
1216   
1217   return true;
1218 }
1219
1220 static bool IsStructurallyEquivalent(StructuralEquivalenceContext &Context,
1221                                      TemplateTemplateParmDecl *D1,
1222                                      TemplateTemplateParmDecl *D2) {
1223   if (D1->isParameterPack() != D2->isParameterPack()) {
1224     if (Context.Complain) {
1225       Context.Diag2(D2->getLocation(), diag::err_odr_parameter_pack_non_pack)
1226         << D2->isParameterPack();
1227       Context.Diag1(D1->getLocation(), diag::note_odr_parameter_pack_non_pack)
1228         << D1->isParameterPack();
1229     }
1230     return false;
1231   }
1232
1233   // Check template parameter lists.
1234   return IsStructurallyEquivalent(Context, D1->getTemplateParameters(),
1235                                   D2->getTemplateParameters());
1236 }
1237
1238 static bool IsStructurallyEquivalent(StructuralEquivalenceContext &Context,
1239                                      ClassTemplateDecl *D1, 
1240                                      ClassTemplateDecl *D2) {
1241   // Check template parameters.
1242   if (!IsStructurallyEquivalent(Context,
1243                                 D1->getTemplateParameters(),
1244                                 D2->getTemplateParameters()))
1245     return false;
1246   
1247   // Check the templated declaration.
1248   return Context.IsStructurallyEquivalent(D1->getTemplatedDecl(), 
1249                                           D2->getTemplatedDecl());
1250 }
1251
1252 /// \brief Determine structural equivalence of two declarations.
1253 static bool IsStructurallyEquivalent(StructuralEquivalenceContext &Context,
1254                                      Decl *D1, Decl *D2) {
1255   // FIXME: Check for known structural equivalences via a callback of some sort.
1256   
1257   // Check whether we already know that these two declarations are not
1258   // structurally equivalent.
1259   if (Context.NonEquivalentDecls.count(std::make_pair(D1->getCanonicalDecl(),
1260                                                       D2->getCanonicalDecl())))
1261     return false;
1262   
1263   // Determine whether we've already produced a tentative equivalence for D1.
1264   Decl *&EquivToD1 = Context.TentativeEquivalences[D1->getCanonicalDecl()];
1265   if (EquivToD1)
1266     return EquivToD1 == D2->getCanonicalDecl();
1267   
1268   // Produce a tentative equivalence D1 <-> D2, which will be checked later.
1269   EquivToD1 = D2->getCanonicalDecl();
1270   Context.DeclsToCheck.push_back(D1->getCanonicalDecl());
1271   return true;
1272 }
1273
1274 bool StructuralEquivalenceContext::IsStructurallyEquivalent(Decl *D1, 
1275                                                             Decl *D2) {
1276   if (!::IsStructurallyEquivalent(*this, D1, D2))
1277     return false;
1278   
1279   return !Finish();
1280 }
1281
1282 bool StructuralEquivalenceContext::IsStructurallyEquivalent(QualType T1, 
1283                                                             QualType T2) {
1284   if (!::IsStructurallyEquivalent(*this, T1, T2))
1285     return false;
1286   
1287   return !Finish();
1288 }
1289
1290 bool StructuralEquivalenceContext::Finish() {
1291   while (!DeclsToCheck.empty()) {
1292     // Check the next declaration.
1293     Decl *D1 = DeclsToCheck.front();
1294     DeclsToCheck.pop_front();
1295     
1296     Decl *D2 = TentativeEquivalences[D1];
1297     assert(D2 && "Unrecorded tentative equivalence?");
1298     
1299     bool Equivalent = true;
1300     
1301     // FIXME: Switch on all declaration kinds. For now, we're just going to
1302     // check the obvious ones.
1303     if (RecordDecl *Record1 = dyn_cast<RecordDecl>(D1)) {
1304       if (RecordDecl *Record2 = dyn_cast<RecordDecl>(D2)) {
1305         // Check for equivalent structure names.
1306         IdentifierInfo *Name1 = Record1->getIdentifier();
1307         if (!Name1 && Record1->getTypedefNameForAnonDecl())
1308           Name1 = Record1->getTypedefNameForAnonDecl()->getIdentifier();
1309         IdentifierInfo *Name2 = Record2->getIdentifier();
1310         if (!Name2 && Record2->getTypedefNameForAnonDecl())
1311           Name2 = Record2->getTypedefNameForAnonDecl()->getIdentifier();
1312         if (!::IsStructurallyEquivalent(Name1, Name2) ||
1313             !::IsStructurallyEquivalent(*this, Record1, Record2))
1314           Equivalent = false;
1315       } else {
1316         // Record/non-record mismatch.
1317         Equivalent = false;
1318       }
1319     } else if (EnumDecl *Enum1 = dyn_cast<EnumDecl>(D1)) {
1320       if (EnumDecl *Enum2 = dyn_cast<EnumDecl>(D2)) {
1321         // Check for equivalent enum names.
1322         IdentifierInfo *Name1 = Enum1->getIdentifier();
1323         if (!Name1 && Enum1->getTypedefNameForAnonDecl())
1324           Name1 = Enum1->getTypedefNameForAnonDecl()->getIdentifier();
1325         IdentifierInfo *Name2 = Enum2->getIdentifier();
1326         if (!Name2 && Enum2->getTypedefNameForAnonDecl())
1327           Name2 = Enum2->getTypedefNameForAnonDecl()->getIdentifier();
1328         if (!::IsStructurallyEquivalent(Name1, Name2) ||
1329             !::IsStructurallyEquivalent(*this, Enum1, Enum2))
1330           Equivalent = false;
1331       } else {
1332         // Enum/non-enum mismatch
1333         Equivalent = false;
1334       }
1335     } else if (TypedefNameDecl *Typedef1 = dyn_cast<TypedefNameDecl>(D1)) {
1336       if (TypedefNameDecl *Typedef2 = dyn_cast<TypedefNameDecl>(D2)) {
1337         if (!::IsStructurallyEquivalent(Typedef1->getIdentifier(),
1338                                         Typedef2->getIdentifier()) ||
1339             !::IsStructurallyEquivalent(*this,
1340                                         Typedef1->getUnderlyingType(),
1341                                         Typedef2->getUnderlyingType()))
1342           Equivalent = false;
1343       } else {
1344         // Typedef/non-typedef mismatch.
1345         Equivalent = false;
1346       }
1347     } else if (ClassTemplateDecl *ClassTemplate1 
1348                                            = dyn_cast<ClassTemplateDecl>(D1)) {
1349       if (ClassTemplateDecl *ClassTemplate2 = dyn_cast<ClassTemplateDecl>(D2)) {
1350         if (!::IsStructurallyEquivalent(ClassTemplate1->getIdentifier(),
1351                                         ClassTemplate2->getIdentifier()) ||
1352             !::IsStructurallyEquivalent(*this, ClassTemplate1, ClassTemplate2))
1353           Equivalent = false;
1354       } else {
1355         // Class template/non-class-template mismatch.
1356         Equivalent = false;
1357       }
1358     } else if (TemplateTypeParmDecl *TTP1= dyn_cast<TemplateTypeParmDecl>(D1)) {
1359       if (TemplateTypeParmDecl *TTP2 = dyn_cast<TemplateTypeParmDecl>(D2)) {
1360         if (!::IsStructurallyEquivalent(*this, TTP1, TTP2))
1361           Equivalent = false;
1362       } else {
1363         // Kind mismatch.
1364         Equivalent = false;
1365       }
1366     } else if (NonTypeTemplateParmDecl *NTTP1
1367                                      = dyn_cast<NonTypeTemplateParmDecl>(D1)) {
1368       if (NonTypeTemplateParmDecl *NTTP2
1369                                       = dyn_cast<NonTypeTemplateParmDecl>(D2)) {
1370         if (!::IsStructurallyEquivalent(*this, NTTP1, NTTP2))
1371           Equivalent = false;
1372       } else {
1373         // Kind mismatch.
1374         Equivalent = false;
1375       }
1376     } else if (TemplateTemplateParmDecl *TTP1
1377                                   = dyn_cast<TemplateTemplateParmDecl>(D1)) {
1378       if (TemplateTemplateParmDecl *TTP2
1379                                     = dyn_cast<TemplateTemplateParmDecl>(D2)) {
1380         if (!::IsStructurallyEquivalent(*this, TTP1, TTP2))
1381           Equivalent = false;
1382       } else {
1383         // Kind mismatch.
1384         Equivalent = false;
1385       }
1386     }
1387     
1388     if (!Equivalent) {
1389       // Note that these two declarations are not equivalent (and we already
1390       // know about it).
1391       NonEquivalentDecls.insert(std::make_pair(D1->getCanonicalDecl(),
1392                                                D2->getCanonicalDecl()));
1393       return true;
1394     }
1395     // FIXME: Check other declaration kinds!
1396   }
1397   
1398   return false;
1399 }
1400
1401 //----------------------------------------------------------------------------
1402 // Import Types
1403 //----------------------------------------------------------------------------
1404
1405 QualType ASTNodeImporter::VisitType(const Type *T) {
1406   Importer.FromDiag(SourceLocation(), diag::err_unsupported_ast_node)
1407     << T->getTypeClassName();
1408   return QualType();
1409 }
1410
1411 QualType ASTNodeImporter::VisitBuiltinType(const BuiltinType *T) {
1412   switch (T->getKind()) {
1413 #define SHARED_SINGLETON_TYPE(Expansion)
1414 #define BUILTIN_TYPE(Id, SingletonId) \
1415   case BuiltinType::Id: return Importer.getToContext().SingletonId;
1416 #include "clang/AST/BuiltinTypes.def"
1417
1418   // FIXME: for Char16, Char32, and NullPtr, make sure that the "to"
1419   // context supports C++.
1420
1421   // FIXME: for ObjCId, ObjCClass, and ObjCSel, make sure that the "to"
1422   // context supports ObjC.
1423
1424   case BuiltinType::Char_U:
1425     // The context we're importing from has an unsigned 'char'. If we're 
1426     // importing into a context with a signed 'char', translate to 
1427     // 'unsigned char' instead.
1428     if (Importer.getToContext().getLangOpts().CharIsSigned)
1429       return Importer.getToContext().UnsignedCharTy;
1430     
1431     return Importer.getToContext().CharTy;
1432
1433   case BuiltinType::Char_S:
1434     // The context we're importing from has an unsigned 'char'. If we're 
1435     // importing into a context with a signed 'char', translate to 
1436     // 'unsigned char' instead.
1437     if (!Importer.getToContext().getLangOpts().CharIsSigned)
1438       return Importer.getToContext().SignedCharTy;
1439     
1440     return Importer.getToContext().CharTy;
1441
1442   case BuiltinType::WChar_S:
1443   case BuiltinType::WChar_U:
1444     // FIXME: If not in C++, shall we translate to the C equivalent of
1445     // wchar_t?
1446     return Importer.getToContext().WCharTy;
1447   }
1448
1449   llvm_unreachable("Invalid BuiltinType Kind!");
1450 }
1451
1452 QualType ASTNodeImporter::VisitComplexType(const ComplexType *T) {
1453   QualType ToElementType = Importer.Import(T->getElementType());
1454   if (ToElementType.isNull())
1455     return QualType();
1456   
1457   return Importer.getToContext().getComplexType(ToElementType);
1458 }
1459
1460 QualType ASTNodeImporter::VisitPointerType(const PointerType *T) {
1461   QualType ToPointeeType = Importer.Import(T->getPointeeType());
1462   if (ToPointeeType.isNull())
1463     return QualType();
1464   
1465   return Importer.getToContext().getPointerType(ToPointeeType);
1466 }
1467
1468 QualType ASTNodeImporter::VisitBlockPointerType(const BlockPointerType *T) {
1469   // FIXME: Check for blocks support in "to" context.
1470   QualType ToPointeeType = Importer.Import(T->getPointeeType());
1471   if (ToPointeeType.isNull())
1472     return QualType();
1473   
1474   return Importer.getToContext().getBlockPointerType(ToPointeeType);
1475 }
1476
1477 QualType
1478 ASTNodeImporter::VisitLValueReferenceType(const LValueReferenceType *T) {
1479   // FIXME: Check for C++ support in "to" context.
1480   QualType ToPointeeType = Importer.Import(T->getPointeeTypeAsWritten());
1481   if (ToPointeeType.isNull())
1482     return QualType();
1483   
1484   return Importer.getToContext().getLValueReferenceType(ToPointeeType);
1485 }
1486
1487 QualType
1488 ASTNodeImporter::VisitRValueReferenceType(const RValueReferenceType *T) {
1489   // FIXME: Check for C++0x support in "to" context.
1490   QualType ToPointeeType = Importer.Import(T->getPointeeTypeAsWritten());
1491   if (ToPointeeType.isNull())
1492     return QualType();
1493   
1494   return Importer.getToContext().getRValueReferenceType(ToPointeeType);  
1495 }
1496
1497 QualType ASTNodeImporter::VisitMemberPointerType(const MemberPointerType *T) {
1498   // FIXME: Check for C++ support in "to" context.
1499   QualType ToPointeeType = Importer.Import(T->getPointeeType());
1500   if (ToPointeeType.isNull())
1501     return QualType();
1502   
1503   QualType ClassType = Importer.Import(QualType(T->getClass(), 0));
1504   return Importer.getToContext().getMemberPointerType(ToPointeeType, 
1505                                                       ClassType.getTypePtr());
1506 }
1507
1508 QualType ASTNodeImporter::VisitConstantArrayType(const ConstantArrayType *T) {
1509   QualType ToElementType = Importer.Import(T->getElementType());
1510   if (ToElementType.isNull())
1511     return QualType();
1512   
1513   return Importer.getToContext().getConstantArrayType(ToElementType, 
1514                                                       T->getSize(),
1515                                                       T->getSizeModifier(),
1516                                                T->getIndexTypeCVRQualifiers());
1517 }
1518
1519 QualType
1520 ASTNodeImporter::VisitIncompleteArrayType(const IncompleteArrayType *T) {
1521   QualType ToElementType = Importer.Import(T->getElementType());
1522   if (ToElementType.isNull())
1523     return QualType();
1524   
1525   return Importer.getToContext().getIncompleteArrayType(ToElementType, 
1526                                                         T->getSizeModifier(),
1527                                                 T->getIndexTypeCVRQualifiers());
1528 }
1529
1530 QualType ASTNodeImporter::VisitVariableArrayType(const VariableArrayType *T) {
1531   QualType ToElementType = Importer.Import(T->getElementType());
1532   if (ToElementType.isNull())
1533     return QualType();
1534
1535   Expr *Size = Importer.Import(T->getSizeExpr());
1536   if (!Size)
1537     return QualType();
1538   
1539   SourceRange Brackets = Importer.Import(T->getBracketsRange());
1540   return Importer.getToContext().getVariableArrayType(ToElementType, Size,
1541                                                       T->getSizeModifier(),
1542                                                 T->getIndexTypeCVRQualifiers(),
1543                                                       Brackets);
1544 }
1545
1546 QualType ASTNodeImporter::VisitVectorType(const VectorType *T) {
1547   QualType ToElementType = Importer.Import(T->getElementType());
1548   if (ToElementType.isNull())
1549     return QualType();
1550   
1551   return Importer.getToContext().getVectorType(ToElementType, 
1552                                                T->getNumElements(),
1553                                                T->getVectorKind());
1554 }
1555
1556 QualType ASTNodeImporter::VisitExtVectorType(const ExtVectorType *T) {
1557   QualType ToElementType = Importer.Import(T->getElementType());
1558   if (ToElementType.isNull())
1559     return QualType();
1560   
1561   return Importer.getToContext().getExtVectorType(ToElementType, 
1562                                                   T->getNumElements());
1563 }
1564
1565 QualType
1566 ASTNodeImporter::VisitFunctionNoProtoType(const FunctionNoProtoType *T) {
1567   // FIXME: What happens if we're importing a function without a prototype 
1568   // into C++? Should we make it variadic?
1569   QualType ToResultType = Importer.Import(T->getResultType());
1570   if (ToResultType.isNull())
1571     return QualType();
1572
1573   return Importer.getToContext().getFunctionNoProtoType(ToResultType,
1574                                                         T->getExtInfo());
1575 }
1576
1577 QualType ASTNodeImporter::VisitFunctionProtoType(const FunctionProtoType *T) {
1578   QualType ToResultType = Importer.Import(T->getResultType());
1579   if (ToResultType.isNull())
1580     return QualType();
1581   
1582   // Import argument types
1583   SmallVector<QualType, 4> ArgTypes;
1584   for (FunctionProtoType::arg_type_iterator A = T->arg_type_begin(),
1585                                          AEnd = T->arg_type_end();
1586        A != AEnd; ++A) {
1587     QualType ArgType = Importer.Import(*A);
1588     if (ArgType.isNull())
1589       return QualType();
1590     ArgTypes.push_back(ArgType);
1591   }
1592   
1593   // Import exception types
1594   SmallVector<QualType, 4> ExceptionTypes;
1595   for (FunctionProtoType::exception_iterator E = T->exception_begin(),
1596                                           EEnd = T->exception_end();
1597        E != EEnd; ++E) {
1598     QualType ExceptionType = Importer.Import(*E);
1599     if (ExceptionType.isNull())
1600       return QualType();
1601     ExceptionTypes.push_back(ExceptionType);
1602   }
1603
1604   FunctionProtoType::ExtProtoInfo FromEPI = T->getExtProtoInfo();
1605   FunctionProtoType::ExtProtoInfo ToEPI;
1606
1607   ToEPI.ExtInfo = FromEPI.ExtInfo;
1608   ToEPI.Variadic = FromEPI.Variadic;
1609   ToEPI.HasTrailingReturn = FromEPI.HasTrailingReturn;
1610   ToEPI.TypeQuals = FromEPI.TypeQuals;
1611   ToEPI.RefQualifier = FromEPI.RefQualifier;
1612   ToEPI.NumExceptions = ExceptionTypes.size();
1613   ToEPI.Exceptions = ExceptionTypes.data();
1614   ToEPI.ConsumedArguments = FromEPI.ConsumedArguments;
1615   ToEPI.ExceptionSpecType = FromEPI.ExceptionSpecType;
1616   ToEPI.NoexceptExpr = Importer.Import(FromEPI.NoexceptExpr);
1617   ToEPI.ExceptionSpecDecl = cast_or_null<FunctionDecl>(
1618                                 Importer.Import(FromEPI.ExceptionSpecDecl));
1619   ToEPI.ExceptionSpecTemplate = cast_or_null<FunctionDecl>(
1620                                 Importer.Import(FromEPI.ExceptionSpecTemplate));
1621
1622   return Importer.getToContext().getFunctionType(ToResultType, ArgTypes, ToEPI);
1623 }
1624
1625 QualType ASTNodeImporter::VisitParenType(const ParenType *T) {
1626   QualType ToInnerType = Importer.Import(T->getInnerType());
1627   if (ToInnerType.isNull())
1628     return QualType();
1629     
1630   return Importer.getToContext().getParenType(ToInnerType);
1631 }
1632
1633 QualType ASTNodeImporter::VisitTypedefType(const TypedefType *T) {
1634   TypedefNameDecl *ToDecl
1635              = dyn_cast_or_null<TypedefNameDecl>(Importer.Import(T->getDecl()));
1636   if (!ToDecl)
1637     return QualType();
1638   
1639   return Importer.getToContext().getTypeDeclType(ToDecl);
1640 }
1641
1642 QualType ASTNodeImporter::VisitTypeOfExprType(const TypeOfExprType *T) {
1643   Expr *ToExpr = Importer.Import(T->getUnderlyingExpr());
1644   if (!ToExpr)
1645     return QualType();
1646   
1647   return Importer.getToContext().getTypeOfExprType(ToExpr);
1648 }
1649
1650 QualType ASTNodeImporter::VisitTypeOfType(const TypeOfType *T) {
1651   QualType ToUnderlyingType = Importer.Import(T->getUnderlyingType());
1652   if (ToUnderlyingType.isNull())
1653     return QualType();
1654   
1655   return Importer.getToContext().getTypeOfType(ToUnderlyingType);
1656 }
1657
1658 QualType ASTNodeImporter::VisitDecltypeType(const DecltypeType *T) {
1659   // FIXME: Make sure that the "to" context supports C++0x!
1660   Expr *ToExpr = Importer.Import(T->getUnderlyingExpr());
1661   if (!ToExpr)
1662     return QualType();
1663   
1664   QualType UnderlyingType = Importer.Import(T->getUnderlyingType());
1665   if (UnderlyingType.isNull())
1666     return QualType();
1667
1668   return Importer.getToContext().getDecltypeType(ToExpr, UnderlyingType);
1669 }
1670
1671 QualType ASTNodeImporter::VisitUnaryTransformType(const UnaryTransformType *T) {
1672   QualType ToBaseType = Importer.Import(T->getBaseType());
1673   QualType ToUnderlyingType = Importer.Import(T->getUnderlyingType());
1674   if (ToBaseType.isNull() || ToUnderlyingType.isNull())
1675     return QualType();
1676
1677   return Importer.getToContext().getUnaryTransformType(ToBaseType,
1678                                                        ToUnderlyingType,
1679                                                        T->getUTTKind());
1680 }
1681
1682 QualType ASTNodeImporter::VisitAutoType(const AutoType *T) {
1683   // FIXME: Make sure that the "to" context supports C++0x!
1684   QualType FromDeduced = T->getDeducedType();
1685   QualType ToDeduced;
1686   if (!FromDeduced.isNull()) {
1687     ToDeduced = Importer.Import(FromDeduced);
1688     if (ToDeduced.isNull())
1689       return QualType();
1690   }
1691   
1692   return Importer.getToContext().getAutoType(ToDeduced);
1693 }
1694
1695 QualType ASTNodeImporter::VisitRecordType(const RecordType *T) {
1696   RecordDecl *ToDecl
1697     = dyn_cast_or_null<RecordDecl>(Importer.Import(T->getDecl()));
1698   if (!ToDecl)
1699     return QualType();
1700
1701   return Importer.getToContext().getTagDeclType(ToDecl);
1702 }
1703
1704 QualType ASTNodeImporter::VisitEnumType(const EnumType *T) {
1705   EnumDecl *ToDecl
1706     = dyn_cast_or_null<EnumDecl>(Importer.Import(T->getDecl()));
1707   if (!ToDecl)
1708     return QualType();
1709
1710   return Importer.getToContext().getTagDeclType(ToDecl);
1711 }
1712
1713 QualType ASTNodeImporter::VisitTemplateSpecializationType(
1714                                        const TemplateSpecializationType *T) {
1715   TemplateName ToTemplate = Importer.Import(T->getTemplateName());
1716   if (ToTemplate.isNull())
1717     return QualType();
1718   
1719   SmallVector<TemplateArgument, 2> ToTemplateArgs;
1720   if (ImportTemplateArguments(T->getArgs(), T->getNumArgs(), ToTemplateArgs))
1721     return QualType();
1722   
1723   QualType ToCanonType;
1724   if (!QualType(T, 0).isCanonical()) {
1725     QualType FromCanonType 
1726       = Importer.getFromContext().getCanonicalType(QualType(T, 0));
1727     ToCanonType =Importer.Import(FromCanonType);
1728     if (ToCanonType.isNull())
1729       return QualType();
1730   }
1731   return Importer.getToContext().getTemplateSpecializationType(ToTemplate, 
1732                                                          ToTemplateArgs.data(), 
1733                                                          ToTemplateArgs.size(),
1734                                                                ToCanonType);
1735 }
1736
1737 QualType ASTNodeImporter::VisitElaboratedType(const ElaboratedType *T) {
1738   NestedNameSpecifier *ToQualifier = 0;
1739   // Note: the qualifier in an ElaboratedType is optional.
1740   if (T->getQualifier()) {
1741     ToQualifier = Importer.Import(T->getQualifier());
1742     if (!ToQualifier)
1743       return QualType();
1744   }
1745
1746   QualType ToNamedType = Importer.Import(T->getNamedType());
1747   if (ToNamedType.isNull())
1748     return QualType();
1749
1750   return Importer.getToContext().getElaboratedType(T->getKeyword(),
1751                                                    ToQualifier, ToNamedType);
1752 }
1753
1754 QualType ASTNodeImporter::VisitObjCInterfaceType(const ObjCInterfaceType *T) {
1755   ObjCInterfaceDecl *Class
1756     = dyn_cast_or_null<ObjCInterfaceDecl>(Importer.Import(T->getDecl()));
1757   if (!Class)
1758     return QualType();
1759
1760   return Importer.getToContext().getObjCInterfaceType(Class);
1761 }
1762
1763 QualType ASTNodeImporter::VisitObjCObjectType(const ObjCObjectType *T) {
1764   QualType ToBaseType = Importer.Import(T->getBaseType());
1765   if (ToBaseType.isNull())
1766     return QualType();
1767
1768   SmallVector<ObjCProtocolDecl *, 4> Protocols;
1769   for (ObjCObjectType::qual_iterator P = T->qual_begin(), 
1770                                      PEnd = T->qual_end();
1771        P != PEnd; ++P) {
1772     ObjCProtocolDecl *Protocol
1773       = dyn_cast_or_null<ObjCProtocolDecl>(Importer.Import(*P));
1774     if (!Protocol)
1775       return QualType();
1776     Protocols.push_back(Protocol);
1777   }
1778
1779   return Importer.getToContext().getObjCObjectType(ToBaseType,
1780                                                    Protocols.data(),
1781                                                    Protocols.size());
1782 }
1783
1784 QualType
1785 ASTNodeImporter::VisitObjCObjectPointerType(const ObjCObjectPointerType *T) {
1786   QualType ToPointeeType = Importer.Import(T->getPointeeType());
1787   if (ToPointeeType.isNull())
1788     return QualType();
1789
1790   return Importer.getToContext().getObjCObjectPointerType(ToPointeeType);
1791 }
1792
1793 //----------------------------------------------------------------------------
1794 // Import Declarations
1795 //----------------------------------------------------------------------------
1796 bool ASTNodeImporter::ImportDeclParts(NamedDecl *D, DeclContext *&DC, 
1797                                       DeclContext *&LexicalDC, 
1798                                       DeclarationName &Name, 
1799                                       SourceLocation &Loc) {
1800   // Import the context of this declaration.
1801   DC = Importer.ImportContext(D->getDeclContext());
1802   if (!DC)
1803     return true;
1804   
1805   LexicalDC = DC;
1806   if (D->getDeclContext() != D->getLexicalDeclContext()) {
1807     LexicalDC = Importer.ImportContext(D->getLexicalDeclContext());
1808     if (!LexicalDC)
1809       return true;
1810   }
1811   
1812   // Import the name of this declaration.
1813   Name = Importer.Import(D->getDeclName());
1814   if (D->getDeclName() && !Name)
1815     return true;
1816   
1817   // Import the location of this declaration.
1818   Loc = Importer.Import(D->getLocation());
1819   return false;
1820 }
1821
1822 void ASTNodeImporter::ImportDefinitionIfNeeded(Decl *FromD, Decl *ToD) {
1823   if (!FromD)
1824     return;
1825   
1826   if (!ToD) {
1827     ToD = Importer.Import(FromD);
1828     if (!ToD)
1829       return;
1830   }
1831   
1832   if (RecordDecl *FromRecord = dyn_cast<RecordDecl>(FromD)) {
1833     if (RecordDecl *ToRecord = cast_or_null<RecordDecl>(ToD)) {
1834       if (FromRecord->getDefinition() && FromRecord->isCompleteDefinition() && !ToRecord->getDefinition()) {
1835         ImportDefinition(FromRecord, ToRecord);
1836       }
1837     }
1838     return;
1839   }
1840
1841   if (EnumDecl *FromEnum = dyn_cast<EnumDecl>(FromD)) {
1842     if (EnumDecl *ToEnum = cast_or_null<EnumDecl>(ToD)) {
1843       if (FromEnum->getDefinition() && !ToEnum->getDefinition()) {
1844         ImportDefinition(FromEnum, ToEnum);
1845       }
1846     }
1847     return;
1848   }
1849 }
1850
1851 void
1852 ASTNodeImporter::ImportDeclarationNameLoc(const DeclarationNameInfo &From,
1853                                           DeclarationNameInfo& To) {
1854   // NOTE: To.Name and To.Loc are already imported.
1855   // We only have to import To.LocInfo.
1856   switch (To.getName().getNameKind()) {
1857   case DeclarationName::Identifier:
1858   case DeclarationName::ObjCZeroArgSelector:
1859   case DeclarationName::ObjCOneArgSelector:
1860   case DeclarationName::ObjCMultiArgSelector:
1861   case DeclarationName::CXXUsingDirective:
1862     return;
1863
1864   case DeclarationName::CXXOperatorName: {
1865     SourceRange Range = From.getCXXOperatorNameRange();
1866     To.setCXXOperatorNameRange(Importer.Import(Range));
1867     return;
1868   }
1869   case DeclarationName::CXXLiteralOperatorName: {
1870     SourceLocation Loc = From.getCXXLiteralOperatorNameLoc();
1871     To.setCXXLiteralOperatorNameLoc(Importer.Import(Loc));
1872     return;
1873   }
1874   case DeclarationName::CXXConstructorName:
1875   case DeclarationName::CXXDestructorName:
1876   case DeclarationName::CXXConversionFunctionName: {
1877     TypeSourceInfo *FromTInfo = From.getNamedTypeInfo();
1878     To.setNamedTypeInfo(Importer.Import(FromTInfo));
1879     return;
1880   }
1881   }
1882   llvm_unreachable("Unknown name kind.");
1883 }
1884
1885 void ASTNodeImporter::ImportDeclContext(DeclContext *FromDC, bool ForceImport) {  
1886   if (Importer.isMinimalImport() && !ForceImport) {
1887     Importer.ImportContext(FromDC);
1888     return;
1889   }
1890   
1891   for (DeclContext::decl_iterator From = FromDC->decls_begin(),
1892                                FromEnd = FromDC->decls_end();
1893        From != FromEnd;
1894        ++From)
1895     Importer.Import(*From);
1896 }
1897
1898 bool ASTNodeImporter::ImportDefinition(RecordDecl *From, RecordDecl *To, 
1899                                        ImportDefinitionKind Kind) {
1900   if (To->getDefinition() || To->isBeingDefined()) {
1901     if (Kind == IDK_Everything)
1902       ImportDeclContext(From, /*ForceImport=*/true);
1903     
1904     return false;
1905   }
1906   
1907   To->startDefinition();
1908   
1909   // Add base classes.
1910   if (CXXRecordDecl *ToCXX = dyn_cast<CXXRecordDecl>(To)) {
1911     CXXRecordDecl *FromCXX = cast<CXXRecordDecl>(From);
1912
1913     struct CXXRecordDecl::DefinitionData &ToData = ToCXX->data();
1914     struct CXXRecordDecl::DefinitionData &FromData = FromCXX->data();
1915     ToData.UserDeclaredConstructor = FromData.UserDeclaredConstructor;
1916     ToData.UserDeclaredSpecialMembers = FromData.UserDeclaredSpecialMembers;
1917     ToData.Aggregate = FromData.Aggregate;
1918     ToData.PlainOldData = FromData.PlainOldData;
1919     ToData.Empty = FromData.Empty;
1920     ToData.Polymorphic = FromData.Polymorphic;
1921     ToData.Abstract = FromData.Abstract;
1922     ToData.IsStandardLayout = FromData.IsStandardLayout;
1923     ToData.HasNoNonEmptyBases = FromData.HasNoNonEmptyBases;
1924     ToData.HasPrivateFields = FromData.HasPrivateFields;
1925     ToData.HasProtectedFields = FromData.HasProtectedFields;
1926     ToData.HasPublicFields = FromData.HasPublicFields;
1927     ToData.HasMutableFields = FromData.HasMutableFields;
1928     ToData.HasOnlyCMembers = FromData.HasOnlyCMembers;
1929     ToData.HasInClassInitializer = FromData.HasInClassInitializer;
1930     ToData.HasUninitializedReferenceMember
1931       = FromData.HasUninitializedReferenceMember;
1932     ToData.NeedOverloadResolutionForMoveConstructor
1933       = FromData.NeedOverloadResolutionForMoveConstructor;
1934     ToData.NeedOverloadResolutionForMoveAssignment
1935       = FromData.NeedOverloadResolutionForMoveAssignment;
1936     ToData.NeedOverloadResolutionForDestructor
1937       = FromData.NeedOverloadResolutionForDestructor;
1938     ToData.DefaultedMoveConstructorIsDeleted
1939       = FromData.DefaultedMoveConstructorIsDeleted;
1940     ToData.DefaultedMoveAssignmentIsDeleted
1941       = FromData.DefaultedMoveAssignmentIsDeleted;
1942     ToData.DefaultedDestructorIsDeleted = FromData.DefaultedDestructorIsDeleted;
1943     ToData.HasTrivialSpecialMembers = FromData.HasTrivialSpecialMembers;
1944     ToData.HasIrrelevantDestructor = FromData.HasIrrelevantDestructor;
1945     ToData.HasConstexprNonCopyMoveConstructor
1946       = FromData.HasConstexprNonCopyMoveConstructor;
1947     ToData.DefaultedDefaultConstructorIsConstexpr
1948       = FromData.DefaultedDefaultConstructorIsConstexpr;
1949     ToData.HasConstexprDefaultConstructor
1950       = FromData.HasConstexprDefaultConstructor;
1951     ToData.HasNonLiteralTypeFieldsOrBases
1952       = FromData.HasNonLiteralTypeFieldsOrBases;
1953     // ComputedVisibleConversions not imported.
1954     ToData.UserProvidedDefaultConstructor
1955       = FromData.UserProvidedDefaultConstructor;
1956     ToData.DeclaredSpecialMembers = FromData.DeclaredSpecialMembers;
1957     ToData.ImplicitCopyConstructorHasConstParam
1958       = FromData.ImplicitCopyConstructorHasConstParam;
1959     ToData.ImplicitCopyAssignmentHasConstParam
1960       = FromData.ImplicitCopyAssignmentHasConstParam;
1961     ToData.HasDeclaredCopyConstructorWithConstParam
1962       = FromData.HasDeclaredCopyConstructorWithConstParam;
1963     ToData.HasDeclaredCopyAssignmentWithConstParam
1964       = FromData.HasDeclaredCopyAssignmentWithConstParam;
1965     ToData.FailedImplicitMoveConstructor
1966       = FromData.FailedImplicitMoveConstructor;
1967     ToData.FailedImplicitMoveAssignment = FromData.FailedImplicitMoveAssignment;
1968     ToData.IsLambda = FromData.IsLambda;
1969
1970     SmallVector<CXXBaseSpecifier *, 4> Bases;
1971     for (CXXRecordDecl::base_class_iterator 
1972                   Base1 = FromCXX->bases_begin(),
1973             FromBaseEnd = FromCXX->bases_end();
1974          Base1 != FromBaseEnd;
1975          ++Base1) {
1976       QualType T = Importer.Import(Base1->getType());
1977       if (T.isNull())
1978         return true;
1979
1980       SourceLocation EllipsisLoc;
1981       if (Base1->isPackExpansion())
1982         EllipsisLoc = Importer.Import(Base1->getEllipsisLoc());
1983
1984       // Ensure that we have a definition for the base.
1985       ImportDefinitionIfNeeded(Base1->getType()->getAsCXXRecordDecl());
1986         
1987       Bases.push_back(
1988                     new (Importer.getToContext()) 
1989                       CXXBaseSpecifier(Importer.Import(Base1->getSourceRange()),
1990                                        Base1->isVirtual(),
1991                                        Base1->isBaseOfClass(),
1992                                        Base1->getAccessSpecifierAsWritten(),
1993                                    Importer.Import(Base1->getTypeSourceInfo()),
1994                                        EllipsisLoc));
1995     }
1996     if (!Bases.empty())
1997       ToCXX->setBases(Bases.data(), Bases.size());
1998   }
1999   
2000   if (shouldForceImportDeclContext(Kind))
2001     ImportDeclContext(From, /*ForceImport=*/true);
2002   
2003   To->completeDefinition();
2004   return false;
2005 }
2006
2007 bool ASTNodeImporter::ImportDefinition(EnumDecl *From, EnumDecl *To, 
2008                                        ImportDefinitionKind Kind) {
2009   if (To->getDefinition() || To->isBeingDefined()) {
2010     if (Kind == IDK_Everything)
2011       ImportDeclContext(From, /*ForceImport=*/true);
2012     return false;
2013   }
2014   
2015   To->startDefinition();
2016
2017   QualType T = Importer.Import(Importer.getFromContext().getTypeDeclType(From));
2018   if (T.isNull())
2019     return true;
2020   
2021   QualType ToPromotionType = Importer.Import(From->getPromotionType());
2022   if (ToPromotionType.isNull())
2023     return true;
2024
2025   if (shouldForceImportDeclContext(Kind))
2026     ImportDeclContext(From, /*ForceImport=*/true);
2027   
2028   // FIXME: we might need to merge the number of positive or negative bits
2029   // if the enumerator lists don't match.
2030   To->completeDefinition(T, ToPromotionType,
2031                          From->getNumPositiveBits(),
2032                          From->getNumNegativeBits());
2033   return false;
2034 }
2035
2036 TemplateParameterList *ASTNodeImporter::ImportTemplateParameterList(
2037                                                 TemplateParameterList *Params) {
2038   SmallVector<NamedDecl *, 4> ToParams;
2039   ToParams.reserve(Params->size());
2040   for (TemplateParameterList::iterator P = Params->begin(), 
2041                                     PEnd = Params->end();
2042        P != PEnd; ++P) {
2043     Decl *To = Importer.Import(*P);
2044     if (!To)
2045       return 0;
2046     
2047     ToParams.push_back(cast<NamedDecl>(To));
2048   }
2049   
2050   return TemplateParameterList::Create(Importer.getToContext(),
2051                                        Importer.Import(Params->getTemplateLoc()),
2052                                        Importer.Import(Params->getLAngleLoc()),
2053                                        ToParams.data(), ToParams.size(),
2054                                        Importer.Import(Params->getRAngleLoc()));
2055 }
2056
2057 TemplateArgument 
2058 ASTNodeImporter::ImportTemplateArgument(const TemplateArgument &From) {
2059   switch (From.getKind()) {
2060   case TemplateArgument::Null:
2061     return TemplateArgument();
2062      
2063   case TemplateArgument::Type: {
2064     QualType ToType = Importer.Import(From.getAsType());
2065     if (ToType.isNull())
2066       return TemplateArgument();
2067     return TemplateArgument(ToType);
2068   }
2069       
2070   case TemplateArgument::Integral: {
2071     QualType ToType = Importer.Import(From.getIntegralType());
2072     if (ToType.isNull())
2073       return TemplateArgument();
2074     return TemplateArgument(From, ToType);
2075   }
2076
2077   case TemplateArgument::Declaration: {
2078     ValueDecl *FromD = From.getAsDecl();
2079     if (ValueDecl *To = cast_or_null<ValueDecl>(Importer.Import(FromD)))
2080       return TemplateArgument(To, From.isDeclForReferenceParam());
2081     return TemplateArgument();
2082   }
2083
2084   case TemplateArgument::NullPtr: {
2085     QualType ToType = Importer.Import(From.getNullPtrType());
2086     if (ToType.isNull())
2087       return TemplateArgument();
2088     return TemplateArgument(ToType, /*isNullPtr*/true);
2089   }
2090
2091   case TemplateArgument::Template: {
2092     TemplateName ToTemplate = Importer.Import(From.getAsTemplate());
2093     if (ToTemplate.isNull())
2094       return TemplateArgument();
2095     
2096     return TemplateArgument(ToTemplate);
2097   }
2098
2099   case TemplateArgument::TemplateExpansion: {
2100     TemplateName ToTemplate 
2101       = Importer.Import(From.getAsTemplateOrTemplatePattern());
2102     if (ToTemplate.isNull())
2103       return TemplateArgument();
2104     
2105     return TemplateArgument(ToTemplate, From.getNumTemplateExpansions());
2106   }
2107
2108   case TemplateArgument::Expression:
2109     if (Expr *ToExpr = Importer.Import(From.getAsExpr()))
2110       return TemplateArgument(ToExpr);
2111     return TemplateArgument();
2112       
2113   case TemplateArgument::Pack: {
2114     SmallVector<TemplateArgument, 2> ToPack;
2115     ToPack.reserve(From.pack_size());
2116     if (ImportTemplateArguments(From.pack_begin(), From.pack_size(), ToPack))
2117       return TemplateArgument();
2118     
2119     TemplateArgument *ToArgs 
2120       = new (Importer.getToContext()) TemplateArgument[ToPack.size()];
2121     std::copy(ToPack.begin(), ToPack.end(), ToArgs);
2122     return TemplateArgument(ToArgs, ToPack.size());
2123   }
2124   }
2125   
2126   llvm_unreachable("Invalid template argument kind");
2127 }
2128
2129 bool ASTNodeImporter::ImportTemplateArguments(const TemplateArgument *FromArgs,
2130                                               unsigned NumFromArgs,
2131                               SmallVectorImpl<TemplateArgument> &ToArgs) {
2132   for (unsigned I = 0; I != NumFromArgs; ++I) {
2133     TemplateArgument To = ImportTemplateArgument(FromArgs[I]);
2134     if (To.isNull() && !FromArgs[I].isNull())
2135       return true;
2136     
2137     ToArgs.push_back(To);
2138   }
2139   
2140   return false;
2141 }
2142
2143 bool ASTNodeImporter::IsStructuralMatch(RecordDecl *FromRecord, 
2144                                         RecordDecl *ToRecord, bool Complain) {
2145   StructuralEquivalenceContext Ctx(Importer.getFromContext(),
2146                                    Importer.getToContext(),
2147                                    Importer.getNonEquivalentDecls(),
2148                                    false, Complain);
2149   return Ctx.IsStructurallyEquivalent(FromRecord, ToRecord);
2150 }
2151
2152 bool ASTNodeImporter::IsStructuralMatch(EnumDecl *FromEnum, EnumDecl *ToEnum) {
2153   StructuralEquivalenceContext Ctx(Importer.getFromContext(),
2154                                    Importer.getToContext(),
2155                                    Importer.getNonEquivalentDecls());
2156   return Ctx.IsStructurallyEquivalent(FromEnum, ToEnum);
2157 }
2158
2159 bool ASTNodeImporter::IsStructuralMatch(EnumConstantDecl *FromEC,
2160                                         EnumConstantDecl *ToEC)
2161 {
2162   const llvm::APSInt &FromVal = FromEC->getInitVal();
2163   const llvm::APSInt &ToVal = ToEC->getInitVal();
2164
2165   return FromVal.isSigned() == ToVal.isSigned() &&
2166          FromVal.getBitWidth() == ToVal.getBitWidth() &&
2167          FromVal == ToVal;
2168 }
2169
2170 bool ASTNodeImporter::IsStructuralMatch(ClassTemplateDecl *From,
2171                                         ClassTemplateDecl *To) {
2172   StructuralEquivalenceContext Ctx(Importer.getFromContext(),
2173                                    Importer.getToContext(),
2174                                    Importer.getNonEquivalentDecls());
2175   return Ctx.IsStructurallyEquivalent(From, To);  
2176 }
2177
2178 Decl *ASTNodeImporter::VisitDecl(Decl *D) {
2179   Importer.FromDiag(D->getLocation(), diag::err_unsupported_ast_node)
2180     << D->getDeclKindName();
2181   return 0;
2182 }
2183
2184 Decl *ASTNodeImporter::VisitTranslationUnitDecl(TranslationUnitDecl *D) {
2185   TranslationUnitDecl *ToD = 
2186     Importer.getToContext().getTranslationUnitDecl();
2187     
2188   Importer.Imported(D, ToD);
2189     
2190   return ToD;
2191 }
2192
2193 Decl *ASTNodeImporter::VisitNamespaceDecl(NamespaceDecl *D) {
2194   // Import the major distinguishing characteristics of this namespace.
2195   DeclContext *DC, *LexicalDC;
2196   DeclarationName Name;
2197   SourceLocation Loc;
2198   if (ImportDeclParts(D, DC, LexicalDC, Name, Loc))
2199     return 0;
2200   
2201   NamespaceDecl *MergeWithNamespace = 0;
2202   if (!Name) {
2203     // This is an anonymous namespace. Adopt an existing anonymous
2204     // namespace if we can.
2205     // FIXME: Not testable.
2206     if (TranslationUnitDecl *TU = dyn_cast<TranslationUnitDecl>(DC))
2207       MergeWithNamespace = TU->getAnonymousNamespace();
2208     else
2209       MergeWithNamespace = cast<NamespaceDecl>(DC)->getAnonymousNamespace();
2210   } else {
2211     SmallVector<NamedDecl *, 4> ConflictingDecls;
2212     SmallVector<NamedDecl *, 2> FoundDecls;
2213     DC->localUncachedLookup(Name, FoundDecls);
2214     for (unsigned I = 0, N = FoundDecls.size(); I != N; ++I) {
2215       if (!FoundDecls[I]->isInIdentifierNamespace(Decl::IDNS_Namespace))
2216         continue;
2217       
2218       if (NamespaceDecl *FoundNS = dyn_cast<NamespaceDecl>(FoundDecls[I])) {
2219         MergeWithNamespace = FoundNS;
2220         ConflictingDecls.clear();
2221         break;
2222       }
2223       
2224       ConflictingDecls.push_back(FoundDecls[I]);
2225     }
2226     
2227     if (!ConflictingDecls.empty()) {
2228       Name = Importer.HandleNameConflict(Name, DC, Decl::IDNS_Namespace,
2229                                          ConflictingDecls.data(), 
2230                                          ConflictingDecls.size());
2231     }
2232   }
2233   
2234   // Create the "to" namespace, if needed.
2235   NamespaceDecl *ToNamespace = MergeWithNamespace;
2236   if (!ToNamespace) {
2237     ToNamespace = NamespaceDecl::Create(Importer.getToContext(), DC,
2238                                         D->isInline(),
2239                                         Importer.Import(D->getLocStart()),
2240                                         Loc, Name.getAsIdentifierInfo(),
2241                                         /*PrevDecl=*/0);
2242     ToNamespace->setLexicalDeclContext(LexicalDC);
2243     LexicalDC->addDeclInternal(ToNamespace);
2244     
2245     // If this is an anonymous namespace, register it as the anonymous
2246     // namespace within its context.
2247     if (!Name) {
2248       if (TranslationUnitDecl *TU = dyn_cast<TranslationUnitDecl>(DC))
2249         TU->setAnonymousNamespace(ToNamespace);
2250       else
2251         cast<NamespaceDecl>(DC)->setAnonymousNamespace(ToNamespace);
2252     }
2253   }
2254   Importer.Imported(D, ToNamespace);
2255   
2256   ImportDeclContext(D);
2257   
2258   return ToNamespace;
2259 }
2260
2261 Decl *ASTNodeImporter::VisitTypedefNameDecl(TypedefNameDecl *D, bool IsAlias) {
2262   // Import the major distinguishing characteristics of this typedef.
2263   DeclContext *DC, *LexicalDC;
2264   DeclarationName Name;
2265   SourceLocation Loc;
2266   if (ImportDeclParts(D, DC, LexicalDC, Name, Loc))
2267     return 0;
2268   
2269   // If this typedef is not in block scope, determine whether we've
2270   // seen a typedef with the same name (that we can merge with) or any
2271   // other entity by that name (which name lookup could conflict with).
2272   if (!DC->isFunctionOrMethod()) {
2273     SmallVector<NamedDecl *, 4> ConflictingDecls;
2274     unsigned IDNS = Decl::IDNS_Ordinary;
2275     SmallVector<NamedDecl *, 2> FoundDecls;
2276     DC->localUncachedLookup(Name, FoundDecls);
2277     for (unsigned I = 0, N = FoundDecls.size(); I != N; ++I) {
2278       if (!FoundDecls[I]->isInIdentifierNamespace(IDNS))
2279         continue;
2280       if (TypedefNameDecl *FoundTypedef =
2281             dyn_cast<TypedefNameDecl>(FoundDecls[I])) {
2282         if (Importer.IsStructurallyEquivalent(D->getUnderlyingType(),
2283                                             FoundTypedef->getUnderlyingType()))
2284           return Importer.Imported(D, FoundTypedef);
2285       }
2286       
2287       ConflictingDecls.push_back(FoundDecls[I]);
2288     }
2289     
2290     if (!ConflictingDecls.empty()) {
2291       Name = Importer.HandleNameConflict(Name, DC, IDNS,
2292                                          ConflictingDecls.data(), 
2293                                          ConflictingDecls.size());
2294       if (!Name)
2295         return 0;
2296     }
2297   }
2298   
2299   // Import the underlying type of this typedef;
2300   QualType T = Importer.Import(D->getUnderlyingType());
2301   if (T.isNull())
2302     return 0;
2303   
2304   // Create the new typedef node.
2305   TypeSourceInfo *TInfo = Importer.Import(D->getTypeSourceInfo());
2306   SourceLocation StartL = Importer.Import(D->getLocStart());
2307   TypedefNameDecl *ToTypedef;
2308   if (IsAlias)
2309     ToTypedef = TypeAliasDecl::Create(Importer.getToContext(), DC,
2310                                       StartL, Loc,
2311                                       Name.getAsIdentifierInfo(),
2312                                       TInfo);
2313   else
2314     ToTypedef = TypedefDecl::Create(Importer.getToContext(), DC,
2315                                     StartL, Loc,
2316                                     Name.getAsIdentifierInfo(),
2317                                     TInfo);
2318   
2319   ToTypedef->setAccess(D->getAccess());
2320   ToTypedef->setLexicalDeclContext(LexicalDC);
2321   Importer.Imported(D, ToTypedef);
2322   LexicalDC->addDeclInternal(ToTypedef);
2323   
2324   return ToTypedef;
2325 }
2326
2327 Decl *ASTNodeImporter::VisitTypedefDecl(TypedefDecl *D) {
2328   return VisitTypedefNameDecl(D, /*IsAlias=*/false);
2329 }
2330
2331 Decl *ASTNodeImporter::VisitTypeAliasDecl(TypeAliasDecl *D) {
2332   return VisitTypedefNameDecl(D, /*IsAlias=*/true);
2333 }
2334
2335 Decl *ASTNodeImporter::VisitEnumDecl(EnumDecl *D) {
2336   // Import the major distinguishing characteristics of this enum.
2337   DeclContext *DC, *LexicalDC;
2338   DeclarationName Name;
2339   SourceLocation Loc;
2340   if (ImportDeclParts(D, DC, LexicalDC, Name, Loc))
2341     return 0;
2342   
2343   // Figure out what enum name we're looking for.
2344   unsigned IDNS = Decl::IDNS_Tag;
2345   DeclarationName SearchName = Name;
2346   if (!SearchName && D->getTypedefNameForAnonDecl()) {
2347     SearchName = Importer.Import(D->getTypedefNameForAnonDecl()->getDeclName());
2348     IDNS = Decl::IDNS_Ordinary;
2349   } else if (Importer.getToContext().getLangOpts().CPlusPlus)
2350     IDNS |= Decl::IDNS_Ordinary;
2351   
2352   // We may already have an enum of the same name; try to find and match it.
2353   if (!DC->isFunctionOrMethod() && SearchName) {
2354     SmallVector<NamedDecl *, 4> ConflictingDecls;
2355     SmallVector<NamedDecl *, 2> FoundDecls;
2356     DC->localUncachedLookup(SearchName, FoundDecls);
2357     for (unsigned I = 0, N = FoundDecls.size(); I != N; ++I) {
2358       if (!FoundDecls[I]->isInIdentifierNamespace(IDNS))
2359         continue;
2360       
2361       Decl *Found = FoundDecls[I];
2362       if (TypedefNameDecl *Typedef = dyn_cast<TypedefNameDecl>(Found)) {
2363         if (const TagType *Tag = Typedef->getUnderlyingType()->getAs<TagType>())
2364           Found = Tag->getDecl();
2365       }
2366       
2367       if (EnumDecl *FoundEnum = dyn_cast<EnumDecl>(Found)) {
2368         if (IsStructuralMatch(D, FoundEnum))
2369           return Importer.Imported(D, FoundEnum);
2370       }
2371       
2372       ConflictingDecls.push_back(FoundDecls[I]);
2373     }
2374     
2375     if (!ConflictingDecls.empty()) {
2376       Name = Importer.HandleNameConflict(Name, DC, IDNS,
2377                                          ConflictingDecls.data(), 
2378                                          ConflictingDecls.size());
2379     }
2380   }
2381   
2382   // Create the enum declaration.
2383   EnumDecl *D2 = EnumDecl::Create(Importer.getToContext(), DC,
2384                                   Importer.Import(D->getLocStart()),
2385                                   Loc, Name.getAsIdentifierInfo(), 0,
2386                                   D->isScoped(), D->isScopedUsingClassTag(),
2387                                   D->isFixed());
2388   // Import the qualifier, if any.
2389   D2->setQualifierInfo(Importer.Import(D->getQualifierLoc()));
2390   D2->setAccess(D->getAccess());
2391   D2->setLexicalDeclContext(LexicalDC);
2392   Importer.Imported(D, D2);
2393   LexicalDC->addDeclInternal(D2);
2394
2395   // Import the integer type.
2396   QualType ToIntegerType = Importer.Import(D->getIntegerType());
2397   if (ToIntegerType.isNull())
2398     return 0;
2399   D2->setIntegerType(ToIntegerType);
2400   
2401   // Import the definition
2402   if (D->isCompleteDefinition() && ImportDefinition(D, D2))
2403     return 0;
2404
2405   return D2;
2406 }
2407
2408 Decl *ASTNodeImporter::VisitRecordDecl(RecordDecl *D) {
2409   // If this record has a definition in the translation unit we're coming from,
2410   // but this particular declaration is not that definition, import the
2411   // definition and map to that.
2412   TagDecl *Definition = D->getDefinition();
2413   if (Definition && Definition != D) {
2414     Decl *ImportedDef = Importer.Import(Definition);
2415     if (!ImportedDef)
2416       return 0;
2417     
2418     return Importer.Imported(D, ImportedDef);
2419   }
2420   
2421   // Import the major distinguishing characteristics of this record.
2422   DeclContext *DC, *LexicalDC;
2423   DeclarationName Name;
2424   SourceLocation Loc;
2425   if (ImportDeclParts(D, DC, LexicalDC, Name, Loc))
2426     return 0;
2427       
2428   // Figure out what structure name we're looking for.
2429   unsigned IDNS = Decl::IDNS_Tag;
2430   DeclarationName SearchName = Name;
2431   if (!SearchName && D->getTypedefNameForAnonDecl()) {
2432     SearchName = Importer.Import(D->getTypedefNameForAnonDecl()->getDeclName());
2433     IDNS = Decl::IDNS_Ordinary;
2434   } else if (Importer.getToContext().getLangOpts().CPlusPlus)
2435     IDNS |= Decl::IDNS_Ordinary;
2436
2437   // We may already have a record of the same name; try to find and match it.
2438   RecordDecl *AdoptDecl = 0;
2439   if (!DC->isFunctionOrMethod()) {
2440     SmallVector<NamedDecl *, 4> ConflictingDecls;
2441     SmallVector<NamedDecl *, 2> FoundDecls;
2442     DC->localUncachedLookup(SearchName, FoundDecls);
2443     for (unsigned I = 0, N = FoundDecls.size(); I != N; ++I) {
2444       if (!FoundDecls[I]->isInIdentifierNamespace(IDNS))
2445         continue;
2446       
2447       Decl *Found = FoundDecls[I];
2448       if (TypedefNameDecl *Typedef = dyn_cast<TypedefNameDecl>(Found)) {
2449         if (const TagType *Tag = Typedef->getUnderlyingType()->getAs<TagType>())
2450           Found = Tag->getDecl();
2451       }
2452       
2453       if (RecordDecl *FoundRecord = dyn_cast<RecordDecl>(Found)) {
2454         if (D->isAnonymousStructOrUnion() && 
2455             FoundRecord->isAnonymousStructOrUnion()) {
2456           // If both anonymous structs/unions are in a record context, make sure
2457           // they occur in the same location in the context records.
2458           if (Optional<unsigned> Index1
2459               = findAnonymousStructOrUnionIndex(D)) {
2460             if (Optional<unsigned> Index2 =
2461                     findAnonymousStructOrUnionIndex(FoundRecord)) {
2462               if (*Index1 != *Index2)
2463                 continue;
2464             }
2465           }
2466         }
2467
2468         if (RecordDecl *FoundDef = FoundRecord->getDefinition()) {
2469           if ((SearchName && !D->isCompleteDefinition())
2470               || (D->isCompleteDefinition() &&
2471                   D->isAnonymousStructOrUnion()
2472                     == FoundDef->isAnonymousStructOrUnion() &&
2473                   IsStructuralMatch(D, FoundDef))) {
2474             // The record types structurally match, or the "from" translation
2475             // unit only had a forward declaration anyway; call it the same
2476             // function.
2477             // FIXME: For C++, we should also merge methods here.
2478             return Importer.Imported(D, FoundDef);
2479           }
2480         } else if (!D->isCompleteDefinition()) {
2481           // We have a forward declaration of this type, so adopt that forward
2482           // declaration rather than building a new one.
2483           AdoptDecl = FoundRecord;
2484           continue;
2485         } else if (!SearchName) {
2486           continue;
2487         }
2488       }
2489       
2490       ConflictingDecls.push_back(FoundDecls[I]);
2491     }
2492     
2493     if (!ConflictingDecls.empty() && SearchName) {
2494       Name = Importer.HandleNameConflict(Name, DC, IDNS,
2495                                          ConflictingDecls.data(), 
2496                                          ConflictingDecls.size());
2497     }
2498   }
2499   
2500   // Create the record declaration.
2501   RecordDecl *D2 = AdoptDecl;
2502   SourceLocation StartLoc = Importer.Import(D->getLocStart());
2503   if (!D2) {
2504     if (isa<CXXRecordDecl>(D)) {
2505       CXXRecordDecl *D2CXX = CXXRecordDecl::Create(Importer.getToContext(), 
2506                                                    D->getTagKind(),
2507                                                    DC, StartLoc, Loc,
2508                                                    Name.getAsIdentifierInfo());
2509       D2 = D2CXX;
2510       D2->setAccess(D->getAccess());
2511     } else {
2512       D2 = RecordDecl::Create(Importer.getToContext(), D->getTagKind(),
2513                               DC, StartLoc, Loc, Name.getAsIdentifierInfo());
2514     }
2515     
2516     D2->setQualifierInfo(Importer.Import(D->getQualifierLoc()));
2517     D2->setLexicalDeclContext(LexicalDC);
2518     LexicalDC->addDeclInternal(D2);
2519     if (D->isAnonymousStructOrUnion())
2520       D2->setAnonymousStructOrUnion(true);
2521   }
2522   
2523   Importer.Imported(D, D2);
2524
2525   if (D->isCompleteDefinition() && ImportDefinition(D, D2, IDK_Default))
2526     return 0;
2527   
2528   return D2;
2529 }
2530
2531 Decl *ASTNodeImporter::VisitEnumConstantDecl(EnumConstantDecl *D) {
2532   // Import the major distinguishing characteristics of this enumerator.
2533   DeclContext *DC, *LexicalDC;
2534   DeclarationName Name;
2535   SourceLocation Loc;
2536   if (ImportDeclParts(D, DC, LexicalDC, Name, Loc))
2537     return 0;
2538
2539   QualType T = Importer.Import(D->getType());
2540   if (T.isNull())
2541     return 0;
2542
2543   // Determine whether there are any other declarations with the same name and 
2544   // in the same context.
2545   if (!LexicalDC->isFunctionOrMethod()) {
2546     SmallVector<NamedDecl *, 4> ConflictingDecls;
2547     unsigned IDNS = Decl::IDNS_Ordinary;
2548     SmallVector<NamedDecl *, 2> FoundDecls;
2549     DC->localUncachedLookup(Name, FoundDecls);
2550     for (unsigned I = 0, N = FoundDecls.size(); I != N; ++I) {
2551       if (!FoundDecls[I]->isInIdentifierNamespace(IDNS))
2552         continue;
2553
2554       if (EnumConstantDecl *FoundEnumConstant
2555             = dyn_cast<EnumConstantDecl>(FoundDecls[I])) {
2556         if (IsStructuralMatch(D, FoundEnumConstant))
2557           return Importer.Imported(D, FoundEnumConstant);
2558       }
2559
2560       ConflictingDecls.push_back(FoundDecls[I]);
2561     }
2562     
2563     if (!ConflictingDecls.empty()) {
2564       Name = Importer.HandleNameConflict(Name, DC, IDNS,
2565                                          ConflictingDecls.data(), 
2566                                          ConflictingDecls.size());
2567       if (!Name)
2568         return 0;
2569     }
2570   }
2571   
2572   Expr *Init = Importer.Import(D->getInitExpr());
2573   if (D->getInitExpr() && !Init)
2574     return 0;
2575   
2576   EnumConstantDecl *ToEnumerator
2577     = EnumConstantDecl::Create(Importer.getToContext(), cast<EnumDecl>(DC), Loc, 
2578                                Name.getAsIdentifierInfo(), T, 
2579                                Init, D->getInitVal());
2580   ToEnumerator->setAccess(D->getAccess());
2581   ToEnumerator->setLexicalDeclContext(LexicalDC);
2582   Importer.Imported(D, ToEnumerator);
2583   LexicalDC->addDeclInternal(ToEnumerator);
2584   return ToEnumerator;
2585 }
2586
2587 Decl *ASTNodeImporter::VisitFunctionDecl(FunctionDecl *D) {
2588   // Import the major distinguishing characteristics of this function.
2589   DeclContext *DC, *LexicalDC;
2590   DeclarationName Name;
2591   SourceLocation Loc;
2592   if (ImportDeclParts(D, DC, LexicalDC, Name, Loc))
2593     return 0;
2594
2595   // Try to find a function in our own ("to") context with the same name, same
2596   // type, and in the same context as the function we're importing.
2597   if (!LexicalDC->isFunctionOrMethod()) {
2598     SmallVector<NamedDecl *, 4> ConflictingDecls;
2599     unsigned IDNS = Decl::IDNS_Ordinary;
2600     SmallVector<NamedDecl *, 2> FoundDecls;
2601     DC->localUncachedLookup(Name, FoundDecls);
2602     for (unsigned I = 0, N = FoundDecls.size(); I != N; ++I) {
2603       if (!FoundDecls[I]->isInIdentifierNamespace(IDNS))
2604         continue;
2605     
2606       if (FunctionDecl *FoundFunction = dyn_cast<FunctionDecl>(FoundDecls[I])) {
2607         if (isExternalLinkage(FoundFunction->getLinkage()) &&
2608             isExternalLinkage(D->getLinkage())) {
2609           if (Importer.IsStructurallyEquivalent(D->getType(), 
2610                                                 FoundFunction->getType())) {
2611             // FIXME: Actually try to merge the body and other attributes.
2612             return Importer.Imported(D, FoundFunction);
2613           }
2614         
2615           // FIXME: Check for overloading more carefully, e.g., by boosting
2616           // Sema::IsOverload out to the AST library.
2617           
2618           // Function overloading is okay in C++.
2619           if (Importer.getToContext().getLangOpts().CPlusPlus)
2620             continue;
2621           
2622           // Complain about inconsistent function types.
2623           Importer.ToDiag(Loc, diag::err_odr_function_type_inconsistent)
2624             << Name << D->getType() << FoundFunction->getType();
2625           Importer.ToDiag(FoundFunction->getLocation(), 
2626                           diag::note_odr_value_here)
2627             << FoundFunction->getType();
2628         }
2629       }
2630       
2631       ConflictingDecls.push_back(FoundDecls[I]);
2632     }
2633     
2634     if (!ConflictingDecls.empty()) {
2635       Name = Importer.HandleNameConflict(Name, DC, IDNS,
2636                                          ConflictingDecls.data(), 
2637                                          ConflictingDecls.size());
2638       if (!Name)
2639         return 0;
2640     }    
2641   }
2642
2643   DeclarationNameInfo NameInfo(Name, Loc);
2644   // Import additional name location/type info.
2645   ImportDeclarationNameLoc(D->getNameInfo(), NameInfo);
2646
2647   QualType FromTy = D->getType();
2648   bool usedDifferentExceptionSpec = false;
2649
2650   if (const FunctionProtoType *
2651         FromFPT = D->getType()->getAs<FunctionProtoType>()) {
2652     FunctionProtoType::ExtProtoInfo FromEPI = FromFPT->getExtProtoInfo();
2653     // FunctionProtoType::ExtProtoInfo's ExceptionSpecDecl can point to the
2654     // FunctionDecl that we are importing the FunctionProtoType for.
2655     // To avoid an infinite recursion when importing, create the FunctionDecl
2656     // with a simplified function type and update it afterwards.
2657     if (FromEPI.ExceptionSpecDecl || FromEPI.ExceptionSpecTemplate ||
2658         FromEPI.NoexceptExpr) {
2659       FunctionProtoType::ExtProtoInfo DefaultEPI;
2660       FromTy = Importer.getFromContext().getFunctionType(
2661                             FromFPT->getResultType(),
2662                             ArrayRef<QualType>(FromFPT->arg_type_begin(),
2663                                                FromFPT->getNumArgs()),
2664                             DefaultEPI);
2665       usedDifferentExceptionSpec = true;
2666     }
2667   }
2668
2669   // Import the type.
2670   QualType T = Importer.Import(FromTy);
2671   if (T.isNull())
2672     return 0;
2673   
2674   // Import the function parameters.
2675   SmallVector<ParmVarDecl *, 8> Parameters;
2676   for (FunctionDecl::param_iterator P = D->param_begin(), PEnd = D->param_end();
2677        P != PEnd; ++P) {
2678     ParmVarDecl *ToP = cast_or_null<ParmVarDecl>(Importer.Import(*P));
2679     if (!ToP)
2680       return 0;
2681     
2682     Parameters.push_back(ToP);
2683   }
2684   
2685   // Create the imported function.
2686   TypeSourceInfo *TInfo = Importer.Import(D->getTypeSourceInfo());
2687   FunctionDecl *ToFunction = 0;
2688   if (CXXConstructorDecl *FromConstructor = dyn_cast<CXXConstructorDecl>(D)) {
2689     ToFunction = CXXConstructorDecl::Create(Importer.getToContext(),
2690                                             cast<CXXRecordDecl>(DC),
2691                                             D->getInnerLocStart(),
2692                                             NameInfo, T, TInfo, 
2693                                             FromConstructor->isExplicit(),
2694                                             D->isInlineSpecified(), 
2695                                             D->isImplicit(),
2696                                             D->isConstexpr());
2697   } else if (isa<CXXDestructorDecl>(D)) {
2698     ToFunction = CXXDestructorDecl::Create(Importer.getToContext(),
2699                                            cast<CXXRecordDecl>(DC),
2700                                            D->getInnerLocStart(),
2701                                            NameInfo, T, TInfo,
2702                                            D->isInlineSpecified(),
2703                                            D->isImplicit());
2704   } else if (CXXConversionDecl *FromConversion
2705                                            = dyn_cast<CXXConversionDecl>(D)) {
2706     ToFunction = CXXConversionDecl::Create(Importer.getToContext(), 
2707                                            cast<CXXRecordDecl>(DC),
2708                                            D->getInnerLocStart(),
2709                                            NameInfo, T, TInfo,
2710                                            D->isInlineSpecified(),
2711                                            FromConversion->isExplicit(),
2712                                            D->isConstexpr(),
2713                                            Importer.Import(D->getLocEnd()));
2714   } else if (CXXMethodDecl *Method = dyn_cast<CXXMethodDecl>(D)) {
2715     ToFunction = CXXMethodDecl::Create(Importer.getToContext(), 
2716                                        cast<CXXRecordDecl>(DC),
2717                                        D->getInnerLocStart(),
2718                                        NameInfo, T, TInfo,
2719                                        Method->getStorageClass(),
2720                                        Method->isInlineSpecified(),
2721                                        D->isConstexpr(),
2722                                        Importer.Import(D->getLocEnd()));
2723   } else {
2724     ToFunction = FunctionDecl::Create(Importer.getToContext(), DC,
2725                                       D->getInnerLocStart(),
2726                                       NameInfo, T, TInfo, D->getStorageClass(),
2727                                       D->isInlineSpecified(),
2728                                       D->hasWrittenPrototype(),
2729                                       D->isConstexpr());
2730   }
2731
2732   // Import the qualifier, if any.
2733   ToFunction->setQualifierInfo(Importer.Import(D->getQualifierLoc()));
2734   ToFunction->setAccess(D->getAccess());
2735   ToFunction->setLexicalDeclContext(LexicalDC);
2736   ToFunction->setVirtualAsWritten(D->isVirtualAsWritten());
2737   ToFunction->setTrivial(D->isTrivial());
2738   ToFunction->setPure(D->isPure());
2739   Importer.Imported(D, ToFunction);
2740
2741   // Set the parameters.
2742   for (unsigned I = 0, N = Parameters.size(); I != N; ++I) {
2743     Parameters[I]->setOwningFunction(ToFunction);
2744     ToFunction->addDeclInternal(Parameters[I]);
2745   }
2746   ToFunction->setParams(Parameters);
2747
2748   if (usedDifferentExceptionSpec) {
2749     // Update FunctionProtoType::ExtProtoInfo.
2750     QualType T = Importer.Import(D->getType());
2751     if (T.isNull())
2752       return 0;
2753     ToFunction->setType(T);
2754   }
2755
2756   // FIXME: Other bits to merge?
2757
2758   // Add this function to the lexical context.
2759   LexicalDC->addDeclInternal(ToFunction);
2760
2761   return ToFunction;
2762 }
2763
2764 Decl *ASTNodeImporter::VisitCXXMethodDecl(CXXMethodDecl *D) {
2765   return VisitFunctionDecl(D);
2766 }
2767
2768 Decl *ASTNodeImporter::VisitCXXConstructorDecl(CXXConstructorDecl *D) {
2769   return VisitCXXMethodDecl(D);
2770 }
2771
2772 Decl *ASTNodeImporter::VisitCXXDestructorDecl(CXXDestructorDecl *D) {
2773   return VisitCXXMethodDecl(D);
2774 }
2775
2776 Decl *ASTNodeImporter::VisitCXXConversionDecl(CXXConversionDecl *D) {
2777   return VisitCXXMethodDecl(D);
2778 }
2779
2780 static unsigned getFieldIndex(Decl *F) {
2781   RecordDecl *Owner = dyn_cast<RecordDecl>(F->getDeclContext());
2782   if (!Owner)
2783     return 0;
2784
2785   unsigned Index = 1;
2786   for (DeclContext::decl_iterator D = Owner->noload_decls_begin(),
2787                                DEnd = Owner->noload_decls_end();
2788        D != DEnd; ++D) {
2789     if (*D == F)
2790       return Index;
2791
2792     if (isa<FieldDecl>(*D) || isa<IndirectFieldDecl>(*D))
2793       ++Index;
2794   }
2795
2796   return Index;
2797 }
2798
2799 Decl *ASTNodeImporter::VisitFieldDecl(FieldDecl *D) {
2800   // Import the major distinguishing characteristics of a variable.
2801   DeclContext *DC, *LexicalDC;
2802   DeclarationName Name;
2803   SourceLocation Loc;
2804   if (ImportDeclParts(D, DC, LexicalDC, Name, Loc))
2805     return 0;
2806   
2807   // Determine whether we've already imported this field. 
2808   SmallVector<NamedDecl *, 2> FoundDecls;
2809   DC->localUncachedLookup(Name, FoundDecls);
2810   for (unsigned I = 0, N = FoundDecls.size(); I != N; ++I) {
2811     if (FieldDecl *FoundField = dyn_cast<FieldDecl>(FoundDecls[I])) {
2812       // For anonymous fields, match up by index.
2813       if (!Name && getFieldIndex(D) != getFieldIndex(FoundField))
2814         continue;
2815
2816       if (Importer.IsStructurallyEquivalent(D->getType(), 
2817                                             FoundField->getType())) {
2818         Importer.Imported(D, FoundField);
2819         return FoundField;
2820       }
2821       
2822       Importer.ToDiag(Loc, diag::err_odr_field_type_inconsistent)
2823         << Name << D->getType() << FoundField->getType();
2824       Importer.ToDiag(FoundField->getLocation(), diag::note_odr_value_here)
2825         << FoundField->getType();
2826       return 0;
2827     }
2828   }
2829
2830   // Import the type.
2831   QualType T = Importer.Import(D->getType());
2832   if (T.isNull())
2833     return 0;
2834   
2835   TypeSourceInfo *TInfo = Importer.Import(D->getTypeSourceInfo());
2836   Expr *BitWidth = Importer.Import(D->getBitWidth());
2837   if (!BitWidth && D->getBitWidth())
2838     return 0;
2839   
2840   FieldDecl *ToField = FieldDecl::Create(Importer.getToContext(), DC,
2841                                          Importer.Import(D->getInnerLocStart()),
2842                                          Loc, Name.getAsIdentifierInfo(),
2843                                          T, TInfo, BitWidth, D->isMutable(),
2844                                          D->getInClassInitStyle());
2845   ToField->setAccess(D->getAccess());
2846   ToField->setLexicalDeclContext(LexicalDC);
2847   if (ToField->hasInClassInitializer())
2848     ToField->setInClassInitializer(D->getInClassInitializer());
2849   ToField->setImplicit(D->isImplicit());
2850   Importer.Imported(D, ToField);
2851   LexicalDC->addDeclInternal(ToField);
2852   return ToField;
2853 }
2854
2855 Decl *ASTNodeImporter::VisitIndirectFieldDecl(IndirectFieldDecl *D) {
2856   // Import the major distinguishing characteristics of a variable.
2857   DeclContext *DC, *LexicalDC;
2858   DeclarationName Name;
2859   SourceLocation Loc;
2860   if (ImportDeclParts(D, DC, LexicalDC, Name, Loc))
2861     return 0;
2862
2863   // Determine whether we've already imported this field. 
2864   SmallVector<NamedDecl *, 2> FoundDecls;
2865   DC->localUncachedLookup(Name, FoundDecls);
2866   for (unsigned I = 0, N = FoundDecls.size(); I != N; ++I) {
2867     if (IndirectFieldDecl *FoundField 
2868                                 = dyn_cast<IndirectFieldDecl>(FoundDecls[I])) {
2869       // For anonymous indirect fields, match up by index.
2870       if (!Name && getFieldIndex(D) != getFieldIndex(FoundField))
2871         continue;
2872
2873       if (Importer.IsStructurallyEquivalent(D->getType(), 
2874                                             FoundField->getType(),
2875                                             Name)) {
2876         Importer.Imported(D, FoundField);
2877         return FoundField;
2878       }
2879
2880       // If there are more anonymous fields to check, continue.
2881       if (!Name && I < N-1)
2882         continue;
2883
2884       Importer.ToDiag(Loc, diag::err_odr_field_type_inconsistent)
2885         << Name << D->getType() << FoundField->getType();
2886       Importer.ToDiag(FoundField->getLocation(), diag::note_odr_value_here)
2887         << FoundField->getType();
2888       return 0;
2889     }
2890   }
2891
2892   // Import the type.
2893   QualType T = Importer.Import(D->getType());
2894   if (T.isNull())
2895     return 0;
2896
2897   NamedDecl **NamedChain =
2898     new (Importer.getToContext())NamedDecl*[D->getChainingSize()];
2899
2900   unsigned i = 0;
2901   for (IndirectFieldDecl::chain_iterator PI = D->chain_begin(),
2902        PE = D->chain_end(); PI != PE; ++PI) {
2903     Decl* D = Importer.Import(*PI);
2904     if (!D)
2905       return 0;
2906     NamedChain[i++] = cast<NamedDecl>(D);
2907   }
2908
2909   IndirectFieldDecl *ToIndirectField = IndirectFieldDecl::Create(
2910                                          Importer.getToContext(), DC,
2911                                          Loc, Name.getAsIdentifierInfo(), T,
2912                                          NamedChain, D->getChainingSize());
2913   ToIndirectField->setAccess(D->getAccess());
2914   ToIndirectField->setLexicalDeclContext(LexicalDC);
2915   Importer.Imported(D, ToIndirectField);
2916   LexicalDC->addDeclInternal(ToIndirectField);
2917   return ToIndirectField;
2918 }
2919
2920 Decl *ASTNodeImporter::VisitObjCIvarDecl(ObjCIvarDecl *D) {
2921   // Import the major distinguishing characteristics of an ivar.
2922   DeclContext *DC, *LexicalDC;
2923   DeclarationName Name;
2924   SourceLocation Loc;
2925   if (ImportDeclParts(D, DC, LexicalDC, Name, Loc))
2926     return 0;
2927   
2928   // Determine whether we've already imported this ivar 
2929   SmallVector<NamedDecl *, 2> FoundDecls;
2930   DC->localUncachedLookup(Name, FoundDecls);
2931   for (unsigned I = 0, N = FoundDecls.size(); I != N; ++I) {
2932     if (ObjCIvarDecl *FoundIvar = dyn_cast<ObjCIvarDecl>(FoundDecls[I])) {
2933       if (Importer.IsStructurallyEquivalent(D->getType(), 
2934                                             FoundIvar->getType())) {
2935         Importer.Imported(D, FoundIvar);
2936         return FoundIvar;
2937       }
2938
2939       Importer.ToDiag(Loc, diag::err_odr_ivar_type_inconsistent)
2940         << Name << D->getType() << FoundIvar->getType();
2941       Importer.ToDiag(FoundIvar->getLocation(), diag::note_odr_value_here)
2942         << FoundIvar->getType();
2943       return 0;
2944     }
2945   }
2946
2947   // Import the type.
2948   QualType T = Importer.Import(D->getType());
2949   if (T.isNull())
2950     return 0;
2951   
2952   TypeSourceInfo *TInfo = Importer.Import(D->getTypeSourceInfo());
2953   Expr *BitWidth = Importer.Import(D->getBitWidth());
2954   if (!BitWidth && D->getBitWidth())
2955     return 0;
2956   
2957   ObjCIvarDecl *ToIvar = ObjCIvarDecl::Create(Importer.getToContext(),
2958                                               cast<ObjCContainerDecl>(DC),
2959                                        Importer.Import(D->getInnerLocStart()),
2960                                               Loc, Name.getAsIdentifierInfo(),
2961                                               T, TInfo, D->getAccessControl(),
2962                                               BitWidth, D->getSynthesize());
2963   ToIvar->setLexicalDeclContext(LexicalDC);
2964   Importer.Imported(D, ToIvar);
2965   LexicalDC->addDeclInternal(ToIvar);
2966   return ToIvar;
2967   
2968 }
2969
2970 Decl *ASTNodeImporter::VisitVarDecl(VarDecl *D) {
2971   // Import the major distinguishing characteristics of a variable.
2972   DeclContext *DC, *LexicalDC;
2973   DeclarationName Name;
2974   SourceLocation Loc;
2975   if (ImportDeclParts(D, DC, LexicalDC, Name, Loc))
2976     return 0;
2977   
2978   // Try to find a variable in our own ("to") context with the same name and
2979   // in the same context as the variable we're importing.
2980   if (D->isFileVarDecl()) {
2981     VarDecl *MergeWithVar = 0;
2982     SmallVector<NamedDecl *, 4> ConflictingDecls;
2983     unsigned IDNS = Decl::IDNS_Ordinary;
2984     SmallVector<NamedDecl *, 2> FoundDecls;
2985     DC->localUncachedLookup(Name, FoundDecls);
2986     for (unsigned I = 0, N = FoundDecls.size(); I != N; ++I) {
2987       if (!FoundDecls[I]->isInIdentifierNamespace(IDNS))
2988         continue;
2989       
2990       if (VarDecl *FoundVar = dyn_cast<VarDecl>(FoundDecls[I])) {
2991         // We have found a variable that we may need to merge with. Check it.
2992         if (isExternalLinkage(FoundVar->getLinkage()) &&
2993             isExternalLinkage(D->getLinkage())) {
2994           if (Importer.IsStructurallyEquivalent(D->getType(), 
2995                                                 FoundVar->getType())) {
2996             MergeWithVar = FoundVar;
2997             break;
2998           }
2999
3000           const ArrayType *FoundArray
3001             = Importer.getToContext().getAsArrayType(FoundVar->getType());
3002           const ArrayType *TArray
3003             = Importer.getToContext().getAsArrayType(D->getType());
3004           if (FoundArray && TArray) {
3005             if (isa<IncompleteArrayType>(FoundArray) &&
3006                 isa<ConstantArrayType>(TArray)) {
3007               // Import the type.
3008               QualType T = Importer.Import(D->getType());
3009               if (T.isNull())
3010                 return 0;
3011               
3012               FoundVar->setType(T);
3013               MergeWithVar = FoundVar;
3014               break;
3015             } else if (isa<IncompleteArrayType>(TArray) &&
3016                        isa<ConstantArrayType>(FoundArray)) {
3017               MergeWithVar = FoundVar;
3018               break;
3019             }
3020           }
3021
3022           Importer.ToDiag(Loc, diag::err_odr_variable_type_inconsistent)
3023             << Name << D->getType() << FoundVar->getType();
3024           Importer.ToDiag(FoundVar->getLocation(), diag::note_odr_value_here)
3025             << FoundVar->getType();
3026         }
3027       }
3028       
3029       ConflictingDecls.push_back(FoundDecls[I]);
3030     }
3031
3032     if (MergeWithVar) {
3033       // An equivalent variable with external linkage has been found. Link 
3034       // the two declarations, then merge them.
3035       Importer.Imported(D, MergeWithVar);
3036       
3037       if (VarDecl *DDef = D->getDefinition()) {
3038         if (VarDecl *ExistingDef = MergeWithVar->getDefinition()) {
3039           Importer.ToDiag(ExistingDef->getLocation(), 
3040                           diag::err_odr_variable_multiple_def)
3041             << Name;
3042           Importer.FromDiag(DDef->getLocation(), diag::note_odr_defined_here);
3043         } else {
3044           Expr *Init = Importer.Import(DDef->getInit());
3045           MergeWithVar->setInit(Init);
3046           if (DDef->isInitKnownICE()) {
3047             EvaluatedStmt *Eval = MergeWithVar->ensureEvaluatedStmt();
3048             Eval->CheckedICE = true;
3049             Eval->IsICE = DDef->isInitICE();
3050           }
3051         }
3052       }
3053       
3054       return MergeWithVar;
3055     }
3056     
3057     if (!ConflictingDecls.empty()) {
3058       Name = Importer.HandleNameConflict(Name, DC, IDNS,
3059                                          ConflictingDecls.data(), 
3060                                          ConflictingDecls.size());
3061       if (!Name)
3062         return 0;
3063     }
3064   }
3065     
3066   // Import the type.
3067   QualType T = Importer.Import(D->getType());
3068   if (T.isNull())
3069     return 0;
3070   
3071   // Create the imported variable.
3072   TypeSourceInfo *TInfo = Importer.Import(D->getTypeSourceInfo());
3073   VarDecl *ToVar = VarDecl::Create(Importer.getToContext(), DC,
3074                                    Importer.Import(D->getInnerLocStart()),
3075                                    Loc, Name.getAsIdentifierInfo(),
3076                                    T, TInfo,
3077                                    D->getStorageClass());
3078   ToVar->setQualifierInfo(Importer.Import(D->getQualifierLoc()));
3079   ToVar->setAccess(D->getAccess());
3080   ToVar->setLexicalDeclContext(LexicalDC);
3081   Importer.Imported(D, ToVar);
3082   LexicalDC->addDeclInternal(ToVar);
3083
3084   // Merge the initializer.
3085   // FIXME: Can we really import any initializer? Alternatively, we could force
3086   // ourselves to import every declaration of a variable and then only use
3087   // getInit() here.
3088   ToVar->setInit(Importer.Import(const_cast<Expr *>(D->getAnyInitializer())));
3089
3090   // FIXME: Other bits to merge?
3091   
3092   return ToVar;
3093 }
3094
3095 Decl *ASTNodeImporter::VisitImplicitParamDecl(ImplicitParamDecl *D) {
3096   // Parameters are created in the translation unit's context, then moved
3097   // into the function declaration's context afterward.
3098   DeclContext *DC = Importer.getToContext().getTranslationUnitDecl();
3099   
3100   // Import the name of this declaration.
3101   DeclarationName Name = Importer.Import(D->getDeclName());
3102   if (D->getDeclName() && !Name)
3103     return 0;
3104   
3105   // Import the location of this declaration.
3106   SourceLocation Loc = Importer.Import(D->getLocation());
3107   
3108   // Import the parameter's type.
3109   QualType T = Importer.Import(D->getType());
3110   if (T.isNull())
3111     return 0;
3112   
3113   // Create the imported parameter.
3114   ImplicitParamDecl *ToParm
3115     = ImplicitParamDecl::Create(Importer.getToContext(), DC,
3116                                 Loc, Name.getAsIdentifierInfo(),
3117                                 T);
3118   return Importer.Imported(D, ToParm);
3119 }
3120
3121 Decl *ASTNodeImporter::VisitParmVarDecl(ParmVarDecl *D) {
3122   // Parameters are created in the translation unit's context, then moved
3123   // into the function declaration's context afterward.
3124   DeclContext *DC = Importer.getToContext().getTranslationUnitDecl();
3125   
3126   // Import the name of this declaration.
3127   DeclarationName Name = Importer.Import(D->getDeclName());
3128   if (D->getDeclName() && !Name)
3129     return 0;
3130   
3131   // Import the location of this declaration.
3132   SourceLocation Loc = Importer.Import(D->getLocation());
3133   
3134   // Import the parameter's type.
3135   QualType T = Importer.Import(D->getType());
3136   if (T.isNull())
3137     return 0;
3138   
3139   // Create the imported parameter.
3140   TypeSourceInfo *TInfo = Importer.Import(D->getTypeSourceInfo());
3141   ParmVarDecl *ToParm = ParmVarDecl::Create(Importer.getToContext(), DC,
3142                                      Importer.Import(D->getInnerLocStart()),
3143                                             Loc, Name.getAsIdentifierInfo(),
3144                                             T, TInfo, D->getStorageClass(),
3145                                             /*FIXME: Default argument*/ 0);
3146   ToParm->setHasInheritedDefaultArg(D->hasInheritedDefaultArg());
3147   return Importer.Imported(D, ToParm);
3148 }
3149
3150 Decl *ASTNodeImporter::VisitObjCMethodDecl(ObjCMethodDecl *D) {
3151   // Import the major distinguishing characteristics of a method.
3152   DeclContext *DC, *LexicalDC;
3153   DeclarationName Name;
3154   SourceLocation Loc;
3155   if (ImportDeclParts(D, DC, LexicalDC, Name, Loc))
3156     return 0;
3157   
3158   SmallVector<NamedDecl *, 2> FoundDecls;
3159   DC->localUncachedLookup(Name, FoundDecls);
3160   for (unsigned I = 0, N = FoundDecls.size(); I != N; ++I) {
3161     if (ObjCMethodDecl *FoundMethod = dyn_cast<ObjCMethodDecl>(FoundDecls[I])) {
3162       if (FoundMethod->isInstanceMethod() != D->isInstanceMethod())
3163         continue;
3164
3165       // Check return types.
3166       if (!Importer.IsStructurallyEquivalent(D->getResultType(),
3167                                              FoundMethod->getResultType())) {
3168         Importer.ToDiag(Loc, diag::err_odr_objc_method_result_type_inconsistent)
3169           << D->isInstanceMethod() << Name
3170           << D->getResultType() << FoundMethod->getResultType();
3171         Importer.ToDiag(FoundMethod->getLocation(), 
3172                         diag::note_odr_objc_method_here)
3173           << D->isInstanceMethod() << Name;
3174         return 0;
3175       }
3176
3177       // Check the number of parameters.
3178       if (D->param_size() != FoundMethod->param_size()) {
3179         Importer.ToDiag(Loc, diag::err_odr_objc_method_num_params_inconsistent)
3180           << D->isInstanceMethod() << Name
3181           << D->param_size() << FoundMethod->param_size();
3182         Importer.ToDiag(FoundMethod->getLocation(), 
3183                         diag::note_odr_objc_method_here)
3184           << D->isInstanceMethod() << Name;
3185         return 0;
3186       }
3187
3188       // Check parameter types.
3189       for (ObjCMethodDecl::param_iterator P = D->param_begin(), 
3190              PEnd = D->param_end(), FoundP = FoundMethod->param_begin();
3191            P != PEnd; ++P, ++FoundP) {
3192         if (!Importer.IsStructurallyEquivalent((*P)->getType(), 
3193                                                (*FoundP)->getType())) {
3194           Importer.FromDiag((*P)->getLocation(), 
3195                             diag::err_odr_objc_method_param_type_inconsistent)
3196             << D->isInstanceMethod() << Name
3197             << (*P)->getType() << (*FoundP)->getType();
3198           Importer.ToDiag((*FoundP)->getLocation(), diag::note_odr_value_here)
3199             << (*FoundP)->getType();
3200           return 0;
3201         }
3202       }
3203
3204       // Check variadic/non-variadic.
3205       // Check the number of parameters.
3206       if (D->isVariadic() != FoundMethod->isVariadic()) {
3207         Importer.ToDiag(Loc, diag::err_odr_objc_method_variadic_inconsistent)
3208           << D->isInstanceMethod() << Name;
3209         Importer.ToDiag(FoundMethod->getLocation(), 
3210                         diag::note_odr_objc_method_here)
3211           << D->isInstanceMethod() << Name;
3212         return 0;
3213       }
3214
3215       // FIXME: Any other bits we need to merge?
3216       return Importer.Imported(D, FoundMethod);
3217     }
3218   }
3219
3220   // Import the result type.
3221   QualType ResultTy = Importer.Import(D->getResultType());
3222   if (ResultTy.isNull())
3223     return 0;
3224
3225   TypeSourceInfo *ResultTInfo = Importer.Import(D->getResultTypeSourceInfo());
3226
3227   ObjCMethodDecl *ToMethod
3228     = ObjCMethodDecl::Create(Importer.getToContext(),
3229                              Loc,
3230                              Importer.Import(D->getLocEnd()),
3231                              Name.getObjCSelector(),
3232                              ResultTy, ResultTInfo, DC,
3233                              D->isInstanceMethod(),
3234                              D->isVariadic(),
3235                              D->isPropertyAccessor(),
3236                              D->isImplicit(),
3237                              D->isDefined(),
3238                              D->getImplementationControl(),
3239                              D->hasRelatedResultType());
3240
3241   // FIXME: When we decide to merge method definitions, we'll need to
3242   // deal with implicit parameters.
3243
3244   // Import the parameters
3245   SmallVector<ParmVarDecl *, 5> ToParams;
3246   for (ObjCMethodDecl::param_iterator FromP = D->param_begin(),
3247                                    FromPEnd = D->param_end();
3248        FromP != FromPEnd; 
3249        ++FromP) {
3250     ParmVarDecl *ToP = cast_or_null<ParmVarDecl>(Importer.Import(*FromP));
3251     if (!ToP)
3252       return 0;
3253     
3254     ToParams.push_back(ToP);
3255   }
3256   
3257   // Set the parameters.
3258   for (unsigned I = 0, N = ToParams.size(); I != N; ++I) {
3259     ToParams[I]->setOwningFunction(ToMethod);
3260     ToMethod->addDeclInternal(ToParams[I]);
3261   }
3262   SmallVector<SourceLocation, 12> SelLocs;
3263   D->getSelectorLocs(SelLocs);
3264   ToMethod->setMethodParams(Importer.getToContext(), ToParams, SelLocs); 
3265
3266   ToMethod->setLexicalDeclContext(LexicalDC);
3267   Importer.Imported(D, ToMethod);
3268   LexicalDC->addDeclInternal(ToMethod);
3269   return ToMethod;
3270 }
3271
3272 Decl *ASTNodeImporter::VisitObjCCategoryDecl(ObjCCategoryDecl *D) {
3273   // Import the major distinguishing characteristics of a category.
3274   DeclContext *DC, *LexicalDC;
3275   DeclarationName Name;
3276   SourceLocation Loc;
3277   if (ImportDeclParts(D, DC, LexicalDC, Name, Loc))
3278     return 0;
3279   
3280   ObjCInterfaceDecl *ToInterface
3281     = cast_or_null<ObjCInterfaceDecl>(Importer.Import(D->getClassInterface()));
3282   if (!ToInterface)
3283     return 0;
3284   
3285   // Determine if we've already encountered this category.
3286   ObjCCategoryDecl *MergeWithCategory
3287     = ToInterface->FindCategoryDeclaration(Name.getAsIdentifierInfo());
3288   ObjCCategoryDecl *ToCategory = MergeWithCategory;
3289   if (!ToCategory) {
3290     ToCategory = ObjCCategoryDecl::Create(Importer.getToContext(), DC,
3291                                           Importer.Import(D->getAtStartLoc()),
3292                                           Loc, 
3293                                        Importer.Import(D->getCategoryNameLoc()), 
3294                                           Name.getAsIdentifierInfo(),
3295                                           ToInterface,
3296                                        Importer.Import(D->getIvarLBraceLoc()),
3297                                        Importer.Import(D->getIvarRBraceLoc()));
3298     ToCategory->setLexicalDeclContext(LexicalDC);
3299     LexicalDC->addDeclInternal(ToCategory);
3300     Importer.Imported(D, ToCategory);
3301     
3302     // Import protocols
3303     SmallVector<ObjCProtocolDecl *, 4> Protocols;
3304     SmallVector<SourceLocation, 4> ProtocolLocs;
3305     ObjCCategoryDecl::protocol_loc_iterator FromProtoLoc
3306       = D->protocol_loc_begin();
3307     for (ObjCCategoryDecl::protocol_iterator FromProto = D->protocol_begin(),
3308                                           FromProtoEnd = D->protocol_end();
3309          FromProto != FromProtoEnd;
3310          ++FromProto, ++FromProtoLoc) {
3311       ObjCProtocolDecl *ToProto
3312         = cast_or_null<ObjCProtocolDecl>(Importer.Import(*FromProto));
3313       if (!ToProto)
3314         return 0;
3315       Protocols.push_back(ToProto);
3316       ProtocolLocs.push_back(Importer.Import(*FromProtoLoc));
3317     }
3318     
3319     // FIXME: If we're merging, make sure that the protocol list is the same.
3320     ToCategory->setProtocolList(Protocols.data(), Protocols.size(),
3321                                 ProtocolLocs.data(), Importer.getToContext());
3322     
3323   } else {
3324     Importer.Imported(D, ToCategory);
3325   }
3326   
3327   // Import all of the members of this category.
3328   ImportDeclContext(D);
3329  
3330   // If we have an implementation, import it as well.
3331   if (D->getImplementation()) {
3332     ObjCCategoryImplDecl *Impl
3333       = cast_or_null<ObjCCategoryImplDecl>(
3334                                        Importer.Import(D->getImplementation()));
3335     if (!Impl)
3336       return 0;
3337     
3338     ToCategory->setImplementation(Impl);
3339   }
3340   
3341   return ToCategory;
3342 }
3343
3344 bool ASTNodeImporter::ImportDefinition(ObjCProtocolDecl *From, 
3345                                        ObjCProtocolDecl *To,
3346                                        ImportDefinitionKind Kind) {
3347   if (To->getDefinition()) {
3348     if (shouldForceImportDeclContext(Kind))
3349       ImportDeclContext(From);
3350     return false;
3351   }
3352
3353   // Start the protocol definition
3354   To->startDefinition();
3355   
3356   // Import protocols
3357   SmallVector<ObjCProtocolDecl *, 4> Protocols;
3358   SmallVector<SourceLocation, 4> ProtocolLocs;
3359   ObjCProtocolDecl::protocol_loc_iterator 
3360   FromProtoLoc = From->protocol_loc_begin();
3361   for (ObjCProtocolDecl::protocol_iterator FromProto = From->protocol_begin(),
3362                                         FromProtoEnd = From->protocol_end();
3363        FromProto != FromProtoEnd;
3364        ++FromProto, ++FromProtoLoc) {
3365     ObjCProtocolDecl *ToProto
3366       = cast_or_null<ObjCProtocolDecl>(Importer.Import(*FromProto));
3367     if (!ToProto)
3368       return true;
3369     Protocols.push_back(ToProto);
3370     ProtocolLocs.push_back(Importer.Import(*FromProtoLoc));
3371   }
3372   
3373   // FIXME: If we're merging, make sure that the protocol list is the same.
3374   To->setProtocolList(Protocols.data(), Protocols.size(),
3375                       ProtocolLocs.data(), Importer.getToContext());
3376
3377   if (shouldForceImportDeclContext(Kind)) {
3378     // Import all of the members of this protocol.
3379     ImportDeclContext(From, /*ForceImport=*/true);
3380   }
3381   return false;
3382 }
3383
3384 Decl *ASTNodeImporter::VisitObjCProtocolDecl(ObjCProtocolDecl *D) {
3385   // If this protocol has a definition in the translation unit we're coming 
3386   // from, but this particular declaration is not that definition, import the
3387   // definition and map to that.
3388   ObjCProtocolDecl *Definition = D->getDefinition();
3389   if (Definition && Definition != D) {
3390     Decl *ImportedDef = Importer.Import(Definition);
3391     if (!ImportedDef)
3392       return 0;
3393     
3394     return Importer.Imported(D, ImportedDef);
3395   }
3396
3397   // Import the major distinguishing characteristics of a protocol.
3398   DeclContext *DC, *LexicalDC;
3399   DeclarationName Name;
3400   SourceLocation Loc;
3401   if (ImportDeclParts(D, DC, LexicalDC, Name, Loc))
3402     return 0;
3403
3404   ObjCProtocolDecl *MergeWithProtocol = 0;
3405   SmallVector<NamedDecl *, 2> FoundDecls;
3406   DC->localUncachedLookup(Name, FoundDecls);
3407   for (unsigned I = 0, N = FoundDecls.size(); I != N; ++I) {
3408     if (!FoundDecls[I]->isInIdentifierNamespace(Decl::IDNS_ObjCProtocol))
3409       continue;
3410     
3411     if ((MergeWithProtocol = dyn_cast<ObjCProtocolDecl>(FoundDecls[I])))
3412       break;
3413   }
3414   
3415   ObjCProtocolDecl *ToProto = MergeWithProtocol;
3416   if (!ToProto) {
3417     ToProto = ObjCProtocolDecl::Create(Importer.getToContext(), DC,
3418                                        Name.getAsIdentifierInfo(), Loc,
3419                                        Importer.Import(D->getAtStartLoc()),
3420                                        /*PrevDecl=*/0);
3421     ToProto->setLexicalDeclContext(LexicalDC);
3422     LexicalDC->addDeclInternal(ToProto);
3423   }
3424     
3425   Importer.Imported(D, ToProto);
3426
3427   if (D->isThisDeclarationADefinition() && ImportDefinition(D, ToProto))
3428     return 0;
3429   
3430   return ToProto;
3431 }
3432
3433 bool ASTNodeImporter::ImportDefinition(ObjCInterfaceDecl *From, 
3434                                        ObjCInterfaceDecl *To,
3435                                        ImportDefinitionKind Kind) {
3436   if (To->getDefinition()) {
3437     // Check consistency of superclass.
3438     ObjCInterfaceDecl *FromSuper = From->getSuperClass();
3439     if (FromSuper) {
3440       FromSuper = cast_or_null<ObjCInterfaceDecl>(Importer.Import(FromSuper));
3441       if (!FromSuper)
3442         return true;
3443     }
3444     
3445     ObjCInterfaceDecl *ToSuper = To->getSuperClass();    
3446     if ((bool)FromSuper != (bool)ToSuper ||
3447         (FromSuper && !declaresSameEntity(FromSuper, ToSuper))) {
3448       Importer.ToDiag(To->getLocation(), 
3449                       diag::err_odr_objc_superclass_inconsistent)
3450         << To->getDeclName();
3451       if (ToSuper)
3452         Importer.ToDiag(To->getSuperClassLoc(), diag::note_odr_objc_superclass)
3453           << To->getSuperClass()->getDeclName();
3454       else
3455         Importer.ToDiag(To->getLocation(), 
3456                         diag::note_odr_objc_missing_superclass);
3457       if (From->getSuperClass())
3458         Importer.FromDiag(From->getSuperClassLoc(), 
3459                           diag::note_odr_objc_superclass)
3460         << From->getSuperClass()->getDeclName();
3461       else
3462         Importer.FromDiag(From->getLocation(), 
3463                           diag::note_odr_objc_missing_superclass);        
3464     }
3465     
3466     if (shouldForceImportDeclContext(Kind))
3467       ImportDeclContext(From);
3468     return false;
3469   }
3470   
3471   // Start the definition.
3472   To->startDefinition();
3473   
3474   // If this class has a superclass, import it.
3475   if (From->getSuperClass()) {
3476     ObjCInterfaceDecl *Super = cast_or_null<ObjCInterfaceDecl>(
3477                                  Importer.Import(From->getSuperClass()));
3478     if (!Super)
3479       return true;
3480     
3481     To->setSuperClass(Super);
3482     To->setSuperClassLoc(Importer.Import(From->getSuperClassLoc()));
3483   }
3484   
3485   // Import protocols
3486   SmallVector<ObjCProtocolDecl *, 4> Protocols;
3487   SmallVector<SourceLocation, 4> ProtocolLocs;
3488   ObjCInterfaceDecl::protocol_loc_iterator 
3489   FromProtoLoc = From->protocol_loc_begin();
3490   
3491   for (ObjCInterfaceDecl::protocol_iterator FromProto = From->protocol_begin(),
3492                                          FromProtoEnd = From->protocol_end();
3493        FromProto != FromProtoEnd;
3494        ++FromProto, ++FromProtoLoc) {
3495     ObjCProtocolDecl *ToProto
3496       = cast_or_null<ObjCProtocolDecl>(Importer.Import(*FromProto));
3497     if (!ToProto)
3498       return true;
3499     Protocols.push_back(ToProto);
3500     ProtocolLocs.push_back(Importer.Import(*FromProtoLoc));
3501   }
3502   
3503   // FIXME: If we're merging, make sure that the protocol list is the same.
3504   To->setProtocolList(Protocols.data(), Protocols.size(),
3505                       ProtocolLocs.data(), Importer.getToContext());
3506   
3507   // Import categories. When the categories themselves are imported, they'll
3508   // hook themselves into this interface.
3509   for (ObjCInterfaceDecl::known_categories_iterator
3510          Cat = From->known_categories_begin(),
3511          CatEnd = From->known_categories_end();
3512        Cat != CatEnd; ++Cat) {
3513     Importer.Import(*Cat);
3514   }
3515   
3516   // If we have an @implementation, import it as well.
3517   if (From->getImplementation()) {
3518     ObjCImplementationDecl *Impl = cast_or_null<ObjCImplementationDecl>(
3519                                      Importer.Import(From->getImplementation()));
3520     if (!Impl)
3521       return true;
3522     
3523     To->setImplementation(Impl);
3524   }
3525
3526   if (shouldForceImportDeclContext(Kind)) {
3527     // Import all of the members of this class.
3528     ImportDeclContext(From, /*ForceImport=*/true);
3529   }
3530   return false;
3531 }
3532
3533 Decl *ASTNodeImporter::VisitObjCInterfaceDecl(ObjCInterfaceDecl *D) {
3534   // If this class has a definition in the translation unit we're coming from,
3535   // but this particular declaration is not that definition, import the
3536   // definition and map to that.
3537   ObjCInterfaceDecl *Definition = D->getDefinition();
3538   if (Definition && Definition != D) {
3539     Decl *ImportedDef = Importer.Import(Definition);
3540     if (!ImportedDef)
3541       return 0;
3542     
3543     return Importer.Imported(D, ImportedDef);
3544   }
3545
3546   // Import the major distinguishing characteristics of an @interface.
3547   DeclContext *DC, *LexicalDC;
3548   DeclarationName Name;
3549   SourceLocation Loc;
3550   if (ImportDeclParts(D, DC, LexicalDC, Name, Loc))
3551     return 0;
3552
3553   // Look for an existing interface with the same name.
3554   ObjCInterfaceDecl *MergeWithIface = 0;
3555   SmallVector<NamedDecl *, 2> FoundDecls;
3556   DC->localUncachedLookup(Name, FoundDecls);
3557   for (unsigned I = 0, N = FoundDecls.size(); I != N; ++I) {
3558     if (!FoundDecls[I]->isInIdentifierNamespace(Decl::IDNS_Ordinary))
3559       continue;
3560     
3561     if ((MergeWithIface = dyn_cast<ObjCInterfaceDecl>(FoundDecls[I])))
3562       break;
3563   }
3564   
3565   // Create an interface declaration, if one does not already exist.
3566   ObjCInterfaceDecl *ToIface = MergeWithIface;
3567   if (!ToIface) {
3568     ToIface = ObjCInterfaceDecl::Create(Importer.getToContext(), DC,
3569                                         Importer.Import(D->getAtStartLoc()),
3570                                         Name.getAsIdentifierInfo(), 
3571                                         /*PrevDecl=*/0,Loc,
3572                                         D->isImplicitInterfaceDecl());
3573     ToIface->setLexicalDeclContext(LexicalDC);
3574     LexicalDC->addDeclInternal(ToIface);
3575   }
3576   Importer.Imported(D, ToIface);
3577   
3578   if (D->isThisDeclarationADefinition() && ImportDefinition(D, ToIface))
3579     return 0;
3580     
3581   return ToIface;
3582 }
3583
3584 Decl *ASTNodeImporter::VisitObjCCategoryImplDecl(ObjCCategoryImplDecl *D) {
3585   ObjCCategoryDecl *Category = cast_or_null<ObjCCategoryDecl>(
3586                                         Importer.Import(D->getCategoryDecl()));
3587   if (!Category)
3588     return 0;
3589   
3590   ObjCCategoryImplDecl *ToImpl = Category->getImplementation();
3591   if (!ToImpl) {
3592     DeclContext *DC = Importer.ImportContext(D->getDeclContext());
3593     if (!DC)
3594       return 0;
3595     
3596     SourceLocation CategoryNameLoc = Importer.Import(D->getCategoryNameLoc());
3597     ToImpl = ObjCCategoryImplDecl::Create(Importer.getToContext(), DC,
3598                                           Importer.Import(D->getIdentifier()),
3599                                           Category->getClassInterface(),
3600                                           Importer.Import(D->getLocation()),
3601                                           Importer.Import(D->getAtStartLoc()),
3602                                           CategoryNameLoc);
3603     
3604     DeclContext *LexicalDC = DC;
3605     if (D->getDeclContext() != D->getLexicalDeclContext()) {
3606       LexicalDC = Importer.ImportContext(D->getLexicalDeclContext());
3607       if (!LexicalDC)
3608         return 0;
3609       
3610       ToImpl->setLexicalDeclContext(LexicalDC);
3611     }
3612     
3613     LexicalDC->addDeclInternal(ToImpl);
3614     Category->setImplementation(ToImpl);
3615   }
3616   
3617   Importer.Imported(D, ToImpl);
3618   ImportDeclContext(D);
3619   return ToImpl;
3620 }
3621
3622 Decl *ASTNodeImporter::VisitObjCImplementationDecl(ObjCImplementationDecl *D) {
3623   // Find the corresponding interface.
3624   ObjCInterfaceDecl *Iface = cast_or_null<ObjCInterfaceDecl>(
3625                                        Importer.Import(D->getClassInterface()));
3626   if (!Iface)
3627     return 0;
3628
3629   // Import the superclass, if any.
3630   ObjCInterfaceDecl *Super = 0;
3631   if (D->getSuperClass()) {
3632     Super = cast_or_null<ObjCInterfaceDecl>(
3633                                           Importer.Import(D->getSuperClass()));
3634     if (!Super)
3635       return 0;
3636   }
3637
3638   ObjCImplementationDecl *Impl = Iface->getImplementation();
3639   if (!Impl) {
3640     // We haven't imported an implementation yet. Create a new @implementation
3641     // now.
3642     Impl = ObjCImplementationDecl::Create(Importer.getToContext(),
3643                                   Importer.ImportContext(D->getDeclContext()),
3644                                           Iface, Super,
3645                                           Importer.Import(D->getLocation()),
3646                                           Importer.Import(D->getAtStartLoc()),
3647                                           Importer.Import(D->getIvarLBraceLoc()),
3648                                           Importer.Import(D->getIvarRBraceLoc()));
3649     
3650     if (D->getDeclContext() != D->getLexicalDeclContext()) {
3651       DeclContext *LexicalDC
3652         = Importer.ImportContext(D->getLexicalDeclContext());
3653       if (!LexicalDC)
3654         return 0;
3655       Impl->setLexicalDeclContext(LexicalDC);
3656     }
3657     
3658     // Associate the implementation with the class it implements.
3659     Iface->setImplementation(Impl);
3660     Importer.Imported(D, Iface->getImplementation());
3661   } else {
3662     Importer.Imported(D, Iface->getImplementation());
3663
3664     // Verify that the existing @implementation has the same superclass.
3665     if ((Super && !Impl->getSuperClass()) ||
3666         (!Super && Impl->getSuperClass()) ||
3667         (Super && Impl->getSuperClass() && 
3668          !declaresSameEntity(Super->getCanonicalDecl(), Impl->getSuperClass()))) {
3669         Importer.ToDiag(Impl->getLocation(), 
3670                         diag::err_odr_objc_superclass_inconsistent)
3671           << Iface->getDeclName();
3672         // FIXME: It would be nice to have the location of the superclass
3673         // below.
3674         if (Impl->getSuperClass())
3675           Importer.ToDiag(Impl->getLocation(), 
3676                           diag::note_odr_objc_superclass)
3677           << Impl->getSuperClass()->getDeclName();
3678         else
3679           Importer.ToDiag(Impl->getLocation(), 
3680                           diag::note_odr_objc_missing_superclass);
3681         if (D->getSuperClass())
3682           Importer.FromDiag(D->getLocation(), 
3683                             diag::note_odr_objc_superclass)
3684           << D->getSuperClass()->getDeclName();
3685         else
3686           Importer.FromDiag(D->getLocation(), 
3687                             diag::note_odr_objc_missing_superclass);
3688       return 0;
3689     }
3690   }
3691     
3692   // Import all of the members of this @implementation.
3693   ImportDeclContext(D);
3694
3695   return Impl;
3696 }
3697
3698 Decl *ASTNodeImporter::VisitObjCPropertyDecl(ObjCPropertyDecl *D) {
3699   // Import the major distinguishing characteristics of an @property.
3700   DeclContext *DC, *LexicalDC;
3701   DeclarationName Name;
3702   SourceLocation Loc;
3703   if (ImportDeclParts(D, DC, LexicalDC, Name, Loc))
3704     return 0;
3705
3706   // Check whether we have already imported this property.
3707   SmallVector<NamedDecl *, 2> FoundDecls;
3708   DC->localUncachedLookup(Name, FoundDecls);
3709   for (unsigned I = 0, N = FoundDecls.size(); I != N; ++I) {
3710     if (ObjCPropertyDecl *FoundProp
3711                                 = dyn_cast<ObjCPropertyDecl>(FoundDecls[I])) {
3712       // Check property types.
3713       if (!Importer.IsStructurallyEquivalent(D->getType(), 
3714                                              FoundProp->getType())) {
3715         Importer.ToDiag(Loc, diag::err_odr_objc_property_type_inconsistent)
3716           << Name << D->getType() << FoundProp->getType();
3717         Importer.ToDiag(FoundProp->getLocation(), diag::note_odr_value_here)
3718           << FoundProp->getType();
3719         return 0;
3720       }
3721
3722       // FIXME: Check property attributes, getters, setters, etc.?
3723
3724       // Consider these properties to be equivalent.
3725       Importer.Imported(D, FoundProp);
3726       return FoundProp;
3727     }
3728   }
3729
3730   // Import the type.
3731   TypeSourceInfo *T = Importer.Import(D->getTypeSourceInfo());
3732   if (!T)
3733     return 0;
3734
3735   // Create the new property.
3736   ObjCPropertyDecl *ToProperty
3737     = ObjCPropertyDecl::Create(Importer.getToContext(), DC, Loc,
3738                                Name.getAsIdentifierInfo(), 
3739                                Importer.Import(D->getAtLoc()),
3740                                Importer.Import(D->getLParenLoc()),
3741                                T,
3742                                D->getPropertyImplementation());
3743   Importer.Imported(D, ToProperty);
3744   ToProperty->setLexicalDeclContext(LexicalDC);
3745   LexicalDC->addDeclInternal(ToProperty);
3746
3747   ToProperty->setPropertyAttributes(D->getPropertyAttributes());
3748   ToProperty->setPropertyAttributesAsWritten(
3749                                       D->getPropertyAttributesAsWritten());
3750   ToProperty->setGetterName(Importer.Import(D->getGetterName()));
3751   ToProperty->setSetterName(Importer.Import(D->getSetterName()));
3752   ToProperty->setGetterMethodDecl(
3753      cast_or_null<ObjCMethodDecl>(Importer.Import(D->getGetterMethodDecl())));
3754   ToProperty->setSetterMethodDecl(
3755      cast_or_null<ObjCMethodDecl>(Importer.Import(D->getSetterMethodDecl())));
3756   ToProperty->setPropertyIvarDecl(
3757        cast_or_null<ObjCIvarDecl>(Importer.Import(D->getPropertyIvarDecl())));
3758   return ToProperty;
3759 }
3760
3761 Decl *ASTNodeImporter::VisitObjCPropertyImplDecl(ObjCPropertyImplDecl *D) {
3762   ObjCPropertyDecl *Property = cast_or_null<ObjCPropertyDecl>(
3763                                         Importer.Import(D->getPropertyDecl()));
3764   if (!Property)
3765     return 0;
3766
3767   DeclContext *DC = Importer.ImportContext(D->getDeclContext());
3768   if (!DC)
3769     return 0;
3770   
3771   // Import the lexical declaration context.
3772   DeclContext *LexicalDC = DC;
3773   if (D->getDeclContext() != D->getLexicalDeclContext()) {
3774     LexicalDC = Importer.ImportContext(D->getLexicalDeclContext());
3775     if (!LexicalDC)
3776       return 0;
3777   }
3778
3779   ObjCImplDecl *InImpl = dyn_cast<ObjCImplDecl>(LexicalDC);
3780   if (!InImpl)
3781     return 0;
3782
3783   // Import the ivar (for an @synthesize).
3784   ObjCIvarDecl *Ivar = 0;
3785   if (D->getPropertyIvarDecl()) {
3786     Ivar = cast_or_null<ObjCIvarDecl>(
3787                                     Importer.Import(D->getPropertyIvarDecl()));
3788     if (!Ivar)
3789       return 0;
3790   }
3791
3792   ObjCPropertyImplDecl *ToImpl
3793     = InImpl->FindPropertyImplDecl(Property->getIdentifier());
3794   if (!ToImpl) {    
3795     ToImpl = ObjCPropertyImplDecl::Create(Importer.getToContext(), DC,
3796                                           Importer.Import(D->getLocStart()),
3797                                           Importer.Import(D->getLocation()),
3798                                           Property,
3799                                           D->getPropertyImplementation(),
3800                                           Ivar, 
3801                                   Importer.Import(D->getPropertyIvarDeclLoc()));
3802     ToImpl->setLexicalDeclContext(LexicalDC);
3803     Importer.Imported(D, ToImpl);
3804     LexicalDC->addDeclInternal(ToImpl);
3805   } else {
3806     // Check that we have the same kind of property implementation (@synthesize
3807     // vs. @dynamic).
3808     if (D->getPropertyImplementation() != ToImpl->getPropertyImplementation()) {
3809       Importer.ToDiag(ToImpl->getLocation(), 
3810                       diag::err_odr_objc_property_impl_kind_inconsistent)
3811         << Property->getDeclName() 
3812         << (ToImpl->getPropertyImplementation() 
3813                                               == ObjCPropertyImplDecl::Dynamic);
3814       Importer.FromDiag(D->getLocation(),
3815                         diag::note_odr_objc_property_impl_kind)
3816         << D->getPropertyDecl()->getDeclName()
3817         << (D->getPropertyImplementation() == ObjCPropertyImplDecl::Dynamic);
3818       return 0;
3819     }
3820     
3821     // For @synthesize, check that we have the same 
3822     if (D->getPropertyImplementation() == ObjCPropertyImplDecl::Synthesize &&
3823         Ivar != ToImpl->getPropertyIvarDecl()) {
3824       Importer.ToDiag(ToImpl->getPropertyIvarDeclLoc(), 
3825                       diag::err_odr_objc_synthesize_ivar_inconsistent)
3826         << Property->getDeclName()
3827         << ToImpl->getPropertyIvarDecl()->getDeclName()
3828         << Ivar->getDeclName();
3829       Importer.FromDiag(D->getPropertyIvarDeclLoc(), 
3830                         diag::note_odr_objc_synthesize_ivar_here)
3831         << D->getPropertyIvarDecl()->getDeclName();
3832       return 0;
3833     }
3834     
3835     // Merge the existing implementation with the new implementation.
3836     Importer.Imported(D, ToImpl);
3837   }
3838   
3839   return ToImpl;
3840 }
3841
3842 Decl *ASTNodeImporter::VisitTemplateTypeParmDecl(TemplateTypeParmDecl *D) {
3843   // For template arguments, we adopt the translation unit as our declaration
3844   // context. This context will be fixed when the actual template declaration
3845   // is created.
3846   
3847   // FIXME: Import default argument.
3848   return TemplateTypeParmDecl::Create(Importer.getToContext(),
3849                               Importer.getToContext().getTranslationUnitDecl(),
3850                                       Importer.Import(D->getLocStart()),
3851                                       Importer.Import(D->getLocation()),
3852                                       D->getDepth(),
3853                                       D->getIndex(), 
3854                                       Importer.Import(D->getIdentifier()),
3855                                       D->wasDeclaredWithTypename(),
3856                                       D->isParameterPack());
3857 }
3858
3859 Decl *
3860 ASTNodeImporter::VisitNonTypeTemplateParmDecl(NonTypeTemplateParmDecl *D) {
3861   // Import the name of this declaration.
3862   DeclarationName Name = Importer.Import(D->getDeclName());
3863   if (D->getDeclName() && !Name)
3864     return 0;
3865   
3866   // Import the location of this declaration.
3867   SourceLocation Loc = Importer.Import(D->getLocation());
3868
3869   // Import the type of this declaration.
3870   QualType T = Importer.Import(D->getType());
3871   if (T.isNull())
3872     return 0;
3873   
3874   // Import type-source information.
3875   TypeSourceInfo *TInfo = Importer.Import(D->getTypeSourceInfo());
3876   if (D->getTypeSourceInfo() && !TInfo)
3877     return 0;
3878   
3879   // FIXME: Import default argument.
3880   
3881   return NonTypeTemplateParmDecl::Create(Importer.getToContext(),
3882                                Importer.getToContext().getTranslationUnitDecl(),
3883                                          Importer.Import(D->getInnerLocStart()),
3884                                          Loc, D->getDepth(), D->getPosition(),
3885                                          Name.getAsIdentifierInfo(),
3886                                          T, D->isParameterPack(), TInfo);
3887 }
3888
3889 Decl *
3890 ASTNodeImporter::VisitTemplateTemplateParmDecl(TemplateTemplateParmDecl *D) {
3891   // Import the name of this declaration.
3892   DeclarationName Name = Importer.Import(D->getDeclName());
3893   if (D->getDeclName() && !Name)
3894     return 0;
3895   
3896   // Import the location of this declaration.
3897   SourceLocation Loc = Importer.Import(D->getLocation());
3898   
3899   // Import template parameters.
3900   TemplateParameterList *TemplateParams
3901     = ImportTemplateParameterList(D->getTemplateParameters());
3902   if (!TemplateParams)
3903     return 0;
3904   
3905   // FIXME: Import default argument.
3906   
3907   return TemplateTemplateParmDecl::Create(Importer.getToContext(), 
3908                               Importer.getToContext().getTranslationUnitDecl(), 
3909                                           Loc, D->getDepth(), D->getPosition(),
3910                                           D->isParameterPack(),
3911                                           Name.getAsIdentifierInfo(), 
3912                                           TemplateParams);
3913 }
3914
3915 Decl *ASTNodeImporter::VisitClassTemplateDecl(ClassTemplateDecl *D) {
3916   // If this record has a definition in the translation unit we're coming from,
3917   // but this particular declaration is not that definition, import the
3918   // definition and map to that.
3919   CXXRecordDecl *Definition 
3920     = cast_or_null<CXXRecordDecl>(D->getTemplatedDecl()->getDefinition());
3921   if (Definition && Definition != D->getTemplatedDecl()) {
3922     Decl *ImportedDef
3923       = Importer.Import(Definition->getDescribedClassTemplate());
3924     if (!ImportedDef)
3925       return 0;
3926     
3927     return Importer.Imported(D, ImportedDef);
3928   }
3929   
3930   // Import the major distinguishing characteristics of this class template.
3931   DeclContext *DC, *LexicalDC;
3932   DeclarationName Name;
3933   SourceLocation Loc;
3934   if (ImportDeclParts(D, DC, LexicalDC, Name, Loc))
3935     return 0;
3936   
3937   // We may already have a template of the same name; try to find and match it.
3938   if (!DC->isFunctionOrMethod()) {
3939     SmallVector<NamedDecl *, 4> ConflictingDecls;
3940     SmallVector<NamedDecl *, 2> FoundDecls;
3941     DC->localUncachedLookup(Name, FoundDecls);
3942     for (unsigned I = 0, N = FoundDecls.size(); I != N; ++I) {
3943       if (!FoundDecls[I]->isInIdentifierNamespace(Decl::IDNS_Ordinary))
3944         continue;
3945       
3946       Decl *Found = FoundDecls[I];
3947       if (ClassTemplateDecl *FoundTemplate 
3948                                         = dyn_cast<ClassTemplateDecl>(Found)) {
3949         if (IsStructuralMatch(D, FoundTemplate)) {
3950           // The class templates structurally match; call it the same template.
3951           // FIXME: We may be filling in a forward declaration here. Handle
3952           // this case!
3953           Importer.Imported(D->getTemplatedDecl(), 
3954                             FoundTemplate->getTemplatedDecl());
3955           return Importer.Imported(D, FoundTemplate);
3956         }         
3957       }
3958       
3959       ConflictingDecls.push_back(FoundDecls[I]);
3960     }
3961     
3962     if (!ConflictingDecls.empty()) {
3963       Name = Importer.HandleNameConflict(Name, DC, Decl::IDNS_Ordinary,
3964                                          ConflictingDecls.data(), 
3965                                          ConflictingDecls.size());
3966     }
3967     
3968     if (!Name)
3969       return 0;
3970   }
3971
3972   CXXRecordDecl *DTemplated = D->getTemplatedDecl();
3973   
3974   // Create the declaration that is being templated.
3975   SourceLocation StartLoc = Importer.Import(DTemplated->getLocStart());
3976   SourceLocation IdLoc = Importer.Import(DTemplated->getLocation());
3977   CXXRecordDecl *D2Templated = CXXRecordDecl::Create(Importer.getToContext(),
3978                                                      DTemplated->getTagKind(),
3979                                                      DC, StartLoc, IdLoc,
3980                                                    Name.getAsIdentifierInfo());
3981   D2Templated->setAccess(DTemplated->getAccess());
3982   D2Templated->setQualifierInfo(Importer.Import(DTemplated->getQualifierLoc()));
3983   D2Templated->setLexicalDeclContext(LexicalDC);
3984   
3985   // Create the class template declaration itself.
3986   TemplateParameterList *TemplateParams
3987     = ImportTemplateParameterList(D->getTemplateParameters());
3988   if (!TemplateParams)
3989     return 0;
3990   
3991   ClassTemplateDecl *D2 = ClassTemplateDecl::Create(Importer.getToContext(), DC, 
3992                                                     Loc, Name, TemplateParams, 
3993                                                     D2Templated, 
3994   /*PrevDecl=*/0);
3995   D2Templated->setDescribedClassTemplate(D2);    
3996   
3997   D2->setAccess(D->getAccess());
3998   D2->setLexicalDeclContext(LexicalDC);
3999   LexicalDC->addDeclInternal(D2);
4000   
4001   // Note the relationship between the class templates.
4002   Importer.Imported(D, D2);
4003   Importer.Imported(DTemplated, D2Templated);
4004
4005   if (DTemplated->isCompleteDefinition() &&
4006       !D2Templated->isCompleteDefinition()) {
4007     // FIXME: Import definition!
4008   }
4009   
4010   return D2;
4011 }
4012
4013 Decl *ASTNodeImporter::VisitClassTemplateSpecializationDecl(
4014                                           ClassTemplateSpecializationDecl *D) {
4015   // If this record has a definition in the translation unit we're coming from,
4016   // but this particular declaration is not that definition, import the
4017   // definition and map to that.
4018   TagDecl *Definition = D->getDefinition();
4019   if (Definition && Definition != D) {
4020     Decl *ImportedDef = Importer.Import(Definition);
4021     if (!ImportedDef)
4022       return 0;
4023     
4024     return Importer.Imported(D, ImportedDef);
4025   }
4026
4027   ClassTemplateDecl *ClassTemplate
4028     = cast_or_null<ClassTemplateDecl>(Importer.Import(
4029                                                  D->getSpecializedTemplate()));
4030   if (!ClassTemplate)
4031     return 0;
4032   
4033   // Import the context of this declaration.
4034   DeclContext *DC = ClassTemplate->getDeclContext();
4035   if (!DC)
4036     return 0;
4037   
4038   DeclContext *LexicalDC = DC;
4039   if (D->getDeclContext() != D->getLexicalDeclContext()) {
4040     LexicalDC = Importer.ImportContext(D->getLexicalDeclContext());
4041     if (!LexicalDC)
4042       return 0;
4043   }
4044   
4045   // Import the location of this declaration.
4046   SourceLocation StartLoc = Importer.Import(D->getLocStart());
4047   SourceLocation IdLoc = Importer.Import(D->getLocation());
4048
4049   // Import template arguments.
4050   SmallVector<TemplateArgument, 2> TemplateArgs;
4051   if (ImportTemplateArguments(D->getTemplateArgs().data(), 
4052                               D->getTemplateArgs().size(),
4053                               TemplateArgs))
4054     return 0;
4055   
4056   // Try to find an existing specialization with these template arguments.
4057   void *InsertPos = 0;
4058   ClassTemplateSpecializationDecl *D2
4059     = ClassTemplate->findSpecialization(TemplateArgs.data(), 
4060                                         TemplateArgs.size(), InsertPos);
4061   if (D2) {
4062     // We already have a class template specialization with these template
4063     // arguments.
4064     
4065     // FIXME: Check for specialization vs. instantiation errors.
4066     
4067     if (RecordDecl *FoundDef = D2->getDefinition()) {
4068       if (!D->isCompleteDefinition() || IsStructuralMatch(D, FoundDef)) {
4069         // The record types structurally match, or the "from" translation
4070         // unit only had a forward declaration anyway; call it the same
4071         // function.
4072         return Importer.Imported(D, FoundDef);
4073       }
4074     }
4075   } else {
4076     // Create a new specialization.
4077     D2 = ClassTemplateSpecializationDecl::Create(Importer.getToContext(), 
4078                                                  D->getTagKind(), DC, 
4079                                                  StartLoc, IdLoc,
4080                                                  ClassTemplate,
4081                                                  TemplateArgs.data(), 
4082                                                  TemplateArgs.size(), 
4083                                                  /*PrevDecl=*/0);
4084     D2->setSpecializationKind(D->getSpecializationKind());
4085
4086     // Add this specialization to the class template.
4087     ClassTemplate->AddSpecialization(D2, InsertPos);
4088     
4089     // Import the qualifier, if any.
4090     D2->setQualifierInfo(Importer.Import(D->getQualifierLoc()));
4091     
4092     // Add the specialization to this context.
4093     D2->setLexicalDeclContext(LexicalDC);
4094     LexicalDC->addDeclInternal(D2);
4095   }
4096   Importer.Imported(D, D2);
4097   
4098   if (D->isCompleteDefinition() && ImportDefinition(D, D2))
4099     return 0;
4100   
4101   return D2;
4102 }
4103
4104 //----------------------------------------------------------------------------
4105 // Import Statements
4106 //----------------------------------------------------------------------------
4107
4108 Stmt *ASTNodeImporter::VisitStmt(Stmt *S) {
4109   Importer.FromDiag(S->getLocStart(), diag::err_unsupported_ast_node)
4110     << S->getStmtClassName();
4111   return 0;
4112 }
4113
4114 //----------------------------------------------------------------------------
4115 // Import Expressions
4116 //----------------------------------------------------------------------------
4117 Expr *ASTNodeImporter::VisitExpr(Expr *E) {
4118   Importer.FromDiag(E->getLocStart(), diag::err_unsupported_ast_node)
4119     << E->getStmtClassName();
4120   return 0;
4121 }
4122
4123 Expr *ASTNodeImporter::VisitDeclRefExpr(DeclRefExpr *E) {
4124   ValueDecl *ToD = cast_or_null<ValueDecl>(Importer.Import(E->getDecl()));
4125   if (!ToD)
4126     return 0;
4127
4128   NamedDecl *FoundD = 0;
4129   if (E->getDecl() != E->getFoundDecl()) {
4130     FoundD = cast_or_null<NamedDecl>(Importer.Import(E->getFoundDecl()));
4131     if (!FoundD)
4132       return 0;
4133   }
4134   
4135   QualType T = Importer.Import(E->getType());
4136   if (T.isNull())
4137     return 0;
4138
4139   DeclRefExpr *DRE = DeclRefExpr::Create(Importer.getToContext(), 
4140                                          Importer.Import(E->getQualifierLoc()),
4141                                    Importer.Import(E->getTemplateKeywordLoc()),
4142                                          ToD,
4143                                          E->refersToEnclosingLocal(),
4144                                          Importer.Import(E->getLocation()),
4145                                          T, E->getValueKind(),
4146                                          FoundD,
4147                                          /*FIXME:TemplateArgs=*/0);
4148   if (E->hadMultipleCandidates())
4149     DRE->setHadMultipleCandidates(true);
4150   return DRE;
4151 }
4152
4153 Expr *ASTNodeImporter::VisitIntegerLiteral(IntegerLiteral *E) {
4154   QualType T = Importer.Import(E->getType());
4155   if (T.isNull())
4156     return 0;
4157
4158   return IntegerLiteral::Create(Importer.getToContext(), 
4159                                 E->getValue(), T,
4160                                 Importer.Import(E->getLocation()));
4161 }
4162
4163 Expr *ASTNodeImporter::VisitCharacterLiteral(CharacterLiteral *E) {
4164   QualType T = Importer.Import(E->getType());
4165   if (T.isNull())
4166     return 0;
4167   
4168   return new (Importer.getToContext()) CharacterLiteral(E->getValue(),
4169                                                         E->getKind(), T,
4170                                           Importer.Import(E->getLocation()));
4171 }
4172
4173 Expr *ASTNodeImporter::VisitParenExpr(ParenExpr *E) {
4174   Expr *SubExpr = Importer.Import(E->getSubExpr());
4175   if (!SubExpr)
4176     return 0;
4177   
4178   return new (Importer.getToContext()) 
4179                                   ParenExpr(Importer.Import(E->getLParen()),
4180                                             Importer.Import(E->getRParen()),
4181                                             SubExpr);
4182 }
4183
4184 Expr *ASTNodeImporter::VisitUnaryOperator(UnaryOperator *E) {
4185   QualType T = Importer.Import(E->getType());
4186   if (T.isNull())
4187     return 0;
4188
4189   Expr *SubExpr = Importer.Import(E->getSubExpr());
4190   if (!SubExpr)
4191     return 0;
4192   
4193   return new (Importer.getToContext()) UnaryOperator(SubExpr, E->getOpcode(),
4194                                                      T, E->getValueKind(),
4195                                                      E->getObjectKind(),
4196                                          Importer.Import(E->getOperatorLoc()));                                        
4197 }
4198
4199 Expr *ASTNodeImporter::VisitUnaryExprOrTypeTraitExpr(
4200                                             UnaryExprOrTypeTraitExpr *E) {
4201   QualType ResultType = Importer.Import(E->getType());
4202   
4203   if (E->isArgumentType()) {
4204     TypeSourceInfo *TInfo = Importer.Import(E->getArgumentTypeInfo());
4205     if (!TInfo)
4206       return 0;
4207     
4208     return new (Importer.getToContext()) UnaryExprOrTypeTraitExpr(E->getKind(),
4209                                            TInfo, ResultType,
4210                                            Importer.Import(E->getOperatorLoc()),
4211                                            Importer.Import(E->getRParenLoc()));
4212   }
4213   
4214   Expr *SubExpr = Importer.Import(E->getArgumentExpr());
4215   if (!SubExpr)
4216     return 0;
4217   
4218   return new (Importer.getToContext()) UnaryExprOrTypeTraitExpr(E->getKind(),
4219                                           SubExpr, ResultType,
4220                                           Importer.Import(E->getOperatorLoc()),
4221                                           Importer.Import(E->getRParenLoc()));
4222 }
4223
4224 Expr *ASTNodeImporter::VisitBinaryOperator(BinaryOperator *E) {
4225   QualType T = Importer.Import(E->getType());
4226   if (T.isNull())
4227     return 0;
4228
4229   Expr *LHS = Importer.Import(E->getLHS());
4230   if (!LHS)
4231     return 0;
4232   
4233   Expr *RHS = Importer.Import(E->getRHS());
4234   if (!RHS)
4235     return 0;
4236   
4237   return new (Importer.getToContext()) BinaryOperator(LHS, RHS, E->getOpcode(),
4238                                                       T, E->getValueKind(),
4239                                                       E->getObjectKind(),
4240                                            Importer.Import(E->getOperatorLoc()),
4241                                                       E->isFPContractable());
4242 }
4243
4244 Expr *ASTNodeImporter::VisitCompoundAssignOperator(CompoundAssignOperator *E) {
4245   QualType T = Importer.Import(E->getType());
4246   if (T.isNull())
4247     return 0;
4248   
4249   QualType CompLHSType = Importer.Import(E->getComputationLHSType());
4250   if (CompLHSType.isNull())
4251     return 0;
4252   
4253   QualType CompResultType = Importer.Import(E->getComputationResultType());
4254   if (CompResultType.isNull())
4255     return 0;
4256   
4257   Expr *LHS = Importer.Import(E->getLHS());
4258   if (!LHS)
4259     return 0;
4260   
4261   Expr *RHS = Importer.Import(E->getRHS());
4262   if (!RHS)
4263     return 0;
4264   
4265   return new (Importer.getToContext()) 
4266                         CompoundAssignOperator(LHS, RHS, E->getOpcode(),
4267                                                T, E->getValueKind(),
4268                                                E->getObjectKind(),
4269                                                CompLHSType, CompResultType,
4270                                            Importer.Import(E->getOperatorLoc()),
4271                                                E->isFPContractable());
4272 }
4273
4274 static bool ImportCastPath(CastExpr *E, CXXCastPath &Path) {
4275   if (E->path_empty()) return false;
4276
4277   // TODO: import cast paths
4278   return true;
4279 }
4280
4281 Expr *ASTNodeImporter::VisitImplicitCastExpr(ImplicitCastExpr *E) {
4282   QualType T = Importer.Import(E->getType());
4283   if (T.isNull())
4284     return 0;
4285
4286   Expr *SubExpr = Importer.Import(E->getSubExpr());
4287   if (!SubExpr)
4288     return 0;
4289
4290   CXXCastPath BasePath;
4291   if (ImportCastPath(E, BasePath))
4292     return 0;
4293
4294   return ImplicitCastExpr::Create(Importer.getToContext(), T, E->getCastKind(),
4295                                   SubExpr, &BasePath, E->getValueKind());
4296 }
4297
4298 Expr *ASTNodeImporter::VisitCStyleCastExpr(CStyleCastExpr *E) {
4299   QualType T = Importer.Import(E->getType());
4300   if (T.isNull())
4301     return 0;
4302   
4303   Expr *SubExpr = Importer.Import(E->getSubExpr());
4304   if (!SubExpr)
4305     return 0;
4306
4307   TypeSourceInfo *TInfo = Importer.Import(E->getTypeInfoAsWritten());
4308   if (!TInfo && E->getTypeInfoAsWritten())
4309     return 0;
4310   
4311   CXXCastPath BasePath;
4312   if (ImportCastPath(E, BasePath))
4313     return 0;
4314
4315   return CStyleCastExpr::Create(Importer.getToContext(), T,
4316                                 E->getValueKind(), E->getCastKind(),
4317                                 SubExpr, &BasePath, TInfo,
4318                                 Importer.Import(E->getLParenLoc()),
4319                                 Importer.Import(E->getRParenLoc()));
4320 }
4321
4322 ASTImporter::ASTImporter(ASTContext &ToContext, FileManager &ToFileManager,
4323                          ASTContext &FromContext, FileManager &FromFileManager,
4324                          bool MinimalImport)
4325   : ToContext(ToContext), FromContext(FromContext),
4326     ToFileManager(ToFileManager), FromFileManager(FromFileManager),
4327     Minimal(MinimalImport), LastDiagFromFrom(false)
4328 {
4329   ImportedDecls[FromContext.getTranslationUnitDecl()]
4330     = ToContext.getTranslationUnitDecl();
4331 }
4332
4333 ASTImporter::~ASTImporter() { }
4334
4335 QualType ASTImporter::Import(QualType FromT) {
4336   if (FromT.isNull())
4337     return QualType();
4338
4339   const Type *fromTy = FromT.getTypePtr();
4340   
4341   // Check whether we've already imported this type.  
4342   llvm::DenseMap<const Type *, const Type *>::iterator Pos
4343     = ImportedTypes.find(fromTy);
4344   if (Pos != ImportedTypes.end())
4345     return ToContext.getQualifiedType(Pos->second, FromT.getLocalQualifiers());
4346   
4347   // Import the type
4348   ASTNodeImporter Importer(*this);
4349   QualType ToT = Importer.Visit(fromTy);
4350   if (ToT.isNull())
4351     return ToT;
4352   
4353   // Record the imported type.
4354   ImportedTypes[fromTy] = ToT.getTypePtr();
4355   
4356   return ToContext.getQualifiedType(ToT, FromT.getLocalQualifiers());
4357 }
4358
4359 TypeSourceInfo *ASTImporter::Import(TypeSourceInfo *FromTSI) {
4360   if (!FromTSI)
4361     return FromTSI;
4362
4363   // FIXME: For now we just create a "trivial" type source info based
4364   // on the type and a single location. Implement a real version of this.
4365   QualType T = Import(FromTSI->getType());
4366   if (T.isNull())
4367     return 0;
4368
4369   return ToContext.getTrivialTypeSourceInfo(T, 
4370                         FromTSI->getTypeLoc().getLocStart());
4371 }
4372
4373 Decl *ASTImporter::Import(Decl *FromD) {
4374   if (!FromD)
4375     return 0;
4376
4377   ASTNodeImporter Importer(*this);
4378
4379   // Check whether we've already imported this declaration.  
4380   llvm::DenseMap<Decl *, Decl *>::iterator Pos = ImportedDecls.find(FromD);
4381   if (Pos != ImportedDecls.end()) {
4382     Decl *ToD = Pos->second;
4383     Importer.ImportDefinitionIfNeeded(FromD, ToD);
4384     return ToD;
4385   }
4386   
4387   // Import the type
4388   Decl *ToD = Importer.Visit(FromD);
4389   if (!ToD)
4390     return 0;
4391   
4392   // Record the imported declaration.
4393   ImportedDecls[FromD] = ToD;
4394   
4395   if (TagDecl *FromTag = dyn_cast<TagDecl>(FromD)) {
4396     // Keep track of anonymous tags that have an associated typedef.
4397     if (FromTag->getTypedefNameForAnonDecl())
4398       AnonTagsWithPendingTypedefs.push_back(FromTag);
4399   } else if (TypedefNameDecl *FromTypedef = dyn_cast<TypedefNameDecl>(FromD)) {
4400     // When we've finished transforming a typedef, see whether it was the
4401     // typedef for an anonymous tag.
4402     for (SmallVector<TagDecl *, 4>::iterator
4403                FromTag = AnonTagsWithPendingTypedefs.begin(), 
4404             FromTagEnd = AnonTagsWithPendingTypedefs.end();
4405          FromTag != FromTagEnd; ++FromTag) {
4406       if ((*FromTag)->getTypedefNameForAnonDecl() == FromTypedef) {
4407         if (TagDecl *ToTag = cast_or_null<TagDecl>(Import(*FromTag))) {
4408           // We found the typedef for an anonymous tag; link them.
4409           ToTag->setTypedefNameForAnonDecl(cast<TypedefNameDecl>(ToD));
4410           AnonTagsWithPendingTypedefs.erase(FromTag);
4411           break;
4412         }
4413       }
4414     }
4415   }
4416   
4417   return ToD;
4418 }
4419
4420 DeclContext *ASTImporter::ImportContext(DeclContext *FromDC) {
4421   if (!FromDC)
4422     return FromDC;
4423
4424   DeclContext *ToDC = cast_or_null<DeclContext>(Import(cast<Decl>(FromDC)));
4425   if (!ToDC)
4426     return 0;
4427   
4428   // When we're using a record/enum/Objective-C class/protocol as a context, we 
4429   // need it to have a definition.
4430   if (RecordDecl *ToRecord = dyn_cast<RecordDecl>(ToDC)) {
4431     RecordDecl *FromRecord = cast<RecordDecl>(FromDC);
4432     if (ToRecord->isCompleteDefinition()) {
4433       // Do nothing.
4434     } else if (FromRecord->isCompleteDefinition()) {
4435       ASTNodeImporter(*this).ImportDefinition(FromRecord, ToRecord,
4436                                               ASTNodeImporter::IDK_Basic);
4437     } else {
4438       CompleteDecl(ToRecord);
4439     }
4440   } else if (EnumDecl *ToEnum = dyn_cast<EnumDecl>(ToDC)) {
4441     EnumDecl *FromEnum = cast<EnumDecl>(FromDC);
4442     if (ToEnum->isCompleteDefinition()) {
4443       // Do nothing.
4444     } else if (FromEnum->isCompleteDefinition()) {
4445       ASTNodeImporter(*this).ImportDefinition(FromEnum, ToEnum,
4446                                               ASTNodeImporter::IDK_Basic);
4447     } else {
4448       CompleteDecl(ToEnum);
4449     }    
4450   } else if (ObjCInterfaceDecl *ToClass = dyn_cast<ObjCInterfaceDecl>(ToDC)) {
4451     ObjCInterfaceDecl *FromClass = cast<ObjCInterfaceDecl>(FromDC);
4452     if (ToClass->getDefinition()) {
4453       // Do nothing.
4454     } else if (ObjCInterfaceDecl *FromDef = FromClass->getDefinition()) {
4455       ASTNodeImporter(*this).ImportDefinition(FromDef, ToClass,
4456                                               ASTNodeImporter::IDK_Basic);
4457     } else {
4458       CompleteDecl(ToClass);
4459     }
4460   } else if (ObjCProtocolDecl *ToProto = dyn_cast<ObjCProtocolDecl>(ToDC)) {
4461     ObjCProtocolDecl *FromProto = cast<ObjCProtocolDecl>(FromDC);
4462     if (ToProto->getDefinition()) {
4463       // Do nothing.
4464     } else if (ObjCProtocolDecl *FromDef = FromProto->getDefinition()) {
4465       ASTNodeImporter(*this).ImportDefinition(FromDef, ToProto,
4466                                               ASTNodeImporter::IDK_Basic);
4467     } else {
4468       CompleteDecl(ToProto);
4469     }    
4470   }
4471   
4472   return ToDC;
4473 }
4474
4475 Expr *ASTImporter::Import(Expr *FromE) {
4476   if (!FromE)
4477     return 0;
4478
4479   return cast_or_null<Expr>(Import(cast<Stmt>(FromE)));
4480 }
4481
4482 Stmt *ASTImporter::Import(Stmt *FromS) {
4483   if (!FromS)
4484     return 0;
4485
4486   // Check whether we've already imported this declaration.  
4487   llvm::DenseMap<Stmt *, Stmt *>::iterator Pos = ImportedStmts.find(FromS);
4488   if (Pos != ImportedStmts.end())
4489     return Pos->second;
4490   
4491   // Import the type
4492   ASTNodeImporter Importer(*this);
4493   Stmt *ToS = Importer.Visit(FromS);
4494   if (!ToS)
4495     return 0;
4496   
4497   // Record the imported declaration.
4498   ImportedStmts[FromS] = ToS;
4499   return ToS;
4500 }
4501
4502 NestedNameSpecifier *ASTImporter::Import(NestedNameSpecifier *FromNNS) {
4503   if (!FromNNS)
4504     return 0;
4505
4506   NestedNameSpecifier *prefix = Import(FromNNS->getPrefix());
4507
4508   switch (FromNNS->getKind()) {
4509   case NestedNameSpecifier::Identifier:
4510     if (IdentifierInfo *II = Import(FromNNS->getAsIdentifier())) {
4511       return NestedNameSpecifier::Create(ToContext, prefix, II);
4512     }
4513     return 0;
4514
4515   case NestedNameSpecifier::Namespace:
4516     if (NamespaceDecl *NS = 
4517           cast<NamespaceDecl>(Import(FromNNS->getAsNamespace()))) {
4518       return NestedNameSpecifier::Create(ToContext, prefix, NS);
4519     }
4520     return 0;
4521
4522   case NestedNameSpecifier::NamespaceAlias:
4523     if (NamespaceAliasDecl *NSAD = 
4524           cast<NamespaceAliasDecl>(Import(FromNNS->getAsNamespaceAlias()))) {
4525       return NestedNameSpecifier::Create(ToContext, prefix, NSAD);
4526     }
4527     return 0;
4528
4529   case NestedNameSpecifier::Global:
4530     return NestedNameSpecifier::GlobalSpecifier(ToContext);
4531
4532   case NestedNameSpecifier::TypeSpec:
4533   case NestedNameSpecifier::TypeSpecWithTemplate: {
4534       QualType T = Import(QualType(FromNNS->getAsType(), 0u));
4535       if (!T.isNull()) {
4536         bool bTemplate = FromNNS->getKind() == 
4537                          NestedNameSpecifier::TypeSpecWithTemplate;
4538         return NestedNameSpecifier::Create(ToContext, prefix, 
4539                                            bTemplate, T.getTypePtr());
4540       }
4541     }
4542     return 0;
4543   }
4544
4545   llvm_unreachable("Invalid nested name specifier kind");
4546 }
4547
4548 NestedNameSpecifierLoc ASTImporter::Import(NestedNameSpecifierLoc FromNNS) {
4549   // FIXME: Implement!
4550   return NestedNameSpecifierLoc();
4551 }
4552
4553 TemplateName ASTImporter::Import(TemplateName From) {
4554   switch (From.getKind()) {
4555   case TemplateName::Template:
4556     if (TemplateDecl *ToTemplate
4557                 = cast_or_null<TemplateDecl>(Import(From.getAsTemplateDecl())))
4558       return TemplateName(ToTemplate);
4559       
4560     return TemplateName();
4561       
4562   case TemplateName::OverloadedTemplate: {
4563     OverloadedTemplateStorage *FromStorage = From.getAsOverloadedTemplate();
4564     UnresolvedSet<2> ToTemplates;
4565     for (OverloadedTemplateStorage::iterator I = FromStorage->begin(),
4566                                              E = FromStorage->end();
4567          I != E; ++I) {
4568       if (NamedDecl *To = cast_or_null<NamedDecl>(Import(*I))) 
4569         ToTemplates.addDecl(To);
4570       else
4571         return TemplateName();
4572     }
4573     return ToContext.getOverloadedTemplateName(ToTemplates.begin(), 
4574                                                ToTemplates.end());
4575   }
4576       
4577   case TemplateName::QualifiedTemplate: {
4578     QualifiedTemplateName *QTN = From.getAsQualifiedTemplateName();
4579     NestedNameSpecifier *Qualifier = Import(QTN->getQualifier());
4580     if (!Qualifier)
4581       return TemplateName();
4582     
4583     if (TemplateDecl *ToTemplate
4584         = cast_or_null<TemplateDecl>(Import(From.getAsTemplateDecl())))
4585       return ToContext.getQualifiedTemplateName(Qualifier, 
4586                                                 QTN->hasTemplateKeyword(), 
4587                                                 ToTemplate);
4588     
4589     return TemplateName();
4590   }
4591   
4592   case TemplateName::DependentTemplate: {
4593     DependentTemplateName *DTN = From.getAsDependentTemplateName();
4594     NestedNameSpecifier *Qualifier = Import(DTN->getQualifier());
4595     if (!Qualifier)
4596       return TemplateName();
4597     
4598     if (DTN->isIdentifier()) {
4599       return ToContext.getDependentTemplateName(Qualifier, 
4600                                                 Import(DTN->getIdentifier()));
4601     }
4602     
4603     return ToContext.getDependentTemplateName(Qualifier, DTN->getOperator());
4604   }
4605
4606   case TemplateName::SubstTemplateTemplateParm: {
4607     SubstTemplateTemplateParmStorage *subst
4608       = From.getAsSubstTemplateTemplateParm();
4609     TemplateTemplateParmDecl *param
4610       = cast_or_null<TemplateTemplateParmDecl>(Import(subst->getParameter()));
4611     if (!param)
4612       return TemplateName();
4613
4614     TemplateName replacement = Import(subst->getReplacement());
4615     if (replacement.isNull()) return TemplateName();
4616     
4617     return ToContext.getSubstTemplateTemplateParm(param, replacement);
4618   }
4619       
4620   case TemplateName::SubstTemplateTemplateParmPack: {
4621     SubstTemplateTemplateParmPackStorage *SubstPack
4622       = From.getAsSubstTemplateTemplateParmPack();
4623     TemplateTemplateParmDecl *Param
4624       = cast_or_null<TemplateTemplateParmDecl>(
4625                                         Import(SubstPack->getParameterPack()));
4626     if (!Param)
4627       return TemplateName();
4628     
4629     ASTNodeImporter Importer(*this);
4630     TemplateArgument ArgPack 
4631       = Importer.ImportTemplateArgument(SubstPack->getArgumentPack());
4632     if (ArgPack.isNull())
4633       return TemplateName();
4634     
4635     return ToContext.getSubstTemplateTemplateParmPack(Param, ArgPack);
4636   }
4637   }
4638   
4639   llvm_unreachable("Invalid template name kind");
4640 }
4641
4642 SourceLocation ASTImporter::Import(SourceLocation FromLoc) {
4643   if (FromLoc.isInvalid())
4644     return SourceLocation();
4645
4646   SourceManager &FromSM = FromContext.getSourceManager();
4647   
4648   // For now, map everything down to its spelling location, so that we
4649   // don't have to import macro expansions.
4650   // FIXME: Import macro expansions!
4651   FromLoc = FromSM.getSpellingLoc(FromLoc);
4652   std::pair<FileID, unsigned> Decomposed = FromSM.getDecomposedLoc(FromLoc);
4653   SourceManager &ToSM = ToContext.getSourceManager();
4654   return ToSM.getLocForStartOfFile(Import(Decomposed.first))
4655              .getLocWithOffset(Decomposed.second);
4656 }
4657
4658 SourceRange ASTImporter::Import(SourceRange FromRange) {
4659   return SourceRange(Import(FromRange.getBegin()), Import(FromRange.getEnd()));
4660 }
4661
4662 FileID ASTImporter::Import(FileID FromID) {
4663   llvm::DenseMap<FileID, FileID>::iterator Pos
4664     = ImportedFileIDs.find(FromID);
4665   if (Pos != ImportedFileIDs.end())
4666     return Pos->second;
4667   
4668   SourceManager &FromSM = FromContext.getSourceManager();
4669   SourceManager &ToSM = ToContext.getSourceManager();
4670   const SrcMgr::SLocEntry &FromSLoc = FromSM.getSLocEntry(FromID);
4671   assert(FromSLoc.isFile() && "Cannot handle macro expansions yet");
4672   
4673   // Include location of this file.
4674   SourceLocation ToIncludeLoc = Import(FromSLoc.getFile().getIncludeLoc());
4675   
4676   // Map the FileID for to the "to" source manager.
4677   FileID ToID;
4678   const SrcMgr::ContentCache *Cache = FromSLoc.getFile().getContentCache();
4679   if (Cache->OrigEntry) {
4680     // FIXME: We probably want to use getVirtualFile(), so we don't hit the
4681     // disk again
4682     // FIXME: We definitely want to re-use the existing MemoryBuffer, rather
4683     // than mmap the files several times.
4684     const FileEntry *Entry = ToFileManager.getFile(Cache->OrigEntry->getName());
4685     ToID = ToSM.createFileID(Entry, ToIncludeLoc, 
4686                              FromSLoc.getFile().getFileCharacteristic());
4687   } else {
4688     // FIXME: We want to re-use the existing MemoryBuffer!
4689     const llvm::MemoryBuffer *
4690         FromBuf = Cache->getBuffer(FromContext.getDiagnostics(), FromSM);
4691     llvm::MemoryBuffer *ToBuf
4692       = llvm::MemoryBuffer::getMemBufferCopy(FromBuf->getBuffer(),
4693                                              FromBuf->getBufferIdentifier());
4694     ToID = ToSM.createFileIDForMemBuffer(ToBuf,
4695                                     FromSLoc.getFile().getFileCharacteristic());
4696   }
4697   
4698   
4699   ImportedFileIDs[FromID] = ToID;
4700   return ToID;
4701 }
4702
4703 void ASTImporter::ImportDefinition(Decl *From) {
4704   Decl *To = Import(From);
4705   if (!To)
4706     return;
4707   
4708   if (DeclContext *FromDC = cast<DeclContext>(From)) {
4709     ASTNodeImporter Importer(*this);
4710       
4711     if (RecordDecl *ToRecord = dyn_cast<RecordDecl>(To)) {
4712       if (!ToRecord->getDefinition()) {
4713         Importer.ImportDefinition(cast<RecordDecl>(FromDC), ToRecord, 
4714                                   ASTNodeImporter::IDK_Everything);
4715         return;
4716       }      
4717     }
4718
4719     if (EnumDecl *ToEnum = dyn_cast<EnumDecl>(To)) {
4720       if (!ToEnum->getDefinition()) {
4721         Importer.ImportDefinition(cast<EnumDecl>(FromDC), ToEnum, 
4722                                   ASTNodeImporter::IDK_Everything);
4723         return;
4724       }      
4725     }
4726     
4727     if (ObjCInterfaceDecl *ToIFace = dyn_cast<ObjCInterfaceDecl>(To)) {
4728       if (!ToIFace->getDefinition()) {
4729         Importer.ImportDefinition(cast<ObjCInterfaceDecl>(FromDC), ToIFace,
4730                                   ASTNodeImporter::IDK_Everything);
4731         return;
4732       }
4733     }
4734
4735     if (ObjCProtocolDecl *ToProto = dyn_cast<ObjCProtocolDecl>(To)) {
4736       if (!ToProto->getDefinition()) {
4737         Importer.ImportDefinition(cast<ObjCProtocolDecl>(FromDC), ToProto,
4738                                   ASTNodeImporter::IDK_Everything);
4739         return;
4740       }
4741     }
4742     
4743     Importer.ImportDeclContext(FromDC, true);
4744   }
4745 }
4746
4747 DeclarationName ASTImporter::Import(DeclarationName FromName) {
4748   if (!FromName)
4749     return DeclarationName();
4750
4751   switch (FromName.getNameKind()) {
4752   case DeclarationName::Identifier:
4753     return Import(FromName.getAsIdentifierInfo());
4754
4755   case DeclarationName::ObjCZeroArgSelector:
4756   case DeclarationName::ObjCOneArgSelector:
4757   case DeclarationName::ObjCMultiArgSelector:
4758     return Import(FromName.getObjCSelector());
4759
4760   case DeclarationName::CXXConstructorName: {
4761     QualType T = Import(FromName.getCXXNameType());
4762     if (T.isNull())
4763       return DeclarationName();
4764
4765     return ToContext.DeclarationNames.getCXXConstructorName(
4766                                                ToContext.getCanonicalType(T));
4767   }
4768
4769   case DeclarationName::CXXDestructorName: {
4770     QualType T = Import(FromName.getCXXNameType());
4771     if (T.isNull())
4772       return DeclarationName();
4773
4774     return ToContext.DeclarationNames.getCXXDestructorName(
4775                                                ToContext.getCanonicalType(T));
4776   }
4777
4778   case DeclarationName::CXXConversionFunctionName: {
4779     QualType T = Import(FromName.getCXXNameType());
4780     if (T.isNull())
4781       return DeclarationName();
4782
4783     return ToContext.DeclarationNames.getCXXConversionFunctionName(
4784                                                ToContext.getCanonicalType(T));
4785   }
4786
4787   case DeclarationName::CXXOperatorName:
4788     return ToContext.DeclarationNames.getCXXOperatorName(
4789                                           FromName.getCXXOverloadedOperator());
4790
4791   case DeclarationName::CXXLiteralOperatorName:
4792     return ToContext.DeclarationNames.getCXXLiteralOperatorName(
4793                                    Import(FromName.getCXXLiteralIdentifier()));
4794
4795   case DeclarationName::CXXUsingDirective:
4796     // FIXME: STATICS!
4797     return DeclarationName::getUsingDirectiveName();
4798   }
4799
4800   llvm_unreachable("Invalid DeclarationName Kind!");
4801 }
4802
4803 IdentifierInfo *ASTImporter::Import(const IdentifierInfo *FromId) {
4804   if (!FromId)
4805     return 0;
4806
4807   return &ToContext.Idents.get(FromId->getName());
4808 }
4809
4810 Selector ASTImporter::Import(Selector FromSel) {
4811   if (FromSel.isNull())
4812     return Selector();
4813
4814   SmallVector<IdentifierInfo *, 4> Idents;
4815   Idents.push_back(Import(FromSel.getIdentifierInfoForSlot(0)));
4816   for (unsigned I = 1, N = FromSel.getNumArgs(); I < N; ++I)
4817     Idents.push_back(Import(FromSel.getIdentifierInfoForSlot(I)));
4818   return ToContext.Selectors.getSelector(FromSel.getNumArgs(), Idents.data());
4819 }
4820
4821 DeclarationName ASTImporter::HandleNameConflict(DeclarationName Name,
4822                                                 DeclContext *DC,
4823                                                 unsigned IDNS,
4824                                                 NamedDecl **Decls,
4825                                                 unsigned NumDecls) {
4826   return Name;
4827 }
4828
4829 DiagnosticBuilder ASTImporter::ToDiag(SourceLocation Loc, unsigned DiagID) {
4830   if (LastDiagFromFrom)
4831     ToContext.getDiagnostics().notePriorDiagnosticFrom(
4832       FromContext.getDiagnostics());
4833   LastDiagFromFrom = false;
4834   return ToContext.getDiagnostics().Report(Loc, DiagID);
4835 }
4836
4837 DiagnosticBuilder ASTImporter::FromDiag(SourceLocation Loc, unsigned DiagID) {
4838   if (!LastDiagFromFrom)
4839     FromContext.getDiagnostics().notePriorDiagnosticFrom(
4840       ToContext.getDiagnostics());
4841   LastDiagFromFrom = true;
4842   return FromContext.getDiagnostics().Report(Loc, DiagID);
4843 }
4844
4845 void ASTImporter::CompleteDecl (Decl *D) {
4846   if (ObjCInterfaceDecl *ID = dyn_cast<ObjCInterfaceDecl>(D)) {
4847     if (!ID->getDefinition())
4848       ID->startDefinition();
4849   }
4850   else if (ObjCProtocolDecl *PD = dyn_cast<ObjCProtocolDecl>(D)) {
4851     if (!PD->getDefinition())
4852       PD->startDefinition();
4853   }
4854   else if (TagDecl *TD = dyn_cast<TagDecl>(D)) {
4855     if (!TD->getDefinition() && !TD->isBeingDefined()) {
4856       TD->startDefinition();
4857       TD->setCompleteDefinition(true);
4858     }
4859   }
4860   else {
4861     assert (0 && "CompleteDecl called on a Decl that can't be completed");
4862   }
4863 }
4864
4865 Decl *ASTImporter::Imported(Decl *From, Decl *To) {
4866   ImportedDecls[From] = To;
4867   return To;
4868 }
4869
4870 bool ASTImporter::IsStructurallyEquivalent(QualType From, QualType To,
4871                                            bool Complain) {
4872   llvm::DenseMap<const Type *, const Type *>::iterator Pos
4873    = ImportedTypes.find(From.getTypePtr());
4874   if (Pos != ImportedTypes.end() && ToContext.hasSameType(Import(From), To))
4875     return true;
4876       
4877   StructuralEquivalenceContext Ctx(FromContext, ToContext, NonEquivalentDecls,
4878                                    false, Complain);
4879   return Ctx.IsStructurallyEquivalent(From, To);
4880 }