Author: rsmith Date: Fri Feb 17 19:01:48 2017 New Revision: 295521 URL: http://llvm.org/viewvc/llvm-project?rev=295521&view=rev Log: Handle deduction guides better in -ast-print.
Modified: cfe/trunk/lib/AST/DeclPrinter.cpp cfe/trunk/test/Misc/ast-dump-templates.cpp Modified: cfe/trunk/lib/AST/DeclPrinter.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/AST/DeclPrinter.cpp?rev=295521&r1=295520&r2=295521&view=diff ============================================================================== --- cfe/trunk/lib/AST/DeclPrinter.cpp (original) +++ cfe/trunk/lib/AST/DeclPrinter.cpp Fri Feb 17 19:01:48 2017 @@ -481,6 +481,7 @@ void DeclPrinter::VisitFunctionDecl(Func CXXConstructorDecl *CDecl = dyn_cast<CXXConstructorDecl>(D); CXXConversionDecl *ConversionDecl = dyn_cast<CXXConversionDecl>(D); + CXXDeductionGuideDecl *GuideDecl = dyn_cast<CXXDeductionGuideDecl>(D); if (!Policy.SuppressSpecifiers) { switch (D->getStorageClass()) { case SC_None: break; @@ -496,13 +497,16 @@ void DeclPrinter::VisitFunctionDecl(Func if (D->isModulePrivate()) Out << "__module_private__ "; if (D->isConstexpr() && !D->isExplicitlyDefaulted()) Out << "constexpr "; if ((CDecl && CDecl->isExplicitSpecified()) || - (ConversionDecl && ConversionDecl->isExplicit())) + (ConversionDecl && ConversionDecl->isExplicitSpecified()) || + (GuideDecl && GuideDecl->isExplicitSpecified())) Out << "explicit "; } PrintingPolicy SubPolicy(Policy); SubPolicy.SuppressSpecifiers = false; std::string Proto = D->getNameInfo().getAsString(); + if (GuideDecl) + Proto = GuideDecl->getDeducedTemplate()->getDeclName().getAsString(); if (const TemplateArgumentList *TArgs = D->getTemplateSpecializationArgs()) { llvm::raw_string_ostream POut(Proto); DeclPrinter TArgPrinter(POut, SubPolicy, Indentation); @@ -652,7 +656,9 @@ void DeclPrinter::VisitFunctionDecl(Func } } else if (!ConversionDecl && !isa<CXXDestructorDecl>(D)) { if (FT && FT->hasTrailingReturn()) { - Out << "auto " << Proto << " -> "; + if (!GuideDecl) + Out << "auto "; + Out << Proto << " -> "; Proto.clear(); } AFT->getReturnType().print(Out, Policy, Proto); @@ -1044,7 +1050,10 @@ void DeclPrinter::VisitFunctionTemplateD prettyPrintPragmas(D->getTemplatedDecl()); VisitRedeclarableTemplateDecl(D); - if (PrintInstantiation) { + // Never print "instantiations" for deduction guides (they don't really + // have them). + if (PrintInstantiation && + !isa<CXXDeductionGuideDecl>(D->getTemplatedDecl())) { FunctionDecl *PrevDecl = D->getTemplatedDecl(); const FunctionDecl *Def; if (PrevDecl->isDefined(Def) && Def != PrevDecl) Modified: cfe/trunk/test/Misc/ast-dump-templates.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Misc/ast-dump-templates.cpp?rev=295521&r1=295520&r2=295521&view=diff ============================================================================== --- cfe/trunk/test/Misc/ast-dump-templates.cpp (original) +++ cfe/trunk/test/Misc/ast-dump-templates.cpp Fri Feb 17 19:01:48 2017 @@ -1,7 +1,7 @@ -// RUN: %clang_cc1 -ast-print %s > %t +// RUN: %clang_cc1 -std=c++1z -ast-print %s > %t // RUN: FileCheck < %t %s -check-prefix=CHECK1 // RUN: FileCheck < %t %s -check-prefix=CHECK2 -// RUN: %clang_cc1 -ast-dump %s | FileCheck --check-prefix=DUMP %s +// RUN: %clang_cc1 -std=c++1z -ast-dump %s | FileCheck --check-prefix=DUMP %s template <int X, typename Y, int Z = 5> struct foo { @@ -61,3 +61,9 @@ void tmpl() { // DUMP: UnresolvedLookupExpr {{.*}} <col:3> '<overloaded function type>' lvalue (ADL) = 'func' } + +namespace test3 { + template<typename T> struct A {}; + template<typename T> A(T) -> A<int>; + // CHECK1: template <typename T> A(T) -> A<int>; +} _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits