53 lines
1.8 KiB
Python
53 lines
1.8 KiB
Python
import t
|
||
import stdio
|
||
import testcheck
|
||
import stdlib
|
||
import memhub
|
||
from conflict_node import Value
|
||
|
||
# ============================================================
|
||
# 关键冲突点:全局变量名 'Value' 与类名 'Value' 相同
|
||
#
|
||
# LlvmGenerator 预处理扫描会将 'Value' 注册为 IsVariable=True
|
||
# 覆盖 SymbolTable 中的类条目。
|
||
# 之后 _get_or_create_struct('Value') 发现 IsVariable=True,
|
||
# 返回 _TypedPointerType 而非 IdentifiedStructType,
|
||
# 导致 _TryLoadStructFromStub 中 set_body 被跳过。
|
||
# ============================================================
|
||
Value: t.CPtr = None
|
||
|
||
|
||
def test_value_struct_fields():
|
||
"""验证 Value struct 有 6 个字段(Next + 5 自有)"""
|
||
testcheck.section("Value struct field access (6 fields expected)")
|
||
arena: bytes = stdlib.malloc(4096)
|
||
if arena is None:
|
||
testcheck.check(False, "malloc arena", "FAIL")
|
||
return
|
||
pool: memhub.MemBuddy | t.CPtr = memhub.MemBuddy(arena, 4096)
|
||
node: Value | t.CPtr = pool.alloc(48)
|
||
if node is None:
|
||
testcheck.check(False, "alloc Value", "FAIL")
|
||
return
|
||
# 写入字段 0 (Next, 继承自 GSListNode)
|
||
node.Next = None
|
||
# 写入字段 1-5 (自有字段)
|
||
node.Ty = None
|
||
node.Name = None
|
||
node.IsConst = 1
|
||
node.IntVal = 42
|
||
node.FloatVal = 3.14
|
||
# 读取验证
|
||
v: t.CInt = node.IntVal
|
||
testcheck.check(v == 42, "Value.IntVal = 42", "expect 42")
|
||
f: t.CDouble = node.FloatVal
|
||
testcheck.check(f > 3.0 and f < 4.0, "Value.FloatVal = 3.14", "expect ~3.14")
|
||
c: t.CInt = node.IsConst
|
||
testcheck.check(c == 1, "Value.IsConst = 1", "expect 1")
|
||
|
||
|
||
def main() -> t.CInt:
|
||
testcheck.begin("G7: Minimal repro - class name 'Value' conflicts with variable")
|
||
test_value_struct_fields()
|
||
return testcheck.end()
|