// File: /workspace/github_c_makefile_star2_O0/oridb[P]mc/parse/infer.c
// Function: typesub
static void
typesub(Node *n, int noerr)
{
	char *name;
	size_t i;
	Node *l;

	if (!n)
		return;
	switch (n->type) {
	case Ndecl:
		pushenv(n->decl.env);
		settype(n, tyfix(n, type(n), noerr));
		if (n->decl.init)
			typesub(n->decl.init, noerr);
		if (streq(declname(n), "main"))
			if (!maincompatible(tybase(decltype(n))))
				fatal(n, "main must be (->void) or (byte[:][:] -> void), got %s",
						tystr(decltype(n)));
		name = declname(n);
		if (streq(name, "__init__") || streq(name, "__fini__"))
			if (!initcompatible(tybase(decltype(n))))
				fatal(n, "%s must be (->void), got %s", name, tystr(decltype(n)));
		popenv(n->decl.env);
		break;
	case Nblock:
		pushstab(n->block.scope);
		for (i = 0; i < n->block.nstmts; i++)
			typesub(n->block.stmts[i], noerr);
		popstab();
		break;
	case Nifstmt:
		typesub(n->ifstmt.cond, noerr);
		typesub(n->ifstmt.iftrue, noerr);
		typesub(n->ifstmt.iffalse, noerr);
		break;
	case Nloopstmt:
		typesub(n->loopstmt.cond, noerr);
		typesub(n->loopstmt.init, noerr);
		typesub(n->loopstmt.step, noerr);
		typesub(n->loopstmt.body, noerr);
		break;
	case Niterstmt:
		typesub(n->iterstmt.elt, noerr);
		typesub(n->iterstmt.seq, noerr);
		typesub(n->iterstmt.body, noerr);
		if (!ingeneric)
			additerspecialization(n, curstab());
		break;
	case Nmatchstmt:
		typesub(n->matchstmt.val, noerr);
		for (i = 0; i < n->matchstmt.nmatches; i++) {
			typesub(n->matchstmt.matches[i], noerr);
		}
		break;
	case Nmatch:
		typesub(n->match.pat, noerr);
		typesub(n->match.block, noerr);
		break;
	case Nexpr:
		settype(n, tyfix(n, type(n), 0));
		if (n->expr.param)
			n->expr.param = tyfix(n, n->expr.param, 0);
		typesub(n->expr.idx, noerr);
		if (exprop(n) == Ocast && exprop(n->expr.args[0]) == Olit) {
			l = n->expr.args[0]->expr.args[0];
			if(l->lit.littype == Lint && istyint(exprtype(n))) {
				settype(n->expr.args[0], exprtype(n));
				settype(n->expr.args[0]->expr.args[0], exprtype(n));
			}
		}
		if (exprop(n) == Oauto)
			adddispspecialization(n, curstab());
		for (i = 0; i < n->expr.nargs; i++)
			typesub(n->expr.args[i], noerr);
		if (!noerr)
			verifyop(n);
		break;
	case Nfunc:
		pushstab(n->func.scope);
		settype(n, tyfix(n, n->func.type, 0));
		for (i = 0; i < n->func.nargs; i++)
			typesub(n->func.args[i], noerr);
		typesub(n->func.body, noerr);
		popstab();
		break;
	case Nlit:
		settype(n, tyfix(n, type(n), 0));
		switch (n->lit.littype) {
		case Lfunc:	typesub(n->lit.fnval, noerr);	break;
		case Lint:	checkrange(n);			break;
		default: 					break;
		}
		break;
	case Nimpl:
		pushenv(n->impl.env);
		putimpl(curstab(), n);
		popenv(n->impl.env);
	case Nname: case Nuse:
		break;
	case Nnone:
		die("Nnone should not be seen as node type!");
		break;
	}
}

