From 95875a9b23ef741f0f0486c67bf4ded4b0c90983 Mon Sep 17 00:00:00 2001 From: Jakub Jelinek Date: Mon, 16 Jan 2012 16:32:14 -0500 Subject: [PATCH] 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 --- gcc/cp/ChangeLog | 5 +++++ gcc/cp/mangle.c | 19 +++++++++++++++++++ gcc/testsuite/ChangeLog | 3 +++ gcc/testsuite/g++.dg/abi/mangle60.C | 20 ++++++++++++++++++++ 4 files changed, 47 insertions(+) create mode 100644 gcc/testsuite/g++.dg/abi/mangle60.C diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index e3ef5f2e813..e90f8331204 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,8 @@ +2012-01-16 Jakub Jelinek + + PR c++/51854 + * mangle.c (write_template_arg_literal): Handle complex. + 2012-01-16 Jason Merrill PR c++/51827 diff --git a/gcc/cp/mangle.c b/gcc/cp/mangle.c index 15b1aca09f5..34f19efc42e 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 9fa8e43365f..af5f550b839 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,5 +1,8 @@ 2012-01-16 Jason Merrill + 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 00000000000..f7e893a558a --- /dev/null +++ b/gcc/testsuite/g++.dg/abi/mangle60.C @@ -0,0 +1,20 @@ +// PR c++/51854 +// { dg-options "" } + +template struct A; + +template +char foo(U, V); + +// { dg-final { scan-assembler "_Z3barIiEvP1AIXszcl3foocvT__ELCi0_42EEEE" } } +template +void bar(A *); + +// { dg-final { scan-assembler "_Z3bazIiEvP1AIXszcl3foocvT__ELCf00000000_00000000EEEE" } } +template +void baz(A *); + +int main() { + bar(0); + baz(0); +} -- 2.30.2