public inbox for gcc-patches@gcc.gnu.org
 help / color / mirror / Atom feed
* Re: [C++ PATCH] Fix PR4447
  2001-11-13 15:03 [C++ PATCH] Fix PR4447 Kriang Lerdsuwanakij
@ 2001-11-13 15:03 ` Jason Merrill
  0 siblings, 0 replies; 2+ messages in thread
From: Jason Merrill @ 2001-11-13 15:03 UTC (permalink / raw)
  To: lerdsuwa; +Cc: gcc-patches

OK.

^ permalink raw reply	[flat|nested] 2+ messages in thread

* [C++ PATCH] Fix PR4447
@ 2001-11-13 15:03 Kriang Lerdsuwanakij
  2001-11-13 15:03 ` Jason Merrill
  0 siblings, 1 reply; 2+ messages in thread
From: Kriang Lerdsuwanakij @ 2001-11-13 15:03 UTC (permalink / raw)
  To: gcc-patches

Hi

Name mangling of type casts for the V3 ABI is currently missing.
(However, demangling type casts is already present in libiberty.)
This appended patch implements mangling for c-style cast,
static_cast and const_cast.  The reinterpret_cast part will be 
submitted later as a separate patch.

Tested on i686-pc-linux-gnu with no regressions.  OK to commit to
the main line?

--Kriang

2001-11-17  Kriang Lerdsuwanakij  <lerdsuwa@users.sourceforge.net>

        * mangle.c (write_expression): Handle CAST_EXPR, STATIC_CAST_EXPR,
        CONST_CAST_EXPR.
        * operators.def: Add CAST_EXPR, STATIC_CAST_EXPR, CONST_CAST_EXPR.

diff -cprN gcc-main-save/gcc/cp/mangle.c gcc-main-new/gcc/cp/mangle.c
*** gcc-main-save/gcc/cp/mangle.c       Tue Oct 23 16:14:14 2001
--- gcc-main-new/gcc/cp/mangle.c        Sat Nov 17 16:44:55 2001
*************** write_expression (expr)
*** 1818,1835 ****
        /* If it wasn't any of those, recursively expand the expression.  */
        write_string (operator_name_info[(int) code].mangled_name);
  
!       /* Handle pointers-to-members specially.  */
!       if (code == SCOPE_REF)
        {
          write_type (TREE_OPERAND (expr, 0));
          if (TREE_CODE (TREE_OPERAND (expr, 1)) == IDENTIFIER_NODE)
            write_source_name (TREE_OPERAND (expr, 1));
          else
            write_encoding (TREE_OPERAND (expr, 1));
        }
-       else
-       for (i = 0; i < TREE_CODE_LENGTH (code); ++i)
-         write_expression (TREE_OPERAND (expr, i));
      }
  }
  
--- 1818,1849 ----
        /* If it wasn't any of those, recursively expand the expression.  */
        write_string (operator_name_info[(int) code].mangled_name);
  
!       switch (code)
        {
+       case CAST_EXPR:
+         write_type (TREE_TYPE (expr));
+         write_expression (TREE_VALUE (TREE_OPERAND (expr, 0)));
+         break;
+ 
+       case STATIC_CAST_EXPR:
+       case CONST_CAST_EXPR:
+         write_type (TREE_TYPE (expr));
+         write_expression (TREE_OPERAND (expr, 0));
+         break;
+ 
+       /* Handle pointers-to-members specially.  */
+       case SCOPE_REF:
          write_type (TREE_OPERAND (expr, 0));
          if (TREE_CODE (TREE_OPERAND (expr, 1)) == IDENTIFIER_NODE)
            write_source_name (TREE_OPERAND (expr, 1));
          else
            write_encoding (TREE_OPERAND (expr, 1));
+         break;
+ 
+       default:
+         for (i = 0; i < TREE_CODE_LENGTH (code); ++i)
+           write_expression (TREE_OPERAND (expr, i));
        }
      }
  }
  
