]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - contrib/llvm/tools/clang/lib/AST/ASTDiagnostic.cpp
Merge ^/head r293850 through r294089.
[FreeBSD/FreeBSD.git] / contrib / llvm / tools / clang / lib / AST / ASTDiagnostic.cpp
1 //===--- ASTDiagnostic.cpp - Diagnostic Printing Hooks for AST Nodes ------===//
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 implements a diagnostic formatting hook for AST elements.
11 //
12 //===----------------------------------------------------------------------===//
13 #include "clang/AST/ASTDiagnostic.h"
14 #include "clang/AST/ASTContext.h"
15 #include "clang/AST/ASTLambda.h"
16 #include "clang/AST/Attr.h"
17 #include "clang/AST/DeclObjC.h"
18 #include "clang/AST/DeclTemplate.h"
19 #include "clang/AST/ExprCXX.h"
20 #include "clang/AST/TemplateBase.h"
21 #include "clang/AST/Type.h"
22 #include "llvm/ADT/SmallString.h"
23 #include "llvm/Support/raw_ostream.h"
24
25 using namespace clang;
26
27 // Returns a desugared version of the QualType, and marks ShouldAKA as true
28 // whenever we remove significant sugar from the type.
29 static QualType Desugar(ASTContext &Context, QualType QT, bool &ShouldAKA) {
30   QualifierCollector QC;
31
32   while (true) {
33     const Type *Ty = QC.strip(QT);
34
35     // Don't aka just because we saw an elaborated type...
36     if (const ElaboratedType *ET = dyn_cast<ElaboratedType>(Ty)) {
37       QT = ET->desugar();
38       continue;
39     }
40     // ... or a paren type ...
41     if (const ParenType *PT = dyn_cast<ParenType>(Ty)) {
42       QT = PT->desugar();
43       continue;
44     }
45     // ...or a substituted template type parameter ...
46     if (const SubstTemplateTypeParmType *ST =
47           dyn_cast<SubstTemplateTypeParmType>(Ty)) {
48       QT = ST->desugar();
49       continue;
50     }
51     // ...or an attributed type...
52     if (const AttributedType *AT = dyn_cast<AttributedType>(Ty)) {
53       QT = AT->desugar();
54       continue;
55     }
56     // ...or an adjusted type...
57     if (const AdjustedType *AT = dyn_cast<AdjustedType>(Ty)) {
58       QT = AT->desugar();
59       continue;
60     }
61     // ... or an auto type.
62     if (const AutoType *AT = dyn_cast<AutoType>(Ty)) {
63       if (!AT->isSugared())
64         break;
65       QT = AT->desugar();
66       continue;
67     }
68
69     // Desugar FunctionType if return type or any parameter type should be
70     // desugared. Preserve nullability attribute on desugared types.
71     if (const FunctionType *FT = dyn_cast<FunctionType>(Ty)) {
72       bool DesugarReturn = false;
73       QualType SugarRT = FT->getReturnType();
74       QualType RT = Desugar(Context, SugarRT, DesugarReturn);
75       if (auto nullability = AttributedType::stripOuterNullability(SugarRT)) {
76         RT = Context.getAttributedType(
77             AttributedType::getNullabilityAttrKind(*nullability), RT, RT);
78       }
79
80       bool DesugarArgument = false;
81       SmallVector<QualType, 4> Args;
82       const FunctionProtoType *FPT = dyn_cast<FunctionProtoType>(FT);
83       if (FPT) {
84         for (QualType SugarPT : FPT->param_types()) {
85           QualType PT = Desugar(Context, SugarPT, DesugarArgument);
86           if (auto nullability =
87                   AttributedType::stripOuterNullability(SugarPT)) {
88             PT = Context.getAttributedType(
89                 AttributedType::getNullabilityAttrKind(*nullability), PT, PT);
90           }
91           Args.push_back(PT);
92         }
93       }
94
95       if (DesugarReturn || DesugarArgument) {
96         ShouldAKA = true;
97         QT = FPT ? Context.getFunctionType(RT, Args, FPT->getExtProtoInfo())
98                  : Context.getFunctionNoProtoType(RT, FT->getExtInfo());
99         break;
100       }
101     }
102
103     // Desugar template specializations if any template argument should be
104     // desugared.
105     if (const TemplateSpecializationType *TST =
106             dyn_cast<TemplateSpecializationType>(Ty)) {
107       if (!TST->isTypeAlias()) {
108         bool DesugarArgument = false;
109         SmallVector<TemplateArgument, 4> Args;
110         for (unsigned I = 0, N = TST->getNumArgs(); I != N; ++I) {
111           const TemplateArgument &Arg = TST->getArg(I);
112           if (Arg.getKind() == TemplateArgument::Type)
113             Args.push_back(Desugar(Context, Arg.getAsType(), DesugarArgument));
114           else
115             Args.push_back(Arg);
116         }
117
118         if (DesugarArgument) {
119           ShouldAKA = true;
120           QT = Context.getTemplateSpecializationType(
121               TST->getTemplateName(), Args.data(), Args.size(), QT);
122         }
123         break;
124       }
125     }
126
127     // Don't desugar magic Objective-C types.
128     if (QualType(Ty,0) == Context.getObjCIdType() ||
129         QualType(Ty,0) == Context.getObjCClassType() ||
130         QualType(Ty,0) == Context.getObjCSelType() ||
131         QualType(Ty,0) == Context.getObjCProtoType())
132       break;
133
134     // Don't desugar va_list.
135     if (QualType(Ty, 0) == Context.getBuiltinVaListType() ||
136         QualType(Ty, 0) == Context.getBuiltinMSVaListType())
137       break;
138
139     // Otherwise, do a single-step desugar.
140     QualType Underlying;
141     bool IsSugar = false;
142     switch (Ty->getTypeClass()) {
143 #define ABSTRACT_TYPE(Class, Base)
144 #define TYPE(Class, Base) \
145 case Type::Class: { \
146 const Class##Type *CTy = cast<Class##Type>(Ty); \
147 if (CTy->isSugared()) { \
148 IsSugar = true; \
149 Underlying = CTy->desugar(); \
150 } \
151 break; \
152 }
153 #include "clang/AST/TypeNodes.def"
154     }
155
156     // If it wasn't sugared, we're done.
157     if (!IsSugar)
158       break;
159
160     // If the desugared type is a vector type, we don't want to expand
161     // it, it will turn into an attribute mess. People want their "vec4".
162     if (isa<VectorType>(Underlying))
163       break;
164
165     // Don't desugar through the primary typedef of an anonymous type.
166     if (const TagType *UTT = Underlying->getAs<TagType>())
167       if (const TypedefType *QTT = dyn_cast<TypedefType>(QT))
168         if (UTT->getDecl()->getTypedefNameForAnonDecl() == QTT->getDecl())
169           break;
170
171     // Record that we actually looked through an opaque type here.
172     ShouldAKA = true;
173     QT = Underlying;
174   }
175
176   // If we have a pointer-like type, desugar the pointee as well.
177   // FIXME: Handle other pointer-like types.
178   if (const PointerType *Ty = QT->getAs<PointerType>()) {
179     QT = Context.getPointerType(Desugar(Context, Ty->getPointeeType(),
180                                         ShouldAKA));
181   } else if (const auto *Ty = QT->getAs<ObjCObjectPointerType>()) {
182     QT = Context.getObjCObjectPointerType(Desugar(Context, Ty->getPointeeType(),
183                                                   ShouldAKA));
184   } else if (const LValueReferenceType *Ty = QT->getAs<LValueReferenceType>()) {
185     QT = Context.getLValueReferenceType(Desugar(Context, Ty->getPointeeType(),
186                                                 ShouldAKA));
187   } else if (const RValueReferenceType *Ty = QT->getAs<RValueReferenceType>()) {
188     QT = Context.getRValueReferenceType(Desugar(Context, Ty->getPointeeType(),
189                                                 ShouldAKA));
190   } else if (const auto *Ty = QT->getAs<ObjCObjectType>()) {
191     if (Ty->getBaseType().getTypePtr() != Ty && !ShouldAKA) {
192       QualType BaseType = Desugar(Context, Ty->getBaseType(), ShouldAKA);
193       QT = Context.getObjCObjectType(BaseType, Ty->getTypeArgsAsWritten(),
194                                      llvm::makeArrayRef(Ty->qual_begin(),
195                                                         Ty->getNumProtocols()),
196                                      Ty->isKindOfTypeAsWritten());
197     }
198   }
199
200   return QC.apply(Context, QT);
201 }
202
203 /// \brief Convert the given type to a string suitable for printing as part of 
204 /// a diagnostic.
205 ///
206 /// There are four main criteria when determining whether we should have an
207 /// a.k.a. clause when pretty-printing a type:
208 ///
209 /// 1) Some types provide very minimal sugar that doesn't impede the
210 ///    user's understanding --- for example, elaborated type
211 ///    specifiers.  If this is all the sugar we see, we don't want an
212 ///    a.k.a. clause.
213 /// 2) Some types are technically sugared but are much more familiar
214 ///    when seen in their sugared form --- for example, va_list,
215 ///    vector types, and the magic Objective C types.  We don't
216 ///    want to desugar these, even if we do produce an a.k.a. clause.
217 /// 3) Some types may have already been desugared previously in this diagnostic.
218 ///    if this is the case, doing another "aka" would just be clutter.
219 /// 4) Two different types within the same diagnostic have the same output
220 ///    string.  In this case, force an a.k.a with the desugared type when
221 ///    doing so will provide additional information.
222 ///
223 /// \param Context the context in which the type was allocated
224 /// \param Ty the type to print
225 /// \param QualTypeVals pointer values to QualTypes which are used in the
226 /// diagnostic message
227 static std::string
228 ConvertTypeToDiagnosticString(ASTContext &Context, QualType Ty,
229                             ArrayRef<DiagnosticsEngine::ArgumentValue> PrevArgs,
230                             ArrayRef<intptr_t> QualTypeVals) {
231   // FIXME: Playing with std::string is really slow.
232   bool ForceAKA = false;
233   QualType CanTy = Ty.getCanonicalType();
234   std::string S = Ty.getAsString(Context.getPrintingPolicy());
235   std::string CanS = CanTy.getAsString(Context.getPrintingPolicy());
236
237   for (unsigned I = 0, E = QualTypeVals.size(); I != E; ++I) {
238     QualType CompareTy =
239         QualType::getFromOpaquePtr(reinterpret_cast<void*>(QualTypeVals[I]));
240     if (CompareTy.isNull())
241       continue;
242     if (CompareTy == Ty)
243       continue;  // Same types
244     QualType CompareCanTy = CompareTy.getCanonicalType();
245     if (CompareCanTy == CanTy)
246       continue;  // Same canonical types
247     std::string CompareS = CompareTy.getAsString(Context.getPrintingPolicy());
248     bool ShouldAKA = false;
249     QualType CompareDesugar = Desugar(Context, CompareTy, ShouldAKA);
250     std::string CompareDesugarStr =
251         CompareDesugar.getAsString(Context.getPrintingPolicy());
252     if (CompareS != S && CompareDesugarStr != S)
253       continue;  // The type string is different than the comparison string
254                  // and the desugared comparison string.
255     std::string CompareCanS =
256         CompareCanTy.getAsString(Context.getPrintingPolicy());
257     
258     if (CompareCanS == CanS)
259       continue;  // No new info from canonical type
260
261     ForceAKA = true;
262     break;
263   }
264
265   // Check to see if we already desugared this type in this
266   // diagnostic.  If so, don't do it again.
267   bool Repeated = false;
268   for (unsigned i = 0, e = PrevArgs.size(); i != e; ++i) {
269     // TODO: Handle ak_declcontext case.
270     if (PrevArgs[i].first == DiagnosticsEngine::ak_qualtype) {
271       void *Ptr = (void*)PrevArgs[i].second;
272       QualType PrevTy(QualType::getFromOpaquePtr(Ptr));
273       if (PrevTy == Ty) {
274         Repeated = true;
275         break;
276       }
277     }
278   }
279
280   // Consider producing an a.k.a. clause if removing all the direct
281   // sugar gives us something "significantly different".
282   if (!Repeated) {
283     bool ShouldAKA = false;
284     QualType DesugaredTy = Desugar(Context, Ty, ShouldAKA);
285     if (ShouldAKA || ForceAKA) {
286       if (DesugaredTy == Ty) {
287         DesugaredTy = Ty.getCanonicalType();
288       }
289       std::string akaStr = DesugaredTy.getAsString(Context.getPrintingPolicy());
290       if (akaStr != S) {
291         S = "'" + S + "' (aka '" + akaStr + "')";
292         return S;
293       }
294     }
295
296     // Give some additional info on vector types. These are either not desugared
297     // or displaying complex __attribute__ expressions so add details of the
298     // type and element count.
299     if (Ty->isVectorType()) {
300       const VectorType *VTy = Ty->getAs<VectorType>();
301       std::string DecoratedString;
302       llvm::raw_string_ostream OS(DecoratedString);
303       const char *Values = VTy->getNumElements() > 1 ? "values" : "value";
304       OS << "'" << S << "' (vector of " << VTy->getNumElements() << " '"
305          << VTy->getElementType().getAsString(Context.getPrintingPolicy())
306          << "' " << Values << ")";
307       return OS.str();
308     }
309   }
310
311   S = "'" + S + "'";
312   return S;
313 }
314
315 static bool FormatTemplateTypeDiff(ASTContext &Context, QualType FromType,
316                                    QualType ToType, bool PrintTree,
317                                    bool PrintFromType, bool ElideType,
318                                    bool ShowColors, raw_ostream &OS);
319
320 void clang::FormatASTNodeDiagnosticArgument(
321     DiagnosticsEngine::ArgumentKind Kind,
322     intptr_t Val,
323     StringRef Modifier,
324     StringRef Argument,
325     ArrayRef<DiagnosticsEngine::ArgumentValue> PrevArgs,
326     SmallVectorImpl<char> &Output,
327     void *Cookie,
328     ArrayRef<intptr_t> QualTypeVals) {
329   ASTContext &Context = *static_cast<ASTContext*>(Cookie);
330   
331   size_t OldEnd = Output.size();
332   llvm::raw_svector_ostream OS(Output);
333   bool NeedQuotes = true;
334   
335   switch (Kind) {
336     default: llvm_unreachable("unknown ArgumentKind");
337     case DiagnosticsEngine::ak_qualtype_pair: {
338       TemplateDiffTypes &TDT = *reinterpret_cast<TemplateDiffTypes*>(Val);
339       QualType FromType =
340           QualType::getFromOpaquePtr(reinterpret_cast<void*>(TDT.FromType));
341       QualType ToType =
342           QualType::getFromOpaquePtr(reinterpret_cast<void*>(TDT.ToType));
343
344       if (FormatTemplateTypeDiff(Context, FromType, ToType, TDT.PrintTree,
345                                  TDT.PrintFromType, TDT.ElideType,
346                                  TDT.ShowColors, OS)) {
347         NeedQuotes = !TDT.PrintTree;
348         TDT.TemplateDiffUsed = true;
349         break;
350       }
351
352       // Don't fall-back during tree printing.  The caller will handle
353       // this case.
354       if (TDT.PrintTree)
355         return;
356
357       // Attempting to do a template diff on non-templates.  Set the variables
358       // and continue with regular type printing of the appropriate type.
359       Val = TDT.PrintFromType ? TDT.FromType : TDT.ToType;
360       Modifier = StringRef();
361       Argument = StringRef();
362       // Fall through
363     }
364     case DiagnosticsEngine::ak_qualtype: {
365       assert(Modifier.empty() && Argument.empty() &&
366              "Invalid modifier for QualType argument");
367       
368       QualType Ty(QualType::getFromOpaquePtr(reinterpret_cast<void*>(Val)));
369       OS << ConvertTypeToDiagnosticString(Context, Ty, PrevArgs, QualTypeVals);
370       NeedQuotes = false;
371       break;
372     }
373     case DiagnosticsEngine::ak_declarationname: {
374       if (Modifier == "objcclass" && Argument.empty())
375         OS << '+';
376       else if (Modifier == "objcinstance" && Argument.empty())
377         OS << '-';
378       else
379         assert(Modifier.empty() && Argument.empty() &&
380                "Invalid modifier for DeclarationName argument");
381
382       OS << DeclarationName::getFromOpaqueInteger(Val);
383       break;
384     }
385     case DiagnosticsEngine::ak_nameddecl: {
386       bool Qualified;
387       if (Modifier == "q" && Argument.empty())
388         Qualified = true;
389       else {
390         assert(Modifier.empty() && Argument.empty() &&
391                "Invalid modifier for NamedDecl* argument");
392         Qualified = false;
393       }
394       const NamedDecl *ND = reinterpret_cast<const NamedDecl*>(Val);
395       ND->getNameForDiagnostic(OS, Context.getPrintingPolicy(), Qualified);
396       break;
397     }
398     case DiagnosticsEngine::ak_nestednamespec: {
399       NestedNameSpecifier *NNS = reinterpret_cast<NestedNameSpecifier*>(Val);
400       NNS->print(OS, Context.getPrintingPolicy());
401       NeedQuotes = false;
402       break;
403     }
404     case DiagnosticsEngine::ak_declcontext: {
405       DeclContext *DC = reinterpret_cast<DeclContext *> (Val);
406       assert(DC && "Should never have a null declaration context");
407       NeedQuotes = false;
408
409       // FIXME: Get the strings for DeclContext from some localized place
410       if (DC->isTranslationUnit()) {
411         if (Context.getLangOpts().CPlusPlus)
412           OS << "the global namespace";
413         else
414           OS << "the global scope";
415       } else if (DC->isClosure()) {
416         OS << "block literal";
417       } else if (isLambdaCallOperator(DC)) {
418         OS << "lambda expression";
419       } else if (TypeDecl *Type = dyn_cast<TypeDecl>(DC)) {
420         OS << ConvertTypeToDiagnosticString(Context,
421                                             Context.getTypeDeclType(Type),
422                                             PrevArgs, QualTypeVals);
423       } else {
424         assert(isa<NamedDecl>(DC) && "Expected a NamedDecl");
425         NamedDecl *ND = cast<NamedDecl>(DC);
426         if (isa<NamespaceDecl>(ND))
427           OS << "namespace ";
428         else if (isa<ObjCMethodDecl>(ND))
429           OS << "method ";
430         else if (isa<FunctionDecl>(ND))
431           OS << "function ";
432
433         OS << '\'';
434         ND->getNameForDiagnostic(OS, Context.getPrintingPolicy(), true);
435         OS << '\'';
436       }
437       break;
438     }
439     case DiagnosticsEngine::ak_attr: {
440       const Attr *At = reinterpret_cast<Attr *>(Val);
441       assert(At && "Received null Attr object!");
442       OS << '\'' << At->getSpelling() << '\'';
443       NeedQuotes = false;
444       break;
445     }
446
447   }
448
449   if (NeedQuotes) {
450     Output.insert(Output.begin()+OldEnd, '\'');
451     Output.push_back('\'');
452   }
453 }
454
455 /// TemplateDiff - A class that constructs a pretty string for a pair of
456 /// QualTypes.  For the pair of types, a diff tree will be created containing
457 /// all the information about the templates and template arguments.  Afterwards,
458 /// the tree is transformed to a string according to the options passed in.
459 namespace {
460 class TemplateDiff {
461   /// Context - The ASTContext which is used for comparing template arguments.
462   ASTContext &Context;
463
464   /// Policy - Used during expression printing.
465   PrintingPolicy Policy;
466
467   /// ElideType - Option to elide identical types.
468   bool ElideType;
469
470   /// PrintTree - Format output string as a tree.
471   bool PrintTree;
472
473   /// ShowColor - Diagnostics support color, so bolding will be used.
474   bool ShowColor;
475
476   /// FromType - When single type printing is selected, this is the type to be
477   /// be printed.  When tree printing is selected, this type will show up first
478   /// in the tree.
479   QualType FromType;
480
481   /// ToType - The type that FromType is compared to.  Only in tree printing
482   /// will this type be outputed.
483   QualType ToType;
484
485   /// OS - The stream used to construct the output strings.
486   raw_ostream &OS;
487
488   /// IsBold - Keeps track of the bold formatting for the output string.
489   bool IsBold;
490
491   /// DiffTree - A tree representation the differences between two types.
492   class DiffTree {
493   public:
494     /// DiffKind - The difference in a DiffNode and which fields are used.
495     enum DiffKind {
496       /// Incomplete or invalid node.
497       Invalid,
498       /// Another level of templates, uses TemplateDecl and Qualifiers
499       Template,
500       /// Type difference, uses QualType
501       Type,
502       /// Expression difference, uses Expr
503       Expression,
504       /// Template argument difference, uses TemplateDecl
505       TemplateTemplate,
506       /// Integer difference, uses APSInt and Expr
507       Integer,
508       /// Declaration difference, uses ValueDecl
509       Declaration
510     };
511   private:
512     /// DiffNode - The root node stores the original type.  Each child node
513     /// stores template arguments of their parents.  For templated types, the
514     /// template decl is also stored.
515     struct DiffNode {
516       DiffKind Kind;
517
518       /// NextNode - The index of the next sibling node or 0.
519       unsigned NextNode;
520
521       /// ChildNode - The index of the first child node or 0.
522       unsigned ChildNode;
523
524       /// ParentNode - The index of the parent node.
525       unsigned ParentNode;
526
527       /// FromType, ToType - The type arguments.
528       QualType FromType, ToType;
529
530       /// FromExpr, ToExpr - The expression arguments.
531       Expr *FromExpr, *ToExpr;
532
533       /// FromNullPtr, ToNullPtr - If the template argument is a nullptr
534       bool FromNullPtr, ToNullPtr;
535
536       /// FromTD, ToTD - The template decl for template template
537       /// arguments or the type arguments that are templates.
538       TemplateDecl *FromTD, *ToTD;
539
540       /// FromQual, ToQual - Qualifiers for template types.
541       Qualifiers FromQual, ToQual;
542
543       /// FromInt, ToInt - APSInt's for integral arguments.
544       llvm::APSInt FromInt, ToInt;
545
546       /// IsValidFromInt, IsValidToInt - Whether the APSInt's are valid.
547       bool IsValidFromInt, IsValidToInt;
548
549       /// FromValueDecl, ToValueDecl - Whether the argument is a decl.
550       ValueDecl *FromValueDecl, *ToValueDecl;
551
552       /// FromAddressOf, ToAddressOf - Whether the ValueDecl needs an address of
553       /// operator before it.
554       bool FromAddressOf, ToAddressOf;
555
556       /// FromDefault, ToDefault - Whether the argument is a default argument.
557       bool FromDefault, ToDefault;
558
559       /// Same - Whether the two arguments evaluate to the same value.
560       bool Same;
561
562       DiffNode(unsigned ParentNode = 0)
563         : Kind(Invalid), NextNode(0), ChildNode(0), ParentNode(ParentNode),
564           FromType(), ToType(), FromExpr(nullptr), ToExpr(nullptr),
565           FromNullPtr(false), ToNullPtr(false),
566           FromTD(nullptr), ToTD(nullptr), IsValidFromInt(false),
567           IsValidToInt(false), FromValueDecl(nullptr), ToValueDecl(nullptr),
568           FromAddressOf(false), ToAddressOf(false), FromDefault(false),
569           ToDefault(false), Same(false) {}
570     };
571
572     /// FlatTree - A flattened tree used to store the DiffNodes.
573     SmallVector<DiffNode, 16> FlatTree;
574
575     /// CurrentNode - The index of the current node being used.
576     unsigned CurrentNode;
577
578     /// NextFreeNode - The index of the next unused node.  Used when creating
579     /// child nodes.
580     unsigned NextFreeNode;
581
582     /// ReadNode - The index of the current node being read.
583     unsigned ReadNode;
584   
585   public:
586     DiffTree() :
587         CurrentNode(0), NextFreeNode(1) {
588       FlatTree.push_back(DiffNode());
589     }
590
591     // Node writing functions.
592     /// SetNode - Sets FromTD and ToTD of the current node.
593     void SetNode(TemplateDecl *FromTD, TemplateDecl *ToTD) {
594       FlatTree[CurrentNode].FromTD = FromTD;
595       FlatTree[CurrentNode].ToTD = ToTD;
596     }
597
598     /// SetNode - Sets FromType and ToType of the current node.
599     void SetNode(QualType FromType, QualType ToType) {
600       FlatTree[CurrentNode].FromType = FromType;
601       FlatTree[CurrentNode].ToType = ToType;
602     }
603
604     /// SetNode - Set FromExpr and ToExpr of the current node.
605     void SetNode(Expr *FromExpr, Expr *ToExpr) {
606       FlatTree[CurrentNode].FromExpr = FromExpr;
607       FlatTree[CurrentNode].ToExpr = ToExpr;
608     }
609
610     /// SetNode - Set FromInt and ToInt of the current node.
611     void SetNode(llvm::APSInt FromInt, llvm::APSInt ToInt,
612                  bool IsValidFromInt, bool IsValidToInt) {
613       FlatTree[CurrentNode].FromInt = FromInt;
614       FlatTree[CurrentNode].ToInt = ToInt;
615       FlatTree[CurrentNode].IsValidFromInt = IsValidFromInt;
616       FlatTree[CurrentNode].IsValidToInt = IsValidToInt;
617     }
618
619     /// SetNode - Set FromQual and ToQual of the current node.
620     void SetNode(Qualifiers FromQual, Qualifiers ToQual) {
621       FlatTree[CurrentNode].FromQual = FromQual;
622       FlatTree[CurrentNode].ToQual = ToQual;
623     }
624
625     /// SetNode - Set FromValueDecl and ToValueDecl of the current node.
626     void SetNode(ValueDecl *FromValueDecl, ValueDecl *ToValueDecl,
627                  bool FromAddressOf, bool ToAddressOf) {
628       FlatTree[CurrentNode].FromValueDecl = FromValueDecl;
629       FlatTree[CurrentNode].ToValueDecl = ToValueDecl;
630       FlatTree[CurrentNode].FromAddressOf = FromAddressOf;
631       FlatTree[CurrentNode].ToAddressOf = ToAddressOf;
632     }
633
634     /// SetSame - Sets the same flag of the current node.
635     void SetSame(bool Same) {
636       FlatTree[CurrentNode].Same = Same;
637     }
638
639     /// SetNullPtr - Sets the NullPtr flags of the current node.
640     void SetNullPtr(bool FromNullPtr, bool ToNullPtr) {
641       FlatTree[CurrentNode].FromNullPtr = FromNullPtr;
642       FlatTree[CurrentNode].ToNullPtr = ToNullPtr;
643     }
644
645     /// SetDefault - Sets FromDefault and ToDefault flags of the current node.
646     void SetDefault(bool FromDefault, bool ToDefault) {
647       FlatTree[CurrentNode].FromDefault = FromDefault;
648       FlatTree[CurrentNode].ToDefault = ToDefault;
649     }
650
651     /// SetKind - Sets the current node's type.
652     void SetKind(DiffKind Kind) {
653       FlatTree[CurrentNode].Kind = Kind;
654     }
655
656     /// Up - Changes the node to the parent of the current node.
657     void Up() {
658       CurrentNode = FlatTree[CurrentNode].ParentNode;
659     }
660
661     /// AddNode - Adds a child node to the current node, then sets that node
662     /// node as the current node.
663     void AddNode() {
664       FlatTree.push_back(DiffNode(CurrentNode));
665       DiffNode &Node = FlatTree[CurrentNode];
666       if (Node.ChildNode == 0) {
667         // If a child node doesn't exist, add one.
668         Node.ChildNode = NextFreeNode;
669       } else {
670         // If a child node exists, find the last child node and add a
671         // next node to it.
672         unsigned i;
673         for (i = Node.ChildNode; FlatTree[i].NextNode != 0;
674              i = FlatTree[i].NextNode) {
675         }
676         FlatTree[i].NextNode = NextFreeNode;
677       }
678       CurrentNode = NextFreeNode;
679       ++NextFreeNode;
680     }
681
682     // Node reading functions.
683     /// StartTraverse - Prepares the tree for recursive traversal.
684     void StartTraverse() {
685       ReadNode = 0;
686       CurrentNode = NextFreeNode;
687       NextFreeNode = 0;
688     }
689
690     /// Parent - Move the current read node to its parent.
691     void Parent() {
692       ReadNode = FlatTree[ReadNode].ParentNode;
693     }
694
695     /// GetNode - Gets the FromType and ToType.
696     void GetNode(QualType &FromType, QualType &ToType) {
697       FromType = FlatTree[ReadNode].FromType;
698       ToType = FlatTree[ReadNode].ToType;
699     }
700
701     /// GetNode - Gets the FromExpr and ToExpr.
702     void GetNode(Expr *&FromExpr, Expr *&ToExpr) {
703       FromExpr = FlatTree[ReadNode].FromExpr;
704       ToExpr = FlatTree[ReadNode].ToExpr;
705     }
706
707     /// GetNode - Gets the FromTD and ToTD.
708     void GetNode(TemplateDecl *&FromTD, TemplateDecl *&ToTD) {
709       FromTD = FlatTree[ReadNode].FromTD;
710       ToTD = FlatTree[ReadNode].ToTD;
711     }
712
713     /// GetNode - Gets the FromInt and ToInt.
714     void GetNode(llvm::APSInt &FromInt, llvm::APSInt &ToInt,
715                  bool &IsValidFromInt, bool &IsValidToInt) {
716       FromInt = FlatTree[ReadNode].FromInt;
717       ToInt = FlatTree[ReadNode].ToInt;
718       IsValidFromInt = FlatTree[ReadNode].IsValidFromInt;
719       IsValidToInt = FlatTree[ReadNode].IsValidToInt;
720     }
721
722     /// GetNode - Gets the FromQual and ToQual.
723     void GetNode(Qualifiers &FromQual, Qualifiers &ToQual) {
724       FromQual = FlatTree[ReadNode].FromQual;
725       ToQual = FlatTree[ReadNode].ToQual;
726     }
727
728     /// GetNode - Gets the FromValueDecl and ToValueDecl.
729     void GetNode(ValueDecl *&FromValueDecl, ValueDecl *&ToValueDecl,
730                  bool &FromAddressOf, bool &ToAddressOf) {
731       FromValueDecl = FlatTree[ReadNode].FromValueDecl;
732       ToValueDecl = FlatTree[ReadNode].ToValueDecl;
733       FromAddressOf = FlatTree[ReadNode].FromAddressOf;
734       ToAddressOf = FlatTree[ReadNode].ToAddressOf;
735     }
736
737     /// NodeIsSame - Returns true the arguments are the same.
738     bool NodeIsSame() {
739       return FlatTree[ReadNode].Same;
740     }
741
742     /// HasChildrend - Returns true if the node has children.
743     bool HasChildren() {
744       return FlatTree[ReadNode].ChildNode != 0;
745     }
746
747     /// MoveToChild - Moves from the current node to its child.
748     void MoveToChild() {
749       ReadNode = FlatTree[ReadNode].ChildNode;
750     }
751
752     /// AdvanceSibling - If there is a next sibling, advance to it and return
753     /// true.  Otherwise, return false.
754     bool AdvanceSibling() {
755       if (FlatTree[ReadNode].NextNode == 0)
756         return false;
757
758       ReadNode = FlatTree[ReadNode].NextNode;
759       return true;
760     }
761
762     /// HasNextSibling - Return true if the node has a next sibling.
763     bool HasNextSibling() {
764       return FlatTree[ReadNode].NextNode != 0;
765     }
766
767     /// FromNullPtr - Returns true if the from argument is null.
768     bool FromNullPtr() {
769       return FlatTree[ReadNode].FromNullPtr;
770     }
771
772     /// ToNullPtr - Returns true if the to argument is null.
773     bool ToNullPtr() {
774       return FlatTree[ReadNode].ToNullPtr;
775     }
776
777     /// FromDefault - Return true if the from argument is the default.
778     bool FromDefault() {
779       return FlatTree[ReadNode].FromDefault;
780     }
781
782     /// ToDefault - Return true if the to argument is the default.
783     bool ToDefault() {
784       return FlatTree[ReadNode].ToDefault;
785     }
786
787     /// Empty - Returns true if the tree has no information.
788     bool Empty() {
789       return GetKind() == Invalid;
790     }
791
792     /// GetKind - Returns the current node's type.
793     DiffKind GetKind() {
794       return FlatTree[ReadNode].Kind;
795     }
796   };
797
798   DiffTree Tree;
799
800   /// TSTiterator - an iterator that is used to enter a
801   /// TemplateSpecializationType and read TemplateArguments inside template
802   /// parameter packs in order with the rest of the TemplateArguments.
803   struct TSTiterator {
804     typedef const TemplateArgument& reference;
805     typedef const TemplateArgument* pointer;
806
807     /// TST - the template specialization whose arguments this iterator
808     /// traverse over.
809     const TemplateSpecializationType *TST;
810
811     /// DesugarTST - desugared template specialization used to extract
812     /// default argument information
813     const TemplateSpecializationType *DesugarTST;
814
815     /// Index - the index of the template argument in TST.
816     unsigned Index;
817
818     /// CurrentTA - if CurrentTA is not the same as EndTA, then CurrentTA
819     /// points to a TemplateArgument within a parameter pack.
820     TemplateArgument::pack_iterator CurrentTA;
821
822     /// EndTA - the end iterator of a parameter pack
823     TemplateArgument::pack_iterator EndTA;
824
825     /// TSTiterator - Constructs an iterator and sets it to the first template
826     /// argument.
827     TSTiterator(ASTContext &Context, const TemplateSpecializationType *TST)
828         : TST(TST),
829           DesugarTST(GetTemplateSpecializationType(Context, TST->desugar())),
830           Index(0), CurrentTA(nullptr), EndTA(nullptr) {
831       if (isEnd()) return;
832
833       // Set to first template argument.  If not a parameter pack, done.
834       TemplateArgument TA = TST->getArg(0);
835       if (TA.getKind() != TemplateArgument::Pack) return;
836
837       // Start looking into the parameter pack.
838       CurrentTA = TA.pack_begin();
839       EndTA = TA.pack_end();
840
841       // Found a valid template argument.
842       if (CurrentTA != EndTA) return;
843
844       // Parameter pack is empty, use the increment to get to a valid
845       // template argument.
846       ++(*this);
847     }
848
849     /// isEnd - Returns true if the iterator is one past the end.
850     bool isEnd() const {
851       return Index >= TST->getNumArgs();
852     }
853
854     /// &operator++ - Increment the iterator to the next template argument.
855     TSTiterator &operator++() {
856       // After the end, Index should be the default argument position in
857       // DesugarTST, if it exists.
858       if (isEnd()) {
859         ++Index;
860         return *this;
861       }
862
863       // If in a parameter pack, advance in the parameter pack.
864       if (CurrentTA != EndTA) {
865         ++CurrentTA;
866         if (CurrentTA != EndTA)
867           return *this;
868       }
869
870       // Loop until a template argument is found, or the end is reached.
871       while (true) {
872         // Advance to the next template argument.  Break if reached the end.
873         if (++Index == TST->getNumArgs()) break;
874
875         // If the TemplateArgument is not a parameter pack, done.
876         TemplateArgument TA = TST->getArg(Index);
877         if (TA.getKind() != TemplateArgument::Pack) break;
878
879         // Handle parameter packs.
880         CurrentTA = TA.pack_begin();
881         EndTA = TA.pack_end();
882
883         // If the parameter pack is empty, try to advance again.
884         if (CurrentTA != EndTA) break;
885       }
886       return *this;
887     }
888
889     /// operator* - Returns the appropriate TemplateArgument.
890     reference operator*() const {
891       assert(!isEnd() && "Index exceeds number of arguments.");
892       if (CurrentTA == EndTA)
893         return TST->getArg(Index);
894       else
895         return *CurrentTA;
896     }
897
898     /// operator-> - Allow access to the underlying TemplateArgument.
899     pointer operator->() const {
900       return &operator*();
901     }
902
903     /// getDesugar - Returns the deduced template argument from DesguarTST
904     reference getDesugar() const {
905       return DesugarTST->getArg(Index);
906     }
907   };
908
909   // These functions build up the template diff tree, including functions to
910   // retrieve and compare template arguments. 
911
912   static const TemplateSpecializationType * GetTemplateSpecializationType(
913       ASTContext &Context, QualType Ty) {
914     if (const TemplateSpecializationType *TST =
915             Ty->getAs<TemplateSpecializationType>())
916       return TST;
917
918     const RecordType *RT = Ty->getAs<RecordType>();
919
920     if (!RT)
921       return nullptr;
922
923     const ClassTemplateSpecializationDecl *CTSD =
924         dyn_cast<ClassTemplateSpecializationDecl>(RT->getDecl());
925
926     if (!CTSD)
927       return nullptr;
928
929     Ty = Context.getTemplateSpecializationType(
930              TemplateName(CTSD->getSpecializedTemplate()),
931              CTSD->getTemplateArgs().data(),
932              CTSD->getTemplateArgs().size(),
933              Ty.getLocalUnqualifiedType().getCanonicalType());
934
935     return Ty->getAs<TemplateSpecializationType>();
936   }
937
938   /// DiffTypes - Fills a DiffNode with information about a type difference.
939   void DiffTypes(const TSTiterator &FromIter, const TSTiterator &ToIter,
940                  TemplateTypeParmDecl *FromDefaultTypeDecl,
941                  TemplateTypeParmDecl *ToDefaultTypeDecl) {
942     QualType FromType = GetType(FromIter, FromDefaultTypeDecl);
943     QualType ToType = GetType(ToIter, ToDefaultTypeDecl);
944
945     Tree.SetNode(FromType, ToType);
946     Tree.SetDefault(FromIter.isEnd() && !FromType.isNull(),
947                     ToIter.isEnd() && !ToType.isNull());
948     Tree.SetKind(DiffTree::Type);
949     if (FromType.isNull() || ToType.isNull())
950       return;
951
952     if (Context.hasSameType(FromType, ToType)) {
953       Tree.SetSame(true);
954       return;
955     }
956
957     const TemplateSpecializationType *FromArgTST =
958         GetTemplateSpecializationType(Context, FromType);
959     if (!FromArgTST)
960       return;
961
962     const TemplateSpecializationType *ToArgTST =
963         GetTemplateSpecializationType(Context, ToType);
964     if (!ToArgTST)
965       return;
966
967     if (!hasSameTemplate(FromArgTST, ToArgTST))
968       return;
969
970     Qualifiers FromQual = FromType.getQualifiers(),
971                ToQual = ToType.getQualifiers();
972     FromQual -= QualType(FromArgTST, 0).getQualifiers();
973     ToQual -= QualType(ToArgTST, 0).getQualifiers();
974     Tree.SetNode(FromArgTST->getTemplateName().getAsTemplateDecl(),
975                  ToArgTST->getTemplateName().getAsTemplateDecl());
976     Tree.SetNode(FromQual, ToQual);
977     Tree.SetKind(DiffTree::Template);
978     DiffTemplate(FromArgTST, ToArgTST);
979   }
980
981   /// DiffTemplateTemplates - Fills a DiffNode with information about a
982   /// template template difference.
983   void DiffTemplateTemplates(const TSTiterator &FromIter,
984                              const TSTiterator &ToIter,
985                              TemplateTemplateParmDecl *FromDefaultTemplateDecl,
986                              TemplateTemplateParmDecl *ToDefaultTemplateDecl) {
987     TemplateDecl *FromDecl = GetTemplateDecl(FromIter, FromDefaultTemplateDecl);
988     TemplateDecl *ToDecl = GetTemplateDecl(ToIter, ToDefaultTemplateDecl);
989     Tree.SetNode(FromDecl, ToDecl);
990     Tree.SetSame(FromDecl && ToDecl &&
991                  FromDecl->getCanonicalDecl() == ToDecl->getCanonicalDecl());
992     Tree.SetDefault(FromIter.isEnd() && FromDecl, ToIter.isEnd() && ToDecl);
993     Tree.SetKind(DiffTree::TemplateTemplate);
994   }
995
996   /// InitializeNonTypeDiffVariables - Helper function for DiffNonTypes
997   static void InitializeNonTypeDiffVariables(
998       ASTContext &Context, const TSTiterator &Iter,
999       NonTypeTemplateParmDecl *Default, bool &HasInt, bool &HasValueDecl,
1000       bool &IsNullPtr, Expr *&E, llvm::APSInt &Value, ValueDecl *&VD) {
1001     HasInt = !Iter.isEnd() && Iter->getKind() == TemplateArgument::Integral;
1002
1003     HasValueDecl =
1004         !Iter.isEnd() && Iter->getKind() == TemplateArgument::Declaration;
1005
1006     IsNullPtr = !Iter.isEnd() && Iter->getKind() == TemplateArgument::NullPtr;
1007
1008     if (HasInt)
1009       Value = Iter->getAsIntegral();
1010     else if (HasValueDecl)
1011       VD = Iter->getAsDecl();
1012     else if (!IsNullPtr)
1013       E = GetExpr(Iter, Default);
1014
1015     if (E && Default->getType()->isPointerType())
1016       IsNullPtr = CheckForNullPtr(Context, E);
1017   }
1018
1019   /// NeedsAddressOf - Helper function for DiffNonTypes.  Returns true if the
1020   /// ValueDecl needs a '&' when printed.
1021   static bool NeedsAddressOf(ValueDecl *VD, Expr *E,
1022                              NonTypeTemplateParmDecl *Default) {
1023     if (!VD)
1024       return false;
1025
1026     if (E) {
1027       if (UnaryOperator *UO = dyn_cast<UnaryOperator>(E->IgnoreParens())) {
1028         if (UO->getOpcode() == UO_AddrOf) {
1029           return true;
1030         }
1031       }
1032       return false;
1033     }
1034
1035     if (!Default->getType()->isReferenceType()) {
1036       return true;
1037     }
1038
1039     return false;
1040   }
1041
1042   /// DiffNonTypes - Handles any template parameters not handled by DiffTypes
1043   /// of DiffTemplatesTemplates, such as integer and declaration parameters.
1044   void DiffNonTypes(const TSTiterator &FromIter, const TSTiterator &ToIter,
1045                     NonTypeTemplateParmDecl *FromDefaultNonTypeDecl,
1046                     NonTypeTemplateParmDecl *ToDefaultNonTypeDecl) {
1047     Expr *FromExpr = nullptr, *ToExpr = nullptr;
1048     llvm::APSInt FromInt, ToInt;
1049     ValueDecl *FromValueDecl = nullptr, *ToValueDecl = nullptr;
1050     bool HasFromInt = false, HasToInt = false, HasFromValueDecl = false,
1051          HasToValueDecl = false, FromNullPtr = false, ToNullPtr = false;
1052     InitializeNonTypeDiffVariables(Context, FromIter, FromDefaultNonTypeDecl,
1053                                      HasFromInt, HasFromValueDecl, FromNullPtr,
1054                                      FromExpr, FromInt, FromValueDecl);
1055     InitializeNonTypeDiffVariables(Context, ToIter, ToDefaultNonTypeDecl,
1056                                      HasToInt, HasToValueDecl, ToNullPtr,
1057                                      ToExpr, ToInt, ToValueDecl);
1058
1059     assert(((!HasFromInt && !HasToInt) ||
1060             (!HasFromValueDecl && !HasToValueDecl)) &&
1061            "Template argument cannot be both integer and declaration");
1062
1063     if (!HasFromInt && !HasToInt && !HasFromValueDecl && !HasToValueDecl) {
1064       Tree.SetNode(FromExpr, ToExpr);
1065       Tree.SetDefault(FromIter.isEnd() && FromExpr, ToIter.isEnd() && ToExpr);
1066       if (FromDefaultNonTypeDecl->getType()->isIntegralOrEnumerationType()) {
1067         if (FromExpr)
1068           HasFromInt = GetInt(Context, FromIter, FromExpr, FromInt,
1069                               FromDefaultNonTypeDecl->getType());
1070         if (ToExpr)
1071           HasToInt = GetInt(Context, ToIter, ToExpr, ToInt,
1072                             ToDefaultNonTypeDecl->getType());
1073       }
1074       if (HasFromInt && HasToInt) {
1075         Tree.SetNode(FromInt, ToInt, HasFromInt, HasToInt);
1076         Tree.SetSame(FromInt == ToInt);
1077         Tree.SetKind(DiffTree::Integer);
1078       } else if (HasFromInt || HasToInt) {
1079         Tree.SetNode(FromInt, ToInt, HasFromInt, HasToInt);
1080         Tree.SetSame(false);
1081         Tree.SetKind(DiffTree::Integer);
1082       } else {
1083         Tree.SetSame(IsEqualExpr(Context, FromExpr, ToExpr) ||
1084                      (FromNullPtr && ToNullPtr));
1085         Tree.SetNullPtr(FromNullPtr, ToNullPtr);
1086         Tree.SetKind(DiffTree::Expression);
1087       }
1088       return;
1089     }
1090
1091     if (HasFromInt || HasToInt) {
1092       if (!HasFromInt && FromExpr)
1093         HasFromInt = GetInt(Context, FromIter, FromExpr, FromInt,
1094                             FromDefaultNonTypeDecl->getType());
1095       if (!HasToInt && ToExpr)
1096         HasToInt = GetInt(Context, ToIter, ToExpr, ToInt,
1097                           ToDefaultNonTypeDecl->getType());
1098       Tree.SetNode(FromInt, ToInt, HasFromInt, HasToInt);
1099       if (HasFromInt && HasToInt) {
1100         Tree.SetSame(FromInt == ToInt);
1101       } else {
1102         Tree.SetSame(false);
1103       }
1104       Tree.SetDefault(FromIter.isEnd() && HasFromInt,
1105                       ToIter.isEnd() && HasToInt);
1106       Tree.SetKind(DiffTree::Integer);
1107       return;
1108     }
1109
1110     if (!HasFromValueDecl && FromExpr)
1111       FromValueDecl = GetValueDecl(FromIter, FromExpr);
1112     if (!HasToValueDecl && ToExpr)
1113       ToValueDecl = GetValueDecl(ToIter, ToExpr);
1114
1115     bool FromAddressOf =
1116         NeedsAddressOf(FromValueDecl, FromExpr, FromDefaultNonTypeDecl);
1117     bool ToAddressOf =
1118         NeedsAddressOf(ToValueDecl, ToExpr, ToDefaultNonTypeDecl);
1119
1120     Tree.SetNullPtr(FromNullPtr, ToNullPtr);
1121     Tree.SetNode(FromValueDecl, ToValueDecl, FromAddressOf, ToAddressOf);
1122     Tree.SetSame(FromValueDecl && ToValueDecl &&
1123                  FromValueDecl->getCanonicalDecl() ==
1124                      ToValueDecl->getCanonicalDecl());
1125     Tree.SetDefault(FromIter.isEnd() && FromValueDecl,
1126                     ToIter.isEnd() && ToValueDecl);
1127     Tree.SetKind(DiffTree::Declaration);
1128   }
1129
1130   /// DiffTemplate - recursively visits template arguments and stores the
1131   /// argument info into a tree.
1132   void DiffTemplate(const TemplateSpecializationType *FromTST,
1133                     const TemplateSpecializationType *ToTST) {
1134     // Begin descent into diffing template tree.
1135     TemplateParameterList *ParamsFrom =
1136         FromTST->getTemplateName().getAsTemplateDecl()->getTemplateParameters();
1137     TemplateParameterList *ParamsTo =
1138         ToTST->getTemplateName().getAsTemplateDecl()->getTemplateParameters();
1139     unsigned TotalArgs = 0;
1140     for (TSTiterator FromIter(Context, FromTST), ToIter(Context, ToTST);
1141          !FromIter.isEnd() || !ToIter.isEnd(); ++TotalArgs) {
1142       Tree.AddNode();
1143
1144       // Get the parameter at index TotalArgs.  If index is larger
1145       // than the total number of parameters, then there is an
1146       // argument pack, so re-use the last parameter.
1147       unsigned FromParamIndex = std::min(TotalArgs, ParamsFrom->size() - 1);
1148       unsigned ToParamIndex = std::min(TotalArgs, ParamsTo->size() - 1);
1149       NamedDecl *FromParamND = ParamsFrom->getParam(FromParamIndex);
1150       NamedDecl *ToParamND = ParamsTo->getParam(ToParamIndex);
1151
1152       TemplateTypeParmDecl *FromDefaultTypeDecl =
1153           dyn_cast<TemplateTypeParmDecl>(FromParamND);
1154       TemplateTypeParmDecl *ToDefaultTypeDecl =
1155           dyn_cast<TemplateTypeParmDecl>(ToParamND);
1156       if (FromDefaultTypeDecl && ToDefaultTypeDecl)
1157         DiffTypes(FromIter, ToIter, FromDefaultTypeDecl, ToDefaultTypeDecl);
1158
1159       TemplateTemplateParmDecl *FromDefaultTemplateDecl =
1160           dyn_cast<TemplateTemplateParmDecl>(FromParamND);
1161       TemplateTemplateParmDecl *ToDefaultTemplateDecl =
1162           dyn_cast<TemplateTemplateParmDecl>(ToParamND);
1163       if (FromDefaultTemplateDecl && ToDefaultTemplateDecl)
1164         DiffTemplateTemplates(FromIter, ToIter, FromDefaultTemplateDecl,
1165                               ToDefaultTemplateDecl);
1166
1167       NonTypeTemplateParmDecl *FromDefaultNonTypeDecl =
1168           dyn_cast<NonTypeTemplateParmDecl>(FromParamND);
1169       NonTypeTemplateParmDecl *ToDefaultNonTypeDecl =
1170           dyn_cast<NonTypeTemplateParmDecl>(ToParamND);
1171       if (FromDefaultNonTypeDecl && ToDefaultNonTypeDecl)
1172         DiffNonTypes(FromIter, ToIter, FromDefaultNonTypeDecl,
1173                      ToDefaultNonTypeDecl);
1174
1175       ++FromIter;
1176       ++ToIter;
1177       Tree.Up();
1178     }
1179   }
1180
1181   /// makeTemplateList - Dump every template alias into the vector.
1182   static void makeTemplateList(
1183       SmallVectorImpl<const TemplateSpecializationType *> &TemplateList,
1184       const TemplateSpecializationType *TST) {
1185     while (TST) {
1186       TemplateList.push_back(TST);
1187       if (!TST->isTypeAlias())
1188         return;
1189       TST = TST->getAliasedType()->getAs<TemplateSpecializationType>();
1190     }
1191   }
1192
1193   /// hasSameBaseTemplate - Returns true when the base templates are the same,
1194   /// even if the template arguments are not.
1195   static bool hasSameBaseTemplate(const TemplateSpecializationType *FromTST,
1196                                   const TemplateSpecializationType *ToTST) {
1197     return FromTST->getTemplateName().getAsTemplateDecl()->getCanonicalDecl() ==
1198            ToTST->getTemplateName().getAsTemplateDecl()->getCanonicalDecl();
1199   }
1200
1201   /// hasSameTemplate - Returns true if both types are specialized from the
1202   /// same template declaration.  If they come from different template aliases,
1203   /// do a parallel ascension search to determine the highest template alias in
1204   /// common and set the arguments to them.
1205   static bool hasSameTemplate(const TemplateSpecializationType *&FromTST,
1206                               const TemplateSpecializationType *&ToTST) {
1207     // Check the top templates if they are the same.
1208     if (hasSameBaseTemplate(FromTST, ToTST))
1209       return true;
1210
1211     // Create vectors of template aliases.
1212     SmallVector<const TemplateSpecializationType*, 1> FromTemplateList,
1213                                                       ToTemplateList;
1214
1215     makeTemplateList(FromTemplateList, FromTST);
1216     makeTemplateList(ToTemplateList, ToTST);
1217
1218     SmallVectorImpl<const TemplateSpecializationType *>::reverse_iterator
1219         FromIter = FromTemplateList.rbegin(), FromEnd = FromTemplateList.rend(),
1220         ToIter = ToTemplateList.rbegin(), ToEnd = ToTemplateList.rend();
1221
1222     // Check if the lowest template types are the same.  If not, return.
1223     if (!hasSameBaseTemplate(*FromIter, *ToIter))
1224       return false;
1225
1226     // Begin searching up the template aliases.  The bottom most template
1227     // matches so move up until one pair does not match.  Use the template
1228     // right before that one.
1229     for (; FromIter != FromEnd && ToIter != ToEnd; ++FromIter, ++ToIter) {
1230       if (!hasSameBaseTemplate(*FromIter, *ToIter))
1231         break;
1232     }
1233
1234     FromTST = FromIter[-1];
1235     ToTST = ToIter[-1];
1236
1237     return true;
1238   }
1239
1240   /// GetType - Retrieves the template type arguments, including default
1241   /// arguments.
1242   static QualType GetType(const TSTiterator &Iter,
1243                           TemplateTypeParmDecl *DefaultTTPD) {
1244     bool isVariadic = DefaultTTPD->isParameterPack();
1245
1246     if (!Iter.isEnd())
1247       return Iter->getAsType();
1248     if (isVariadic)
1249       return QualType();
1250
1251     QualType ArgType = DefaultTTPD->getDefaultArgument();
1252     if (ArgType->isDependentType())
1253       return Iter.getDesugar().getAsType();
1254
1255     return ArgType;
1256   }
1257
1258   /// GetExpr - Retrieves the template expression argument, including default
1259   /// arguments.
1260   static Expr *GetExpr(const TSTiterator &Iter,
1261                        NonTypeTemplateParmDecl *DefaultNTTPD) {
1262     Expr *ArgExpr = nullptr;
1263     bool isVariadic = DefaultNTTPD->isParameterPack();
1264
1265     if (!Iter.isEnd())
1266       ArgExpr = Iter->getAsExpr();
1267     else if (!isVariadic)
1268       ArgExpr = DefaultNTTPD->getDefaultArgument();
1269
1270     if (ArgExpr)
1271       while (SubstNonTypeTemplateParmExpr *SNTTPE =
1272                  dyn_cast<SubstNonTypeTemplateParmExpr>(ArgExpr))
1273         ArgExpr = SNTTPE->getReplacement();
1274
1275     return ArgExpr;
1276   }
1277
1278   /// GetInt - Retrieves the template integer argument, including evaluating
1279   /// default arguments.  If the value comes from an expression, extend the
1280   /// APSInt to size of IntegerType to match the behavior in
1281   /// Sema::CheckTemplateArgument
1282   static bool GetInt(ASTContext &Context, const TSTiterator &Iter,
1283                      Expr *ArgExpr, llvm::APSInt &Int, QualType IntegerType) {
1284     // Default, value-depenedent expressions require fetching
1285     // from the desugared TemplateArgument, otherwise expression needs to
1286     // be evaluatable.
1287     if (Iter.isEnd() && ArgExpr->isValueDependent()) {
1288       switch (Iter.getDesugar().getKind()) {
1289         case TemplateArgument::Integral:
1290           Int = Iter.getDesugar().getAsIntegral();
1291           return true;
1292         case TemplateArgument::Expression:
1293           ArgExpr = Iter.getDesugar().getAsExpr();
1294           Int = ArgExpr->EvaluateKnownConstInt(Context);
1295           Int = Int.extOrTrunc(Context.getTypeSize(IntegerType));
1296           return true;
1297         default:
1298           llvm_unreachable("Unexpected template argument kind");
1299       }
1300     } else if (ArgExpr->isEvaluatable(Context)) {
1301       Int = ArgExpr->EvaluateKnownConstInt(Context);
1302       Int = Int.extOrTrunc(Context.getTypeSize(IntegerType));
1303       return true;
1304     }
1305
1306     return false;
1307   }
1308
1309   /// GetValueDecl - Retrieves the template Decl argument, including
1310   /// default expression argument.
1311   static ValueDecl *GetValueDecl(const TSTiterator &Iter, Expr *ArgExpr) {
1312     // Default, value-depenedent expressions require fetching
1313     // from the desugared TemplateArgument
1314     if (Iter.isEnd() && ArgExpr->isValueDependent())
1315       switch (Iter.getDesugar().getKind()) {
1316         case TemplateArgument::Declaration:
1317           return Iter.getDesugar().getAsDecl();
1318         case TemplateArgument::Expression:
1319           ArgExpr = Iter.getDesugar().getAsExpr();
1320           return cast<DeclRefExpr>(ArgExpr)->getDecl();
1321         default:
1322           llvm_unreachable("Unexpected template argument kind");
1323       }
1324     DeclRefExpr *DRE = dyn_cast<DeclRefExpr>(ArgExpr);
1325     if (!DRE) {
1326       UnaryOperator *UO = dyn_cast<UnaryOperator>(ArgExpr->IgnoreParens());
1327       if (!UO)
1328         return nullptr;
1329       DRE = cast<DeclRefExpr>(UO->getSubExpr());
1330     }
1331
1332     return DRE->getDecl();
1333   }
1334
1335   /// CheckForNullPtr - returns true if the expression can be evaluated as
1336   /// a null pointer
1337   static bool CheckForNullPtr(ASTContext &Context, Expr *E) {
1338     assert(E && "Expected expression");
1339
1340     E = E->IgnoreParenCasts();
1341     if (E->isNullPointerConstant(Context, Expr::NPC_ValueDependentIsNull))
1342       return true;
1343
1344     DeclRefExpr *DRE = dyn_cast<DeclRefExpr>(E);
1345     if (!DRE)
1346       return false;
1347
1348     VarDecl *VD = dyn_cast<VarDecl>(DRE->getDecl());
1349     if (!VD || !VD->hasInit())
1350       return false;
1351
1352     return VD->getInit()->IgnoreParenCasts()->isNullPointerConstant(
1353         Context, Expr::NPC_ValueDependentIsNull);
1354   }
1355
1356   /// GetTemplateDecl - Retrieves the template template arguments, including
1357   /// default arguments.
1358   static TemplateDecl *GetTemplateDecl(const TSTiterator &Iter,
1359                                 TemplateTemplateParmDecl *DefaultTTPD) {
1360     bool isVariadic = DefaultTTPD->isParameterPack();
1361
1362     TemplateArgument TA = DefaultTTPD->getDefaultArgument().getArgument();
1363     TemplateDecl *DefaultTD = nullptr;
1364     if (TA.getKind() != TemplateArgument::Null)
1365       DefaultTD = TA.getAsTemplate().getAsTemplateDecl();
1366
1367     if (!Iter.isEnd())
1368       return Iter->getAsTemplate().getAsTemplateDecl();
1369     if (!isVariadic)
1370       return DefaultTD;
1371
1372     return nullptr;
1373   }
1374
1375   /// IsEqualExpr - Returns true if the expressions evaluate to the same value.
1376   static bool IsEqualExpr(ASTContext &Context, Expr *FromExpr, Expr *ToExpr) {
1377     if (FromExpr == ToExpr)
1378       return true;
1379
1380     if (!FromExpr || !ToExpr)
1381       return false;
1382
1383     DeclRefExpr *FromDRE = dyn_cast<DeclRefExpr>(FromExpr->IgnoreParens()),
1384                 *ToDRE = dyn_cast<DeclRefExpr>(ToExpr->IgnoreParens());
1385
1386     if (FromDRE || ToDRE) {
1387       if (!FromDRE || !ToDRE)
1388         return false;
1389       return FromDRE->getDecl() == ToDRE->getDecl();
1390     }
1391
1392     Expr::EvalResult FromResult, ToResult;
1393     if (!FromExpr->EvaluateAsRValue(FromResult, Context) ||
1394         !ToExpr->EvaluateAsRValue(ToResult, Context)) {
1395       llvm::FoldingSetNodeID FromID, ToID;
1396       FromExpr->Profile(FromID, Context, true);
1397       ToExpr->Profile(ToID, Context, true);
1398       return FromID == ToID;
1399     }
1400
1401     APValue &FromVal = FromResult.Val;
1402     APValue &ToVal = ToResult.Val;
1403
1404     if (FromVal.getKind() != ToVal.getKind()) return false;
1405
1406     switch (FromVal.getKind()) {
1407       case APValue::Int:
1408         return FromVal.getInt() == ToVal.getInt();
1409       case APValue::LValue: {
1410         APValue::LValueBase FromBase = FromVal.getLValueBase();
1411         APValue::LValueBase ToBase = ToVal.getLValueBase();
1412         if (FromBase.isNull() && ToBase.isNull())
1413           return true;
1414         if (FromBase.isNull() || ToBase.isNull())
1415           return false;
1416         return FromBase.get<const ValueDecl*>() ==
1417                ToBase.get<const ValueDecl*>();
1418       }
1419       case APValue::MemberPointer:
1420         return FromVal.getMemberPointerDecl() == ToVal.getMemberPointerDecl();
1421       default:
1422         llvm_unreachable("Unknown template argument expression.");
1423     }
1424   }
1425
1426   // These functions converts the tree representation of the template
1427   // differences into the internal character vector.
1428
1429   /// TreeToString - Converts the Tree object into a character stream which
1430   /// will later be turned into the output string.
1431   void TreeToString(int Indent = 1) {
1432     if (PrintTree) {
1433       OS << '\n';
1434       OS.indent(2 * Indent);
1435       ++Indent;
1436     }
1437
1438     // Handle cases where the difference is not templates with different
1439     // arguments.
1440     switch (Tree.GetKind()) {
1441       case DiffTree::Invalid:
1442         llvm_unreachable("Template diffing failed with bad DiffNode");
1443       case DiffTree::Type: {
1444         QualType FromType, ToType;
1445         Tree.GetNode(FromType, ToType);
1446         PrintTypeNames(FromType, ToType, Tree.FromDefault(), Tree.ToDefault(),
1447                        Tree.NodeIsSame());
1448         return;
1449       }
1450       case DiffTree::Expression: {
1451         Expr *FromExpr, *ToExpr;
1452         Tree.GetNode(FromExpr, ToExpr);
1453         PrintExpr(FromExpr, ToExpr, Tree.FromNullPtr(), Tree.ToNullPtr(),
1454                   Tree.FromDefault(), Tree.ToDefault(), Tree.NodeIsSame());
1455         return;
1456       }
1457       case DiffTree::TemplateTemplate: {
1458         TemplateDecl *FromTD, *ToTD;
1459         Tree.GetNode(FromTD, ToTD);
1460         PrintTemplateTemplate(FromTD, ToTD, Tree.FromDefault(),
1461                               Tree.ToDefault(), Tree.NodeIsSame());
1462         return;
1463       }
1464       case DiffTree::Integer: {
1465         llvm::APSInt FromInt, ToInt;
1466         Expr *FromExpr, *ToExpr;
1467         bool IsValidFromInt, IsValidToInt;
1468         Tree.GetNode(FromExpr, ToExpr);
1469         Tree.GetNode(FromInt, ToInt, IsValidFromInt, IsValidToInt);
1470         PrintAPSInt(FromInt, ToInt, IsValidFromInt, IsValidToInt,
1471                     FromExpr, ToExpr, Tree.FromDefault(), Tree.ToDefault(),
1472                     Tree.NodeIsSame());
1473         return;
1474       }
1475       case DiffTree::Declaration: {
1476         ValueDecl *FromValueDecl, *ToValueDecl;
1477         bool FromAddressOf, ToAddressOf;
1478         Tree.GetNode(FromValueDecl, ToValueDecl, FromAddressOf, ToAddressOf);
1479         PrintValueDecl(FromValueDecl, ToValueDecl, FromAddressOf, ToAddressOf,
1480                        Tree.FromNullPtr(), Tree.ToNullPtr(), Tree.FromDefault(),
1481                        Tree.ToDefault(), Tree.NodeIsSame());
1482         return;
1483       }
1484       case DiffTree::Template: {
1485         // Node is root of template.  Recurse on children.
1486         TemplateDecl *FromTD, *ToTD;
1487         Tree.GetNode(FromTD, ToTD);
1488
1489         if (!Tree.HasChildren()) {
1490           // If we're dealing with a template specialization with zero
1491           // arguments, there are no children; special-case this.
1492           OS << FromTD->getNameAsString() << "<>";
1493           return;
1494         }
1495
1496         Qualifiers FromQual, ToQual;
1497         Tree.GetNode(FromQual, ToQual);
1498         PrintQualifiers(FromQual, ToQual);
1499
1500         OS << FromTD->getNameAsString() << '<'; 
1501         Tree.MoveToChild();
1502         unsigned NumElideArgs = 0;
1503         do {
1504           if (ElideType) {
1505             if (Tree.NodeIsSame()) {
1506               ++NumElideArgs;
1507               continue;
1508             }
1509             if (NumElideArgs > 0) {
1510               PrintElideArgs(NumElideArgs, Indent);
1511               NumElideArgs = 0;
1512               OS << ", ";
1513             }
1514           }
1515           TreeToString(Indent);
1516           if (Tree.HasNextSibling())
1517             OS << ", ";
1518         } while (Tree.AdvanceSibling());
1519         if (NumElideArgs > 0)
1520           PrintElideArgs(NumElideArgs, Indent);
1521
1522         Tree.Parent();
1523         OS << ">";
1524         return;
1525       }
1526     }
1527   }
1528
1529   // To signal to the text printer that a certain text needs to be bolded,
1530   // a special character is injected into the character stream which the
1531   // text printer will later strip out.
1532
1533   /// Bold - Start bolding text.
1534   void Bold() {
1535     assert(!IsBold && "Attempting to bold text that is already bold.");
1536     IsBold = true;
1537     if (ShowColor)
1538       OS << ToggleHighlight;
1539   }
1540
1541   /// Unbold - Stop bolding text.
1542   void Unbold() {
1543     assert(IsBold && "Attempting to remove bold from unbold text.");
1544     IsBold = false;
1545     if (ShowColor)
1546       OS << ToggleHighlight;
1547   }
1548
1549   // Functions to print out the arguments and highlighting the difference.
1550
1551   /// PrintTypeNames - prints the typenames, bolding differences.  Will detect
1552   /// typenames that are the same and attempt to disambiguate them by using
1553   /// canonical typenames.
1554   void PrintTypeNames(QualType FromType, QualType ToType,
1555                       bool FromDefault, bool ToDefault, bool Same) {
1556     assert((!FromType.isNull() || !ToType.isNull()) &&
1557            "Only one template argument may be missing.");
1558
1559     if (Same) {
1560       OS << FromType.getAsString(Policy);
1561       return;
1562     }
1563
1564     if (!FromType.isNull() && !ToType.isNull() &&
1565         FromType.getLocalUnqualifiedType() ==
1566         ToType.getLocalUnqualifiedType()) {
1567       Qualifiers FromQual = FromType.getLocalQualifiers(),
1568                  ToQual = ToType.getLocalQualifiers();
1569       PrintQualifiers(FromQual, ToQual);
1570       FromType.getLocalUnqualifiedType().print(OS, Policy);
1571       return;
1572     }
1573
1574     std::string FromTypeStr = FromType.isNull() ? "(no argument)"
1575                                                 : FromType.getAsString(Policy);
1576     std::string ToTypeStr = ToType.isNull() ? "(no argument)"
1577                                             : ToType.getAsString(Policy);
1578     // Switch to canonical typename if it is better.
1579     // TODO: merge this with other aka printing above.
1580     if (FromTypeStr == ToTypeStr) {
1581       std::string FromCanTypeStr =
1582           FromType.getCanonicalType().getAsString(Policy);
1583       std::string ToCanTypeStr = ToType.getCanonicalType().getAsString(Policy);
1584       if (FromCanTypeStr != ToCanTypeStr) {
1585         FromTypeStr = FromCanTypeStr;
1586         ToTypeStr = ToCanTypeStr;
1587       }
1588     }
1589
1590     if (PrintTree) OS << '[';
1591     OS << (FromDefault ? "(default) " : "");
1592     Bold();
1593     OS << FromTypeStr;
1594     Unbold();
1595     if (PrintTree) {
1596       OS << " != " << (ToDefault ? "(default) " : "");
1597       Bold();
1598       OS << ToTypeStr;
1599       Unbold();
1600       OS << "]";
1601     }
1602     return;
1603   }
1604
1605   /// PrintExpr - Prints out the expr template arguments, highlighting argument
1606   /// differences.
1607   void PrintExpr(const Expr *FromExpr, const Expr *ToExpr, bool FromNullPtr,
1608                  bool ToNullPtr, bool FromDefault, bool ToDefault, bool Same) {
1609     assert((FromExpr || ToExpr) &&
1610             "Only one template argument may be missing.");
1611     if (Same) {
1612       PrintExpr(FromExpr, FromNullPtr);
1613     } else if (!PrintTree) {
1614       OS << (FromDefault ? "(default) " : "");
1615       Bold();
1616       PrintExpr(FromExpr, FromNullPtr);
1617       Unbold();
1618     } else {
1619       OS << (FromDefault ? "[(default) " : "[");
1620       Bold();
1621       PrintExpr(FromExpr, FromNullPtr);
1622       Unbold();
1623       OS << " != " << (ToDefault ? "(default) " : "");
1624       Bold();
1625       PrintExpr(ToExpr, ToNullPtr);
1626       Unbold();
1627       OS << ']';
1628     }
1629   }
1630
1631   /// PrintExpr - Actual formatting and printing of expressions.
1632   void PrintExpr(const Expr *E, bool NullPtr = false) {
1633     if (E) {
1634       E->printPretty(OS, nullptr, Policy);
1635       return;
1636     }
1637     if (NullPtr) {
1638       OS << "nullptr";
1639       return;
1640     }
1641     OS << "(no argument)";
1642   }
1643
1644   /// PrintTemplateTemplate - Handles printing of template template arguments,
1645   /// highlighting argument differences.
1646   void PrintTemplateTemplate(TemplateDecl *FromTD, TemplateDecl *ToTD,
1647                              bool FromDefault, bool ToDefault, bool Same) {
1648     assert((FromTD || ToTD) && "Only one template argument may be missing.");
1649
1650     std::string FromName = FromTD ? FromTD->getName() : "(no argument)";
1651     std::string ToName = ToTD ? ToTD->getName() : "(no argument)";
1652     if (FromTD && ToTD && FromName == ToName) {
1653       FromName = FromTD->getQualifiedNameAsString();
1654       ToName = ToTD->getQualifiedNameAsString();
1655     }
1656
1657     if (Same) {
1658       OS << "template " << FromTD->getNameAsString();
1659     } else if (!PrintTree) {
1660       OS << (FromDefault ? "(default) template " : "template ");
1661       Bold();
1662       OS << FromName;
1663       Unbold();
1664     } else {
1665       OS << (FromDefault ? "[(default) template " : "[template ");
1666       Bold();
1667       OS << FromName;
1668       Unbold();
1669       OS << " != " << (ToDefault ? "(default) template " : "template ");
1670       Bold();
1671       OS << ToName;
1672       Unbold();
1673       OS << ']';
1674     }
1675   }
1676
1677   /// PrintAPSInt - Handles printing of integral arguments, highlighting
1678   /// argument differences.
1679   void PrintAPSInt(llvm::APSInt FromInt, llvm::APSInt ToInt,
1680                    bool IsValidFromInt, bool IsValidToInt, Expr *FromExpr,
1681                    Expr *ToExpr, bool FromDefault, bool ToDefault, bool Same) {
1682     assert((IsValidFromInt || IsValidToInt) &&
1683            "Only one integral argument may be missing.");
1684
1685     if (Same) {
1686       OS << FromInt.toString(10);
1687     } else if (!PrintTree) {
1688       OS << (FromDefault ? "(default) " : "");
1689       PrintAPSInt(FromInt, FromExpr, IsValidFromInt);
1690     } else {
1691       OS << (FromDefault ? "[(default) " : "[");
1692       PrintAPSInt(FromInt, FromExpr, IsValidFromInt);
1693       OS << " != " << (ToDefault ? "(default) " : "");
1694       PrintAPSInt(ToInt, ToExpr, IsValidToInt);
1695       OS << ']';
1696     }
1697   }
1698
1699   /// PrintAPSInt - If valid, print the APSInt.  If the expression is
1700   /// gives more information, print it too.
1701   void PrintAPSInt(llvm::APSInt Val, Expr *E, bool Valid) {
1702     Bold();
1703     if (Valid) {
1704       if (HasExtraInfo(E)) {
1705         PrintExpr(E);
1706         Unbold();
1707         OS << " aka ";
1708         Bold();
1709       }
1710       OS << Val.toString(10);
1711     } else if (E) {
1712       PrintExpr(E);
1713     } else {
1714       OS << "(no argument)";
1715     }
1716     Unbold();
1717   }
1718
1719   /// HasExtraInfo - Returns true if E is not an integer literal or the
1720   /// negation of an integer literal
1721   bool HasExtraInfo(Expr *E) {
1722     if (!E) return false;
1723
1724     E = E->IgnoreImpCasts();
1725
1726     if (isa<IntegerLiteral>(E)) return false;
1727
1728     if (UnaryOperator *UO = dyn_cast<UnaryOperator>(E))
1729       if (UO->getOpcode() == UO_Minus)
1730         if (isa<IntegerLiteral>(UO->getSubExpr()))
1731           return false;
1732
1733     return true;
1734   }
1735
1736   void PrintValueDecl(ValueDecl *VD, bool AddressOf, bool NullPtr) {
1737     if (VD) {
1738       if (AddressOf)
1739         OS << "&";
1740       OS << VD->getName();
1741       return;
1742     }
1743
1744     if (NullPtr) {
1745       OS << "nullptr";
1746       return;
1747     }
1748
1749     OS << "(no argument)";
1750   }
1751
1752   /// PrintDecl - Handles printing of Decl arguments, highlighting
1753   /// argument differences.
1754   void PrintValueDecl(ValueDecl *FromValueDecl, ValueDecl *ToValueDecl,
1755                       bool FromAddressOf, bool ToAddressOf, bool FromNullPtr,
1756                       bool ToNullPtr, bool FromDefault, bool ToDefault,
1757                       bool Same) {
1758     assert((FromValueDecl || FromNullPtr || ToValueDecl || ToNullPtr) &&
1759            "Only one Decl argument may be NULL");
1760
1761     if (Same) {
1762       PrintValueDecl(FromValueDecl, FromAddressOf, FromNullPtr);
1763     } else if (!PrintTree) {
1764       OS << (FromDefault ? "(default) " : "");
1765       Bold();
1766       PrintValueDecl(FromValueDecl, FromAddressOf, FromNullPtr);
1767       Unbold();
1768     } else {
1769       OS << (FromDefault ? "[(default) " : "[");
1770       Bold();
1771       PrintValueDecl(FromValueDecl, FromAddressOf, FromNullPtr);
1772       Unbold();
1773       OS << " != " << (ToDefault ? "(default) " : "");
1774       Bold();
1775       PrintValueDecl(ToValueDecl, ToAddressOf, ToNullPtr);
1776       Unbold();
1777       OS << ']';
1778     }
1779
1780   }
1781
1782   // Prints the appropriate placeholder for elided template arguments.
1783   void PrintElideArgs(unsigned NumElideArgs, unsigned Indent) {
1784     if (PrintTree) {
1785       OS << '\n';
1786       for (unsigned i = 0; i < Indent; ++i)
1787         OS << "  ";
1788     }
1789     if (NumElideArgs == 0) return;
1790     if (NumElideArgs == 1)
1791       OS << "[...]";
1792     else
1793       OS << "[" << NumElideArgs << " * ...]";
1794   }
1795
1796   // Prints and highlights differences in Qualifiers.
1797   void PrintQualifiers(Qualifiers FromQual, Qualifiers ToQual) {
1798     // Both types have no qualifiers
1799     if (FromQual.empty() && ToQual.empty())
1800       return;
1801
1802     // Both types have same qualifiers
1803     if (FromQual == ToQual) {
1804       PrintQualifier(FromQual, /*ApplyBold*/false);
1805       return;
1806     }
1807
1808     // Find common qualifiers and strip them from FromQual and ToQual.
1809     Qualifiers CommonQual = Qualifiers::removeCommonQualifiers(FromQual,
1810                                                                ToQual);
1811
1812     // The qualifiers are printed before the template name.
1813     // Inline printing:
1814     // The common qualifiers are printed.  Then, qualifiers only in this type
1815     // are printed and highlighted.  Finally, qualifiers only in the other
1816     // type are printed and highlighted inside parentheses after "missing".
1817     // Tree printing:
1818     // Qualifiers are printed next to each other, inside brackets, and
1819     // separated by "!=".  The printing order is:
1820     // common qualifiers, highlighted from qualifiers, "!=",
1821     // common qualifiers, highlighted to qualifiers
1822     if (PrintTree) {
1823       OS << "[";
1824       if (CommonQual.empty() && FromQual.empty()) {
1825         Bold();
1826         OS << "(no qualifiers) ";
1827         Unbold();
1828       } else {
1829         PrintQualifier(CommonQual, /*ApplyBold*/false);
1830         PrintQualifier(FromQual, /*ApplyBold*/true);
1831       }
1832       OS << "!= ";
1833       if (CommonQual.empty() && ToQual.empty()) {
1834         Bold();
1835         OS << "(no qualifiers)";
1836         Unbold();
1837       } else {
1838         PrintQualifier(CommonQual, /*ApplyBold*/false,
1839                        /*appendSpaceIfNonEmpty*/!ToQual.empty());
1840         PrintQualifier(ToQual, /*ApplyBold*/true,
1841                        /*appendSpaceIfNonEmpty*/false);
1842       }
1843       OS << "] ";
1844     } else {
1845       PrintQualifier(CommonQual, /*ApplyBold*/false);
1846       PrintQualifier(FromQual, /*ApplyBold*/true);
1847     }
1848   }
1849
1850   void PrintQualifier(Qualifiers Q, bool ApplyBold,
1851                       bool AppendSpaceIfNonEmpty = true) {
1852     if (Q.empty()) return;
1853     if (ApplyBold) Bold();
1854     Q.print(OS, Policy, AppendSpaceIfNonEmpty);
1855     if (ApplyBold) Unbold();
1856   }
1857
1858 public:
1859
1860   TemplateDiff(raw_ostream &OS, ASTContext &Context, QualType FromType,
1861                QualType ToType, bool PrintTree, bool PrintFromType,
1862                bool ElideType, bool ShowColor)
1863     : Context(Context),
1864       Policy(Context.getLangOpts()),
1865       ElideType(ElideType),
1866       PrintTree(PrintTree),
1867       ShowColor(ShowColor),
1868       // When printing a single type, the FromType is the one printed.
1869       FromType(PrintFromType ? FromType : ToType),
1870       ToType(PrintFromType ? ToType : FromType),
1871       OS(OS),
1872       IsBold(false) {
1873   }
1874
1875   /// DiffTemplate - Start the template type diffing.
1876   void DiffTemplate() {
1877     Qualifiers FromQual = FromType.getQualifiers(),
1878                ToQual = ToType.getQualifiers();
1879
1880     const TemplateSpecializationType *FromOrigTST =
1881         GetTemplateSpecializationType(Context, FromType);
1882     const TemplateSpecializationType *ToOrigTST =
1883         GetTemplateSpecializationType(Context, ToType);
1884
1885     // Only checking templates.
1886     if (!FromOrigTST || !ToOrigTST)
1887       return;
1888
1889     // Different base templates.
1890     if (!hasSameTemplate(FromOrigTST, ToOrigTST)) {
1891       return;
1892     }
1893
1894     FromQual -= QualType(FromOrigTST, 0).getQualifiers();
1895     ToQual -= QualType(ToOrigTST, 0).getQualifiers();
1896     Tree.SetNode(FromType, ToType);
1897     Tree.SetNode(FromQual, ToQual);
1898     Tree.SetKind(DiffTree::Template);
1899
1900     // Same base template, but different arguments.
1901     Tree.SetNode(FromOrigTST->getTemplateName().getAsTemplateDecl(),
1902                  ToOrigTST->getTemplateName().getAsTemplateDecl());
1903
1904     DiffTemplate(FromOrigTST, ToOrigTST);
1905   }
1906
1907   /// Emit - When the two types given are templated types with the same
1908   /// base template, a string representation of the type difference will be
1909   /// emitted to the stream and return true.  Otherwise, return false.
1910   bool Emit() {
1911     Tree.StartTraverse();
1912     if (Tree.Empty())
1913       return false;
1914
1915     TreeToString();
1916     assert(!IsBold && "Bold is applied to end of string.");
1917     return true;
1918   }
1919 }; // end class TemplateDiff
1920 }  // end namespace
1921
1922 /// FormatTemplateTypeDiff - A helper static function to start the template
1923 /// diff and return the properly formatted string.  Returns true if the diff
1924 /// is successful.
1925 static bool FormatTemplateTypeDiff(ASTContext &Context, QualType FromType,
1926                                    QualType ToType, bool PrintTree,
1927                                    bool PrintFromType, bool ElideType, 
1928                                    bool ShowColors, raw_ostream &OS) {
1929   if (PrintTree)
1930     PrintFromType = true;
1931   TemplateDiff TD(OS, Context, FromType, ToType, PrintTree, PrintFromType,
1932                   ElideType, ShowColors);
1933   TD.DiffTemplate();
1934   return TD.Emit();
1935 }