// Assembly:
pushq %rbp
movq %rsp, %rbp
subq $0xa0, %rsp
movq %rdi, -0x8(%rbp)
movl %esi, -0xc(%rbp)
cmpq $0x0, -0x8(%rbp)
jne 0x2690e
jmp 0x26f13
movq -0x8(%rbp), %rax
movl 0x8(%rax), %eax
movq %rax, -0x30(%rbp)
subq $0xd, %rax
ja 0x26f13
movq -0x30(%rbp), %rax
leaq 0x2af7a(%rip), %rcx     # 0x518a8
movslq (%rcx,%rax,4), %rax
addq %rcx, %rax
jmpq *%rax
movq -0x8(%rbp), %rax
movq 0x38(%rax), %rdi
callq 0x32f70
movq -0x8(%rbp), %rax
movq %rax, -0x38(%rbp)
movq -0x8(%rbp), %rax
movq %rax, -0x40(%rbp)
movq -0x8(%rbp), %rdi
callq 0x2a8f0
movq -0x40(%rbp), %rdi
movq %rax, %rsi
movl -0xc(%rbp), %edx
callq 0x28500
movq -0x38(%rbp), %rdi
movq %rax, %rsi
callq 0x2ce80
movq -0x8(%rbp), %rax
cmpq $0x0, 0x30(%rax)
je 0x26993
movq -0x8(%rbp), %rax
movq 0x30(%rax), %rdi
movl -0xc(%rbp), %esi
callq 0x268f0
movq -0x8(%rbp), %rdi
callq 0x30200
movq %rax, %rdi
leaq 0x2711c(%rip), %rsi     # 0x4dac2
callq 0x499b0
cmpl $0x0, %eax
je 0x269fe
movq -0x8(%rbp), %rdi
callq 0x30260
movq %rax, %rdi
callq 0x36a30
movq %rax, %rdi
callq 0x2e980
cmpl $0x0, %eax
jne 0x269fc
movq -0x8(%rbp), %rax
movq %rax, -0x48(%rbp)
movq -0x8(%rbp), %rdi
callq 0x30260
movq %rax, %rdi
callq 0x38a10
movq -0x48(%rbp), %rdi
movq %rax, %rdx
leaq 0x2bf34(%rip), %rsi     # 0x52929
movb $0x0, %al
callq 0x1dfe0
jmp 0x269fe
movq -0x8(%rbp), %rdi
callq 0x30200
movq %rax, -0x18(%rbp)
movq -0x18(%rbp), %rdi
leaq 0x26dfa(%rip), %rsi     # 0x4d810
callq 0x499b0
cmpl $0x0, %eax
jne 0x26a35
movq -0x18(%rbp), %rdi
leaq 0x26dee(%rip), %rsi     # 0x4d819
callq 0x499b0
cmpl $0x0, %eax
je 0x26a8f
movq -0x8(%rbp), %rdi
callq 0x30260
movq %rax, %rdi
callq 0x36a30
movq %rax, %rdi
callq 0x2ea60
cmpl $0x0, %eax
jne 0x26a8d
movq -0x8(%rbp), %rax
movq %rax, -0x58(%rbp)
movq -0x18(%rbp), %rax
movq %rax, -0x50(%rbp)
movq -0x8(%rbp), %rdi
callq 0x30260
movq %rax, %rdi
callq 0x38a10
movq -0x58(%rbp), %rdi
movq -0x50(%rbp), %rdx
movq %rax, %rcx
leaq 0x2bed9(%rip), %rsi     # 0x5295f
movb $0x0, %al
callq 0x1dfe0
jmp 0x26a8f
movq -0x8(%rbp), %rax
movq 0x38(%rax), %rdi
callq 0x32fe0
jmp 0x26f13
movq -0x8(%rbp), %rax
movq 0x18(%rax), %rdi
callq 0x32db0
movq $0x0, -0x20(%rbp)
movq -0x20(%rbp), %rax
movq -0x8(%rbp), %rcx
cmpq 0x20(%rcx), %rax
jae 0x26aea
movq -0x8(%rbp), %rax
movq 0x28(%rax), %rax
movq -0x20(%rbp), %rcx
movq (%rax,%rcx,8), %rdi
movl -0xc(%rbp), %esi
callq 0x268f0
movq -0x20(%rbp), %rax
addq $0x1, %rax
movq %rax, -0x20(%rbp)
jmp 0x26ab6
callq 0x32e20
jmp 0x26f13
movq -0x8(%rbp), %rax
movq 0x18(%rax), %rdi
movl -0xc(%rbp), %esi
callq 0x268f0
movq -0x8(%rbp), %rax
movq 0x20(%rax), %rdi
movl -0xc(%rbp), %esi
callq 0x268f0
movq -0x8(%rbp), %rax
movq 0x28(%rax), %rdi
movl -0xc(%rbp), %esi
callq 0x268f0
jmp 0x26f13
movq -0x8(%rbp), %rax
movq 0x20(%rax), %rdi
movl -0xc(%rbp), %esi
callq 0x268f0
movq -0x8(%rbp), %rax
movq 0x18(%rax), %rdi
movl -0xc(%rbp), %esi
callq 0x268f0
movq -0x8(%rbp), %rax
movq 0x28(%rax), %rdi
movl -0xc(%rbp), %esi
callq 0x268f0
movq -0x8(%rbp), %rax
movq 0x30(%rax), %rdi
movl -0xc(%rbp), %esi
callq 0x268f0
jmp 0x26f13
movq -0x8(%rbp), %rax
movq 0x18(%rax), %rdi
movl -0xc(%rbp), %esi
callq 0x268f0
movq -0x8(%rbp), %rax
movq 0x20(%rax), %rdi
movl -0xc(%rbp), %esi
callq 0x268f0
movq -0x8(%rbp), %rax
movq 0x28(%rax), %rdi
movl -0xc(%rbp), %esi
callq 0x268f0
cmpl $0x0, 0x5686b(%rip)     # 0x7d410
jne 0x26bc0
movq -0x8(%rbp), %rax
movq %rax, -0x60(%rbp)
callq 0x32d60
movq -0x60(%rbp), %rdi
movq %rax, %rsi
callq 0x2eac0
jmp 0x26f13
movq -0x8(%rbp), %rax
movq 0x18(%rax), %rdi
movl -0xc(%rbp), %esi
callq 0x268f0
movq $0x0, -0x20(%rbp)
movq -0x20(%rbp), %rax
movq -0x8(%rbp), %rcx
cmpq 0x20(%rcx), %rax
jae 0x26c11
movq -0x8(%rbp), %rax
movq 0x28(%rax), %rax
movq -0x20(%rbp), %rcx
movq (%rax,%rcx,8), %rdi
movl -0xc(%rbp), %esi
callq 0x268f0
movq -0x20(%rbp), %rax
addq $0x1, %rax
movq %rax, -0x20(%rbp)
jmp 0x26bdd
jmp 0x26f13
movq -0x8(%rbp), %rax
movq 0x18(%rax), %rdi
movl -0xc(%rbp), %esi
callq 0x268f0
movq -0x8(%rbp), %rax
movq 0x20(%rax), %rdi
movl -0xc(%rbp), %esi
callq 0x268f0
jmp 0x26f13
movq -0x8(%rbp), %rax
movq %rax, -0x68(%rbp)
movq -0x8(%rbp), %rax
movq %rax, -0x70(%rbp)
movq -0x8(%rbp), %rdi
callq 0x2a8f0
movq -0x70(%rbp), %rdi
movq %rax, %rsi
xorl %edx, %edx
callq 0x28500
movq -0x68(%rbp), %rdi
movq %rax, %rsi
callq 0x2ce80
movq -0x8(%rbp), %rax
cmpq $0x0, 0x28(%rax)
je 0x26c97
movq -0x8(%rbp), %rdi
movq -0x8(%rbp), %rax
movq 0x28(%rax), %rsi
xorl %edx, %edx
callq 0x28500
movq %rax, %rcx
movq -0x8(%rbp), %rax
movq %rcx, 0x28(%rax)
movq -0x8(%rbp), %rax
movq 0x48(%rax), %rdi
movl -0xc(%rbp), %esi
callq 0x268f0
movq -0x8(%rbp), %rdi
callq 0x2f210
cmpl $0x2e, %eax
jne 0x26d59
movq -0x8(%rbp), %rax
movq 0x50(%rax), %rax
movq (%rax), %rdi
callq 0x2f210
cmpl $0x35, %eax
jne 0x26d59
movq -0x8(%rbp), %rax
movq 0x50(%rax), %rax
movq (%rax), %rax
movq 0x50(%rax), %rax
movq (%rax), %rax
movq %rax, -0x28(%rbp)
movq -0x28(%rbp), %rax
cmpl $0x2, 0x18(%rax)
jne 0x26d57
movq -0x8(%rbp), %rdi
callq 0x30340
movq %rax, %rdi
callq 0x378e0
cmpl $0x0, %eax
je 0x26d57
movq -0x8(%rbp), %rax
movq 0x50(%rax), %rax
movq (%rax), %rax
movq %rax, -0x80(%rbp)
movq -0x8(%rbp), %rdi
callq 0x30340
movq -0x80(%rbp), %rdi
movq %rax, %rsi
callq 0x2ce80
movq -0x8(%rbp), %rax
movq 0x50(%rax), %rax
movq (%rax), %rax
movq 0x50(%rax), %rax
movq (%rax), %rax
movq %rax, -0x78(%rbp)
movq -0x8(%rbp), %rdi
callq 0x30340
movq -0x78(%rbp), %rdi
movq %rax, %rsi
callq 0x2ce80
jmp 0x26d59
movq -0x8(%rbp), %rdi
callq 0x2f210
cmpl $0x1, %eax
jne 0x26d86
movq -0x8(%rbp), %rax
movq %rax, -0x88(%rbp)
callq 0x32d60
movq -0x88(%rbp), %rdi
movq %rax, %rsi
callq 0x2ebe0
movq $0x0, -0x20(%rbp)
movq -0x20(%rbp), %rax
movq -0x8(%rbp), %rcx
cmpq 0x40(%rcx), %rax
jae 0x26dc2
movq -0x8(%rbp), %rax
movq 0x50(%rax), %rax
movq -0x20(%rbp), %rcx
movq (%rax,%rcx,8), %rdi
movl -0xc(%rbp), %esi
callq 0x268f0
movq -0x20(%rbp), %rax
addq $0x1, %rax
movq %rax, -0x20(%rbp)
jmp 0x26d8e
cmpl $0x0, -0xc(%rbp)
jne 0x26dd1
movq -0x8(%rbp), %rdi
callq 0x2ecb0
jmp 0x26f13
movq -0x8(%rbp), %rax
movq 0x20(%rax), %rdi
callq 0x32db0
movq -0x8(%rbp), %rax
movq %rax, -0x90(%rbp)
movq -0x8(%rbp), %rdi
movq -0x8(%rbp), %rax
movq 0x28(%rax), %rsi
xorl %edx, %edx
callq 0x28500
movq -0x90(%rbp), %rdi
movq %rax, %rsi
callq 0x2ce80
movq $0x0, -0x20(%rbp)
movq -0x20(%rbp), %rax
movq -0x8(%rbp), %rcx
cmpq 0x30(%rcx), %rax
jae 0x26e4c
movq -0x8(%rbp), %rax
movq 0x38(%rax), %rax
movq -0x20(%rbp), %rcx
movq (%rax,%rcx,8), %rdi
movl -0xc(%rbp), %esi
callq 0x268f0
movq -0x20(%rbp), %rax
addq $0x1, %rax
movq %rax, -0x20(%rbp)
jmp 0x26e18
movq -0x8(%rbp), %rax
movq 0x40(%rax), %rdi
movl -0xc(%rbp), %esi
callq 0x268f0
callq 0x32e20
jmp 0x26f13
movq -0x8(%rbp), %rdi
movq %rdi, -0xa0(%rbp)
callq 0x2a8f0
movq -0xa0(%rbp), %rdi
movq %rax, %rsi
xorl %edx, %edx
callq 0x28500
movq -0xa0(%rbp), %rdi
movq %rax, %rsi
callq 0x2ce80
movq -0x8(%rbp), %rax
movl 0x18(%rax), %eax
movl %eax, -0x94(%rbp)
subl $0x2, %eax
je 0x26ec9
jmp 0x26eaa
movl -0x94(%rbp), %eax
subl $0x5, %eax
jne 0x26ed4
jmp 0x26eb7
movq -0x8(%rbp), %rax
movq 0x30(%rax), %rdi
movl -0xc(%rbp), %esi
callq 0x268f0
jmp 0x26ed6
movq -0x8(%rbp), %rdi
callq 0x2ee60
jmp 0x26ed6
jmp 0x26ed6
jmp 0x26f13
movq -0x8(%rbp), %rax
movq 0x38(%rax), %rdi
callq 0x32f70
callq 0x32d60
movq %rax, %rdi
movq -0x8(%rbp), %rsi
callq 0x34600
movq -0x8(%rbp), %rax
movq 0x38(%rax), %rdi
callq 0x32fe0
jmp 0x26f13
leaq 0x2b404(%rip), %rdi     # 0x52310
movb $0x0, %al
callq 0x1df20
addq $0xa0, %rsp
popq %rbp
retq
nopl (%rax)