diff -cprN gcc-main-save/gcc/cp/operators.def gcc-main-new/gcc/cp/operators.def
*** gcc-main-save/gcc/cp/operators.def  Wed Apr  4 11:45:23 2001
--- gcc-main-new/gcc/cp/operators.def   Sat Nov 17 16:45:46 2001
*************** DEF_SIMPLE_OPERATOR ("alignof", ALIGNOF_
*** 102,107 ****
--- 102,110 ----
  
  /* The cast operator.  */
  DEF_SIMPLE_OPERATOR ("", TYPE_EXPR, "cv", 1)
+ DEF_SIMPLE_OPERATOR ("", CAST_EXPR, "cv", 1)
+ DEF_SIMPLE_OPERATOR ("", CONST_CAST_EXPR, "cv", 1)
+ DEF_SIMPLE_OPERATOR ("", STATIC_CAST_EXPR, "cv", 1)
  
  /* Binary operators.  */
  DEF_SIMPLE_OPERATOR ("+", PLUS_EXPR, "pl", 2)
diff -cprN gcc-main-save/gcc/testsuite/g++.dg/abi/mangle3.C gcc-main-new/gcc/testsuite/g++.dg/abi/mangle3.C
*** gcc-main-save/gcc/testsuite/g++.dg/abi/mangle3.C    Thu Jan  1 07:00:00 1970
--- gcc-main-new/gcc/testsuite/g++.dg/abi/mangle3.C     Sat Nov 17 19:06:21 2001
***************
*** 0 ****
--- 1,19 ----
+ // Test mangling of type casts
+ // { dg-do compile }
+ 
+ template<int i> class A {};
+ template<bool b> class B {};
+ 
+ template<int i> void f(A<i> &, B<bool(i)> &) {}
+ template<int i> void g(A<i> &, B<static_cast<bool>(i)> &) {}
+ 
+ int main()
+ {
+   A<1> a;
+   B<true> b;
+   f(a, b);
+   g(a, b);
+ }
+ 
+ // { dg-final { scan-assembler "\n_?_Z1fILi1EEvR1AIXT_EER1BIXcvbT_EE\[: \t\n\]" } }
+ // { dg-final { scan-assembler "\n_?_Z1gILi1EEvR1AIXT_EER1BIXcvbT_EE\[: \t\n\]" } }
diff -cprN gcc-main-save/gcc/testsuite/g++.dg/abi/mangle4.C gcc-main-new/gcc/testsuite/g++.dg/abi/mangle4.C
*** gcc-main-save/gcc/testsuite/g++.dg/abi/mangle4.C    Thu Jan  1 07:00:00 1970
--- gcc-main-new/gcc/testsuite/g++.dg/abi/mangle4.C     Sat Nov 17 19:06:17 2001
***************
*** 0 ****
--- 1,26 ----
+ // Test mangling of type casts
+ // { dg-do compile }
+ 
+ class A {};
+ class B : A {};
+ 
+ template<const A* a> class C {};
+ template<const B* b> class D {};
+ template<B* b> class E {};
+ 
+ template<const B* b> void f(D<b> &, C<static_cast<const A*>(b)> &) {}
+ template<const B* b> void g(D<b> &, E<const_cast<B*>(b)> &) {}
+ 
+ B b;
+ 
+ int main()
+ {
+   C<static_cast<const A*>(&b)> c;
+   D<&b> d;
+   E<const_cast<B*>(&b)> e;
+   f(d, c);
+   g(d, e);
+ }
+ 
+ // { dg-final { scan-assembler "\n_?_Z1fIXadL_Z1bEEEvR1DIXT_EER1CIXcvPK1AT_EE\[: \t\n\]" } }
+ // { dg-final { scan-assembler "\n_?_Z1gIXadL_Z1bEEEvR1DIXT_EER1EIXcvP1BT_EE\[: \t\n\]" } }

^ permalink raw reply	[flat|nested] 2+ messages in thread

end of thread, other threads:[~2001-11-17 22:37 UTC | newest]

Thread overview: 2+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2001-11-13 15:03 [C++ PATCH] Fix PR4447 Kriang Lerdsuwanakij
2001-11-13 15:03 ` Jason Merrill

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).