[clang] [Clang] Fall back to DW_TAG_typedef for instantiation dependent template aliases (PR #90032)

2024-05-08 Thread Orlando Cazalet-Hyams via cfe-commits

OCHyams wrote:

Here's that issue - #91451.

Carlos pointed me to [bz44884](https://bugs.llvm.org/show_bug.cgi?id=44884) 
(#44229) which may be related

https://github.com/llvm/llvm-project/pull/90032
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] [Clang] Fall back to DW_TAG_typedef for instantiation dependent template aliases (PR #90032)

2024-05-03 Thread David Blaikie via cfe-commits

dwblaikie wrote:

> > Comment in the code should probably mention this as a FIXME and include a 
> > reference to the issue?
> 
> Sure, added in 
> [f78949a](https://github.com/llvm/llvm-project/commit/f78949a07e33017a798c410a102c95455685a9b1)

Thanks!

> > Also, there's another bug here - the DW_TAG_typedef is in the CU scope, 
> > instead of the struct scope. But if the struct is a non-template, the 
> > typedef is in the struct scope as it should be, not the CU scope...
> 
> That does looks odd - I can reproduce it with normal (language-level) 
> typedefs too (rather than with template aliases): 
> https://godbolt.org/z/GsGKqhKzz. I can open a separate issue?

Yep!

https://github.com/llvm/llvm-project/pull/90032
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] [Clang] Fall back to DW_TAG_typedef for instantiation dependent template aliases (PR #90032)

2024-04-30 Thread Orlando Cazalet-Hyams via cfe-commits

OCHyams wrote:

> Comment in the code should probably mention this as a FIXME and include a 
> reference to the issue?

Sure, added in f78949a07e33017a798c410a102c95455685a9b1

> Also, there's another bug here - the DW_TAG_typedef is in the CU scope, 
> instead of the struct scope. But if the struct is a non-template, the typedef 
> is in the struct scope as it should be, not the CU scope...

That does looks odd - I can reproduce it with normal (language-level) typedefs 
too (rather than with template aliases): https://godbolt.org/z/GsGKqhKzz. I can 
open a separate issue?

Now that I think about it, I recall @CarlosAlbertoEnciso running into something 
similar a while ago... I'm sure a bug was filed about something similar but I 
can't find it. Does this ring any bells @CarlosAlbertoEnciso?


https://github.com/llvm/llvm-project/pull/90032
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] [Clang] Fall back to DW_TAG_typedef for instantiation dependent template aliases (PR #90032)

2024-04-29 Thread David Blaikie via cfe-commits

dwblaikie wrote:

Comment in the code should probably mention this as a FIXME and include a 
reference to the issue?

Also, there's another bug here - the DW_TAG_typedef is in the CU scope, instead 
of the struct scope. But if the struct is a non-template, the typedef is in the 
struct scope as it should be, not the CU scope... 

https://github.com/llvm/llvm-project/pull/90032
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] [Clang] Fall back to DW_TAG_typedef for instantiation dependent template aliases (PR #90032)

2024-04-25 Thread Orlando Cazalet-Hyams via cfe-commits

https://github.com/OCHyams closed 
https://github.com/llvm/llvm-project/pull/90032
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] [Clang] Fall back to DW_TAG_typedef for instantiation dependent template aliases (PR #90032)

2024-04-25 Thread Michael Buch via cfe-commits

https://github.com/Michael137 approved this pull request.


https://github.com/llvm/llvm-project/pull/90032
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] [Clang] Fall back to DW_TAG_typedef for instantiation dependent template aliases (PR #90032)

2024-04-25 Thread via cfe-commits

llvmbot wrote:




@llvm/pr-subscribers-clang

Author: Orlando Cazalet-Hyams (OCHyams)


Changes

Workaround for issue #89774 until it can be properly fixed.

When `-gtemplate-alias` is specified Clang emits a DW_TAG_template_alias for 
template aliases. This patch avoids an assertion failure by falling back to the 
 `-gno-template-alias` (default) behaviour, emitting a DW_TAG_typedef, if the 
alias is instantiation dependent.



---
Full diff: https://github.com/llvm/llvm-project/pull/90032.diff


2 Files Affected:

- (modified) clang/lib/CodeGen/CGDebugInfo.cpp (+20-1) 
- (added) clang/test/CodeGenCXX/dependent-template-alias.cpp (+21) 


``diff
diff --git a/clang/lib/CodeGen/CGDebugInfo.cpp 
b/clang/lib/CodeGen/CGDebugInfo.cpp
index 539ded5cca5e1b..787db350487417 100644
--- a/clang/lib/CodeGen/CGDebugInfo.cpp
+++ b/clang/lib/CodeGen/CGDebugInfo.cpp
@@ -1372,7 +1372,26 @@ llvm::DIType *CGDebugInfo::CreateType(const 
TemplateSpecializationType *Ty,
 
   SourceLocation Loc = AliasDecl->getLocation();
 
-  if (CGM.getCodeGenOpts().DebugTemplateAlias) {
+  if (CGM.getCodeGenOpts().DebugTemplateAlias &&
+  // The TemplateSpecializationType doesn't contain any instantiation
+  // information; dependent template arguments can't be resolved. For now,
+  // fall back to DW_TAG_typedefs for template aliases that are
+  // instantiation dependent, e.g.:
+  // ```
+  // template 
+  // using A = int;
+  //
+  // template
+  // struct S {
+  //   using AA = A; // Instantiation dependent.
+  //   AA aa;
+  // };
+  //
+  // S<0> s;
+  // ```
+  // S::AA's underlying type A is dependent on I so will be emitted as a
+  // DW_TAG_typedef.
+  !Ty->isInstantiationDependentType()) {
 auto ArgVector = ::GetTemplateArgs(TD, Ty);
 TemplateArgs Args = {TD->getTemplateParameters(), ArgVector};
 
diff --git a/clang/test/CodeGenCXX/dependent-template-alias.cpp 
b/clang/test/CodeGenCXX/dependent-template-alias.cpp
new file mode 100644
index 00..deb243f9fc88d0
--- /dev/null
+++ b/clang/test/CodeGenCXX/dependent-template-alias.cpp
@@ -0,0 +1,21 @@
+// RUN: %clang_cc1 -triple x86_64-unk-unk -o - -emit-llvm 
-debug-info-kind=standalone -gtemplate-alias %s -gsimple-template-names=simple \
+// RUN: | FileCheck %s
+
+ Check that -gtemplate-alias falls back to DW_TAG_typedef emission
+ for instantiation dependent type aliases.
+
+template 
+using A = int;
+
+template
+struct S {
+  using AA = A;
+  AA aa;
+};
+
+S<0> s;
+
+// CHECK: !DIDerivedType(tag: DW_TAG_member, name: "aa", scope: ![[#]], file: 
![[#]], line: [[#]], baseType: ![[AA:[0-9]+]], size: 32)
+// CHECK: [[AA]] = !DIDerivedType(tag: DW_TAG_typedef, name: "AA", file: 
![[#]], line: [[#]], baseType: ![[A:[0-9]+]])
+// CHECK: [[A]] = !DIDerivedType(tag: DW_TAG_typedef, name: "A", file: 
![[#]], line: [[#]], baseType: ![[int:[0-9]+]])
+// CHECK: [[int]] = !DIBasicType(name: "int", size: 32, encoding: 
DW_ATE_signed)

``




https://github.com/llvm/llvm-project/pull/90032
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] [Clang] Fall back to DW_TAG_typedef for instantiation dependent template aliases (PR #90032)

2024-04-25 Thread Orlando Cazalet-Hyams via cfe-commits

https://github.com/OCHyams created 
https://github.com/llvm/llvm-project/pull/90032

Workaround for issue #89774 until it can be properly fixed.

When `-gtemplate-alias` is specified Clang emits a DW_TAG_template_alias for 
template aliases. This patch avoids an assertion failure by falling back to the 
 `-gno-template-alias` (default) behaviour, emitting a DW_TAG_typedef, if the 
alias is instantiation dependent.



>From 075a3f662807d2605964bd20b17e9552c07098be Mon Sep 17 00:00:00 2001
From: Orlando Cazalet-Hyams 
Date: Thu, 25 Apr 2024 09:30:05 +0100
Subject: [PATCH] [Clang] Fall back to DW_TAG_typedef for instantiation
 dependent template aliases

Workaround for issue #89774
---
 clang/lib/CodeGen/CGDebugInfo.cpp | 21 ++-
 .../CodeGenCXX/dependent-template-alias.cpp   | 21 +++
 2 files changed, 41 insertions(+), 1 deletion(-)
 create mode 100644 clang/test/CodeGenCXX/dependent-template-alias.cpp

diff --git a/clang/lib/CodeGen/CGDebugInfo.cpp 
b/clang/lib/CodeGen/CGDebugInfo.cpp
index 539ded5cca5e1b..787db350487417 100644
--- a/clang/lib/CodeGen/CGDebugInfo.cpp
+++ b/clang/lib/CodeGen/CGDebugInfo.cpp
@@ -1372,7 +1372,26 @@ llvm::DIType *CGDebugInfo::CreateType(const 
TemplateSpecializationType *Ty,
 
   SourceLocation Loc = AliasDecl->getLocation();
 
-  if (CGM.getCodeGenOpts().DebugTemplateAlias) {
+  if (CGM.getCodeGenOpts().DebugTemplateAlias &&
+  // The TemplateSpecializationType doesn't contain any instantiation
+  // information; dependent template arguments can't be resolved. For now,
+  // fall back to DW_TAG_typedefs for template aliases that are
+  // instantiation dependent, e.g.:
+  // ```
+  // template 
+  // using A = int;
+  //
+  // template
+  // struct S {
+  //   using AA = A; // Instantiation dependent.
+  //   AA aa;
+  // };
+  //
+  // S<0> s;
+  // ```
+  // S::AA's underlying type A is dependent on I so will be emitted as a
+  // DW_TAG_typedef.
+  !Ty->isInstantiationDependentType()) {
 auto ArgVector = ::GetTemplateArgs(TD, Ty);
 TemplateArgs Args = {TD->getTemplateParameters(), ArgVector};
 
diff --git a/clang/test/CodeGenCXX/dependent-template-alias.cpp 
b/clang/test/CodeGenCXX/dependent-template-alias.cpp
new file mode 100644
index 00..deb243f9fc88d0
--- /dev/null
+++ b/clang/test/CodeGenCXX/dependent-template-alias.cpp
@@ -0,0 +1,21 @@
+// RUN: %clang_cc1 -triple x86_64-unk-unk -o - -emit-llvm 
-debug-info-kind=standalone -gtemplate-alias %s -gsimple-template-names=simple \
+// RUN: | FileCheck %s
+
+ Check that -gtemplate-alias falls back to DW_TAG_typedef emission
+ for instantiation dependent type aliases.
+
+template 
+using A = int;
+
+template
+struct S {
+  using AA = A;
+  AA aa;
+};
+
+S<0> s;
+
+// CHECK: !DIDerivedType(tag: DW_TAG_member, name: "aa", scope: ![[#]], file: 
![[#]], line: [[#]], baseType: ![[AA:[0-9]+]], size: 32)
+// CHECK: [[AA]] = !DIDerivedType(tag: DW_TAG_typedef, name: "AA", file: 
![[#]], line: [[#]], baseType: ![[A:[0-9]+]])
+// CHECK: [[A]] = !DIDerivedType(tag: DW_TAG_typedef, name: "A", file: 
![[#]], line: [[#]], baseType: ![[int:[0-9]+]])
+// CHECK: [[int]] = !DIBasicType(name: "int", size: 32, encoding: 
DW_ATE_signed)

___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits