re PR c++/51854 (ICE in mangle.c with literal of complex floating type)
authorJakub Jelinek <jakub@redhat.com>
Mon, 16 Jan 2012 21:32:14 +0000 (16:32 -0500)
committerJason Merrill <jason@gcc.gnu.org>
Mon, 16 Jan 2012 21:32:14 +0000 (16:32 -0500)
PR c++/51854
* mangle.c (write_template_arg_literal): Handle complex.

From-SVN: r183222

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

index e3ef5f2e8132b1f1a5f498ba8b13d3a6c9d60a19..e90f8331204561b94754546583302a22155da38b 100644 (file)
@@ -1,3 +1,8 @@
+2012-01-16  Jakub Jelinek  <jakub@redhat.com>
+
+       PR c++/51854
+       * mangle.c (write_template_arg_literal): Handle complex.
+
 2012-01-16  Jason Merrill  <jason@redhat.com>
 
        PR c++/51827
index 15b1aca09f55cdca03d03dd2f666f3a5a05d22a7..34f19efc42e0432237ed333e11e4dc6c3d696b07 100644 (file)
@@ -2927,6 +2927,25 @@ write_template_arg_literal (const tree value)
        write_real_cst (value);
        break;
 
+      case COMPLEX_CST:
+       if (TREE_CODE (TREE_REALPART (value)) == INTEGER_CST
+           && TREE_CODE (TREE_IMAGPART (value)) == INTEGER_CST)
+         {
+           write_integer_cst (TREE_REALPART (value));
+           write_char ('_');
+           write_integer_cst (TREE_IMAGPART (value));
+         }
+       else if (TREE_CODE (TREE_REALPART (value)) == REAL_CST
+                && TREE_CODE (TREE_IMAGPART (value)) == REAL_CST)
+         {
+           write_real_cst (TREE_REALPART (value));
+           write_char ('_');
+           write_real_cst (TREE_IMAGPART (value));
+         }
+       else
+         gcc_unreachable ();
+       break;
+
       case STRING_CST:
        sorry ("string literal in function template signature");
        break;
index 9fa8e43365f242bf092f8b54f539fe4da0fff688..af5f550b839d99005dca7bb9a171ff17ddb81cfb 100644 (file)
@@ -1,5 +1,8 @@
 2012-01-16  Jason Merrill  <jason@redhat.com>
 
+       PR c++/51854
+       * g++.dg/abi/mangle60.C: New.
+
        PR c++/51827
        * g++.dg/pch/mangle1.{C,Hs}: New.
 
diff --git a/gcc/testsuite/g++.dg/abi/mangle60.C b/gcc/testsuite/g++.dg/abi/mangle60.C
new file mode 100644 (file)
index 0000000..f7e893a
--- /dev/null
@@ -0,0 +1,20 @@
+// PR c++/51854
+// { dg-options "" }
+
+template <unsigned N> struct A;
+
+template <typename U, typename V>
+char foo(U, V);
+
+// { dg-final { scan-assembler "_Z3barIiEvP1AIXszcl3foocvT__ELCi0_42EEEE" } }
+template <typename U>
+void bar(A<sizeof(foo(U(), 42i))> *);
+
+// { dg-final { scan-assembler "_Z3bazIiEvP1AIXszcl3foocvT__ELCf00000000_00000000EEEE" } }
+template <typename U>
+void baz(A<sizeof(foo(U(), 0.0fj))> *);
+
+int main() {
+   bar<int>(0);
+   baz<int>(0);
+}