================ @@ -951,28 +959,124 @@ Sema::ActOnDecompositionDeclarator(Scope *S, Declarator &D, return New; } +// CheckBindingsCount +// - Checks the arity of the structured bindings +// - Creates the resolved pack expr if there is +// one +static bool CheckBindingsCount(Sema &S, DecompositionDecl *DD, + QualType DecompType, + ArrayRef<BindingDecl *> Bindings, + unsigned MemberCount) { + auto BindingWithPackItr = + std::find_if(Bindings.begin(), Bindings.end(), + [](BindingDecl *D) -> bool { return D->isParameterPack(); }); + bool HasPack = BindingWithPackItr != Bindings.end(); + bool IsValid; + if (!HasPack) { + IsValid = Bindings.size() == MemberCount; + } else { + // there may not be more members than non-pack bindings + IsValid = MemberCount >= Bindings.size() - 1; + } + + if (IsValid && HasPack) { + // create the pack expr and assign it to the binding + unsigned PackSize = MemberCount - Bindings.size() + 1; + QualType PackType = S.Context.getPackExpansionType( + S.Context.DependentTy, std::nullopt, /*ExpectsPackInType=*/false); + BindingDecl *BD = (*BindingWithPackItr); + BD->setBinding(PackType, + ResolvedUnexpandedPackExpr::Create( + S.Context, DD->getBeginLoc(), DecompType, PackSize)); ---------------- ricejasonf wrote:
The problem is that we do not know the length of the pack until the initializer expression is created. This happens in various locations depending on context such as range based for loops. I am not saying it isn't possible, but I think it would require creating the init expression up front which I do not know if that would be problematic with how variables are checked. We could also do Bindings in a separate allocation, but that would require keeping the DecompositionDeclarator around somehow, and there would need to be that extra information in the DecompositionDecl which would have a cost for Decomps that do not have a pack. (I don't know if that is an issue.) https://github.com/llvm/llvm-project/pull/121417 _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits