Suppress trailing template arguments equivalent to default arguments

when printing the name of a member of a class template specialization.
This commit is contained in:
Richard Smith 2020-11-12 20:55:21 -08:00
parent a9386bb0f9
commit 7602ef768b
3 changed files with 9 additions and 3 deletions

View File

@ -1627,7 +1627,9 @@ void NamedDecl::printNestedNameSpecifier(raw_ostream &OS,
if (const auto *Spec = dyn_cast<ClassTemplateSpecializationDecl>(DC)) {
OS << Spec->getName();
const TemplateArgumentList &TemplateArgs = Spec->getTemplateArgs();
printTemplateArgumentList(OS, TemplateArgs.asArray(), P);
printTemplateArgumentList(
OS, TemplateArgs.asArray(), P,
Spec->getSpecializedTemplate()->getTemplateParameters());
} else if (const auto *ND = dyn_cast<NamespaceDecl>(DC)) {
if (ND->isAnonymousNamespace()) {
OS << (P.MSVCFormatting ? "`anonymous namespace\'"

View File

@ -7,7 +7,7 @@
// CHECK-DAG: private unnamed_addr constant [95 x i8] c"void SpecializedClassTemplate<char>::memberFunctionTemplate(T, U) const [T = char, U = double]\00"
// CHECK-DAG: private unnamed_addr constant [85 x i8] c"void SpecializedClassTemplate<int>::memberFunctionTemplate(int, U) const [U = float]\00"
// CHECK-DAG: private unnamed_addr constant [57 x i8] c"void NonTypeTemplateParam<42>::size() const [Count = 42]\00"
// CHECK-DAG: private unnamed_addr constant [122 x i8] c"static void ClassWithTemplateTemplateParam<char, NS::ClassTemplate>::staticMember() [T = char, Param = NS::ClassTemplate]\00"
// CHECK-DAG: private unnamed_addr constant [103 x i8] c"static void ClassWithTemplateTemplateParam<char>::staticMember() [T = char, Param = NS::ClassTemplate]\00"
// CHECK-DAG: private unnamed_addr constant [106 x i8] c"void OuterClass<int *>::MiddleClass::InnerClass<float>::memberFunction(T, U) const [T = int *, U = float]\00"
// CHECK-DAG: private unnamed_addr constant [51 x i8] c"void functionTemplateWithCapturedStmt(T) [T = int]\00"
// CHECK-DAG: private unnamed_addr constant [76 x i8] c"auto functionTemplateWithLambda(int)::(anonymous class)::operator()() const\00"

View File

@ -15,11 +15,15 @@ namespace default_args {
}
template<typename T> struct default_delete {};
template<class T, class Deleter = default_delete<T>> class unique_ptr {};
template<class T, class Deleter = default_delete<T>> class unique_ptr {
public:
void f() { T::error(); } // expected-error {{no member named 'error' in 'default_args::basic_string<char>'}}
};
template<class T, class Deleter> class unique_ptr<T[], Deleter> {};
void test2() {
unique_ptr<string> ups;
f(ups).reset(); // expected-error {{no member named 'reset' in 'default_args::unique_ptr<default_args::basic_string<char>>'}}
f(ups).f(); // expected-note {{in instantiation of member function 'default_args::unique_ptr<default_args::basic_string<char>>::f' requested here}}
}
template<int A, int B = A> struct Z { int error[B]; }; // expected-error {{negative size}}