[clang] [llvm] [Clang] Emit DW_TAG_template_alias for template aliases (PR #87623)

Michael Buch via cfe-commits cfe-commits at lists.llvm.org
Thu Apr 18 05:13:08 PDT 2024


================
@@ -1332,6 +1332,54 @@ llvm::DIType *CGDebugInfo::CreateType(const TemplateSpecializationType *Ty,
   auto PP = getPrintingPolicy();
   Ty->getTemplateName().print(OS, PP, TemplateName::Qualified::None);
 
+  SourceLocation Loc = AliasDecl->getLocation();
+
+  if (CGM.getCodeGenOpts().DebugTemplateAlias) {
+    // TemplateSpecializationType doesn't know if its template args are
+    // being substituted into a parameter pack. We can find out if that's
+    // the case now by inspecting the TypeAliasTemplateDecl template
+    // parameters. Insert Ty's template args into SpecArgs, bundling args
+    // passed to a parameter pack into a TemplateArgument::Pack.
+    SmallVector<TemplateArgument> SpecArgs;
+    {
+      ArrayRef SubstArgs = Ty->template_arguments();
+      for (const NamedDecl *P : TD->getTemplateParameters()->asArray()) {
+        if (P->isParameterPack()) {
+          SpecArgs.push_back(TemplateArgument(SubstArgs));
+          break;
+        }
+        // Skip defaulted args.
+        if (SubstArgs.empty()) {
+          // If SubstArgs is now empty (we're taking from it each iteration) and
+          // this template parameter isn't a pack, then that should mean we're
+          // using default values for the remaining template parameters.
+          break;
----------------
Michael137 wrote:

> The constant value default appears to be working, it's the dependent value int I2 = I1 that is causing problems for me.

Aaah I see. Yea for a`TypeAliasTemplateDecl` we don't get the argument instantiations. Hmmm I don't see a good way of getting the information you need here. Perhaps @dwblaikie or @AaronBallman have some better ideas on how to resolve the dependent default arguments here.

Sorry for diverting you down this path, maybe ignoring the default arguments as you did in your first attempt is sufficient if this is just not feasible.

https://github.com/llvm/llvm-project/pull/87623


More information about the cfe-commits mailing list