https://github.com/tbaederr created https://github.com/llvm/llvm-project/pull/230396
None >From 04fc6dc9c63fce276e58245335bc7effa97a937b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Timm=20B=C3=A4der?= <[email protected]> Date: Fri, 9 Oct 2026 10:16:09 +0200 Subject: [PATCH] [clang][bytecode] Reject strcmp with non-primitive element types --- clang/lib/AST/ByteCode/InterpBuiltin.cpp | 3 ++- clang/test/AST/ByteCode/c.c | 6 ++++++ 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/clang/lib/AST/ByteCode/InterpBuiltin.cpp b/clang/lib/AST/ByteCode/InterpBuiltin.cpp index 5f3f59ae242456..4a5c691d390a71 100644 --- a/clang/lib/AST/ByteCode/InterpBuiltin.cpp +++ b/clang/lib/AST/ByteCode/InterpBuiltin.cpp @@ -325,7 +325,8 @@ static bool interp__builtin_strcmp(InterpState &S, CodePtr OpPC, QualType ElemTy = getElemType(A); // Different element types shouldn't happen, but with casts they can. - if (!S.getASTContext().hasSameUnqualifiedType(ElemTy, getElemType(B))) + if (!S.getASTContext().hasSameUnqualifiedType(ElemTy, getElemType(B)) || + !S.getContext().canClassify(ElemTy)) return false; PrimType ElemT = *S.getContext().classify(ElemTy); diff --git a/clang/test/AST/ByteCode/c.c b/clang/test/AST/ByteCode/c.c index 7dd3f667559ed9..e431691ed190d8 100644 --- a/clang/test/AST/ByteCode/c.c +++ b/clang/test/AST/ByteCode/c.c @@ -486,3 +486,9 @@ Parse sqlite3Prepare_sParse; void sqlite3Prepare(void) { memset( ((char *)&sqlite3Prepare_sParse) + sizeof(int), 0, sizeof(int)); } + +int strcmp(const char *, const char *); +const union u { + char c[2]; +} str[] = {"", ""}; +const int strcmpFoo = strcmp((const char *)str, (const char *)str); // all-error {{not a compile-time constant}} _______________________________________________ cfe-commits mailing list [email protected] https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
