aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorJason Merrill <jason@redhat.com>2008-12-10 17:11:44 -0500
committerJason Merrill <jason@gcc.gnu.org>2008-12-10 17:11:44 -0500
commit07523e7c080b44354836524f09f1c9a11f2a1679 (patch)
tree262e40a0acb4385f32e278194a774e3b2f7f60a0 /gcc
parent615cb001bb90ef2acb21c011918b456c59ddb5de (diff)
downloadgcc-07523e7c080b44354836524f09f1c9a11f2a1679.zip
gcc-07523e7c080b44354836524f09f1c9a11f2a1679.tar.gz
gcc-07523e7c080b44354836524f09f1c9a11f2a1679.tar.bz2
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
Diffstat (limited to 'gcc')
-rw-r--r--gcc/cp/ChangeLog7
-rw-r--r--gcc/cp/mangle.c54
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/g++.dg/ext/fixed2.C7
4 files changed, 73 insertions, 0 deletions
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 <jason@redhat.com>
+
+ 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 <mark@codesourcery.com>
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 <jason@redhat.com>
+
+ PR c++/35319
+ * g++.dg/ext/fixed2.C: New test.
+
2008-12-10 Daniel Berlin <dberlin@dberlin.org>
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;
+}