ilya-biryukov added inline comments.

================
Comment at: clang/lib/Serialization/ASTReaderStmt.cpp:2179
+  for (unsigned I = 0; I < E->NumExprs; I++)
+    E->getTrailingObjects<Expr *>()[I] = Record.readSubExpr();
+}
----------------
ayzhao wrote:
> ilya-biryukov wrote:
> > FYI: I think this is where the crash comes from.
> > We should allocate the trailing objects first.
> > E.g. see how `PragmaCommentDecl::CreateDeserialized` does this.
> This sounds like it could be the solution - thanks for looking at it!
> 
> Currently, I'm working on the refactor that shafik@ suggested, which was to 
> inherit from `InitListExpr`. Hopefully, that refactor will fix this issue as 
> `InitListExpr` stores it's subexpressions in a class member instead of using 
> `llvm::TrailingObjects`.
Are we trying to share code between two implementations? If so, I suggest to 
consider alternatives, e.g. creating a new base class and inheriting both 
`InitListExpr` and `CXXParentInitListExpr` to share the common code.

Inheriting `CXXParentInitListExpr` from `InitListExpr` breaks [Liskov 
substitution 
principle](https://en.wikipedia.org/wiki/Liskov_substitution_principle) and 
will likely to lead to bugs that are hard to chase.  `InitListExpr` is widely 
used and means`{}`. `CXXParenInitListExpr` is not `{}` and we do not know in 
advance which code is going to work for both and which code is only valid for 
`{}`. Reviewing all callsites that use `InitListExpr` does not seem plausible. 
Note that in addition to Clang, there are also uses in ast-matchers and in 
clang-tidy checks (quite a few of those are downstream).


Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D129531

_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to