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

Douglas Gregor dgregor at apple.com
Wed Aug 14 10:02:40 PDT 2013


On 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.

It’s a GNU extension that isn’t used all that often.

>  
> 
> 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.

Right.  This is a non-trivial refactoring of the AST to introduce either some kind of run-length encoding for repeated expressions or additional uses of OpaqueValueExprs.

	- Doug


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


More information about the cfe-dev mailing list