diff options
author | Jakub Jelinek <jakub@redhat.com> | 2012-01-16 16:32:14 -0500 |
---|---|---|
committer | Jason Merrill <jason@gcc.gnu.org> | 2012-01-16 16:32:14 -0500 |
commit | 95875a9b23ef741f0f0486c67bf4ded4b0c90983 (patch) | |
tree | 58317c9d505382d11efbf339137c16888578ff93 /gcc | |
parent | a7cd72be0248ce0b24f61c603a3fc68fcb78baf3 (diff) | |
download | gcc-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
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/cp/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/cp/mangle.c | 19 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 3 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/abi/mangle60.C | 20 |
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); +} |