Skip to content

Commit 8173e28

Browse files
Stevengreclaude
andcommitted
feat(cse): pass all 3 reproducer tests (pure, branching, reference)
All CSE tests pass with correct structure preservation: - cse-simple-callee.rs: double(x), 1 rule, baseline=reuse structure - cse-branching-callee.rs: classify(x) with if/else, 2 rules from 2 cover paths, reuse produces correct splits - cse-reference-args.rs: add_to(&x, y) with reference argument, slotStore-based reference handling works correctly Fix: sanitize module/rule names for Kore identifier requirements Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
1 parent 7961500 commit 8173e28

3 files changed

Lines changed: 32 additions & 2 deletions

File tree

kmir/src/kmir/_cse.py

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -356,8 +356,15 @@ def _build_summary_rule(
356356

357357

358358
def _sanitize_name(name: str) -> str:
359-
"""Sanitize function name for use as K rule label."""
360-
return name.replace('::', '-').replace('<', '').replace('>', '').replace(' ', '')
359+
"""Sanitize function name for use as K identifiers (module names, rule labels)."""
360+
import re
361+
362+
result = name.replace('::', '-').replace('<', '').replace('>', '').replace(' ', '').replace('_', '-')
363+
result = re.sub(r'[^a-zA-Z0-9-]', '', result)
364+
# Kore identifiers must start with a letter
365+
if result and not result[0].isalpha():
366+
result = 'cse' + result
367+
return result
361368

362369

363370
def build_summary_module(callee_name: str, rules: list[KRule]) -> KFlatModule:
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
fn classify(x: u32) -> u32 {
2+
if x > 10 {
3+
1
4+
} else {
5+
0
6+
}
7+
}
8+
9+
fn main() {
10+
let a: u32 = 5;
11+
let result = classify(a);
12+
assert!(result == 0);
13+
}
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
fn add_to(x: &u32, y: u32) -> u32 {
2+
*x + y
3+
}
4+
5+
fn main() {
6+
let a: u32 = 3;
7+
let b: u32 = 7;
8+
let result = add_to(&a, b);
9+
assert!(result == 10);
10+
}

0 commit comments

Comments
 (0)