[PATCH] D129531: [clang][C++20] P0960R3: Allow initializing aggregates from a parenthesized list of values
Corentin Jabot via Phabricator via cfe-commits
cfe-commits at lists.llvm.org
Sun Oct 30 02:25:55 PDT 2022
cor3ntin added a comment.
I added a few more comments, mostly nitpicks
================
Comment at: clang/lib/AST/ExprConstant.cpp:9952-9953
+ const FieldDecl *Field;
+ if (isa<InitListExpr>(E)) {
+ Field = cast<InitListExpr>(E)->getInitializedFieldInUnion();
+ } else if (isa<CXXParenListInitExpr>(E)) {
----------------
================
Comment at: clang/lib/AST/ExprConstant.cpp:9956
+ assert(InitExprs.size() == 1 &&
+ "Number of expressions in C++ paren list is not 1");
+
----------------
Maybe that message could be a bit more clear.
"Union should have exactly 1 initializer in in C++ paren list" or something like that.
================
Comment at: clang/lib/CodeGen/CGExprAgg.cpp:1595
+void AggExprEmitter::VisitCXXParenListInitExpr(CXXParenListInitExpr *E) {
+ ArrayRef<Expr *> InitExprs = E->getInitExprs();
----------------
There are some overlaps with `VisitInitListExpr`, I wonder if we should try to factor out some of the code, especially the base class initialization
================
Comment at: clang/lib/CodeGen/CGExprAgg.cpp:1600
+ if (const ArrayType *AT = dyn_cast<ArrayType>(E->getType())) {
+ for (auto Pair : llvm::enumerate(InitExprs)) {
+ // Initialization for every element of the array.
----------------
Maybe it would be cleaner to use a structured binding here.
================
Comment at: clang/lib/CodeGen/CGExprAgg.cpp:1616
+ const CXXRecordDecl *BaseRD = Base.getType()->getAsCXXRecordDecl();
+ Address V = CGF.GetAddressOfDirectBaseInCompleteClass(
+ Dest.getAddress(), RD, BaseRD,
----------------
Should we assert that the base is not virtual?
================
Comment at: clang/lib/Sema/SemaInit.cpp:5281
+
+ // Unnamed bitfields should not be initialized at all,either with an arg
+ // or by default.
----------------
================
Comment at: clang/lib/Sema/TreeTransform.h:13930
+ InitExprs.size(), true, TransformedInits,
+ &ArgumentChanged))
+ return ExprError();
----------------
`ArgumentChanged` is not used, and is defaulted by the function, so you should be able to remove it
Repository:
rG LLVM Github Monorepo
CHANGES SINCE LAST ACTION
https://reviews.llvm.org/D129531/new/
https://reviews.llvm.org/D129531
More information about the cfe-commits
mailing list