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@-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 _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits