Re: [cxx-abi-dev] mangling template-id
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [cxx-abi-dev] mangling template-id
- To: "cxx-abi-dev@xxxxxxxxxxxxxxxx" <cxx-abi-dev@xxxxxxxxxxxxxxxx>
- Subject: Re: [cxx-abi-dev] mangling template-id
- From: Jason Merrill <jason@xxxxxxxxxx>
- Date: Tue, 22 Dec 2009 00:20:09 -0500
On 12/17/2009 07:09 PM, Jason Merrill wrote:
On 12/17/2009 05:58 PM, Jason Merrill wrote:
Handling this just as unqualified-name template-args seems to work fine;
any reason not to just add that to expression? We also need to support a
plain identifier for overloaded functions.
Hmm...where this runs into trouble is with operator names. Where t is a
function parameter, operator+(t,t) would mangle as clplfp_fp_E, which is
ambiguous; it could also mean (t+t)().
So I guess we need something to distinguish an operator name used as a
function name from an operator name used as an operator.
New patch adds "on" (operator name) before an operator name used as an
unqualified name. It isn't necessary in . and -> expressions, since we
already know that the second operand is a name.
*** abi.html.~1~ 2009-09-23 16:05:02.162720132 -0400
--- abi.html 2009-12-22 00:16:16.448078822 -0500
*************** from other arguments.
*** 4391,4397 ****
<expression> ::= <<i>unary</i> operator-name> <expression>
::= <<i>binary</i> operator-name> <expression> <expression>
::= <<i>trinary</i> operator-name> <expression> <expression> <expression>
! ::= cl <expression>* E # call
::= cv <type> expression # conversion with one argument
::= cv <type> _ <expression>* E # conversion with a different number of arguments
::= st <type> # sizeof (a type)
--- 4392,4398 ----
<expression> ::= <<i>unary</i> operator-name> <expression>
::= <<i>binary</i> operator-name> <expression> <expression>
::= <<i>trinary</i> operator-name> <expression> <expression> <expression>
! ::= cl <expression>+ E # call
::= cv <type> expression # conversion with one argument
::= cv <type> _ <expression>* E # conversion with a different number of arguments
::= st <type> # sizeof (a type)
*************** from other arguments.
*** 4400,4405 ****
--- 4401,4414 ----
::= <function-param>
::= sr <type> <unqualified-name> # dependent name
::= sr <type> <unqualified-name> <template-args> # dependent template-id
+ ::= dt <expression> <unqualified-name> # expr.name
+ ::= dt <expression> <unqualified-name> <template-args>
+ ::= pt <expression> <unqualified-name> # expr->name
+ ::= pt <expression> <unqualified-name> <template-args>
+ ::= on <operator-name> # dependent operator-function-id
+ ::= on <operator-name> <template-args> # dependent operator template-id
+ ::= <source-name> # dependent name
+ ::= <source-name> <template-args> # dependent template-id
::= sZ <template-param> # size of a parameter pack
::= <expr-primary>