aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJakub Jelinek <jakub@redhat.com>2012-01-16 16:32:14 -0500
committerJason Merrill <jason@gcc.gnu.org>2012-01-16 16:32:14 -0500
commit95875a9b23ef741f0f0486c67bf4ded4b0c90983 (patch)
tree58317c9d505382d11efbf339137c16888578ff93
parenta7cd72be0248ce0b24f61c603a3fc68fcb78baf3 (diff)
downloadgcc-95875a9b23ef741f0f0486c67bf4ded4b0c90983.zip
gcc-95875a9b23ef741f0f0486c67bf4ded4b0c90983.tar.gz
gcc-95875a9b23ef741f0f0486c67bf4ded4b0c90983.tar.bz2
re PR c++/51854 (ICE in mangle.c with literal of complex floating type)
PR c++/51854 * mangle.c (write_template_arg_literal): Handle complex. From-SVN: r183222
-rw-r--r--gcc/cp/ChangeLog5
-rw-r--r--gcc/cp/mangle.c19
-rw-r--r--gcc/testsuite/ChangeLog3
-rw-r--r--gcc/testsuite/g++.dg/abi/mangle60.C20
4 files changed, 47 insertions, 0 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index e3ef5f2e8..e90f833 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -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
diff --git a/gcc/cp/mangle.c b/gcc/cp/mangle.c
index 15b1aca..34f19ef 100644
--- a/gcc/cp/mangle.c
+++ b/gcc/cp/mangle.c
@@ -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;
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 9fa8e43..af5f550 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -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
index 0000000..f7e893a
--- /dev/null
+++ b/gcc/testsuite/g++.dg/abi/mangle60.C
@@ -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);
+}