[cfe-dev] Reuse of expressions in synthesized functions.

Eli Friedman eli.friedman at gmail.com
Wed Aug 14 09:57:12 PDT 2013


On Wed, Aug 14, 2013 at 4:52 AM, Pavel Labath <labath at google.com> wrote:

>
>
>
> On 14 August 2013 12:47, Abramo Bagnara <abramo.bagnara at bugseng.com>wrote:
>
>> Il 14/08/2013 12:33, Pavel Labath ha scritto:
>> >
>> >
>>
>> >> Could you please elaborate on that? I'm not sure what you mean by
>> > repeated initializers. Do you know of a situation where an AST node can
>> > be present in the tree twice?
>> >
>> $ cat p.c
>> void f() {
>>   int a[10] = {[1 ... 8] = 2};
>> }
>> $ clang -cc1 -ast-dump p.c
>> TranslationUnitDecl 0x54ae6e0 <<invalid sloc>>
>> |-TypedefDecl 0x54aebc0 <<invalid sloc>> __int128_t '__int128'
>> |-TypedefDecl 0x54aec20 <<invalid sloc>> __uint128_t 'unsigned __int128'
>> |-TypedefDecl 0x54aef70 <<invalid sloc>> __builtin_va_list
>> '__va_list_tag [1]'
>> `-FunctionDecl 0x54af010 <p.c:1:1, line:3:1> f 'void ()'
>>   `-CompoundStmt 0x54af330 <line:1:10, line:3:1>
>>     `-DeclStmt 0x54af318 <line:2:3, col:30>
>>       `-VarDecl 0x54af130 <col:3, col:29> a 'int [10]'
>>         `-InitListExpr 0x54af280 <col:15, col:29> 'int [10]'
>>           |-ImplicitValueInitExpr 0x54af308 <<invalid sloc>> 'int'
>>           |-IntegerLiteral 0x54af1c8 <col:28> 'int' 2
>>           |-IntegerLiteral 0x54af1c8 <col:28> 'int' 2
>>           |-IntegerLiteral 0x54af1c8 <col:28> 'int' 2
>>           |-IntegerLiteral 0x54af1c8 <col:28> 'int' 2
>>           |-IntegerLiteral 0x54af1c8 <col:28> 'int' 2
>>           |-IntegerLiteral 0x54af1c8 <col:28> 'int' 2
>>           |-IntegerLiteral 0x54af1c8 <col:28> 'int' 2
>>           `-IntegerLiteral 0x54af1c8 <col:28> 'int' 2
>>
>>
> Wow.. I didn't even know such syntax exists. This is a nice example,
> thanks.
>
> Right now, the static analyzer seems to get this code right (which is
> quite surprising, since even the compiler does not support this right now),
> but as soon as I replace 2 by something more complicated (a function call),
> it stops for some reason, which I didn't investigate yet. But in any case,
> the analyzers approach to this is wrong, as it tries to evaluate the
> expression multiple times, which, I guess, it shouldn't (gcc doesn't).
>
> Since the compiler doesn't support this yet, I guess this is not such an
> important issue yet, but it's definitely a thing to keep an eye on.
>
>
> Soon or later I personally hope that such node replication will
>> disappear, but currently we have it and I don't know if there is the
>> intention to get rid of it.
>>
>>
> I think I would also prefer a different AST representation of the above
> code, because the current one gives the impression that the RHS expression
> is to be evaluated multiple times.
>
>
>
Yeah, we'll need a different AST representation to implement it properly...

That said, you might also want to watch out for something like the
following:

struct A { A(); };
void f() { A a[10]; }

-Eli
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-dev/attachments/20130814/d683a428/attachment.html>


More information about the cfe-dev mailing list