This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Mangling and operator new



The following code causes an ICE in gcc-3.0.3 in write_expression() in
mangle.c.

  template <unsigned int> struct helper {};
  template <class T> static void check( helper< sizeof( new T ) > * );

  int main()
  {
    check<int>(0);
  }

The problem occurs whilst trying to mangle the new expression part of
the name of the class

  helper< sizeof( new T ) >

The NEW_EXPR tree node takes three parameters: the placement list (NULL
in this example), the type declarator (a template_type_parm corresponding
to T), and an initializer list (also NULL in this case).  The segfault
occurs when it attempts to recursively call write_expression on the NULL
placement list.

I've looked in the draft Itanium ABI on the codesourcery web page and this
gives no guidance as to how this should be handled.

I have attached a patch which fixes the problem by mangling calls to
new and new[], schematically, as

  <expression> ::= <new operator-name> <placement expression-list>
                           <type> <initializer expression-list>

  <expression-list> ::= <expression>+ _

I'm not particularly keen on this mangling of <expression-list> -- I'd
prefer something like [random lettter] <expression>+ E, but this syntax
doesn't take any new letters, and uses '_' consistently with, say,
<array-type>.

The same problem occurs with function calls, although my patch doesn't
address this.  It wouldn't surprise me if there wasn't a similar problem
with delete and delete[], but I haven't yet been able to coax the
compiler into attempting to mangle either of these.

It would be good if this (or a similar) patch could find it's way into
the 3.1 release because there has been a lot of interest in the last
week or so about using this technique to simplify various parts of the
Boost library, which is on the list of real-world applications used to
test gcc.

I have not done a complete bootstrap re-build with the patch applied, nor
have I run the testsuites.

--
Richard Smith




Attachment: new_mangle.patch
Description: Patch to cp/mangle.c

Attachment: new_mangle_test1.cc
Description: Test case 1

Attachment: new_mangle_test2.cc
Description: Test case 2

Attachment: new_mangle_test3.cc
Description: Test case 3


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]