[clang] [Clang][P1061] Add stuctured binding packs (PR #121417)

Richard Smith via cfe-commits cfe-commits at lists.llvm.org
Fri Jan 17 16:04:59 PST 2025


================
@@ -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));
----------------
zygoloid wrote:

Instead of creating a single binding with a pack of values, I think template instantiation should be creating `N` `BindingDecl`s each with a single value, like we do when we instantiate a function parameter pack or a template parameter pack. I think that would simplify a lot of what you're doing here.

(During the initial parse, we should treat a structured binding declaration with a binding pack as being dependent, just like we treat a case where the initializer has an unexpanded pack as dependent.)

https://github.com/llvm/llvm-project/pull/121417


More information about the cfe-commits mailing list