[cfe-dev] Reuse of expressions in synthesized functions.
Abramo Bagnara
abramo.bagnara at bugseng.com
Wed Aug 14 03:47:55 PDT 2013
Il 14/08/2013 12:33, Pavel Labath ha scritto:
>
>
>
> On 14 August 2013 07:45, Abramo Bagnara <abramo.bagnara at gmail.com
> <mailto:abramo.bagnara at gmail.com>> wrote:
>
> Il 14/08/2013 00:30, Douglas Gregor ha scritto:
> >
> > On Aug 13, 2013, at 3:08 AM, Pavel Labath <labath at google.com
> <mailto:labath at google.com>
> > <mailto:labath at google.com <mailto:labath at google.com>>> wrote:
> >
> >> Greetings,
> >>
> >> I have encountered a bug in the static analyzer
> >> <http://llvm.org/bugs/show_bug.cgi?id=16745>, which I have traced
> back
> >> to a problem with a synthesized operator=(). In short, the analyzer
> >> currently assumes that each expression object occurs in a function
> >> only once, and this breaks down for synthesized functions, as Sema
> >> happily reuses various Exprs there.
> >>
> >> So, now the question is how to proceed. One possible solution (one
> >> that Jordan suggests) would be to have Sema not reuse any Exprs
> during
> >> synthesis of various functions. This should be fairly easy, but it
> >> will touch a larger amount of code (as the synthesis algorithm is
> >> recursive, I would need to pass some sort of expression factory
> >> objects instead of plain Expr *s back and forth). It would also make
> >> the code look less pretty and cause (probably only slight) memory
> >> increase.
> >>
> >> Because of these downsides, I am not sure if a change like this would
> >> be accepted into the tree. Therefore, I wanted to ask you what do you
> >> think about this change before I invest time into carrying it out.
> >> Would you accept a patch like this? Or should i try to fix the
> problem
> >> from the analyzer side (right now I think it's doable, but it's quite
> >> possible i'll run into unexpected troubles)? Also, can you think of
> >> any other situations where sharing expression objects could cause
> >> troubles (template instantiations have been mentioned, but these
> >> should be fine as they don't produce nodes in the same function)?
> >
> > I think it’s fine to teach Sema to build unique expressions within its
> > synthesized assignment operators. It’s a cleaner model for the AST
> anyway.
>
>
> Ok, I'll get on it then.
>
>
>
>
> Is this *in general* a viable approach?
>
> I'm thinking to repeated initializer in InitListExpr (as long as we need
> to put in AST the expanded nodes).
>
>
> 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
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.
--
Abramo Bagnara
BUGSENG srl - http://bugseng.com
mailto:abramo.bagnara at bugseng.com
More information about the cfe-dev
mailing list