From 3ad35ba4dea5240dd58476f0c85f0fe096d6c7ce Mon Sep 17 00:00:00 2001 From: =?utf8?q?Krist=C3=B3f=20Umann?= Date: Wed, 10 Nov 2021 15:03:06 +0100 Subject: [PATCH] [Templight] Don't display empty strings for names of unnamed template parameters Patch originally by oktal3000: https://github.com/mikael-s-persson/templight/pull/40 When a template parameter is unnamed, the name of -templight-dump might return an empty string. This is fine, they are unnamed after all, but it might be more user friendly to at least describe what entity is unnamed. Differential Revision: https://reviews.llvm.org/D115521 --- clang/lib/Frontend/FrontendActions.cpp | 95 +++++- .../test/Templight/templight-empty-entries-fix.cpp | 333 +++++++++++++++++++++ 2 files changed, 415 insertions(+), 13 deletions(-) create mode 100644 clang/test/Templight/templight-empty-entries-fix.cpp diff --git a/clang/lib/Frontend/FrontendActions.cpp b/clang/lib/Frontend/FrontendActions.cpp index 5b77c3e..ad2e603 100644 --- a/clang/lib/Frontend/FrontendActions.cpp +++ b/clang/lib/Frontend/FrontendActions.cpp @@ -8,9 +8,10 @@ #include "clang/Frontend/FrontendActions.h" #include "clang/AST/ASTConsumer.h" +#include "clang/AST/Decl.h" #include "clang/Basic/FileManager.h" -#include "clang/Basic/TargetInfo.h" #include "clang/Basic/LangStandard.h" +#include "clang/Basic/TargetInfo.h" #include "clang/Frontend/ASTConsumers.h" #include "clang/Frontend/CompilerInstance.h" #include "clang/Frontend/FrontendDiagnostic.h" @@ -23,6 +24,7 @@ #include "clang/Sema/TemplateInstCallback.h" #include "clang/Serialization/ASTReader.h" #include "clang/Serialization/ASTWriter.h" +#include "llvm/Support/ErrorHandling.h" #include "llvm/Support/FileSystem.h" #include "llvm/Support/MemoryBuffer.h" #include "llvm/Support/Path.h" @@ -480,25 +482,92 @@ private: Out << "---" << YAML << "\n"; } + static void printEntryName(const Sema &TheSema, const Decl *Entity, + llvm::raw_string_ostream &OS) { + auto *NamedTemplate = cast(Entity); + + PrintingPolicy Policy = TheSema.Context.getPrintingPolicy(); + // FIXME: Also ask for FullyQualifiedNames? + Policy.SuppressDefaultTemplateArgs = false; + NamedTemplate->getNameForDiagnostic(OS, Policy, true); + + if (!OS.str().empty()) + return; + + Decl *Ctx = Decl::castFromDeclContext(NamedTemplate->getDeclContext()); + NamedDecl *NamedCtx = dyn_cast_or_null(Ctx); + + if (const auto *Decl = dyn_cast(NamedTemplate)) { + if (const auto *R = dyn_cast(Decl)) { + if (R->isLambda()) { + OS << "lambda at "; + Decl->getLocation().print(OS, TheSema.getSourceManager()); + return; + } + } + OS << "unnamed " << Decl->getKindName(); + return; + } + + if (const auto *Decl = dyn_cast(NamedTemplate)) { + OS << "unnamed function parameter " << Decl->getFunctionScopeIndex() + << " "; + if (Decl->getFunctionScopeDepth() > 0) + OS << "(at depth " << Decl->getFunctionScopeDepth() << ") "; + OS << "of "; + NamedCtx->getNameForDiagnostic(OS, TheSema.getLangOpts(), true); + return; + } + + if (const auto *Decl = dyn_cast(NamedTemplate)) { + if (const Type *Ty = Decl->getTypeForDecl()) { + if (const auto *TTPT = dyn_cast_or_null(Ty)) { + OS << "unnamed template type parameter " << TTPT->getIndex() << " "; + if (TTPT->getDepth() > 0) + OS << "(at depth " << TTPT->getDepth() << ") "; + OS << "of "; + NamedCtx->getNameForDiagnostic(OS, TheSema.getLangOpts(), true); + return; + } + } + } + + if (const auto *Decl = dyn_cast(NamedTemplate)) { + OS << "unnamed template non-type parameter " << Decl->getIndex() << " "; + if (Decl->getDepth() > 0) + OS << "(at depth " << Decl->getDepth() << ") "; + OS << "of "; + NamedCtx->getNameForDiagnostic(OS, TheSema.getLangOpts(), true); + return; + } + + if (const auto *Decl = dyn_cast(NamedTemplate)) { + OS << "unnamed template template parameter " << Decl->getIndex() << " "; + if (Decl->getDepth() > 0) + OS << "(at depth " << Decl->getDepth() << ") "; + OS << "of "; + NamedCtx->getNameForDiagnostic(OS, TheSema.getLangOpts(), true); + return; + } + + llvm_unreachable("Failed to retrieve a name for this entry!"); + OS << "unnamed identifier"; + } + template static TemplightEntry getTemplightEntry(const Sema &TheSema, const CodeSynthesisContext &Inst) { TemplightEntry Entry; Entry.Kind = toString(Inst.Kind); Entry.Event = BeginInstantiation ? "Begin" : "End"; - if (auto *NamedTemplate = dyn_cast_or_null(Inst.Entity)) { - llvm::raw_string_ostream OS(Entry.Name); - PrintingPolicy Policy = TheSema.Context.getPrintingPolicy(); - // FIXME: Also ask for FullyQualifiedNames? - Policy.SuppressDefaultTemplateArgs = false; - NamedTemplate->getNameForDiagnostic(OS, Policy, true); - const PresumedLoc DefLoc = + llvm::raw_string_ostream OS(Entry.Name); + printEntryName(TheSema, Inst.Entity, OS); + const PresumedLoc DefLoc = TheSema.getSourceManager().getPresumedLoc(Inst.Entity->getLocation()); - if(!DefLoc.isInvalid()) - Entry.DefinitionLocation = std::string(DefLoc.getFilename()) + ":" + - std::to_string(DefLoc.getLine()) + ":" + - std::to_string(DefLoc.getColumn()); - } + if (!DefLoc.isInvalid()) + Entry.DefinitionLocation = std::string(DefLoc.getFilename()) + ":" + + std::to_string(DefLoc.getLine()) + ":" + + std::to_string(DefLoc.getColumn()); const PresumedLoc PoiLoc = TheSema.getSourceManager().getPresumedLoc(Inst.PointOfInstantiation); if (!PoiLoc.isInvalid()) { diff --git a/clang/test/Templight/templight-empty-entries-fix.cpp b/clang/test/Templight/templight-empty-entries-fix.cpp new file mode 100644 index 0000000..9154e56 --- /dev/null +++ b/clang/test/Templight/templight-empty-entries-fix.cpp @@ -0,0 +1,333 @@ +// RUN: %clang_cc1 -templight-dump -Wno-unused-value %s 2>&1 | FileCheck %s + +void a() { + [] {}; +} + +// CHECK-LABEL: {{^---$}} +// CHECK: {{^name:[ ]+'lambda at .*templight-empty-entries-fix.cpp:4:3'$}} +// CHECK: {{^kind:[ ]+Memoization$}} +// CHECK: {{^event:[ ]+Begin$}} +// CHECK: {{^orig:[ ]+'.*templight-empty-entries-fix.cpp:4:3'$}} +// CHECK: {{^poi:[ ]+'.*templight-empty-entries-fix.cpp:4:3'$}} +// CHECK-LABEL: {{^---$}} +// CHECK: {{^name:[ ]+'lambda at .*templight-empty-entries-fix.cpp:4:3'$}} +// CHECK: {{^kind:[ ]+Memoization$}} +// CHECK: {{^event:[ ]+End$}} +// CHECK: {{^orig:[ ]+'.*templight-empty-entries-fix.cpp:4:3'$}} +// CHECK: {{^poi:[ ]+'.*templight-empty-entries-fix.cpp:4:3'$}} + +template void a() { a(); } + +// CHECK-LABEL: {{^---$}} +// CHECK: {{^name:[ ]+a$}} +// CHECK: {{^kind:[ ]+DeducedTemplateArgumentSubstitution$}} +// CHECK: {{^event:[ ]+Begin$}} +// CHECK: {{^orig:[ ]+'.*templight-empty-entries-fix.cpp:20:25'$}} +// CHECK: {{^poi:[ ]+'.*templight-empty-entries-fix.cpp:20:31'$}} +// CHECK-LABEL: {{^---$}} +// CHECK: {{^name:[ ]+unnamed template non-type parameter 0 of a$}} +// CHECK: {{^kind:[ ]+DefaultTemplateArgumentInstantiation$}} +// CHECK: {{^event:[ ]+Begin$}} +// CHECK: {{^orig:[ ]+'.*templight-empty-entries-fix.cpp:20:15'$}} +// CHECK: {{^poi:[ ]+'.*templight-empty-entries-fix.cpp:20:25'$}} +// CHECK-LABEL: {{^---$}} +// CHECK: {{^name:[ ]+unnamed template non-type parameter 0 of a$}} +// CHECK: {{^kind:[ ]+DefaultTemplateArgumentInstantiation$}} +// CHECK: {{^event:[ ]+End$}} +// CHECK: {{^orig:[ ]+'.*templight-empty-entries-fix.cpp:20:15'$}} +// CHECK: {{^poi:[ ]+'.*templight-empty-entries-fix.cpp:20:25'$}} +// CHECK-LABEL: {{^---$}} +// CHECK: {{^name:[ ]+a$}} +// CHECK: {{^kind:[ ]+DeducedTemplateArgumentSubstitution$}} +// CHECK: {{^event:[ ]+End$}} +// CHECK: {{^orig:[ ]+'.*templight-empty-entries-fix.cpp:20:25'$}} +// CHECK: {{^poi:[ ]+'.*templight-empty-entries-fix.cpp:20:31'$}} +// CHECK-LABEL: {{^---$}} +// CHECK: {{^name:[ ]+'a<0>'$}} +// CHECK: {{^kind:[ ]+TemplateInstantiation$}} +// CHECK: {{^event:[ ]+Begin$}} +// CHECK: {{^orig:[ ]+'.*templight-empty-entries-fix.cpp:20:25'$}} +// CHECK: {{^poi:[ ]+'.*templight-empty-entries-fix.cpp:20:31'$}} +// CHECK-LABEL: {{^---$}} +// CHECK: {{^name:[ ]+'a<0>'$}} +// CHECK: {{^kind:[ ]+TemplateInstantiation$}} +// CHECK: {{^event:[ ]+End$}} +// CHECK: {{^orig:[ ]+'.*templight-empty-entries-fix.cpp:20:25'$}} +// CHECK: {{^poi:[ ]+'.*templight-empty-entries-fix.cpp:20:31'$}} + +template struct b { typedef int c; }; +template ::c> void a() { a(); } + +// CHECK-LABEL: {{^---$}} +// CHECK: {{^name:[ ]+a$}} +// CHECK: {{^kind:[ ]+DeducedTemplateArgumentSubstitution$}} +// CHECK: {{^event:[ ]+Begin$}} +// CHECK: {{^orig:[ ]+'.*templight-empty-entries-fix.cpp:60:57'$}} +// CHECK: {{^poi:[ ]+'.*templight-empty-entries-fix.cpp:60:63'$}} +// CHECK-LABEL: {{^---$}} +// CHECK: {{^name:[ ]+d$}} +// CHECK: {{^kind:[ ]+DefaultTemplateArgumentInstantiation$}} +// CHECK: {{^event:[ ]+Begin$}} +// CHECK: {{^orig:[ ]+'.*templight-empty-entries-fix.cpp:60:16'$}} +// CHECK: {{^poi:[ ]+'.*templight-empty-entries-fix.cpp:60:57'$}} +// CHECK-LABEL: {{^---$}} +// CHECK: {{^name:[ ]+d$}} +// CHECK: {{^kind:[ ]+DefaultTemplateArgumentInstantiation$}} +// CHECK: {{^event:[ ]+End$}} +// CHECK: {{^orig:[ ]+'.*templight-empty-entries-fix.cpp:60:16'$}} +// CHECK: {{^poi:[ ]+'.*templight-empty-entries-fix.cpp:60:57'$}} +// CHECK-LABEL: {{^---$}} +// CHECK: {{^name:[ ]+unnamed template type parameter 1 of a$}} +// CHECK: {{^kind:[ ]+DefaultTemplateArgumentInstantiation$}} +// CHECK: {{^event:[ ]+Begin$}} +// CHECK: {{^orig:[ ]+'.*templight-empty-entries-fix.cpp:60:32'$}} +// CHECK: {{^poi:[ ]+'.*templight-empty-entries-fix.cpp:60:57'$}} +// CHECK-LABEL: {{^---$}} +// CHECK: {{^name:[ ]+'b<1>'$}} +// CHECK: {{^kind:[ ]+TemplateInstantiation$}} +// CHECK: {{^event:[ ]+Begin$}} +// CHECK: {{^orig:[ ]+'.*templight-empty-entries-fix.cpp:59:23'$}} +// CHECK: {{^poi:[ ]+'.*templight-empty-entries-fix.cpp:60:43'$}} +// CHECK-LABEL: {{^---$}} +// CHECK: {{^name:[ ]+'b<1>'$}} +// CHECK: {{^kind:[ ]+TemplateInstantiation$}} +// CHECK: {{^event:[ ]+End$}} +// CHECK: {{^orig:[ ]+'.*templight-empty-entries-fix.cpp:59:23'$}} +// CHECK: {{^poi:[ ]+'.*templight-empty-entries-fix.cpp:60:43'$}} +// CHECK-LABEL: {{^---$}} +// CHECK: {{^name:[ ]+'b<1>'$}} +// CHECK: {{^kind:[ ]+TemplateInstantiation$}} +// CHECK: {{^event:[ ]+Begin$}} +// CHECK: {{^orig:[ ]+'.*templight-empty-entries-fix.cpp:59:23'$}} +// CHECK: {{^poi:[ ]+'.*templight-empty-entries-fix.cpp:60:43'$}} +// CHECK-LABEL: {{^---$}} +// CHECK: {{^name:[ ]+'b<1>'$}} +// CHECK: {{^kind:[ ]+TemplateInstantiation$}} +// CHECK: {{^event:[ ]+End$}} +// CHECK: {{^orig:[ ]+'.*templight-empty-entries-fix.cpp:59:23'$}} +// CHECK: {{^poi:[ ]+'.*templight-empty-entries-fix.cpp:60:43'$}} +// CHECK-LABEL: {{^---$}} +// CHECK: {{^name:[ ]+'b<1>'$}} +// CHECK: {{^kind:[ ]+Memoization$}} +// CHECK: {{^event:[ ]+Begin$}} +// CHECK: {{^orig:[ ]+'.*templight-empty-entries-fix.cpp:59:23'$}} +// CHECK: {{^poi:[ ]+'.*templight-empty-entries-fix.cpp:60:43'$}} +// CHECK-LABEL: {{^---$}} +// CHECK: {{^name:[ ]+'b<1>'$}} +// CHECK: {{^kind:[ ]+Memoization$}} +// CHECK: {{^event:[ ]+End$}} +// CHECK: {{^orig:[ ]+'.*templight-empty-entries-fix.cpp:59:23'$}} +// CHECK: {{^poi:[ ]+'.*templight-empty-entries-fix.cpp:60:43'$}} +// CHECK-LABEL: {{^---$}} +// CHECK: {{^name:[ ]+unnamed template type parameter 1 of a$}} +// CHECK: {{^kind:[ ]+DefaultTemplateArgumentInstantiation$}} +// CHECK: {{^event:[ ]+End$}} +// CHECK: {{^orig:[ ]+'.*templight-empty-entries-fix.cpp:60:32'$}} +// CHECK: {{^poi:[ ]+'.*templight-empty-entries-fix.cpp:60:57'$}} +// CHECK-LABEL: {{^---$}} +// CHECK: {{^name:[ ]+a$}} +// CHECK: {{^kind:[ ]+DeducedTemplateArgumentSubstitution$}} +// CHECK: {{^event:[ ]+End$}} +// CHECK: {{^orig:[ ]+'.*templight-empty-entries-fix.cpp:60:57'$}} +// CHECK: {{^poi:[ ]+'.*templight-empty-entries-fix.cpp:60:63'$}} +// CHECK-LABEL: {{^---$}} +// CHECK: {{^name:[ ]+'a'$}} +// CHECK: {{^kind:[ ]+TemplateInstantiation$}} +// CHECK: {{^event:[ ]+Begin$}} +// CHECK: {{^orig:[ ]+'.*templight-empty-entries-fix.cpp:60:57'$}} +// CHECK: {{^poi:[ ]+'.*templight-empty-entries-fix.cpp:60:63'$}} +// CHECK-LABEL: {{^---$}} +// CHECK: {{^name:[ ]+'a'$}} +// CHECK: {{^kind:[ ]+TemplateInstantiation$}} +// CHECK: {{^event:[ ]+End$}} +// CHECK: {{^orig:[ ]+'.*templight-empty-entries-fix.cpp:60:57'$}} +// CHECK: {{^poi:[ ]+'.*templight-empty-entries-fix.cpp:60:63'$}} +// CHECK-LABEL: {{^---$}} +// CHECK: {{^name:[ ]+a$}} +// CHECK: {{^kind:[ ]+DeducedTemplateArgumentSubstitution$}} +// CHECK: {{^event:[ ]+Begin$}} +// CHECK: {{^orig:[ ]+'.*templight-empty-entries-fix.cpp:20:25'$}} +// CHECK: {{^poi:[ ]+'.*templight-empty-entries-fix.cpp:60:63'$}} +// CHECK-LABEL: {{^---$}} +// CHECK: {{^name:[ ]+unnamed template non-type parameter 0 of a$}} +// CHECK: {{^kind:[ ]+DefaultTemplateArgumentInstantiation$}} +// CHECK: {{^event:[ ]+Begin$}} +// CHECK: {{^orig:[ ]+'.*templight-empty-entries-fix.cpp:20:15'$}} +// CHECK: {{^poi:[ ]+'.*templight-empty-entries-fix.cpp:20:25'$}} +// CHECK-LABEL: {{^---$}} +// CHECK: {{^name:[ ]+unnamed template non-type parameter 0 of a$}} +// CHECK: {{^kind:[ ]+DefaultTemplateArgumentInstantiation$}} +// CHECK: {{^event:[ ]+End$}} +// CHECK: {{^orig:[ ]+'.*templight-empty-entries-fix.cpp:20:15'$}} +// CHECK: {{^poi:[ ]+'.*templight-empty-entries-fix.cpp:20:25'$}} +// CHECK-LABEL: {{^---$}} +// CHECK: {{^name:[ ]+a$}} +// CHECK: {{^kind:[ ]+DeducedTemplateArgumentSubstitution$}} +// CHECK: {{^event:[ ]+End$}} +// CHECK: {{^orig:[ ]+'.*templight-empty-entries-fix.cpp:20:25'$}} +// CHECK: {{^poi:[ ]+'.*templight-empty-entries-fix.cpp:60:63'$}} + +template void d(int = 0) { d(); } + +// CHECK-LABEL: {{^---$}} +// CHECK: {{^name:[ ]+d$}} +// CHECK: {{^kind:[ ]+DeducedTemplateArgumentSubstitution$}} +// CHECK: {{^event:[ ]+Begin$}} +// CHECK: {{^orig:[ ]+'.*templight-empty-entries-fix.cpp:171:29'$}} +// CHECK: {{^poi:[ ]+'.*templight-empty-entries-fix.cpp:171:42'$}} +// CHECK-LABEL: {{^---$}} +// CHECK: {{^name:[ ]+unnamed template non-type parameter 0 of d$}} +// CHECK: {{^kind:[ ]+DefaultTemplateArgumentInstantiation$}} +// CHECK: {{^event:[ ]+Begin$}} +// CHECK: {{^orig:[ ]+'.*templight-empty-entries-fix.cpp:171:16'$}} +// CHECK: {{^poi:[ ]+'.*templight-empty-entries-fix.cpp:171:29'$}} +// CHECK-LABEL: {{^---$}} +// CHECK: {{^name:[ ]+unnamed template non-type parameter 0 of d$}} +// CHECK: {{^kind:[ ]+DefaultTemplateArgumentInstantiation$}} +// CHECK: {{^event:[ ]+End$}} +// CHECK: {{^orig:[ ]+'.*templight-empty-entries-fix.cpp:171:16'$}} +// CHECK: {{^poi:[ ]+'.*templight-empty-entries-fix.cpp:171:29'$}} +// CHECK-LABEL: {{^---$}} +// CHECK: {{^name:[ ]+d$}} +// CHECK: {{^kind:[ ]+DeducedTemplateArgumentSubstitution$}} +// CHECK: {{^event:[ ]+End$}} +// CHECK: {{^orig:[ ]+'.*templight-empty-entries-fix.cpp:171:29'$}} +// CHECK: {{^poi:[ ]+'.*templight-empty-entries-fix.cpp:171:42'$}} +// CHECK-LABEL: {{^---$}} +// CHECK: {{^name:[ ]+'d'$}} +// CHECK: {{^kind:[ ]+TemplateInstantiation$}} +// CHECK: {{^event:[ ]+Begin$}} +// CHECK: {{^orig:[ ]+'.*templight-empty-entries-fix.cpp:171:29'$}} +// CHECK: {{^poi:[ ]+'.*templight-empty-entries-fix.cpp:171:42'$}} +// CHECK-LABEL: {{^---$}} +// CHECK: {{^name:[ ]+'d'$}} +// CHECK: {{^kind:[ ]+TemplateInstantiation$}} +// CHECK: {{^event:[ ]+End$}} +// CHECK: {{^orig:[ ]+'.*templight-empty-entries-fix.cpp:171:29'$}} +// CHECK: {{^poi:[ ]+'.*templight-empty-entries-fix.cpp:171:42'$}} +// CHECK-LABEL: {{^---$}} +// CHECK: {{^name:[ ]+'unnamed function parameter 0 of d'$}} +// CHECK: {{^kind:[ ]+DefaultFunctionArgumentInstantiation$}} +// CHECK: {{^event:[ ]+Begin$}} +// CHECK: {{^orig:[ ]+'.*templight-empty-entries-fix.cpp:171:35'$}} +// CHECK: {{^poi:[ ]+'.*templight-empty-entries-fix.cpp:171:42'$}} +// CHECK-LABEL: {{^---$}} +// CHECK: {{^name:[ ]+'unnamed function parameter 0 of d'$}} +// CHECK: {{^kind:[ ]+DefaultFunctionArgumentInstantiation$}} +// CHECK: {{^event:[ ]+End$}} +// CHECK: {{^orig:[ ]+'.*templight-empty-entries-fix.cpp:171:35'$}} +// CHECK: {{^poi:[ ]+'.*templight-empty-entries-fix.cpp:171:42'$}} + +void e() { + struct { + } f; +} + +// CHECK-LABEL: {{^---$}} +// CHECK: {{^name:[ ]+unnamed struct$}} +// CHECK: {{^kind:[ ]+Memoization$}} +// CHECK: {{^event:[ ]+Begin$}} +// CHECK: {{^orig:[ ]+'.*templight-empty-entries-fix.cpp:223:3'$}} +// CHECK: {{^poi:[ ]+'.*templight-empty-entries-fix.cpp:224:5'$}} +// CHECK-LABEL: {{^---$}} +// CHECK: {{^name:[ ]+unnamed struct$}} +// CHECK: {{^kind:[ ]+Memoization$}} +// CHECK: {{^event:[ ]+End$}} +// CHECK: {{^orig:[ ]+'.*templight-empty-entries-fix.cpp:223:3'$}} +// CHECK: {{^poi:[ ]+'.*templight-empty-entries-fix.cpp:224:5'$}} +// CHECK-LABEL: {{^---$}} +// CHECK: {{^name:[ ]+unnamed struct$}} +// CHECK: {{^kind:[ ]+Memoization$}} +// CHECK: {{^event:[ ]+Begin$}} +// CHECK: {{^orig:[ ]+'.*templight-empty-entries-fix.cpp:223:3'$}} +// CHECK: {{^poi:[ ]+'.*templight-empty-entries-fix.cpp:224:5'$}} +// CHECK-LABEL: {{^---$}} +// CHECK: {{^name:[ ]+unnamed struct$}} +// CHECK: {{^kind:[ ]+Memoization$}} +// CHECK: {{^event:[ ]+End$}} +// CHECK: {{^orig:[ ]+'.*templight-empty-entries-fix.cpp:223:3'$}} +// CHECK: {{^poi:[ ]+'.*templight-empty-entries-fix.cpp:224:5'$}} +// CHECK-LABEL: {{^---$}} +// CHECK: {{^name:[ ]+unnamed struct$}} +// CHECK: {{^kind:[ ]+Memoization$}} +// CHECK: {{^event:[ ]+Begin$}} +// CHECK: {{^orig:[ ]+'.*templight-empty-entries-fix.cpp:223:3'$}} +// CHECK: {{^poi:[ ]+'.*templight-empty-entries-fix.cpp:223:3'$}} +// CHECK-LABEL: {{^---$}} +// CHECK: {{^name:[ ]+unnamed struct$}} +// CHECK: {{^kind:[ ]+Memoization$}} +// CHECK: {{^event:[ ]+End$}} +// CHECK: {{^orig:[ ]+'.*templight-empty-entries-fix.cpp:223:3'$}} +// CHECK: {{^poi:[ ]+'.*templight-empty-entries-fix.cpp:223:3'$}} + + +template class> +void d(); + +template struct C; + +void foo() { + d(); +} + +// CHECK-LABEL: {{^---$}} +// CHECK: {{^name:[ ]+d$}} +// CHECK: {{^kind:[ ]+ExplicitTemplateArgumentSubstitution$}} +// CHECK: {{^event:[ ]+Begin$}} +// CHECK: {{^orig:[ ]+'.*templight-empty-entries-fix.cpp:266:6'$}} +// CHECK: {{^poi:[ ]+'.*templight-empty-entries-fix.cpp:271:3'$}} +// CHECK-LABEL: {{^---$}} +// CHECK: {{^name:[ ]+unnamed template template parameter 0 of d$}} +// CHECK: {{^kind:[ ]+PriorTemplateArgumentSubstitution$}} +// CHECK: {{^event:[ ]+Begin$}} +// CHECK: {{^orig:[ ]+'.*templight-empty-entries-fix.cpp:265:35'$}} +// CHECK: {{^poi:[ ]+''$}} +// CHECK-LABEL: {{^---$}} +// CHECK: {{^name:[ ]+unnamed template template parameter 0 of d$}} +// CHECK: {{^kind:[ ]+PriorTemplateArgumentSubstitution$}} +// CHECK: {{^event:[ ]+End$}} +// CHECK: {{^orig:[ ]+'.*templight-empty-entries-fix.cpp:265:35'$}} +// CHECK: {{^poi:[ ]+''$}} +// CHECK-LABEL: {{^---$}} +// CHECK: {{^name:[ ]+d$}} +// CHECK: {{^kind:[ ]+ExplicitTemplateArgumentSubstitution$}} +// CHECK: {{^event:[ ]+End$}} +// CHECK: {{^orig:[ ]+'.*templight-empty-entries-fix.cpp:266:6'$}} +// CHECK: {{^poi:[ ]+'.*templight-empty-entries-fix.cpp:271:3'$}} +// CHECK-LABEL: {{^---$}} +// CHECK: {{^name:[ ]+d$}} +// CHECK: {{^kind:[ ]+DeducedTemplateArgumentSubstitution$}} +// CHECK: {{^event:[ ]+Begin$}} +// CHECK: {{^orig:[ ]+'.*templight-empty-entries-fix.cpp:266:6'$}} +// CHECK: {{^poi:[ ]+'.*templight-empty-entries-fix.cpp:271:3'$}} +// CHECK-LABEL: {{^---$}} +// CHECK: {{^name:[ ]+d$}} +// CHECK: {{^kind:[ ]+DeducedTemplateArgumentSubstitution$}} +// CHECK: {{^event:[ ]+End$}} +// CHECK: {{^orig:[ ]+'.*templight-empty-entries-fix.cpp:266:6'$}} +// CHECK: {{^poi:[ ]+'.*templight-empty-entries-fix.cpp:271:3'$}} +// CHECK-LABEL: {{^---$}} +// CHECK: {{^name:[ ]+'d'$}} +// CHECK: {{^kind:[ ]+TemplateInstantiation$}} +// CHECK: {{^event:[ ]+Begin$}} +// CHECK: {{^orig:[ ]+'.*templight-empty-entries-fix.cpp:266:6'$}} +// CHECK: {{^poi:[ ]+'.*templight-empty-entries-fix.cpp:271:3'$}} +// CHECK-LABEL: {{^---$}} +// CHECK: {{^name:[ ]+'d'$}} +// CHECK: {{^kind:[ ]+TemplateInstantiation$}} +// CHECK: {{^event:[ ]+End$}} +// CHECK: {{^orig:[ ]+'.*templight-empty-entries-fix.cpp:266:6'$}} +// CHECK: {{^poi:[ ]+'.*templight-empty-entries-fix.cpp:271:3'$}} +// CHECK-LABEL: {{^---$}} +// CHECK: {{^name:[ ]+d$}} +// CHECK: {{^kind:[ ]+ExplicitTemplateArgumentSubstitution$}} +// CHECK: {{^event:[ ]+Begin$}} +// CHECK: {{^orig:[ ]+'.*templight-empty-entries-fix.cpp:171:29'$}} +// CHECK: {{^poi:[ ]+'.*templight-empty-entries-fix.cpp:271:3'$}} +// CHECK-LABEL: {{^---$}} +// CHECK: {{^name:[ ]+d$}} +// CHECK: {{^kind:[ ]+ExplicitTemplateArgumentSubstitution$}} +// CHECK: {{^event:[ ]+End$}} +// CHECK: {{^orig:[ ]+'.*templight-empty-entries-fix.cpp:171:29'$}} +// CHECK: {{^poi:[ ]+'.*templight-empty-entries-fix.cpp:271:3'$}} -- 2.7.4