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 
14 #include "clang/AST/ASTDiagnostic.h"
15 #include "clang/AST/ASTContext.h"
16 #include "clang/AST/ASTLambda.h"
17 #include "clang/AST/Attr.h"
18 #include "clang/AST/DeclObjC.h"
19 #include "clang/AST/DeclTemplate.h"
20 #include "clang/AST/ExprCXX.h"
21 #include "clang/AST/TemplateBase.h"
22 #include "clang/AST/Type.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, 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   if (NeedQuotes) {
449     Output.insert(Output.begin()+OldEnd, '\'');
450     Output.push_back('\'');
451   }
452 }
453 
454 /// TemplateDiff - A class that constructs a pretty string for a pair of
455 /// QualTypes.  For the pair of types, a diff tree will be created containing
456 /// all the information about the templates and template arguments.  Afterwards,
457 /// the tree is transformed to a string according to the options passed in.
458 namespace {
459 class TemplateDiff {
460   /// Context - The ASTContext which is used for comparing template arguments.
461   ASTContext &Context;
462 
463   /// Policy - Used during expression printing.
464   PrintingPolicy Policy;
465 
466   /// ElideType - Option to elide identical types.
467   bool ElideType;
468 
469   /// PrintTree - Format output string as a tree.
470   bool PrintTree;
471 
472   /// ShowColor - Diagnostics support color, so bolding will be used.
473   bool ShowColor;
474 
475   /// FromTemplateType - When single type printing is selected, this is the
476   /// type to be be printed.  When tree printing is selected, this type will
477   /// show up first in the tree.
478   QualType FromTemplateType;
479 
480   /// ToTemplateType - The type that FromType is compared to.  Only in tree
481   /// printing will this type be outputed.
482   QualType ToTemplateType;
483 
484   /// OS - The stream used to construct the output strings.
485   raw_ostream &OS;
486 
487   /// IsBold - Keeps track of the bold formatting for the output string.
488   bool IsBold;
489 
490   /// DiffTree - A tree representation the differences between two types.
491   class DiffTree {
492   public:
493     /// DiffKind - The difference in a DiffNode.  Fields of
494     /// TemplateArgumentInfo needed by each difference can be found in the
495     /// Set* and Get* functions.
496     enum DiffKind {
497       /// Incomplete or invalid node.
498       Invalid,
499       /// Another level of templates
500       Template,
501       /// Type difference, all type differences except those falling under
502       /// the Template difference.
503       Type,
504       /// Expression difference, this is only when both arguments are
505       /// expressions.  If one argument is an expression and the other is
506       /// Integer or Declaration, then use that diff type instead.
507       Expression,
508       /// Template argument difference
509       TemplateTemplate,
510       /// Integer difference
511       Integer,
512       /// Declaration difference, nullptr arguments are included here
513       Declaration,
514       /// One argument being integer and the other being declaration
515       FromIntegerAndToDeclaration,
516       FromDeclarationAndToInteger
517     };
518 
519   private:
520     /// TemplateArgumentInfo - All the information needed to pretty print
521     /// a template argument.  See the Set* and Get* functions to see which
522     /// fields are used for each DiffKind.
523     struct TemplateArgumentInfo {
524       QualType ArgType;
525       Qualifiers Qual;
526       llvm::APSInt Val;
527       bool IsValidInt = false;
528       Expr *ArgExpr = nullptr;
529       TemplateDecl *TD = nullptr;
530       ValueDecl *VD = nullptr;
531       bool NeedAddressOf = false;
532       bool IsNullPtr = false;
533       bool IsDefault = false;
534     };
535 
536     /// DiffNode - The root node stores the original type.  Each child node
537     /// stores template arguments of their parents.  For templated types, the
538     /// template decl is also stored.
539     struct DiffNode {
540       DiffKind Kind = Invalid;
541 
542       /// NextNode - The index of the next sibling node or 0.
543       unsigned NextNode = 0;
544 
545       /// ChildNode - The index of the first child node or 0.
546       unsigned ChildNode = 0;
547 
548       /// ParentNode - The index of the parent node.
549       unsigned ParentNode = 0;
550 
551       TemplateArgumentInfo FromArgInfo, ToArgInfo;
552 
553       /// Same - Whether the two arguments evaluate to the same value.
554       bool Same = false;
555 
556       DiffNode(unsigned ParentNode = 0) : ParentNode(ParentNode) {}
557     };
558 
559     /// FlatTree - A flattened tree used to store the DiffNodes.
560     SmallVector<DiffNode, 16> FlatTree;
561 
562     /// CurrentNode - The index of the current node being used.
563     unsigned CurrentNode;
564 
565     /// NextFreeNode - The index of the next unused node.  Used when creating
566     /// child nodes.
567     unsigned NextFreeNode;
568 
569     /// ReadNode - The index of the current node being read.
570     unsigned ReadNode;
571 
572   public:
573     DiffTree() :
574         CurrentNode(0), NextFreeNode(1) {
575       FlatTree.push_back(DiffNode());
576     }
577 
578     // Node writing functions, one for each valid DiffKind element.
579     void SetTemplateDiff(TemplateDecl *FromTD, TemplateDecl *ToTD,
580                          Qualifiers FromQual, Qualifiers ToQual,
581                          bool FromDefault, bool ToDefault) {
582       assert(FlatTree[CurrentNode].Kind == Invalid && "Node is not empty.");
583       FlatTree[CurrentNode].Kind = Template;
584       FlatTree[CurrentNode].FromArgInfo.TD = FromTD;
585       FlatTree[CurrentNode].ToArgInfo.TD = ToTD;
586       FlatTree[CurrentNode].FromArgInfo.Qual = FromQual;
587       FlatTree[CurrentNode].ToArgInfo.Qual = ToQual;
588       SetDefault(FromDefault, ToDefault);
589     }
590 
591     void SetTypeDiff(QualType FromType, QualType ToType, bool FromDefault,
592                      bool ToDefault) {
593       assert(FlatTree[CurrentNode].Kind == Invalid && "Node is not empty.");
594       FlatTree[CurrentNode].Kind = Type;
595       FlatTree[CurrentNode].FromArgInfo.ArgType = FromType;
596       FlatTree[CurrentNode].ToArgInfo.ArgType = ToType;
597       SetDefault(FromDefault, ToDefault);
598     }
599 
600     void SetExpressionDiff(Expr *FromExpr, Expr *ToExpr, bool FromDefault,
601                            bool ToDefault) {
602       assert(FlatTree[CurrentNode].Kind == Invalid && "Node is not empty.");
603       FlatTree[CurrentNode].Kind = Expression;
604       FlatTree[CurrentNode].FromArgInfo.ArgExpr = FromExpr;
605       FlatTree[CurrentNode].ToArgInfo.ArgExpr = ToExpr;
606       SetDefault(FromDefault, ToDefault);
607     }
608 
609     void SetTemplateTemplateDiff(TemplateDecl *FromTD, TemplateDecl *ToTD,
610                                  bool FromDefault, bool ToDefault) {
611       assert(FlatTree[CurrentNode].Kind == Invalid && "Node is not empty.");
612       FlatTree[CurrentNode].Kind = TemplateTemplate;
613       FlatTree[CurrentNode].FromArgInfo.TD = FromTD;
614       FlatTree[CurrentNode].ToArgInfo.TD = ToTD;
615       SetDefault(FromDefault, ToDefault);
616     }
617 
618     void SetIntegerDiff(const llvm::APSInt &FromInt, const llvm::APSInt &ToInt,
619                         bool IsValidFromInt, bool IsValidToInt,
620                         QualType FromIntType, QualType ToIntType,
621                         Expr *FromExpr, Expr *ToExpr, bool FromDefault,
622                         bool ToDefault) {
623       assert(FlatTree[CurrentNode].Kind == Invalid && "Node is not empty.");
624       FlatTree[CurrentNode].Kind = Integer;
625       FlatTree[CurrentNode].FromArgInfo.Val = FromInt;
626       FlatTree[CurrentNode].ToArgInfo.Val = ToInt;
627       FlatTree[CurrentNode].FromArgInfo.IsValidInt = IsValidFromInt;
628       FlatTree[CurrentNode].ToArgInfo.IsValidInt = IsValidToInt;
629       FlatTree[CurrentNode].FromArgInfo.ArgType = FromIntType;
630       FlatTree[CurrentNode].ToArgInfo.ArgType = ToIntType;
631       FlatTree[CurrentNode].FromArgInfo.ArgExpr = FromExpr;
632       FlatTree[CurrentNode].ToArgInfo.ArgExpr = ToExpr;
633       SetDefault(FromDefault, ToDefault);
634     }
635 
636     void SetDeclarationDiff(ValueDecl *FromValueDecl, ValueDecl *ToValueDecl,
637                             bool FromAddressOf, bool ToAddressOf,
638                             bool FromNullPtr, bool ToNullPtr, Expr *FromExpr,
639                             Expr *ToExpr, bool FromDefault, bool ToDefault) {
640       assert(FlatTree[CurrentNode].Kind == Invalid && "Node is not empty.");
641       FlatTree[CurrentNode].Kind = Declaration;
642       FlatTree[CurrentNode].FromArgInfo.VD = FromValueDecl;
643       FlatTree[CurrentNode].ToArgInfo.VD = ToValueDecl;
644       FlatTree[CurrentNode].FromArgInfo.NeedAddressOf = FromAddressOf;
645       FlatTree[CurrentNode].ToArgInfo.NeedAddressOf = ToAddressOf;
646       FlatTree[CurrentNode].FromArgInfo.IsNullPtr = FromNullPtr;
647       FlatTree[CurrentNode].ToArgInfo.IsNullPtr = ToNullPtr;
648       FlatTree[CurrentNode].FromArgInfo.ArgExpr = FromExpr;
649       FlatTree[CurrentNode].ToArgInfo.ArgExpr = ToExpr;
650       SetDefault(FromDefault, ToDefault);
651     }
652 
653     void SetFromDeclarationAndToIntegerDiff(
654         ValueDecl *FromValueDecl, bool FromAddressOf, bool FromNullPtr,
655         Expr *FromExpr, const llvm::APSInt &ToInt, bool IsValidToInt,
656         QualType ToIntType, Expr *ToExpr, bool FromDefault, bool ToDefault) {
657       assert(FlatTree[CurrentNode].Kind == Invalid && "Node is not empty.");
658       FlatTree[CurrentNode].Kind = FromDeclarationAndToInteger;
659       FlatTree[CurrentNode].FromArgInfo.VD = FromValueDecl;
660       FlatTree[CurrentNode].FromArgInfo.NeedAddressOf = FromAddressOf;
661       FlatTree[CurrentNode].FromArgInfo.IsNullPtr = FromNullPtr;
662       FlatTree[CurrentNode].FromArgInfo.ArgExpr = FromExpr;
663       FlatTree[CurrentNode].ToArgInfo.Val = ToInt;
664       FlatTree[CurrentNode].ToArgInfo.IsValidInt = IsValidToInt;
665       FlatTree[CurrentNode].ToArgInfo.ArgType = ToIntType;
666       FlatTree[CurrentNode].ToArgInfo.ArgExpr = ToExpr;
667       SetDefault(FromDefault, ToDefault);
668     }
669 
670     void SetFromIntegerAndToDeclarationDiff(
671         const llvm::APSInt &FromInt, bool IsValidFromInt, QualType FromIntType,
672         Expr *FromExpr, ValueDecl *ToValueDecl, bool ToAddressOf,
673         bool ToNullPtr, Expr *ToExpr, bool FromDefault, bool ToDefault) {
674       assert(FlatTree[CurrentNode].Kind == Invalid && "Node is not empty.");
675       FlatTree[CurrentNode].Kind = FromIntegerAndToDeclaration;
676       FlatTree[CurrentNode].FromArgInfo.Val = FromInt;
677       FlatTree[CurrentNode].FromArgInfo.IsValidInt = IsValidFromInt;
678       FlatTree[CurrentNode].FromArgInfo.ArgType = FromIntType;
679       FlatTree[CurrentNode].FromArgInfo.ArgExpr = FromExpr;
680       FlatTree[CurrentNode].ToArgInfo.VD = ToValueDecl;
681       FlatTree[CurrentNode].ToArgInfo.NeedAddressOf = ToAddressOf;
682       FlatTree[CurrentNode].ToArgInfo.IsNullPtr = ToNullPtr;
683       FlatTree[CurrentNode].ToArgInfo.ArgExpr = ToExpr;
684       SetDefault(FromDefault, ToDefault);
685     }
686 
687     /// SetDefault - Sets FromDefault and ToDefault flags of the current node.
688     void SetDefault(bool FromDefault, bool ToDefault) {
689       assert((!FromDefault || !ToDefault) && "Both arguments cannot be default.");
690       FlatTree[CurrentNode].FromArgInfo.IsDefault = FromDefault;
691       FlatTree[CurrentNode].ToArgInfo.IsDefault = ToDefault;
692     }
693 
694     /// SetSame - Sets the same flag of the current node.
695     void SetSame(bool Same) {
696       FlatTree[CurrentNode].Same = Same;
697     }
698 
699     /// SetKind - Sets the current node's type.
700     void SetKind(DiffKind Kind) {
701       FlatTree[CurrentNode].Kind = Kind;
702     }
703 
704     /// Up - Changes the node to the parent of the current node.
705     void Up() {
706       assert(FlatTree[CurrentNode].Kind != Invalid &&
707              "Cannot exit node before setting node information.");
708       CurrentNode = FlatTree[CurrentNode].ParentNode;
709     }
710 
711     /// AddNode - Adds a child node to the current node, then sets that node
712     /// node as the current node.
713     void AddNode() {
714       assert(FlatTree[CurrentNode].Kind == Template &&
715              "Only Template nodes can have children nodes.");
716       FlatTree.push_back(DiffNode(CurrentNode));
717       DiffNode &Node = FlatTree[CurrentNode];
718       if (Node.ChildNode == 0) {
719         // If a child node doesn't exist, add one.
720         Node.ChildNode = NextFreeNode;
721       } else {
722         // If a child node exists, find the last child node and add a
723         // next node to it.
724         unsigned i;
725         for (i = Node.ChildNode; FlatTree[i].NextNode != 0;
726              i = FlatTree[i].NextNode) {
727         }
728         FlatTree[i].NextNode = NextFreeNode;
729       }
730       CurrentNode = NextFreeNode;
731       ++NextFreeNode;
732     }
733 
734     // Node reading functions.
735     /// StartTraverse - Prepares the tree for recursive traversal.
736     void StartTraverse() {
737       ReadNode = 0;
738       CurrentNode = NextFreeNode;
739       NextFreeNode = 0;
740     }
741 
742     /// Parent - Move the current read node to its parent.
743     void Parent() {
744       ReadNode = FlatTree[ReadNode].ParentNode;
745     }
746 
747     void GetTemplateDiff(TemplateDecl *&FromTD, TemplateDecl *&ToTD,
748                          Qualifiers &FromQual, Qualifiers &ToQual) {
749       assert(FlatTree[ReadNode].Kind == Template && "Unexpected kind.");
750       FromTD = FlatTree[ReadNode].FromArgInfo.TD;
751       ToTD = FlatTree[ReadNode].ToArgInfo.TD;
752       FromQual = FlatTree[ReadNode].FromArgInfo.Qual;
753       ToQual = FlatTree[ReadNode].ToArgInfo.Qual;
754     }
755 
756     void GetTypeDiff(QualType &FromType, QualType &ToType) {
757       assert(FlatTree[ReadNode].Kind == Type && "Unexpected kind");
758       FromType = FlatTree[ReadNode].FromArgInfo.ArgType;
759       ToType = FlatTree[ReadNode].ToArgInfo.ArgType;
760     }
761 
762     void GetExpressionDiff(Expr *&FromExpr, Expr *&ToExpr) {
763       assert(FlatTree[ReadNode].Kind == Expression && "Unexpected kind");
764       FromExpr = FlatTree[ReadNode].FromArgInfo.ArgExpr;
765       ToExpr = FlatTree[ReadNode].ToArgInfo.ArgExpr;
766     }
767 
768     void GetTemplateTemplateDiff(TemplateDecl *&FromTD, TemplateDecl *&ToTD) {
769       assert(FlatTree[ReadNode].Kind == TemplateTemplate && "Unexpected kind.");
770       FromTD = FlatTree[ReadNode].FromArgInfo.TD;
771       ToTD = FlatTree[ReadNode].ToArgInfo.TD;
772     }
773 
774     void GetIntegerDiff(llvm::APSInt &FromInt, llvm::APSInt &ToInt,
775                         bool &IsValidFromInt, bool &IsValidToInt,
776                         QualType &FromIntType, QualType &ToIntType,
777                         Expr *&FromExpr, Expr *&ToExpr) {
778       assert(FlatTree[ReadNode].Kind == Integer && "Unexpected kind.");
779       FromInt = FlatTree[ReadNode].FromArgInfo.Val;
780       ToInt = FlatTree[ReadNode].ToArgInfo.Val;
781       IsValidFromInt = FlatTree[ReadNode].FromArgInfo.IsValidInt;
782       IsValidToInt = FlatTree[ReadNode].ToArgInfo.IsValidInt;
783       FromIntType = FlatTree[ReadNode].FromArgInfo.ArgType;
784       ToIntType = FlatTree[ReadNode].ToArgInfo.ArgType;
785       FromExpr = FlatTree[ReadNode].FromArgInfo.ArgExpr;
786       ToExpr = FlatTree[ReadNode].ToArgInfo.ArgExpr;
787     }
788 
789     void GetDeclarationDiff(ValueDecl *&FromValueDecl, ValueDecl *&ToValueDecl,
790                             bool &FromAddressOf, bool &ToAddressOf,
791                             bool &FromNullPtr, bool &ToNullPtr, Expr *&FromExpr,
792                             Expr *&ToExpr) {
793       assert(FlatTree[ReadNode].Kind == Declaration && "Unexpected kind.");
794       FromValueDecl = FlatTree[ReadNode].FromArgInfo.VD;
795       ToValueDecl = FlatTree[ReadNode].ToArgInfo.VD;
796       FromAddressOf = FlatTree[ReadNode].FromArgInfo.NeedAddressOf;
797       ToAddressOf = FlatTree[ReadNode].ToArgInfo.NeedAddressOf;
798       FromNullPtr = FlatTree[ReadNode].FromArgInfo.IsNullPtr;
799       ToNullPtr = FlatTree[ReadNode].ToArgInfo.IsNullPtr;
800       FromExpr = FlatTree[ReadNode].FromArgInfo.ArgExpr;
801       ToExpr = FlatTree[ReadNode].ToArgInfo.ArgExpr;
802     }
803 
804     void GetFromDeclarationAndToIntegerDiff(
805         ValueDecl *&FromValueDecl, bool &FromAddressOf, bool &FromNullPtr,
806         Expr *&FromExpr, llvm::APSInt &ToInt, bool &IsValidToInt,
807         QualType &ToIntType, Expr *&ToExpr) {
808       assert(FlatTree[ReadNode].Kind == FromDeclarationAndToInteger &&
809              "Unexpected kind.");
810       FromValueDecl = FlatTree[ReadNode].FromArgInfo.VD;
811       FromAddressOf = FlatTree[ReadNode].FromArgInfo.NeedAddressOf;
812       FromNullPtr = FlatTree[ReadNode].FromArgInfo.IsNullPtr;
813       FromExpr = FlatTree[ReadNode].FromArgInfo.ArgExpr;
814       ToInt = FlatTree[ReadNode].ToArgInfo.Val;
815       IsValidToInt = FlatTree[ReadNode].ToArgInfo.IsValidInt;
816       ToIntType = FlatTree[ReadNode].ToArgInfo.ArgType;
817       ToExpr = FlatTree[ReadNode].ToArgInfo.ArgExpr;
818     }
819 
820     void GetFromIntegerAndToDeclarationDiff(
821         llvm::APSInt &FromInt, bool &IsValidFromInt, QualType &FromIntType,
822         Expr *&FromExpr, ValueDecl *&ToValueDecl, bool &ToAddressOf,
823         bool &ToNullPtr, Expr *&ToExpr) {
824       assert(FlatTree[ReadNode].Kind == FromIntegerAndToDeclaration &&
825              "Unexpected kind.");
826       FromInt = FlatTree[ReadNode].FromArgInfo.Val;
827       IsValidFromInt = FlatTree[ReadNode].FromArgInfo.IsValidInt;
828       FromIntType = FlatTree[ReadNode].FromArgInfo.ArgType;
829       FromExpr = FlatTree[ReadNode].FromArgInfo.ArgExpr;
830       ToValueDecl = FlatTree[ReadNode].ToArgInfo.VD;
831       ToAddressOf = FlatTree[ReadNode].ToArgInfo.NeedAddressOf;
832       ToNullPtr = FlatTree[ReadNode].ToArgInfo.IsNullPtr;
833       ToExpr = FlatTree[ReadNode].ToArgInfo.ArgExpr;
834     }
835 
836     /// FromDefault - Return true if the from argument is the default.
837     bool FromDefault() {
838       return FlatTree[ReadNode].FromArgInfo.IsDefault;
839     }
840 
841     /// ToDefault - Return true if the to argument is the default.
842     bool ToDefault() {
843       return FlatTree[ReadNode].ToArgInfo.IsDefault;
844     }
845 
846     /// NodeIsSame - Returns true the arguments are the same.
847     bool NodeIsSame() {
848       return FlatTree[ReadNode].Same;
849     }
850 
851     /// HasChildrend - Returns true if the node has children.
852     bool HasChildren() {
853       return FlatTree[ReadNode].ChildNode != 0;
854     }
855 
856     /// MoveToChild - Moves from the current node to its child.
857     void MoveToChild() {
858       ReadNode = FlatTree[ReadNode].ChildNode;
859     }
860 
861     /// AdvanceSibling - If there is a next sibling, advance to it and return
862     /// true.  Otherwise, return false.
863     bool AdvanceSibling() {
864       if (FlatTree[ReadNode].NextNode == 0)
865         return false;
866 
867       ReadNode = FlatTree[ReadNode].NextNode;
868       return true;
869     }
870 
871     /// HasNextSibling - Return true if the node has a next sibling.
872     bool HasNextSibling() {
873       return FlatTree[ReadNode].NextNode != 0;
874     }
875 
876     /// Empty - Returns true if the tree has no information.
877     bool Empty() {
878       return GetKind() == Invalid;
879     }
880 
881     /// GetKind - Returns the current node's type.
882     DiffKind GetKind() {
883       return FlatTree[ReadNode].Kind;
884     }
885   };
886 
887   DiffTree Tree;
888 
889   /// TSTiterator - a pair of iterators that walks the
890   /// TemplateSpecializationType and the desugared TemplateSpecializationType.
891   /// The deseguared TemplateArgument should provide the canonical argument
892   /// for comparisons.
893   class TSTiterator {
894     typedef const TemplateArgument& reference;
895     typedef const TemplateArgument* pointer;
896 
897     /// InternalIterator - an iterator that is used to enter a
898     /// TemplateSpecializationType and read TemplateArguments inside template
899     /// parameter packs in order with the rest of the TemplateArguments.
900     struct InternalIterator {
901       /// TST - the template specialization whose arguments this iterator
902       /// traverse over.
903       const TemplateSpecializationType *TST;
904 
905       /// Index - the index of the template argument in TST.
906       unsigned Index;
907 
908       /// CurrentTA - if CurrentTA is not the same as EndTA, then CurrentTA
909       /// points to a TemplateArgument within a parameter pack.
910       TemplateArgument::pack_iterator CurrentTA;
911 
912       /// EndTA - the end iterator of a parameter pack
913       TemplateArgument::pack_iterator EndTA;
914 
915       /// InternalIterator - Constructs an iterator and sets it to the first
916       /// template argument.
917       InternalIterator(const TemplateSpecializationType *TST)
918           : TST(TST), Index(0), CurrentTA(nullptr), EndTA(nullptr) {
919         if (!TST) return;
920 
921         if (isEnd()) return;
922 
923         // Set to first template argument.  If not a parameter pack, done.
924         TemplateArgument TA = TST->getArg(0);
925         if (TA.getKind() != TemplateArgument::Pack) return;
926 
927         // Start looking into the parameter pack.
928         CurrentTA = TA.pack_begin();
929         EndTA = TA.pack_end();
930 
931         // Found a valid template argument.
932         if (CurrentTA != EndTA) return;
933 
934         // Parameter pack is empty, use the increment to get to a valid
935         // template argument.
936         ++(*this);
937       }
938 
939       /// isEnd - Returns true if the iterator is one past the end.
940       bool isEnd() const {
941         assert(TST && "InternalIterator is invalid with a null TST.");
942         return Index >= TST->getNumArgs();
943       }
944 
945       /// &operator++ - Increment the iterator to the next template argument.
946       InternalIterator &operator++() {
947         assert(TST && "InternalIterator is invalid with a null TST.");
948         if (isEnd()) {
949           return *this;
950         }
951 
952         // If in a parameter pack, advance in the parameter pack.
953         if (CurrentTA != EndTA) {
954           ++CurrentTA;
955           if (CurrentTA != EndTA)
956             return *this;
957         }
958 
959         // Loop until a template argument is found, or the end is reached.
960         while (true) {
961           // Advance to the next template argument.  Break if reached the end.
962           if (++Index == TST->getNumArgs())
963             break;
964 
965           // If the TemplateArgument is not a parameter pack, done.
966           TemplateArgument TA = TST->getArg(Index);
967           if (TA.getKind() != TemplateArgument::Pack)
968             break;
969 
970           // Handle parameter packs.
971           CurrentTA = TA.pack_begin();
972           EndTA = TA.pack_end();
973 
974           // If the parameter pack is empty, try to advance again.
975           if (CurrentTA != EndTA)
976             break;
977         }
978         return *this;
979       }
980 
981       /// operator* - Returns the appropriate TemplateArgument.
982       reference operator*() const {
983         assert(TST && "InternalIterator is invalid with a null TST.");
984         assert(!isEnd() && "Index exceeds number of arguments.");
985         if (CurrentTA == EndTA)
986           return TST->getArg(Index);
987         else
988           return *CurrentTA;
989       }
990 
991       /// operator-> - Allow access to the underlying TemplateArgument.
992       pointer operator->() const {
993         assert(TST && "InternalIterator is invalid with a null TST.");
994         return &operator*();
995       }
996     };
997 
998     bool UseDesugaredIterator;
999     InternalIterator SugaredIterator;
1000     InternalIterator DesugaredIterator;
1001 
1002   public:
1003     TSTiterator(ASTContext &Context, const TemplateSpecializationType *TST)
1004         : UseDesugaredIterator(TST->isSugared() && !TST->isTypeAlias()),
1005           SugaredIterator(TST),
1006           DesugaredIterator(
1007               GetTemplateSpecializationType(Context, TST->desugar())) {}
1008 
1009     /// &operator++ - Increment the iterator to the next template argument.
1010     TSTiterator &operator++() {
1011       ++SugaredIterator;
1012       if (UseDesugaredIterator)
1013         ++DesugaredIterator;
1014       return *this;
1015     }
1016 
1017     /// operator* - Returns the appropriate TemplateArgument.
1018     reference operator*() const {
1019       return *SugaredIterator;
1020     }
1021 
1022     /// operator-> - Allow access to the underlying TemplateArgument.
1023     pointer operator->() const {
1024       return &operator*();
1025     }
1026 
1027     /// isEnd - Returns true if no more TemplateArguments are available.
1028     bool isEnd() const {
1029       return SugaredIterator.isEnd();
1030     }
1031 
1032     /// hasDesugaredTA - Returns true if there is another TemplateArgument
1033     /// available.
1034     bool hasDesugaredTA() const {
1035       return UseDesugaredIterator && !DesugaredIterator.isEnd();
1036     }
1037 
1038     /// getDesugaredTA - Returns the desugared TemplateArgument.
1039     reference getDesugaredTA() const {
1040       assert(UseDesugaredIterator &&
1041              "Desugared TemplateArgument should not be used.");
1042       return *DesugaredIterator;
1043     }
1044   };
1045 
1046   // These functions build up the template diff tree, including functions to
1047   // retrieve and compare template arguments.
1048 
1049   static const TemplateSpecializationType *GetTemplateSpecializationType(
1050       ASTContext &Context, QualType Ty) {
1051     if (const TemplateSpecializationType *TST =
1052             Ty->getAs<TemplateSpecializationType>())
1053       return TST;
1054 
1055     const RecordType *RT = Ty->getAs<RecordType>();
1056 
1057     if (!RT)
1058       return nullptr;
1059 
1060     const ClassTemplateSpecializationDecl *CTSD =
1061         dyn_cast<ClassTemplateSpecializationDecl>(RT->getDecl());
1062 
1063     if (!CTSD)
1064       return nullptr;
1065 
1066     Ty = Context.getTemplateSpecializationType(
1067              TemplateName(CTSD->getSpecializedTemplate()),
1068              CTSD->getTemplateArgs().asArray(),
1069              Ty.getLocalUnqualifiedType().getCanonicalType());
1070 
1071     return Ty->getAs<TemplateSpecializationType>();
1072   }
1073 
1074   /// Returns true if the DiffType is Type and false for Template.
1075   static bool OnlyPerformTypeDiff(ASTContext &Context, QualType FromType,
1076                                   QualType ToType,
1077                                   const TemplateSpecializationType *&FromArgTST,
1078                                   const TemplateSpecializationType *&ToArgTST) {
1079     if (FromType.isNull() || ToType.isNull())
1080       return true;
1081 
1082     if (Context.hasSameType(FromType, ToType))
1083       return true;
1084 
1085     FromArgTST = GetTemplateSpecializationType(Context, FromType);
1086     ToArgTST = GetTemplateSpecializationType(Context, ToType);
1087 
1088     if (!FromArgTST || !ToArgTST)
1089       return true;
1090 
1091     if (!hasSameTemplate(FromArgTST, ToArgTST))
1092       return true;
1093 
1094     return false;
1095   }
1096 
1097   /// DiffTypes - Fills a DiffNode with information about a type difference.
1098   void DiffTypes(const TSTiterator &FromIter, const TSTiterator &ToIter) {
1099     QualType FromType = GetType(FromIter);
1100     QualType ToType = GetType(ToIter);
1101 
1102     bool FromDefault = FromIter.isEnd() && !FromType.isNull();
1103     bool ToDefault = ToIter.isEnd() && !ToType.isNull();
1104 
1105     const TemplateSpecializationType *FromArgTST = nullptr;
1106     const TemplateSpecializationType *ToArgTST = nullptr;
1107     if (OnlyPerformTypeDiff(Context, FromType, ToType, FromArgTST, ToArgTST)) {
1108       Tree.SetTypeDiff(FromType, ToType, FromDefault, ToDefault);
1109       Tree.SetSame(!FromType.isNull() && !ToType.isNull() &&
1110                    Context.hasSameType(FromType, ToType));
1111     } else {
1112       assert(FromArgTST && ToArgTST &&
1113              "Both template specializations need to be valid.");
1114       Qualifiers FromQual = FromType.getQualifiers(),
1115                  ToQual = ToType.getQualifiers();
1116       FromQual -= QualType(FromArgTST, 0).getQualifiers();
1117       ToQual -= QualType(ToArgTST, 0).getQualifiers();
1118       Tree.SetTemplateDiff(FromArgTST->getTemplateName().getAsTemplateDecl(),
1119                            ToArgTST->getTemplateName().getAsTemplateDecl(),
1120                            FromQual, ToQual, FromDefault, ToDefault);
1121       DiffTemplate(FromArgTST, ToArgTST);
1122     }
1123   }
1124 
1125   /// DiffTemplateTemplates - Fills a DiffNode with information about a
1126   /// template template difference.
1127   void DiffTemplateTemplates(const TSTiterator &FromIter,
1128                              const TSTiterator &ToIter) {
1129     TemplateDecl *FromDecl = GetTemplateDecl(FromIter);
1130     TemplateDecl *ToDecl = GetTemplateDecl(ToIter);
1131     Tree.SetTemplateTemplateDiff(FromDecl, ToDecl, FromIter.isEnd() && FromDecl,
1132                                  ToIter.isEnd() && ToDecl);
1133     Tree.SetSame(FromDecl && ToDecl &&
1134                  FromDecl->getCanonicalDecl() == ToDecl->getCanonicalDecl());
1135   }
1136 
1137   /// InitializeNonTypeDiffVariables - Helper function for DiffNonTypes
1138   static void InitializeNonTypeDiffVariables(ASTContext &Context,
1139                                              const TSTiterator &Iter,
1140                                              NonTypeTemplateParmDecl *Default,
1141                                              llvm::APSInt &Value, bool &HasInt,
1142                                              QualType &IntType, bool &IsNullPtr,
1143                                              Expr *&E, ValueDecl *&VD,
1144                                              bool &NeedAddressOf) {
1145     if (!Iter.isEnd()) {
1146       switch (Iter->getKind()) {
1147         default:
1148           llvm_unreachable("unknown ArgumentKind");
1149         case TemplateArgument::Integral:
1150           Value = Iter->getAsIntegral();
1151           HasInt = true;
1152           IntType = Iter->getIntegralType();
1153           return;
1154         case TemplateArgument::Declaration: {
1155           VD = Iter->getAsDecl();
1156           QualType ArgType = Iter->getParamTypeForDecl();
1157           QualType VDType = VD->getType();
1158           if (ArgType->isPointerType() &&
1159               Context.hasSameType(ArgType->getPointeeType(), VDType))
1160             NeedAddressOf = true;
1161           return;
1162         }
1163         case TemplateArgument::NullPtr:
1164           IsNullPtr = true;
1165           return;
1166         case TemplateArgument::Expression:
1167           E = Iter->getAsExpr();
1168       }
1169     } else if (!Default->isParameterPack()) {
1170       E = Default->getDefaultArgument();
1171     }
1172 
1173     if (!Iter.hasDesugaredTA()) return;
1174 
1175     const TemplateArgument& TA = Iter.getDesugaredTA();
1176     switch (TA.getKind()) {
1177       default:
1178         llvm_unreachable("unknown ArgumentKind");
1179       case TemplateArgument::Integral:
1180         Value = TA.getAsIntegral();
1181         HasInt = true;
1182         IntType = TA.getIntegralType();
1183         return;
1184       case TemplateArgument::Declaration: {
1185         VD = TA.getAsDecl();
1186         QualType ArgType = TA.getParamTypeForDecl();
1187         QualType VDType = VD->getType();
1188         if (ArgType->isPointerType() &&
1189             Context.hasSameType(ArgType->getPointeeType(), VDType))
1190           NeedAddressOf = true;
1191         return;
1192       }
1193       case TemplateArgument::NullPtr:
1194         IsNullPtr = true;
1195         return;
1196       case TemplateArgument::Expression:
1197         // TODO: Sometimes, the desugared template argument Expr differs from
1198         // the sugared template argument Expr.  It may be useful in the future
1199         // but for now, it is just discarded.
1200         if (!E)
1201           E = TA.getAsExpr();
1202         return;
1203     }
1204   }
1205 
1206   /// DiffNonTypes - Handles any template parameters not handled by DiffTypes
1207   /// of DiffTemplatesTemplates, such as integer and declaration parameters.
1208   void DiffNonTypes(const TSTiterator &FromIter, const TSTiterator &ToIter,
1209                     NonTypeTemplateParmDecl *FromDefaultNonTypeDecl,
1210                     NonTypeTemplateParmDecl *ToDefaultNonTypeDecl) {
1211     Expr *FromExpr = nullptr, *ToExpr = nullptr;
1212     llvm::APSInt FromInt, ToInt;
1213     QualType FromIntType, ToIntType;
1214     ValueDecl *FromValueDecl = nullptr, *ToValueDecl = nullptr;
1215     bool HasFromInt = false, HasToInt = false, FromNullPtr = false,
1216          ToNullPtr = false, NeedFromAddressOf = false, NeedToAddressOf = false;
1217     InitializeNonTypeDiffVariables(
1218         Context, FromIter, FromDefaultNonTypeDecl, FromInt, HasFromInt,
1219         FromIntType, FromNullPtr, FromExpr, FromValueDecl, NeedFromAddressOf);
1220     InitializeNonTypeDiffVariables(Context, ToIter, ToDefaultNonTypeDecl, ToInt,
1221                                    HasToInt, ToIntType, ToNullPtr, ToExpr,
1222                                    ToValueDecl, NeedToAddressOf);
1223 
1224     bool FromDefault = FromIter.isEnd() &&
1225                        (FromExpr || FromValueDecl || HasFromInt || FromNullPtr);
1226     bool ToDefault = ToIter.isEnd() &&
1227                      (ToExpr || ToValueDecl || HasToInt || ToNullPtr);
1228 
1229     bool FromDeclaration = FromValueDecl || FromNullPtr;
1230     bool ToDeclaration = ToValueDecl || ToNullPtr;
1231 
1232     if (FromDeclaration && HasToInt) {
1233       Tree.SetFromDeclarationAndToIntegerDiff(
1234           FromValueDecl, NeedFromAddressOf, FromNullPtr, FromExpr, ToInt,
1235           HasToInt, ToIntType, ToExpr, FromDefault, ToDefault);
1236       Tree.SetSame(false);
1237       return;
1238 
1239     }
1240 
1241     if (HasFromInt && ToDeclaration) {
1242       Tree.SetFromIntegerAndToDeclarationDiff(
1243           FromInt, HasFromInt, FromIntType, FromExpr, ToValueDecl,
1244           NeedToAddressOf, ToNullPtr, ToExpr, FromDefault, ToDefault);
1245       Tree.SetSame(false);
1246       return;
1247     }
1248 
1249     if (HasFromInt || HasToInt) {
1250       Tree.SetIntegerDiff(FromInt, ToInt, HasFromInt, HasToInt, FromIntType,
1251                           ToIntType, FromExpr, ToExpr, FromDefault, ToDefault);
1252       if (HasFromInt && HasToInt) {
1253         Tree.SetSame(Context.hasSameType(FromIntType, ToIntType) &&
1254                      FromInt == ToInt);
1255       }
1256       return;
1257     }
1258 
1259     if (FromDeclaration || ToDeclaration) {
1260       Tree.SetDeclarationDiff(FromValueDecl, ToValueDecl, NeedFromAddressOf,
1261                               NeedToAddressOf, FromNullPtr, ToNullPtr, FromExpr,
1262                               ToExpr, FromDefault, ToDefault);
1263       bool BothNull = FromNullPtr && ToNullPtr;
1264       bool SameValueDecl =
1265           FromValueDecl && ToValueDecl &&
1266           NeedFromAddressOf == NeedToAddressOf &&
1267           FromValueDecl->getCanonicalDecl() == ToValueDecl->getCanonicalDecl();
1268       Tree.SetSame(BothNull || SameValueDecl);
1269       return;
1270     }
1271 
1272     assert((FromExpr || ToExpr) && "Both template arguments cannot be empty.");
1273     Tree.SetExpressionDiff(FromExpr, ToExpr, FromDefault, ToDefault);
1274     Tree.SetSame(IsEqualExpr(Context, FromExpr, ToExpr));
1275   }
1276 
1277   /// DiffTemplate - recursively visits template arguments and stores the
1278   /// argument info into a tree.
1279   void DiffTemplate(const TemplateSpecializationType *FromTST,
1280                     const TemplateSpecializationType *ToTST) {
1281     // Begin descent into diffing template tree.
1282     TemplateParameterList *ParamsFrom =
1283         FromTST->getTemplateName().getAsTemplateDecl()->getTemplateParameters();
1284     TemplateParameterList *ParamsTo =
1285         ToTST->getTemplateName().getAsTemplateDecl()->getTemplateParameters();
1286     unsigned TotalArgs = 0;
1287     for (TSTiterator FromIter(Context, FromTST), ToIter(Context, ToTST);
1288          !FromIter.isEnd() || !ToIter.isEnd(); ++TotalArgs) {
1289       Tree.AddNode();
1290 
1291       // Get the parameter at index TotalArgs.  If index is larger
1292       // than the total number of parameters, then there is an
1293       // argument pack, so re-use the last parameter.
1294       unsigned FromParamIndex = std::min(TotalArgs, ParamsFrom->size() - 1);
1295       unsigned ToParamIndex = std::min(TotalArgs, ParamsTo->size() - 1);
1296       NamedDecl *FromParamND = ParamsFrom->getParam(FromParamIndex);
1297       NamedDecl *ToParamND = ParamsTo->getParam(ToParamIndex);
1298 
1299       assert(FromParamND->getKind() == ToParamND->getKind() &&
1300              "Parameter Decl are not the same kind.");
1301 
1302       if (isa<TemplateTypeParmDecl>(FromParamND)) {
1303         DiffTypes(FromIter, ToIter);
1304       } else if (isa<TemplateTemplateParmDecl>(FromParamND)) {
1305         DiffTemplateTemplates(FromIter, ToIter);
1306       } else if (isa<NonTypeTemplateParmDecl>(FromParamND)) {
1307         NonTypeTemplateParmDecl *FromDefaultNonTypeDecl =
1308             cast<NonTypeTemplateParmDecl>(FromParamND);
1309         NonTypeTemplateParmDecl *ToDefaultNonTypeDecl =
1310             cast<NonTypeTemplateParmDecl>(ToParamND);
1311         DiffNonTypes(FromIter, ToIter, FromDefaultNonTypeDecl,
1312                      ToDefaultNonTypeDecl);
1313       } else {
1314         llvm_unreachable("Unexpected Decl type.");
1315       }
1316 
1317       ++FromIter;
1318       ++ToIter;
1319       Tree.Up();
1320     }
1321   }
1322 
1323   /// makeTemplateList - Dump every template alias into the vector.
1324   static void makeTemplateList(
1325       SmallVectorImpl<const TemplateSpecializationType *> &TemplateList,
1326       const TemplateSpecializationType *TST) {
1327     while (TST) {
1328       TemplateList.push_back(TST);
1329       if (!TST->isTypeAlias())
1330         return;
1331       TST = TST->getAliasedType()->getAs<TemplateSpecializationType>();
1332     }
1333   }
1334 
1335   /// hasSameBaseTemplate - Returns true when the base templates are the same,
1336   /// even if the template arguments are not.
1337   static bool hasSameBaseTemplate(const TemplateSpecializationType *FromTST,
1338                                   const TemplateSpecializationType *ToTST) {
1339     return FromTST->getTemplateName().getAsTemplateDecl()->getCanonicalDecl() ==
1340            ToTST->getTemplateName().getAsTemplateDecl()->getCanonicalDecl();
1341   }
1342 
1343   /// hasSameTemplate - Returns true if both types are specialized from the
1344   /// same template declaration.  If they come from different template aliases,
1345   /// do a parallel ascension search to determine the highest template alias in
1346   /// common and set the arguments to them.
1347   static bool hasSameTemplate(const TemplateSpecializationType *&FromTST,
1348                               const TemplateSpecializationType *&ToTST) {
1349     // Check the top templates if they are the same.
1350     if (hasSameBaseTemplate(FromTST, ToTST))
1351       return true;
1352 
1353     // Create vectors of template aliases.
1354     SmallVector<const TemplateSpecializationType*, 1> FromTemplateList,
1355                                                       ToTemplateList;
1356 
1357     makeTemplateList(FromTemplateList, FromTST);
1358     makeTemplateList(ToTemplateList, ToTST);
1359 
1360     SmallVectorImpl<const TemplateSpecializationType *>::reverse_iterator
1361         FromIter = FromTemplateList.rbegin(), FromEnd = FromTemplateList.rend(),
1362         ToIter = ToTemplateList.rbegin(), ToEnd = ToTemplateList.rend();
1363 
1364     // Check if the lowest template types are the same.  If not, return.
1365     if (!hasSameBaseTemplate(*FromIter, *ToIter))
1366       return false;
1367 
1368     // Begin searching up the template aliases.  The bottom most template
1369     // matches so move up until one pair does not match.  Use the template
1370     // right before that one.
1371     for (; FromIter != FromEnd && ToIter != ToEnd; ++FromIter, ++ToIter) {
1372       if (!hasSameBaseTemplate(*FromIter, *ToIter))
1373         break;
1374     }
1375 
1376     FromTST = FromIter[-1];
1377     ToTST = ToIter[-1];
1378 
1379     return true;
1380   }
1381 
1382   /// GetType - Retrieves the template type arguments, including default
1383   /// arguments.
1384   static QualType GetType(const TSTiterator &Iter) {
1385     if (!Iter.isEnd())
1386       return Iter->getAsType();
1387     if (Iter.hasDesugaredTA())
1388       return Iter.getDesugaredTA().getAsType();
1389     return QualType();
1390   }
1391 
1392   /// GetTemplateDecl - Retrieves the template template arguments, including
1393   /// default arguments.
1394   static TemplateDecl *GetTemplateDecl(const TSTiterator &Iter) {
1395     if (!Iter.isEnd())
1396       return Iter->getAsTemplate().getAsTemplateDecl();
1397     if (Iter.hasDesugaredTA())
1398       return Iter.getDesugaredTA().getAsTemplate().getAsTemplateDecl();
1399     return nullptr;
1400   }
1401 
1402   /// IsEqualExpr - Returns true if the expressions are the same in regards to
1403   /// template arguments.  These expressions are dependent, so profile them
1404   /// instead of trying to evaluate them.
1405   static bool IsEqualExpr(ASTContext &Context, Expr *FromExpr, Expr *ToExpr) {
1406     if (FromExpr == ToExpr)
1407       return true;
1408 
1409     if (!FromExpr || !ToExpr)
1410       return false;
1411 
1412     llvm::FoldingSetNodeID FromID, ToID;
1413     FromExpr->Profile(FromID, Context, true);
1414     ToExpr->Profile(ToID, Context, true);
1415     return FromID == ToID;
1416   }
1417 
1418   // These functions converts the tree representation of the template
1419   // differences into the internal character vector.
1420 
1421   /// TreeToString - Converts the Tree object into a character stream which
1422   /// will later be turned into the output string.
1423   void TreeToString(int Indent = 1) {
1424     if (PrintTree) {
1425       OS << '\n';
1426       OS.indent(2 * Indent);
1427       ++Indent;
1428     }
1429 
1430     // Handle cases where the difference is not templates with different
1431     // arguments.
1432     switch (Tree.GetKind()) {
1433       case DiffTree::Invalid:
1434         llvm_unreachable("Template diffing failed with bad DiffNode");
1435       case DiffTree::Type: {
1436         QualType FromType, ToType;
1437         Tree.GetTypeDiff(FromType, ToType);
1438         PrintTypeNames(FromType, ToType, Tree.FromDefault(), Tree.ToDefault(),
1439                        Tree.NodeIsSame());
1440         return;
1441       }
1442       case DiffTree::Expression: {
1443         Expr *FromExpr, *ToExpr;
1444         Tree.GetExpressionDiff(FromExpr, ToExpr);
1445         PrintExpr(FromExpr, ToExpr, Tree.FromDefault(), Tree.ToDefault(),
1446                   Tree.NodeIsSame());
1447         return;
1448       }
1449       case DiffTree::TemplateTemplate: {
1450         TemplateDecl *FromTD, *ToTD;
1451         Tree.GetTemplateTemplateDiff(FromTD, ToTD);
1452         PrintTemplateTemplate(FromTD, ToTD, Tree.FromDefault(),
1453                               Tree.ToDefault(), Tree.NodeIsSame());
1454         return;
1455       }
1456       case DiffTree::Integer: {
1457         llvm::APSInt FromInt, ToInt;
1458         Expr *FromExpr, *ToExpr;
1459         bool IsValidFromInt, IsValidToInt;
1460         QualType FromIntType, ToIntType;
1461         Tree.GetIntegerDiff(FromInt, ToInt, IsValidFromInt, IsValidToInt,
1462                             FromIntType, ToIntType, FromExpr, ToExpr);
1463         PrintAPSInt(FromInt, ToInt, IsValidFromInt, IsValidToInt, FromIntType,
1464                     ToIntType, FromExpr, ToExpr, Tree.FromDefault(),
1465                     Tree.ToDefault(), Tree.NodeIsSame());
1466         return;
1467       }
1468       case DiffTree::Declaration: {
1469         ValueDecl *FromValueDecl, *ToValueDecl;
1470         bool FromAddressOf, ToAddressOf;
1471         bool FromNullPtr, ToNullPtr;
1472         Expr *FromExpr, *ToExpr;
1473         Tree.GetDeclarationDiff(FromValueDecl, ToValueDecl, FromAddressOf,
1474                                 ToAddressOf, FromNullPtr, ToNullPtr, FromExpr,
1475                                 ToExpr);
1476         PrintValueDecl(FromValueDecl, ToValueDecl, FromAddressOf, ToAddressOf,
1477                        FromNullPtr, ToNullPtr, FromExpr, ToExpr,
1478                        Tree.FromDefault(), Tree.ToDefault(), Tree.NodeIsSame());
1479         return;
1480       }
1481       case DiffTree::FromDeclarationAndToInteger: {
1482         ValueDecl *FromValueDecl;
1483         bool FromAddressOf;
1484         bool FromNullPtr;
1485         Expr *FromExpr;
1486         llvm::APSInt ToInt;
1487         bool IsValidToInt;
1488         QualType ToIntType;
1489         Expr *ToExpr;
1490         Tree.GetFromDeclarationAndToIntegerDiff(
1491             FromValueDecl, FromAddressOf, FromNullPtr, FromExpr, ToInt,
1492             IsValidToInt, ToIntType, ToExpr);
1493         assert((FromValueDecl || FromNullPtr) && IsValidToInt);
1494         PrintValueDeclAndInteger(FromValueDecl, FromAddressOf, FromNullPtr,
1495                                  FromExpr, Tree.FromDefault(), ToInt, ToIntType,
1496                                  ToExpr, Tree.ToDefault());
1497         return;
1498       }
1499       case DiffTree::FromIntegerAndToDeclaration: {
1500         llvm::APSInt FromInt;
1501         bool IsValidFromInt;
1502         QualType FromIntType;
1503         Expr *FromExpr;
1504         ValueDecl *ToValueDecl;
1505         bool ToAddressOf;
1506         bool ToNullPtr;
1507         Expr *ToExpr;
1508         Tree.GetFromIntegerAndToDeclarationDiff(
1509             FromInt, IsValidFromInt, FromIntType, FromExpr, ToValueDecl,
1510             ToAddressOf, ToNullPtr, ToExpr);
1511         assert(IsValidFromInt && (ToValueDecl || ToNullPtr));
1512         PrintIntegerAndValueDecl(FromInt, FromIntType, FromExpr,
1513                                  Tree.FromDefault(), ToValueDecl, ToAddressOf,
1514                                  ToNullPtr, ToExpr, Tree.ToDefault());
1515         return;
1516       }
1517       case DiffTree::Template: {
1518         // Node is root of template.  Recurse on children.
1519         TemplateDecl *FromTD, *ToTD;
1520         Qualifiers FromQual, ToQual;
1521         Tree.GetTemplateDiff(FromTD, ToTD, FromQual, ToQual);
1522 
1523         PrintQualifiers(FromQual, ToQual);
1524 
1525         if (!Tree.HasChildren()) {
1526           // If we're dealing with a template specialization with zero
1527           // arguments, there are no children; special-case this.
1528           OS << FromTD->getNameAsString() << "<>";
1529           return;
1530         }
1531 
1532         OS << FromTD->getNameAsString() << '<';
1533         Tree.MoveToChild();
1534         unsigned NumElideArgs = 0;
1535         bool AllArgsElided = true;
1536         do {
1537           if (ElideType) {
1538             if (Tree.NodeIsSame()) {
1539               ++NumElideArgs;
1540               continue;
1541             }
1542             AllArgsElided = false;
1543             if (NumElideArgs > 0) {
1544               PrintElideArgs(NumElideArgs, Indent);
1545               NumElideArgs = 0;
1546               OS << ", ";
1547             }
1548           }
1549           TreeToString(Indent);
1550           if (Tree.HasNextSibling())
1551             OS << ", ";
1552         } while (Tree.AdvanceSibling());
1553         if (NumElideArgs > 0) {
1554           if (AllArgsElided)
1555             OS << "...";
1556           else
1557             PrintElideArgs(NumElideArgs, Indent);
1558         }
1559 
1560         Tree.Parent();
1561         OS << ">";
1562         return;
1563       }
1564     }
1565   }
1566 
1567   // To signal to the text printer that a certain text needs to be bolded,
1568   // a special character is injected into the character stream which the
1569   // text printer will later strip out.
1570 
1571   /// Bold - Start bolding text.
1572   void Bold() {
1573     assert(!IsBold && "Attempting to bold text that is already bold.");
1574     IsBold = true;
1575     if (ShowColor)
1576       OS << ToggleHighlight;
1577   }
1578 
1579   /// Unbold - Stop bolding text.
1580   void Unbold() {
1581     assert(IsBold && "Attempting to remove bold from unbold text.");
1582     IsBold = false;
1583     if (ShowColor)
1584       OS << ToggleHighlight;
1585   }
1586 
1587   // Functions to print out the arguments and highlighting the difference.
1588 
1589   /// PrintTypeNames - prints the typenames, bolding differences.  Will detect
1590   /// typenames that are the same and attempt to disambiguate them by using
1591   /// canonical typenames.
1592   void PrintTypeNames(QualType FromType, QualType ToType,
1593                       bool FromDefault, bool ToDefault, bool Same) {
1594     assert((!FromType.isNull() || !ToType.isNull()) &&
1595            "Only one template argument may be missing.");
1596 
1597     if (Same) {
1598       OS << FromType.getAsString(Policy);
1599       return;
1600     }
1601 
1602     if (!FromType.isNull() && !ToType.isNull() &&
1603         FromType.getLocalUnqualifiedType() ==
1604         ToType.getLocalUnqualifiedType()) {
1605       Qualifiers FromQual = FromType.getLocalQualifiers(),
1606                  ToQual = ToType.getLocalQualifiers();
1607       PrintQualifiers(FromQual, ToQual);
1608       FromType.getLocalUnqualifiedType().print(OS, Policy);
1609       return;
1610     }
1611 
1612     std::string FromTypeStr = FromType.isNull() ? "(no argument)"
1613                                                 : FromType.getAsString(Policy);
1614     std::string ToTypeStr = ToType.isNull() ? "(no argument)"
1615                                             : ToType.getAsString(Policy);
1616     // Switch to canonical typename if it is better.
1617     // TODO: merge this with other aka printing above.
1618     if (FromTypeStr == ToTypeStr) {
1619       std::string FromCanTypeStr =
1620           FromType.getCanonicalType().getAsString(Policy);
1621       std::string ToCanTypeStr = ToType.getCanonicalType().getAsString(Policy);
1622       if (FromCanTypeStr != ToCanTypeStr) {
1623         FromTypeStr = FromCanTypeStr;
1624         ToTypeStr = ToCanTypeStr;
1625       }
1626     }
1627 
1628     if (PrintTree) OS << '[';
1629     OS << (FromDefault ? "(default) " : "");
1630     Bold();
1631     OS << FromTypeStr;
1632     Unbold();
1633     if (PrintTree) {
1634       OS << " != " << (ToDefault ? "(default) " : "");
1635       Bold();
1636       OS << ToTypeStr;
1637       Unbold();
1638       OS << "]";
1639     }
1640   }
1641 
1642   /// PrintExpr - Prints out the expr template arguments, highlighting argument
1643   /// differences.
1644   void PrintExpr(const Expr *FromExpr, const Expr *ToExpr, bool FromDefault,
1645                  bool ToDefault, bool Same) {
1646     assert((FromExpr || ToExpr) &&
1647             "Only one template argument may be missing.");
1648     if (Same) {
1649       PrintExpr(FromExpr);
1650     } else if (!PrintTree) {
1651       OS << (FromDefault ? "(default) " : "");
1652       Bold();
1653       PrintExpr(FromExpr);
1654       Unbold();
1655     } else {
1656       OS << (FromDefault ? "[(default) " : "[");
1657       Bold();
1658       PrintExpr(FromExpr);
1659       Unbold();
1660       OS << " != " << (ToDefault ? "(default) " : "");
1661       Bold();
1662       PrintExpr(ToExpr);
1663       Unbold();
1664       OS << ']';
1665     }
1666   }
1667 
1668   /// PrintExpr - Actual formatting and printing of expressions.
1669   void PrintExpr(const Expr *E) {
1670     if (E) {
1671       E->printPretty(OS, nullptr, Policy);
1672       return;
1673     }
1674     OS << "(no argument)";
1675   }
1676 
1677   /// PrintTemplateTemplate - Handles printing of template template arguments,
1678   /// highlighting argument differences.
1679   void PrintTemplateTemplate(TemplateDecl *FromTD, TemplateDecl *ToTD,
1680                              bool FromDefault, bool ToDefault, bool Same) {
1681     assert((FromTD || ToTD) && "Only one template argument may be missing.");
1682 
1683     std::string FromName = FromTD ? FromTD->getName() : "(no argument)";
1684     std::string ToName = ToTD ? ToTD->getName() : "(no argument)";
1685     if (FromTD && ToTD && FromName == ToName) {
1686       FromName = FromTD->getQualifiedNameAsString();
1687       ToName = ToTD->getQualifiedNameAsString();
1688     }
1689 
1690     if (Same) {
1691       OS << "template " << FromTD->getNameAsString();
1692     } else if (!PrintTree) {
1693       OS << (FromDefault ? "(default) template " : "template ");
1694       Bold();
1695       OS << FromName;
1696       Unbold();
1697     } else {
1698       OS << (FromDefault ? "[(default) template " : "[template ");
1699       Bold();
1700       OS << FromName;
1701       Unbold();
1702       OS << " != " << (ToDefault ? "(default) template " : "template ");
1703       Bold();
1704       OS << ToName;
1705       Unbold();
1706       OS << ']';
1707     }
1708   }
1709 
1710   /// PrintAPSInt - Handles printing of integral arguments, highlighting
1711   /// argument differences.
1712   void PrintAPSInt(const llvm::APSInt &FromInt, const llvm::APSInt &ToInt,
1713                    bool IsValidFromInt, bool IsValidToInt, QualType FromIntType,
1714                    QualType ToIntType, Expr *FromExpr, Expr *ToExpr,
1715                    bool FromDefault, bool ToDefault, bool Same) {
1716     assert((IsValidFromInt || IsValidToInt) &&
1717            "Only one integral argument may be missing.");
1718 
1719     if (Same) {
1720       if (FromIntType->isBooleanType()) {
1721         OS << ((FromInt == 0) ? "false" : "true");
1722       } else {
1723         OS << FromInt.toString(10);
1724       }
1725       return;
1726     }
1727 
1728     bool PrintType = IsValidFromInt && IsValidToInt &&
1729                      !Context.hasSameType(FromIntType, ToIntType);
1730 
1731     if (!PrintTree) {
1732       OS << (FromDefault ? "(default) " : "");
1733       PrintAPSInt(FromInt, FromExpr, IsValidFromInt, FromIntType, PrintType);
1734     } else {
1735       OS << (FromDefault ? "[(default) " : "[");
1736       PrintAPSInt(FromInt, FromExpr, IsValidFromInt, FromIntType, PrintType);
1737       OS << " != " << (ToDefault ? "(default) " : "");
1738       PrintAPSInt(ToInt, ToExpr, IsValidToInt, ToIntType, PrintType);
1739       OS << ']';
1740     }
1741   }
1742 
1743   /// PrintAPSInt - If valid, print the APSInt.  If the expression is
1744   /// gives more information, print it too.
1745   void PrintAPSInt(const llvm::APSInt &Val, Expr *E, bool Valid,
1746                    QualType IntType, bool PrintType) {
1747     Bold();
1748     if (Valid) {
1749       if (HasExtraInfo(E)) {
1750         PrintExpr(E);
1751         Unbold();
1752         OS << " aka ";
1753         Bold();
1754       }
1755       if (PrintType) {
1756         Unbold();
1757         OS << "(";
1758         Bold();
1759         IntType.print(OS, Context.getPrintingPolicy());
1760         Unbold();
1761         OS << ") ";
1762         Bold();
1763       }
1764       if (IntType->isBooleanType()) {
1765         OS << ((Val == 0) ? "false" : "true");
1766       } else {
1767         OS << Val.toString(10);
1768       }
1769     } else if (E) {
1770       PrintExpr(E);
1771     } else {
1772       OS << "(no argument)";
1773     }
1774     Unbold();
1775   }
1776 
1777   /// HasExtraInfo - Returns true if E is not an integer literal, the
1778   /// negation of an integer literal, or a boolean literal.
1779   bool HasExtraInfo(Expr *E) {
1780     if (!E) return false;
1781 
1782     E = E->IgnoreImpCasts();
1783 
1784     if (isa<IntegerLiteral>(E)) return false;
1785 
1786     if (UnaryOperator *UO = dyn_cast<UnaryOperator>(E))
1787       if (UO->getOpcode() == UO_Minus)
1788         if (isa<IntegerLiteral>(UO->getSubExpr()))
1789           return false;
1790 
1791     if (isa<CXXBoolLiteralExpr>(E))
1792       return false;
1793 
1794     return true;
1795   }
1796 
1797   void PrintValueDecl(ValueDecl *VD, bool AddressOf, Expr *E, bool NullPtr) {
1798     if (VD) {
1799       if (AddressOf)
1800         OS << "&";
1801       OS << VD->getName();
1802       return;
1803     }
1804 
1805     if (NullPtr) {
1806       if (E && !isa<CXXNullPtrLiteralExpr>(E)) {
1807         PrintExpr(E);
1808         if (IsBold) {
1809           Unbold();
1810           OS << " aka ";
1811           Bold();
1812         } else {
1813           OS << " aka ";
1814         }
1815       }
1816 
1817       OS << "nullptr";
1818       return;
1819     }
1820 
1821     OS << "(no argument)";
1822   }
1823 
1824   /// PrintDecl - Handles printing of Decl arguments, highlighting
1825   /// argument differences.
1826   void PrintValueDecl(ValueDecl *FromValueDecl, ValueDecl *ToValueDecl,
1827                       bool FromAddressOf, bool ToAddressOf, bool FromNullPtr,
1828                       bool ToNullPtr, Expr *FromExpr, Expr *ToExpr,
1829                       bool FromDefault, bool ToDefault, bool Same) {
1830     assert((FromValueDecl || FromNullPtr || ToValueDecl || ToNullPtr) &&
1831            "Only one Decl argument may be NULL");
1832 
1833     if (Same) {
1834       PrintValueDecl(FromValueDecl, FromAddressOf, FromExpr, FromNullPtr);
1835     } else if (!PrintTree) {
1836       OS << (FromDefault ? "(default) " : "");
1837       Bold();
1838       PrintValueDecl(FromValueDecl, FromAddressOf, FromExpr, FromNullPtr);
1839       Unbold();
1840     } else {
1841       OS << (FromDefault ? "[(default) " : "[");
1842       Bold();
1843       PrintValueDecl(FromValueDecl, FromAddressOf, FromExpr, FromNullPtr);
1844       Unbold();
1845       OS << " != " << (ToDefault ? "(default) " : "");
1846       Bold();
1847       PrintValueDecl(ToValueDecl, ToAddressOf, ToExpr, ToNullPtr);
1848       Unbold();
1849       OS << ']';
1850     }
1851   }
1852 
1853   /// PrintValueDeclAndInteger - Uses the print functions for ValueDecl and
1854   /// APSInt to print a mixed difference.
1855   void PrintValueDeclAndInteger(ValueDecl *VD, bool NeedAddressOf,
1856                                 bool IsNullPtr, Expr *VDExpr, bool DefaultDecl,
1857                                 const llvm::APSInt &Val, QualType IntType,
1858                                 Expr *IntExpr, bool DefaultInt) {
1859     if (!PrintTree) {
1860       OS << (DefaultDecl ? "(default) " : "");
1861       Bold();
1862       PrintValueDecl(VD, NeedAddressOf, VDExpr, IsNullPtr);
1863       Unbold();
1864     } else {
1865       OS << (DefaultDecl ? "[(default) " : "[");
1866       Bold();
1867       PrintValueDecl(VD, NeedAddressOf, VDExpr, IsNullPtr);
1868       Unbold();
1869       OS << " != " << (DefaultInt ? "(default) " : "");
1870       PrintAPSInt(Val, IntExpr, true /*Valid*/, IntType, false /*PrintType*/);
1871       OS << ']';
1872     }
1873   }
1874 
1875   /// PrintIntegerAndValueDecl - Uses the print functions for APSInt and
1876   /// ValueDecl to print a mixed difference.
1877   void PrintIntegerAndValueDecl(const llvm::APSInt &Val, QualType IntType,
1878                                 Expr *IntExpr, bool DefaultInt, ValueDecl *VD,
1879                                 bool NeedAddressOf, bool IsNullPtr,
1880                                 Expr *VDExpr, bool DefaultDecl) {
1881     if (!PrintTree) {
1882       OS << (DefaultInt ? "(default) " : "");
1883       PrintAPSInt(Val, IntExpr, true /*Valid*/, IntType, false /*PrintType*/);
1884     } else {
1885       OS << (DefaultInt ? "[(default) " : "[");
1886       PrintAPSInt(Val, IntExpr, true /*Valid*/, IntType, false /*PrintType*/);
1887       OS << " != " << (DefaultDecl ? "(default) " : "");
1888       Bold();
1889       PrintValueDecl(VD, NeedAddressOf, VDExpr, IsNullPtr);
1890       Unbold();
1891       OS << ']';
1892     }
1893   }
1894 
1895   // Prints the appropriate placeholder for elided template arguments.
1896   void PrintElideArgs(unsigned NumElideArgs, unsigned Indent) {
1897     if (PrintTree) {
1898       OS << '\n';
1899       for (unsigned i = 0; i < Indent; ++i)
1900         OS << "  ";
1901     }
1902     if (NumElideArgs == 0) return;
1903     if (NumElideArgs == 1)
1904       OS << "[...]";
1905     else
1906       OS << "[" << NumElideArgs << " * ...]";
1907   }
1908 
1909   // Prints and highlights differences in Qualifiers.
1910   void PrintQualifiers(Qualifiers FromQual, Qualifiers ToQual) {
1911     // Both types have no qualifiers
1912     if (FromQual.empty() && ToQual.empty())
1913       return;
1914 
1915     // Both types have same qualifiers
1916     if (FromQual == ToQual) {
1917       PrintQualifier(FromQual, /*ApplyBold*/false);
1918       return;
1919     }
1920 
1921     // Find common qualifiers and strip them from FromQual and ToQual.
1922     Qualifiers CommonQual = Qualifiers::removeCommonQualifiers(FromQual,
1923                                                                ToQual);
1924 
1925     // The qualifiers are printed before the template name.
1926     // Inline printing:
1927     // The common qualifiers are printed.  Then, qualifiers only in this type
1928     // are printed and highlighted.  Finally, qualifiers only in the other
1929     // type are printed and highlighted inside parentheses after "missing".
1930     // Tree printing:
1931     // Qualifiers are printed next to each other, inside brackets, and
1932     // separated by "!=".  The printing order is:
1933     // common qualifiers, highlighted from qualifiers, "!=",
1934     // common qualifiers, highlighted to qualifiers
1935     if (PrintTree) {
1936       OS << "[";
1937       if (CommonQual.empty() && FromQual.empty()) {
1938         Bold();
1939         OS << "(no qualifiers) ";
1940         Unbold();
1941       } else {
1942         PrintQualifier(CommonQual, /*ApplyBold*/false);
1943         PrintQualifier(FromQual, /*ApplyBold*/true);
1944       }
1945       OS << "!= ";
1946       if (CommonQual.empty() && ToQual.empty()) {
1947         Bold();
1948         OS << "(no qualifiers)";
1949         Unbold();
1950       } else {
1951         PrintQualifier(CommonQual, /*ApplyBold*/false,
1952                        /*appendSpaceIfNonEmpty*/!ToQual.empty());
1953         PrintQualifier(ToQual, /*ApplyBold*/true,
1954                        /*appendSpaceIfNonEmpty*/false);
1955       }
1956       OS << "] ";
1957     } else {
1958       PrintQualifier(CommonQual, /*ApplyBold*/false);
1959       PrintQualifier(FromQual, /*ApplyBold*/true);
1960     }
1961   }
1962 
1963   void PrintQualifier(Qualifiers Q, bool ApplyBold,
1964                       bool AppendSpaceIfNonEmpty = true) {
1965     if (Q.empty()) return;
1966     if (ApplyBold) Bold();
1967     Q.print(OS, Policy, AppendSpaceIfNonEmpty);
1968     if (ApplyBold) Unbold();
1969   }
1970 
1971 public:
1972 
1973   TemplateDiff(raw_ostream &OS, ASTContext &Context, QualType FromType,
1974                QualType ToType, bool PrintTree, bool PrintFromType,
1975                bool ElideType, bool ShowColor)
1976     : Context(Context),
1977       Policy(Context.getLangOpts()),
1978       ElideType(ElideType),
1979       PrintTree(PrintTree),
1980       ShowColor(ShowColor),
1981       // When printing a single type, the FromType is the one printed.
1982       FromTemplateType(PrintFromType ? FromType : ToType),
1983       ToTemplateType(PrintFromType ? ToType : FromType),
1984       OS(OS),
1985       IsBold(false) {
1986   }
1987 
1988   /// DiffTemplate - Start the template type diffing.
1989   void DiffTemplate() {
1990     Qualifiers FromQual = FromTemplateType.getQualifiers(),
1991                ToQual = ToTemplateType.getQualifiers();
1992 
1993     const TemplateSpecializationType *FromOrigTST =
1994         GetTemplateSpecializationType(Context, FromTemplateType);
1995     const TemplateSpecializationType *ToOrigTST =
1996         GetTemplateSpecializationType(Context, ToTemplateType);
1997 
1998     // Only checking templates.
1999     if (!FromOrigTST || !ToOrigTST)
2000       return;
2001 
2002     // Different base templates.
2003     if (!hasSameTemplate(FromOrigTST, ToOrigTST)) {
2004       return;
2005     }
2006 
2007     FromQual -= QualType(FromOrigTST, 0).getQualifiers();
2008     ToQual -= QualType(ToOrigTST, 0).getQualifiers();
2009 
2010     // Same base template, but different arguments.
2011     Tree.SetTemplateDiff(FromOrigTST->getTemplateName().getAsTemplateDecl(),
2012                          ToOrigTST->getTemplateName().getAsTemplateDecl(),
2013                          FromQual, ToQual, false /*FromDefault*/,
2014                          false /*ToDefault*/);
2015 
2016     DiffTemplate(FromOrigTST, ToOrigTST);
2017   }
2018 
2019   /// Emit - When the two types given are templated types with the same
2020   /// base template, a string representation of the type difference will be
2021   /// emitted to the stream and return true.  Otherwise, return false.
2022   bool Emit() {
2023     Tree.StartTraverse();
2024     if (Tree.Empty())
2025       return false;
2026 
2027     TreeToString();
2028     assert(!IsBold && "Bold is applied to end of string.");
2029     return true;
2030   }
2031 }; // end class TemplateDiff
2032 }  // end anonymous namespace
2033 
2034 /// FormatTemplateTypeDiff - A helper static function to start the template
2035 /// diff and return the properly formatted string.  Returns true if the diff
2036 /// is successful.
2037 static bool FormatTemplateTypeDiff(ASTContext &Context, QualType FromType,
2038                                    QualType ToType, bool PrintTree,
2039                                    bool PrintFromType, bool ElideType,
2040                                    bool ShowColors, raw_ostream &OS) {
2041   if (PrintTree)
2042     PrintFromType = true;
2043   TemplateDiff TD(OS, Context, FromType, ToType, PrintTree, PrintFromType,
2044                   ElideType, ShowColors);
2045   TD.DiffTemplate();
2046   return TD.Emit();
2047 }
2048