[clang] [clang][Sema] Reject negative tuple sizes (PR #159579)

via cfe-commits cfe-commits at lists.llvm.org
Thu Sep 18 07:24:31 PDT 2025


llvmbot wrote:


<!--LLVM PR SUMMARY COMMENT-->

@llvm/pr-subscribers-clang

Author: Timm Baeder (tbaederr)

<details>
<summary>Changes</summary>

Negative sizes don't make sense and trip up the code using `UnsignedOrNone`.

Fixes #<!-- -->159563

---
Full diff: https://github.com/llvm/llvm-project/pull/159579.diff


2 Files Affected:

- (modified) clang/lib/Sema/SemaDeclCXX.cpp (+1-1) 
- (modified) clang/test/SemaCXX/builtin-structured-binding-size.cpp (+9) 


``````````diff
diff --git a/clang/lib/Sema/SemaDeclCXX.cpp b/clang/lib/Sema/SemaDeclCXX.cpp
index fb57b43882911..2acd07cc5a6f1 100644
--- a/clang/lib/Sema/SemaDeclCXX.cpp
+++ b/clang/lib/Sema/SemaDeclCXX.cpp
@@ -1219,7 +1219,7 @@ static IsTupleLike isTupleLike(Sema &S, SourceLocation Loc, QualType T,
     return IsTupleLike::Error;
 
   E = S.VerifyIntegerConstantExpression(E.get(), &Size, Diagnoser);
-  if (E.isInvalid())
+  if (E.isInvalid() || Size.isNegative())
     return IsTupleLike::Error;
 
   return IsTupleLike::TupleLike;
diff --git a/clang/test/SemaCXX/builtin-structured-binding-size.cpp b/clang/test/SemaCXX/builtin-structured-binding-size.cpp
index 53576048754ab..de881a539310c 100644
--- a/clang/test/SemaCXX/builtin-structured-binding-size.cpp
+++ b/clang/test/SemaCXX/builtin-structured-binding-size.cpp
@@ -229,3 +229,12 @@ static_assert(__is_same_as(tag_of_t<S1>, int));
 static_assert(__is_same_as(tag_of_t<int>, int)); // error
 // expected-error at -1 {{constraints not satisfied for alias template 'tag_of_t' [with T = int]}}
 // expected-note@#tag-of-constr {{because substituted constraint expression is ill-formed: type 'int' cannot be decomposed}}
+
+struct Neg {
+  int a;
+};
+template <> struct std::tuple_size<Neg> {
+  static constexpr int value = -1;
+};
+
+int e = __builtin_structured_binding_size(Neg); // expected-error {{type 'Neg' cannot be decomposed}}

``````````

</details>


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


More information about the cfe-commits mailing list