[cfe-dev] Different AST translations for the same body, why?
sebastian.redl at getdesigned.at
Wed Apr 11 05:01:15 PDT 2012
On 11.04.2012, at 10:52, Abramo Bagnara wrote:
> I'd like to understand the rationale underlying the different
> translation of body of foo1 and foo2.
> It seems that the presence of a totally unrelated operator* change the
> I don't see any benefits in doing that (as template instantiation will
> do the right thing in both cases).
> I'm missing something?
A UnaryOperator node is more lightweight than a CXXOperatorCallExpr node. Therefore, the more heavyweight node is only created if the definition-time name lookup had any results. These results need to be stored for correct two-phase name lookup, and only CXXOperatorCallExpr can do that.
> void foo1() (CompoundStmt 0x585d0c0 <p.cc:8:21, col:38>
> (UnaryExprOrTypeTraitExpr 0x585d0a0 <col:23, col:35> 'unsigned long'
> (ParenExpr 0x585d080 <col:29, col:35> '<dependent type>'
> (UnaryOperator 0x585d060 <col:30, col:31> '<dependent type>'
> prefix '*'
> (CXXThisExpr 0x585d048 <col:31> 'Foo<T> *' this)))))
> struct Bar;
> Bar &operator*(Bar &, Bar &);
> void foo2() (CompoundStmt 0x585f510 <p.cc:14:21, col:38>
> (UnaryExprOrTypeTraitExpr 0x585f4f0 <col:23, col:35> 'unsigned long'
> (ParenExpr 0x585f4d0 <col:29, col:35> '<dependent type>'
> (CXXOperatorCallExpr 0x585f498 <col:30, col:31> '<dependent type>'
> (UnresolvedLookupExpr 0x585f440 <col:30> '<overloaded function
> type>' lvalue (ADL) = '1' 0x585d310)
> (CXXThisExpr 0x585f428 <col:31> 'Foo<T> *' this)))))
More information about the cfe-dev