[clang] [clang][bytecode] Only count taken jumps as steps (PR #201845)
Timm Baeder via cfe-commits
cfe-commits at lists.llvm.org
Sun Jun 7 23:36:13 PDT 2026
Timm =?utf-8?q?Bäder?= <tbaeder at redhat.com>
Message-ID:
In-Reply-To: <llvm.org/llvm/llvm-project/pull/201845 at github.com>
https://github.com/tbaederr updated https://github.com/llvm/llvm-project/pull/201845
>From 2287ef041ebfd2e7089bec98c6a9cfb28213cb73 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Timm=20B=C3=A4der?= <tbaeder at redhat.com>
Date: Fri, 5 Jun 2026 16:09:32 +0200
Subject: [PATCH 1/2] asdf
---
clang/lib/AST/ByteCode/Interp.cpp | 6 ++++--
1 file changed, 4 insertions(+), 2 deletions(-)
diff --git a/clang/lib/AST/ByteCode/Interp.cpp b/clang/lib/AST/ByteCode/Interp.cpp
index 699b034c3c683..f6cac7aeb9fb5 100644
--- a/clang/lib/AST/ByteCode/Interp.cpp
+++ b/clang/lib/AST/ByteCode/Interp.cpp
@@ -65,15 +65,17 @@ static bool Jmp(InterpState &S, CodePtr &PC, int32_t Offset) {
static bool Jt(InterpState &S, CodePtr &PC, int32_t Offset) {
if (S.Stk.pop<bool>()) {
PC += Offset;
+ return S.noteStep(PC);
}
- return S.noteStep(PC);
+ return true;
}
static bool Jf(InterpState &S, CodePtr &PC, int32_t Offset) {
if (!S.Stk.pop<bool>()) {
PC += Offset;
+ return S.noteStep(PC);
}
- return S.noteStep(PC);
+ return true;
}
static void diagnoseMissingInitializer(InterpState &S, CodePtr OpPC,
>From e8770c7fa9351f87c015fc117a7db7b74c9a29aa Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Timm=20B=C3=A4der?= <tbaeder at redhat.com>
Date: Mon, 8 Jun 2026 08:35:33 +0200
Subject: [PATCH 2/2] Add test case
---
clang/test/AST/ByteCode/switch-case-steps.cpp | 120 ++++++++++++++++++
1 file changed, 120 insertions(+)
create mode 100644 clang/test/AST/ByteCode/switch-case-steps.cpp
diff --git a/clang/test/AST/ByteCode/switch-case-steps.cpp b/clang/test/AST/ByteCode/switch-case-steps.cpp
new file mode 100644
index 0000000000000..c3fb10be300bb
--- /dev/null
+++ b/clang/test/AST/ByteCode/switch-case-steps.cpp
@@ -0,0 +1,120 @@
+// RUN: %clang_cc1 -fexperimental-new-constant-interpreter -std=c++23 %s -fconstexpr-steps=2000
+// RUN: %clang_cc1 -std=c++23 %s -fconstexpr-steps=2000
+
+
+
+constexpr int char_to_int(char ch) {
+ switch (ch) {
+ case '0':
+ return 0;
+ case '1':
+ return 1;
+ case '2':
+ return 2;
+ case '3':
+ return 3;
+ case '4':
+ return 4;
+ case '5':
+ return 5;
+ case '6':
+ return 6;
+ case '7':
+ return 7;
+ case '8':
+ return 8;
+ case '9':
+ return 9;
+ case 'a':
+ case 'A':
+ return 10;
+ case 'b':
+ case 'B':
+ return 11;
+ case 'c':
+ case 'C':
+ return 12;
+ case 'd':
+ case 'D':
+ return 13;
+ case 'e':
+ case 'E':
+ return 14;
+ case 'f':
+ case 'F':
+ return 15;
+ case 'g':
+ case 'G':
+ return 16;
+ case 'h':
+ case 'H':
+ return 17;
+ case 'i':
+ case 'I':
+ return 18;
+ case 'j':
+ case 'J':
+ return 19;
+ case 'k':
+ case 'K':
+ return 20;
+ case 'l':
+ case 'L':
+ return 21;
+ case 'm':
+ case 'M':
+ return 22;
+ case 'n':
+ case 'N':
+ return 23;
+ case 'o':
+ case 'O':
+ return 24;
+ case 'p':
+ case 'P':
+ return 25;
+ case 'q':
+ case 'Q':
+ return 26;
+ case 'r':
+ case 'R':
+ return 27;
+ case 's':
+ case 'S':
+ return 28;
+ case 't':
+ case 'T':
+ return 29;
+ case 'u':
+ case 'U':
+ return 30;
+ case 'v':
+ case 'V':
+ return 31;
+ case 'w':
+ case 'W':
+ return 32;
+ case 'x':
+ case 'X':
+ return 33;
+ case 'y':
+ case 'Y':
+ return 34;
+ case 'z':
+ case 'Z':
+ return 35;
+ default:
+ return 0;
+ }
+}
+
+constexpr bool check() {
+ const char *str = "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n";
+ unsigned sum = 0;
+ for (const char *p = str; *p != '\0'; ++p) {
+ sum+= char_to_int(*p);
+ }
+
+ return sum != 0;
+}
+static_assert(check());
More information about the cfe-commits
mailing list