From e673d71a07a85face6c3b7b60c1357f7dfe45255 Mon Sep 17 00:00:00 2001 From: Richard Trieu Date: Thu, 31 Jan 2013 02:47:46 +0000 Subject: [PATCH] When comparing two template template arguments in the template differ, consider them the same if they are actually the same; having the same name isn't enough. Similar to r174013, template template arguments were also mistakenly considered the same when they had the same name but were in different namespaces. In addition, when printing template template arguments, use the qualified name if the regular name is the same. llvm-svn: 174029 --- clang/lib/AST/ASTDiagnostic.cpp | 19 ++++++++++++++----- clang/test/Misc/diag-template-diffing.cpp | 8 ++++++++ 2 files changed, 22 insertions(+), 5 deletions(-) diff --git a/clang/lib/AST/ASTDiagnostic.cpp b/clang/lib/AST/ASTDiagnostic.cpp index fb3544f03aa6..4f165132a6f5 100644 --- a/clang/lib/AST/ASTDiagnostic.cpp +++ b/clang/lib/AST/ASTDiagnostic.cpp @@ -894,8 +894,9 @@ class TemplateDiff { GetTemplateDecl(FromIter, DefaultTTPD, FromDecl); GetTemplateDecl(ToIter, DefaultTTPD, ToDecl); Tree.SetNode(FromDecl, ToDecl); - Tree.SetSame(FromDecl && ToDecl && - FromDecl->getIdentifier() == ToDecl->getIdentifier()); + Tree.SetSame( + FromDecl && ToDecl && + FromDecl->getCanonicalDecl() == ToDecl->getCanonicalDecl()); } if (!FromIter.isEnd()) ++FromIter; @@ -1278,21 +1279,29 @@ class TemplateDiff { void PrintTemplateTemplate(TemplateDecl *FromTD, TemplateDecl *ToTD, bool FromDefault, bool ToDefault, bool Same) { assert((FromTD || ToTD) && "Only one template argument may be missing."); + + std::string FromName = FromTD ? FromTD->getName() : "(no argument)"; + std::string ToName = ToTD ? ToTD->getName() : "(no argument)"; + if (FromTD && ToTD && FromName == ToName) { + FromName = FromTD->getQualifiedNameAsString(); + ToName = ToTD->getQualifiedNameAsString(); + } + if (Same) { OS << "template " << FromTD->getNameAsString(); } else if (!PrintTree) { OS << (FromDefault ? "(default) template " : "template "); Bold(); - OS << (FromTD ? FromTD->getNameAsString() : "(no argument)"); + OS << FromName; Unbold(); } else { OS << (FromDefault ? "[(default) template " : "[template "); Bold(); - OS << (FromTD ? FromTD->getNameAsString() : "(no argument)"); + OS << FromName; Unbold(); OS << " != " << (ToDefault ? "(default) template " : "template "); Bold(); - OS << (ToTD ? ToTD->getNameAsString() : "(no argument)"); + OS << ToName; Unbold(); OS << ']'; } diff --git a/clang/test/Misc/diag-template-diffing.cpp b/clang/test/Misc/diag-template-diffing.cpp index 7e9998c82810..c6fc32d1b349 100644 --- a/clang/test/Misc/diag-template-diffing.cpp +++ b/clang/test/Misc/diag-template-diffing.cpp @@ -859,6 +859,14 @@ namespace rdar12931988 { // CHECK-ELIDE-NOTREE: no known conversion from 'B::X' to 'const rdar12931988::A::X' ax = bx; } + + template class> class Y {}; + + void bar(Y ya, Y yb) { + // CHECK-ELIDE-NOTREE: no viable overloaded '=' + // CHECK-ELIDE-NOTREE: no known conversion from 'Y