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