c++: Mangling of dependent conversions [PR91377]
authorJason Merrill <jason@redhat.com>
Sat, 4 Apr 2020 15:45:41 +0000 (11:45 -0400)
committerJason Merrill <jason@redhat.com>
Sat, 4 Apr 2020 20:22:44 +0000 (16:22 -0400)
We skip over other conversion codes when mangling expressions, we should do
the same with IMPLICIT_CONV_EXPR.

gcc/cp/ChangeLog
2020-04-04  Jason Merrill  <jason@redhat.com>

PR c++/91377
* mangle.c (write_expression): Skip IMPLICIT_CONV_EXPR.

gcc/cp/ChangeLog
gcc/cp/mangle.c
gcc/testsuite/g++.dg/abi/mangle75.C [new file with mode: 0644]

index 686128a7ebad4172e51dfccbea12f8abb7b4ba80..a382235d7cceedf64fddb9d7d5a6b7b752ae3c80 100644 (file)
@@ -1,3 +1,8 @@
+2020-04-04  Jason Merrill  <jason@redhat.com>
+
+       PR c++/91377
+       * mangle.c (write_expression): Skip IMPLICIT_CONV_EXPR.
+
 2020-04-04  Patrick Palka  <ppalka@redhat.com>
 
        PR c++/94205
index 1fc78bfa7536478fdc3479186de9b79c1ade0df4..9e39cfd8dbad6c69f80c4f180de10b54d8a2a764 100644 (file)
@@ -2875,6 +2875,7 @@ write_expression (tree expr)
   /* Skip NOP_EXPR and CONVERT_EXPR.  They can occur when (say) a pointer
      argument is converted (via qualification conversions) to another type.  */
   while (CONVERT_EXPR_CODE_P (code)
+        || code == IMPLICIT_CONV_EXPR
         || location_wrapper_p (expr)
         /* Parentheses aren't mangled.  */
         || code == PAREN_EXPR
diff --git a/gcc/testsuite/g++.dg/abi/mangle75.C b/gcc/testsuite/g++.dg/abi/mangle75.C
new file mode 100644 (file)
index 0000000..f266199
--- /dev/null
@@ -0,0 +1,13 @@
+// PR c++/91377
+// { dg-do compile { target c++11 } }
+
+struct f {
+  static constexpr int d = 3;
+  typedef int e;
+};
+template <int a> struct x { };
+template <typename g, g j, g m> using n = x<j + m>;
+template <typename ac> auto v() -> n<typename ac::e, 0, ac::d>;
+void af() { v<f>(); }
+
+// { dg-final { scan-assembler "_Z1vI1fE1xIXplLi0EsrT_1dEEv" } }