From 07523e7c080b44354836524f09f1c9a11f2a1679 Mon Sep 17 00:00:00 2001 From: Jason Merrill Date: Wed, 10 Dec 2008 17:11:44 -0500 Subject: re PR c++/35319 (ICE throwing fixed-point types) PR c++/35319 * mangle.c (write_builtin_type): Add mangling for decimal floating point and fixed point types. (write_type): Pass FIXED_POINT_TYPE along. * cp-demangle.c (cplus_demangle_type): Support fixed-point types. (d_print_comp, d_dump): Likewise. From-SVN: r142661 --- gcc/cp/ChangeLog | 7 +++++ gcc/cp/mangle.c | 54 +++++++++++++++++++++++++++++++++++++++ gcc/testsuite/ChangeLog | 5 ++++ gcc/testsuite/g++.dg/ext/fixed2.C | 7 +++++ 4 files changed, 73 insertions(+) create mode 100644 gcc/testsuite/g++.dg/ext/fixed2.C (limited to 'gcc') diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 9c27cd0..4b33059 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,10 @@ +2008-12-10 Jason Merrill + + PR c++/35319 + * mangle.c (write_builtin_type): Add mangling for decimal floating + point and fixed point types. + (write_type): Pass FIXED_POINT_TYPE along. + 2008-12-09 Mark Mitchell PR c++/37971 diff --git a/gcc/cp/mangle.c b/gcc/cp/mangle.c index c0282d8..36b984e 100644 --- a/gcc/cp/mangle.c +++ b/gcc/cp/mangle.c @@ -1598,6 +1598,7 @@ write_type (tree type) case BOOLEAN_TYPE: case INTEGER_TYPE: /* Includes wchar_t. */ case REAL_TYPE: + case FIXED_POINT_TYPE: { /* If this is a typedef, TYPE may not be one of the standard builtin type nodes, but an alias of one. Use @@ -1852,6 +1853,59 @@ write_builtin_type (tree type) gcc_unreachable (); break; + case FIXED_POINT_TYPE: + write_string ("DF"); + if (GET_MODE_IBIT (TYPE_MODE (type)) > 0) + write_unsigned_number (GET_MODE_IBIT (TYPE_MODE (type))); + if (type == fract_type_node + || type == sat_fract_type_node + || type == accum_type_node + || type == sat_accum_type_node) + write_char ('i'); + else if (type == unsigned_fract_type_node + || type == sat_unsigned_fract_type_node + || type == unsigned_accum_type_node + || type == sat_unsigned_accum_type_node) + write_char ('j'); + else if (type == short_fract_type_node + || type == sat_short_fract_type_node + || type == short_accum_type_node + || type == sat_short_accum_type_node) + write_char ('s'); + else if (type == unsigned_short_fract_type_node + || type == sat_unsigned_short_fract_type_node + || type == unsigned_short_accum_type_node + || type == sat_unsigned_short_accum_type_node) + write_char ('t'); + else if (type == long_fract_type_node + || type == sat_long_fract_type_node + || type == long_accum_type_node + || type == sat_long_accum_type_node) + write_char ('l'); + else if (type == unsigned_long_fract_type_node + || type == sat_unsigned_long_fract_type_node + || type == unsigned_long_accum_type_node + || type == sat_unsigned_long_accum_type_node) + write_char ('m'); + else if (type == long_long_fract_type_node + || type == sat_long_long_fract_type_node + || type == long_long_accum_type_node + || type == sat_long_long_accum_type_node) + write_char ('x'); + else if (type == unsigned_long_long_fract_type_node + || type == sat_unsigned_long_long_fract_type_node + || type == unsigned_long_long_accum_type_node + || type == sat_unsigned_long_long_accum_type_node) + write_char ('y'); + else + sorry ("mangling unknown fixed point type"); + write_unsigned_number (GET_MODE_FBIT (TYPE_MODE (type))); + if (TYPE_SATURATING (type)) + write_char ('s'); + else + write_char ('n'); + break; + default: gcc_unreachable (); } diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 659a5bf..f8a447f 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2008-12-10 Jason Merrill + + PR c++/35319 + * g++.dg/ext/fixed2.C: New test. + 2008-12-10 Daniel Berlin PR tree-optimization/36792 diff --git a/gcc/testsuite/g++.dg/ext/fixed2.C b/gcc/testsuite/g++.dg/ext/fixed2.C new file mode 100644 index 0000000..a4766eb --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/fixed2.C @@ -0,0 +1,7 @@ +// PR c++/35319 +// { dg-options "" } + +void foo() +{ + throw 0r; +} -- cgit v1.1