Author: Yanzuo Liu
Date: 2025-07-01T19:15:12+08:00
New Revision: 90e20d4f42c31060a64a4848affd2b1fd16a4ffe

URL: 
https://github.com/llvm/llvm-project/commit/90e20d4f42c31060a64a4848affd2b1fd16a4ffe
DIFF: 
https://github.com/llvm/llvm-project/commit/90e20d4f42c31060a64a4848affd2b1fd16a4ffe.diff

LOG: [Clang][Bytecode] Implement P1061 structured binding pack (#146474)

Other part of this feature was implemented by #121417.

Added: 
    

Modified: 
    clang/lib/AST/ByteCode/Compiler.cpp
    clang/test/SemaCXX/cxx2c-binding-pack.cpp

Removed: 
    


################################################################################
diff  --git a/clang/lib/AST/ByteCode/Compiler.cpp 
b/clang/lib/AST/ByteCode/Compiler.cpp
index 759d5a64f97be..20580c8fe7be3 100644
--- a/clang/lib/AST/ByteCode/Compiler.cpp
+++ b/clang/lib/AST/ByteCode/Compiler.cpp
@@ -5275,7 +5275,7 @@ bool Compiler<Emitter>::visitCompoundStmt(const 
CompoundStmt *S) {
 template <class Emitter>
 bool Compiler<Emitter>::maybeEmitDeferredVarInit(const VarDecl *VD) {
   if (auto *DD = dyn_cast_if_present<DecompositionDecl>(VD)) {
-    for (auto *BD : DD->bindings())
+    for (auto *BD : DD->flat_bindings())
       if (auto *KD = BD->getHoldingVar(); KD && !this->visitVarDecl(KD))
         return false;
   }

diff  --git a/clang/test/SemaCXX/cxx2c-binding-pack.cpp 
b/clang/test/SemaCXX/cxx2c-binding-pack.cpp
index 0f10dad3937ba..a8c1386ea5c18 100644
--- a/clang/test/SemaCXX/cxx2c-binding-pack.cpp
+++ b/clang/test/SemaCXX/cxx2c-binding-pack.cpp
@@ -1,10 +1,11 @@
 // RUN: %clang_cc1 -fsyntax-only -std=c++26 %s -verify
+// RUN: %clang_cc1 -fsyntax-only -std=c++26 %s -verify 
-fexperimental-new-constant-interpreter
 
 template <typename T>
 struct type_ { };
 
 template <typename ...T>
-auto sum(T... t) { return (t + ...); }
+constexpr auto sum(T... t) { return (t + ...); }
 
 struct my_struct {
   int a;
@@ -17,7 +18,7 @@ struct fake_tuple {
   int arr[4] = {1, 2, 3, 6};
 
   template <unsigned i>
-  int get() {
+  constexpr int& get() {
     return arr[i];
   }
 };
@@ -233,3 +234,28 @@ void g() {
 }
 
 }
+
+namespace constant_interpreter {
+using Arr = int[2];
+struct Triple { int x, y, z = 3; };
+
+constexpr int ref_to_same_obj(auto&& arg) {
+  auto& [...xs] = arg;
+  auto& [...ys] = arg;
+  (..., (xs += 2));
+  return sum(ys...);
+}
+static_assert(ref_to_same_obj(Arr{}) == 4);
+static_assert(ref_to_same_obj(fake_tuple{}) == 20);
+static_assert(ref_to_same_obj(Triple{}) == 9);
+
+constexpr int copy_obj(auto&& arg) {
+  auto& [...xs] = arg;
+  auto [...ys] = arg;
+  (..., (xs += 2));
+  return sum(ys...);
+}
+static_assert(copy_obj(Arr{}) == 0);
+static_assert(copy_obj(fake_tuple{}) == 12);
+static_assert(copy_obj(Triple{}) == 3);
+}


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

Reply via email to