aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPatrick Palka <ppalka@redhat.com>2023-07-15 09:47:36 -0400
committerPatrick Palka <ppalka@redhat.com>2023-07-17 09:48:29 -0400
commit04e8808841c33d94529b144b15af5d11671dde1b (patch)
treeb1851d42c2783bfdaab0733e3d989188c48903f6
parentb8a15313766661309698ad5cd4f000152ce74a52 (diff)
downloadgcc-04e8808841c33d94529b144b15af5d11671dde1b.zip
gcc-04e8808841c33d94529b144b15af5d11671dde1b.tar.gz
gcc-04e8808841c33d94529b144b15af5d11671dde1b.tar.bz2
c++: mangling template-id of unknown template [PR110524]
This fixes a crash when mangling an ADL-enabled call to a template-id naming an unknown template (as per P0846R0). PR c++/110524 gcc/cp/ChangeLog: * mangle.cc (write_expression): Handle TEMPLATE_ID_EXPR whose template is already an IDENTIFIER_NODE. gcc/testsuite/ChangeLog: * g++.dg/cpp2a/fn-template26.C: New test. (cherry picked from commit 97ceaa110e1607ec8f4f1223200868e1642f3cc7)
-rw-r--r--gcc/cp/mangle.cc3
-rw-r--r--gcc/testsuite/g++.dg/cpp2a/fn-template26.C16
2 files changed, 18 insertions, 1 deletions
diff --git a/gcc/cp/mangle.cc b/gcc/cp/mangle.cc
index a235f23..7076608 100644
--- a/gcc/cp/mangle.cc
+++ b/gcc/cp/mangle.cc
@@ -3312,7 +3312,8 @@ write_expression (tree expr)
else if (TREE_CODE (expr) == TEMPLATE_ID_EXPR)
{
tree fn = TREE_OPERAND (expr, 0);
- fn = OVL_NAME (fn);
+ if (!identifier_p (fn))
+ fn = OVL_NAME (fn);
if (IDENTIFIER_ANY_OP_P (fn))
write_string ("on");
write_unqualified_id (fn);
diff --git a/gcc/testsuite/g++.dg/cpp2a/fn-template26.C b/gcc/testsuite/g++.dg/cpp2a/fn-template26.C
new file mode 100644
index 0000000..d4a17eb
--- /dev/null
+++ b/gcc/testsuite/g++.dg/cpp2a/fn-template26.C
@@ -0,0 +1,16 @@
+// PR c++/110524
+// { dg-do compile { target c++20 } }
+
+template<class T>
+auto f(T t) -> decltype(g<T>(t));
+
+namespace N {
+ struct A { };
+ template<class T> void g(T);
+};
+
+int main() {
+ f(N::A{});
+}
+
+// { dg-final { scan-assembler "_Z1fIN1N1AEEDTcl1gIT_Efp_EES2_" } }