[PATCH] D39886: [ASTImporter] Fix wrong conflict detections for unnamed structures

Takafumi Kubota via Phabricator via cfe-commits cfe-commits at lists.llvm.org
Tue Nov 21 11:44:18 PST 2017


tk1012 added a comment.

Hello Aleksei,

Unfortunately, I find the related problem with the unnamed structs/unions, even if I apply https://reviews.llvm.org/D39886.

For example, in PostgreSQL, there is a part of code like below.

  typedef struct { int  a; } b;
  
  struct { const char *x; } y;

then, original AST becomse like below.

  -RecordDecl 0x7ac3900 ... struct definition
  | `-FieldDecl 0x7b18690 ... a 'int'
  |-TypedefDecl 0x7b18730 ... b 'struct b':'b'
  | `-ElaboratedType 0x7b186e0 'struct b' sugar
  |   `-RecordType 0x7ac3990 'b'
  |     `-Record 0x7ac3900 ''
  |-RecordDecl 0x7b187a0 ... struct definition
  | `-FieldDecl 0x7b18868 ... x 'const char *'
  `-VarDecl 0x7b18900 ... y 'struct (anonymous struct at ...)':'struct (anonymous at ...)'

However, ASTImporter imports the AST incorrectly.
The result AST becomes

  |-RecordDecl 0x7f696c07ee50 ... struct definition
  | `-FieldDecl 0x7f696c177470 ... a 'int'
  |-TypedefDecl 0x7f696c177510 ...  b 'struct b':'b'
  | `-ElaboratedType 0x7f696c1774c0 'struct b' sugar
  |   `-RecordType 0x7f696c07eee0 'b'
  |     `-Record 0x7f696c07ee50 ''
  |-RecordDecl 0x7f696c177568 prev 0x7f696c07ee50 ...  struct
  `-VarDecl 0x7f696c177660 ...  y 'struct b':'b'

The variable `y`'s type becomes `struct b` mistakenly.
This is because `FoundDecl` is set into `PrevDecl` at L1676.
In this case, `FoundDecl` is `struct { int a; }`.
Then, ASTImporter set  `PrevDecl` as a previous RecordDecl of the imported RecordDecl at L1772.

To avoid this, I think there are two possible solutions.

1. Like this patch, skipping conflict resolution part for the unnamed structs/unions.
2. Add a condition for setting the previous decl at L1676.

What do you think?
( I guess the first is unexpectedly dependable. )

p.s.
Should I also share this in https://reviews.llvm.org/D39886?



================
Comment at: lib/AST/ASTImporter.cpp:1676
 
         PrevDecl = FoundRecord;
 
----------------
highlight


================
Comment at: lib/AST/ASTImporter.cpp:1772
       // FIXME: do this for all Redeclarables, not just RecordDecls.
       D2->setPreviousDecl(PrevDecl);
     }
----------------
highlight


https://reviews.llvm.org/D39886





More information about the cfe-commits mailing list