[PATCH] D154764: [ASTImporter] Fields are imported first and reordered for correct layout.

Ding Fei via Phabricator via cfe-commits cfe-commits at lists.llvm.org
Thu Jul 27 21:35:27 PDT 2023


danix800 added inline comments.


================
Comment at: clang/unittests/AST/ASTImporterTest.cpp:8018
+        int m() {
+          return &((A *)0)->f1 - &((A *)0)->f2;
+        }
----------------
danix800 wrote:
> shafik wrote:
> > So is it the case that this caused `f2` to be imported first and then `f1`? Which is the opposite of the example in the comments:
> > 
> > ```
> >  struct declToImport {
> >           int a = c + b;
> >           int b = 1;
> >           int c = 2;
> >       };
> > ```
> > 
> > which causes the order to be c, b and then a.
> The issue caused by this case
> ```
> int m() {
>    return &((A *)0)->f1 - &((A *)0)->f2;
> }
> int f1;
> int f2;
> ```
> is that before fixing, method `m` is imported first, which triggers expr (UnaryOperator) dependency computation, further relies on the correct RecordLayout of `declToImport`, but `f1` & `f2` is not imported at this moment.
> 
> This is not the opposite to the case like `int a = c + b;`, but both are caused by circular refs.
> 
> Similar record layout issue will also be triggered like:
> ```
> class B;
> class A {
>   B* b;
>   int c;
> };
> class B {
>    A *f() { return &((B *)0)->a; }
>    A a;
> };
> ```
> https://reviews.llvm.org/D156201 removes the unnecessary record layout as another fix to this kind of circular refs
> (which cannot be fixed simply by re-adjusting import ordering).
> 
> 
Sorry for typos, they are both import ordering issues (not circular ref issues).


Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D154764/new/

https://reviews.llvm.org/D154764



More information about the cfe-commits mailing list