[clang] 0ab1f57 - [clang][bytecode] Register decomposition holding vars (#123515)
via cfe-commits
cfe-commits at lists.llvm.org
Sun Jan 19 07:30:00 PST 2025
Author: Timm Baeder
Date: 2025-01-19T16:29:56+01:00
New Revision: 0ab1f5772cbe6855d55bade566d885b7504c32ee
URL: https://github.com/llvm/llvm-project/commit/0ab1f5772cbe6855d55bade566d885b7504c32ee
DIFF: https://github.com/llvm/llvm-project/commit/0ab1f5772cbe6855d55bade566d885b7504c32ee.diff
LOG: [clang][bytecode] Register decomposition holding vars (#123515)
Added:
Modified:
clang/lib/AST/ByteCode/Compiler.cpp
clang/test/AST/ByteCode/cxx17.cpp
Removed:
################################################################################
diff --git a/clang/lib/AST/ByteCode/Compiler.cpp b/clang/lib/AST/ByteCode/Compiler.cpp
index 7afae97f308ad5..414323eaa12654 100644
--- a/clang/lib/AST/ByteCode/Compiler.cpp
+++ b/clang/lib/AST/ByteCode/Compiler.cpp
@@ -4984,6 +4984,15 @@ bool Compiler<Emitter>::visitDeclStmt(const DeclStmt *DS) {
return false;
if (!this->visitVarDecl(VD))
return false;
+
+ // Register decomposition decl holding vars.
+ if (const auto *DD = dyn_cast<DecompositionDecl>(VD)) {
+ for (auto *BD : DD->bindings())
+ if (auto *KD = BD->getHoldingVar()) {
+ if (!this->visitVarDecl(KD))
+ return false;
+ }
+ }
}
return true;
diff --git a/clang/test/AST/ByteCode/cxx17.cpp b/clang/test/AST/ByteCode/cxx17.cpp
index e8559d8b9812ac..ecb8a395520a05 100644
--- a/clang/test/AST/ByteCode/cxx17.cpp
+++ b/clang/test/AST/ByteCode/cxx17.cpp
@@ -105,3 +105,23 @@ constexpr S s = getS(); // both-error {{must be initialized by a constant expres
// both-note {{declared here}}
static_assert(s.a == 12, ""); // both-error {{not an integral constant expression}} \
// both-note {{initializer of 's' is not a constant expression}}
+
+using size_t = decltype(sizeof(0));
+namespace std { template<typename T> struct tuple_size; }
+namespace std { template<size_t, typename> struct tuple_element; }
+
+namespace constant {
+ struct Q {};
+ template<int N> constexpr int get(Q &&) { return N * N; }
+}
+template<> struct std::tuple_size<constant::Q> { static const int value = 3; };
+template<int N> struct std::tuple_element<N, constant::Q> { typedef int type; };
+
+namespace constant {
+ Q q;
+ constexpr bool f() {
+ auto [a, b, c] = q;
+ return a == 0 && b == 1 && c == 4;
+ }
+ static_assert(f());
+}
More information about the cfe-commits
mailing list