Skip to content

Commit f12faae

Browse files
authored
[mypyc] Fix native int default args in __init__ (#13910)
Avoid creating duplicate bitmap arguments for the constructor. These would generate broken C with errors like these: ``` build/__native.c:122:74: error: redefinition of parameter ‘cpy_r___bitmap’ 122 | PyObject *CPyDef_Foo(int64_t cpy_r_xx, uint32_t cpy_r___bitmap, uint32_t cpy_r___bitmap) ```
1 parent 5e1e26e commit f12faae

File tree

2 files changed

+33
-1
lines changed

2 files changed

+33
-1
lines changed

mypyc/irbuild/prepare.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -288,7 +288,8 @@ def prepare_class_def(
288288
init_sig.ret_type,
289289
)
290290

291-
ctor_sig = FuncSignature(init_sig.args[1:], RInstance(ir))
291+
last_arg = len(init_sig.args) - init_sig.num_bitmap_args
292+
ctor_sig = FuncSignature(init_sig.args[1:last_arg], RInstance(ir))
292293
ir.ctor = FuncDecl(cdef.name, None, module_name, ctor_sig)
293294
mapper.func_to_decl[cdef.info] = ir.ctor
294295

mypyc/test-data/run-i64.test

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -844,6 +844,37 @@ def test_class_method_default_args() -> None:
844844
assert dd.c(MAGIC) == MAGIC + 3
845845
assert dd.c(b=5) == 7
846846

847+
class Init:
848+
def __init__(self, x: i64 = 2, y: i64 = 5) -> None:
849+
self.x = x
850+
self.y = y
851+
852+
def test_init_default_args() -> None:
853+
o = Init()
854+
assert o.x == 2
855+
assert o.y == 5
856+
o = Init(7, 8)
857+
assert o.x == 7
858+
assert o.y == 8
859+
o = Init(4)
860+
assert o.x == 4
861+
assert o.y == 5
862+
o = Init(MAGIC, MAGIC)
863+
assert o.x == MAGIC
864+
assert o.y == MAGIC
865+
o = Init(3, MAGIC)
866+
assert o.x == 3
867+
assert o.y == MAGIC
868+
o = Init(MAGIC, 11)
869+
assert o.x == MAGIC
870+
assert o.y == 11
871+
o = Init(MAGIC)
872+
assert o.x == MAGIC
873+
assert o.y == 5
874+
o = Init(y=MAGIC)
875+
assert o.x == 2
876+
assert o.y == MAGIC
877+
847878
def kw_only(*, a: i64 = 1, b: int = 2, c: i64 = 3) -> i64:
848879
return a + b + c * 2
849880

0 commit comments

Comments
 (0)