[PATCH] D158006: [Clang][WIP]Experimental implementation of data member packs in dependent context.
David Blaikie via Phabricator via cfe-commits
cfe-commits at lists.llvm.org
Wed Aug 16 15:19:18 PDT 2023
dblaikie added inline comments.
================
Comment at: clang/lib/Sema/SemaExprMember.cpp:519-521
+ if (const ElaboratedType *ET = dyn_cast<const ElaboratedType>(BaseType)) {
+ if (const TemplateSpecializationType *TST =
+ dyn_cast<TemplateSpecializationType>(ET->getNamedType())) {
----------------
I think you can skip the `const` in the first `dyn_cast` (think it works implicitly?) & could use `const auto *` on the LHS of both these `if`s, since the RHS makes it clear what the type is
================
Comment at: clang/lib/Sema/SemaExprMember.cpp:523-524
+ auto *TD = TST->getTemplateName().getAsTemplateDecl();
+ assert(isa<ClassTemplateDecl>(TD) &&
+ "template decl in member access is not ClassTemplateDecl");
+ for (FieldDecl *Field :
----------------
No need for the assert if you're immediately going to `cast` anyway, it'll assert. Though perhaps the custom assert here gives you a chance to make it more explicit that this is intentional.
================
Comment at: clang/lib/Sema/SemaExprMember.cpp:525-527
+ for (FieldDecl *Field :
+ cast<ClassTemplateDecl>(TD)->getTemplatedDecl()->fields()) {
+ if (Field->getDeclName() == NameInfo.getName()) {
----------------
This could be `llvm::find_if`, maybe? Not sure if it'd be tidier, but maybe more legible
================
Comment at: clang/lib/Sema/SemaExprMember.cpp:1023-1025
+ if (MemberNameStr.find('@') != std::string::npos) {
+ return ExprEmpty();
+ }
----------------
Usually don't put `{}` on single-line scopes in the LLVM codebase.
================
Comment at: clang/lib/Sema/SemaTemplateInstantiate.cpp:3292
+ std::string NewFieldName =
+ PackedField->getName().str() + "@" + std::to_string(Arg);
+ PackedField->setDeclName(&Context.Idents.get(NewFieldName));
----------------
cjdb wrote:
> Does LLVM have some form of `absl::StrCat` that we can use instead of `operator+`?
there's at least `llvm::Twine` which can avoid manifesting the intermediate strings
================
Comment at: clang/lib/Sema/TreeTransform.h:4171
+ if (CXXDependentScopeMemberExpr *MemberExpr =
+ dyn_cast<CXXDependentScopeMemberExpr>(Pattern)) {
----------------
Might be worth pulling out this new code as a separate function - the `continue` at the end is many lines away from the start or end of the loop, making control flow a bit hard to follow (probably the existing code could do with some of this massaging even before/regardless of the new code you're adding here)
Repository:
rG LLVM Github Monorepo
CHANGES SINCE LAST ACTION
https://reviews.llvm.org/D158006/new/
https://reviews.llvm.org/D158006
More information about the cfe-commits
mailing list