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