// File: /workspace/github_c_makefile_star2_O0/lucvoo[P]sparse-dev/parse.c
// Function: single_initializer
static struct token *single_initializer(struct expression **ep, struct token *token)
{
	int expect_equal = 0;
	struct token *next = token->next;
	struct expression **tail = ep;
	int nested;

	*ep = NULL; 

	if ((token_type(token) == TOKEN_IDENT) && match_op(next, ':')) {
		struct expression *expr = identifier_expression(token);
		if (Wold_initializer)
			warning(token->pos, "obsolete struct initializer, use C99 syntax");
		token = initializer(&expr->ident_expression, next->next);
		if (expr->ident_expression)
			*ep = expr;
		return token;
	}

	for (tail = ep, nested = 0; ; nested++, next = token->next) {
		if (match_op(token, '.') && (token_type(next) == TOKEN_IDENT)) {
			struct expression *expr = identifier_expression(next);
			*tail = expr;
			tail = &expr->ident_expression;
			expect_equal = 1;
			token = next->next;
		} else if (match_op(token, '[')) {
			struct expression *from = NULL, *to = NULL, *expr;
			token = constant_expression(token->next, &from);
			if (!from) {
				sparse_error(token->pos, "Expected constant expression");
				break;
			}
			if (match_op(token, SPECIAL_ELLIPSIS))
				token = constant_expression(token->next, &to);
			expr = index_expression(from, to);
			*tail = expr;
			tail = &expr->idx_expression;
			token = expect(token, ']', "at end of initializer index");
			if (nested)
				expect_equal = 1;
		} else {
			break;
		}
	}
	if (nested && !expect_equal) {
		if (!match_op(token, '='))
			warning(token->pos, "obsolete array initializer, use C99 syntax");
		else
			expect_equal = 1;
	}
	if (expect_equal)
		token = expect(token, '=', "at end of initializer index");

	token = initializer(tail, token);
	if (!*tail)
		*ep = NULL;
	return token;
}

// Assembly:
pushq %rbp
movq %rsp, %rbp
subq $0x60, %rsp
movq %rdi, -0x10(%rbp)
movq %rsi, -0x18(%rbp)
movl $0x0, -0x1c(%rbp)
movq -0x18(%rbp), %rax
movq 0x8(%rax), %rax
movq %rax, -0x28(%rbp)
movq -0x10(%rbp), %rax
movq %rax, -0x30(%rbp)
movq -0x10(%rbp), %rax
movq $0x0, (%rax)
movq -0x18(%rbp), %rax
movq (%rax), %rax
andq $0x3f, %rax
cmpl $0x3, %eax
jne 0x29aab
movq -0x28(%rbp), %rdi
movl $0x3a, %esi
callq 0x22f80
cmpl $0x0, %eax
je 0x29aab
movq -0x18(%rbp), %rdi
callq 0x29cb0
movq %rax, -0x40(%rbp)
leaq 0x5adf3(%rip), %rax     # 0x84844
cmpl $0x0, (%rax)
je 0x29a6b
movq -0x18(%rbp), %rax
movq (%rax), %rdi
leaq 0x3d378(%rip), %rsi     # 0x66ddc
movb $0x0, %al
callq 0x16d80
movq -0x40(%rbp), %rdi
addq $0x20, %rdi
addq $0x18, %rdi
movq -0x28(%rbp), %rax
movq 0x8(%rax), %rsi
callq 0x23980
movq %rax, -0x18(%rbp)
movq -0x40(%rbp), %rax
cmpq $0x0, 0x38(%rax)
je 0x29a9e
movq -0x40(%rbp), %rcx
movq -0x10(%rbp), %rax
movq %rcx, (%rax)
movq -0x18(%rbp), %rax
movq %rax, -0x8(%rbp)
jmp 0x29ca2
movq -0x10(%rbp), %rax
movq %rax, -0x30(%rbp)
movl $0x0, -0x34(%rbp)
movq -0x18(%rbp), %rdi
movl $0x2e, %esi
callq 0x22f80
cmpl $0x0, %eax
je 0x29b1d
movq -0x28(%rbp), %rax
movq (%rax), %rax
andq $0x3f, %rax
cmpl $0x3, %eax
jne 0x29b1d
movq -0x28(%rbp), %rdi
callq 0x29cb0
movq %rax, -0x48(%rbp)
movq -0x48(%rbp), %rcx
movq -0x30(%rbp), %rax
movq %rcx, (%rax)
movq -0x48(%rbp), %rax
addq $0x20, %rax
addq $0x18, %rax
movq %rax, -0x30(%rbp)
movl $0x1, -0x1c(%rbp)
movq -0x28(%rbp), %rax
movq 0x8(%rax), %rax
movq %rax, -0x18(%rbp)
jmp 0x29bfa
movq -0x18(%rbp), %rdi
movl $0x5b, %esi
callq 0x22f80
cmpl $0x0, %eax
je 0x29bf6
movq $0x0, -0x50(%rbp)
movq $0x0, -0x58(%rbp)
movq -0x18(%rbp), %rax
movq 0x8(%rax), %rdi
leaq -0x50(%rbp), %rsi
callq 0x56f40
movq %rax, -0x18(%rbp)
cmpq $0x0, -0x50(%rbp)
jne 0x29b7a
movq -0x18(%rbp), %rax
movq (%rax), %rdi
leaq 0x3b25d(%rip), %rsi     # 0x64dcb
movb $0x0, %al
callq 0x16f90
jmp 0x29c16
movq -0x18(%rbp), %rdi
movl $0x117, %esi            # imm = 0x117
callq 0x22f80
cmpl $0x0, %eax
je 0x29ba2
movq -0x18(%rbp), %rax
movq 0x8(%rax), %rdi
leaq -0x58(%rbp), %rsi
callq 0x56f40
movq %rax, -0x18(%rbp)
movq -0x50(%rbp), %rdi
movq -0x58(%rbp), %rsi
callq 0x29cf0
movq %rax, -0x60(%rbp)
movq -0x60(%rbp), %rcx
movq -0x30(%rbp), %rax
movq %rcx, (%rax)
movq -0x60(%rbp), %rax
addq $0x20, %rax
addq $0x8, %rax
movq %rax, -0x30(%rbp)
movq -0x18(%rbp), %rdi
movl $0x5d, %esi
leaq 0x3d22a(%rip), %rdx     # 0x66e08
callq 0x22eb0
movq %rax, -0x18(%rbp)
cmpl $0x0, -0x34(%rbp)
je 0x29bf4
movl $0x1, -0x1c(%rbp)
jmp 0x29bf8
jmp 0x29c16
jmp 0x29bfa
jmp 0x29bfc
movl -0x34(%rbp), %eax
addl $0x1, %eax
movl %eax, -0x34(%rbp)
movq -0x18(%rbp), %rax
movq 0x8(%rax), %rax
movq %rax, -0x28(%rbp)
jmp 0x29aba
cmpl $0x0, -0x34(%rbp)
je 0x29c55
cmpl $0x0, -0x1c(%rbp)
jne 0x29c55
movq -0x18(%rbp), %rdi
movl $0x3d, %esi
callq 0x22f80
cmpl $0x0, %eax
jne 0x29c4c
movq -0x18(%rbp), %rax
movq (%rax), %rdi
leaq 0x3d1e1(%rip), %rsi     # 0x66e24
movb $0x0, %al
callq 0x16d80
jmp 0x29c53
movl $0x1, -0x1c(%rbp)
jmp 0x29c55
cmpl $0x0, -0x1c(%rbp)
je 0x29c74
movq -0x18(%rbp), %rdi
movl $0x3d, %esi
leaq 0x3d19d(%rip), %rdx     # 0x66e08
callq 0x22eb0
movq %rax, -0x18(%rbp)
movq -0x30(%rbp), %rdi
movq -0x18(%rbp), %rsi
callq 0x23980
movq %rax, -0x18(%rbp)
movq -0x30(%rbp), %rax
cmpq $0x0, (%rax)
jne 0x29c9a
movq -0x10(%rbp), %rax
movq $0x0, (%rax)
movq -0x18(%rbp), %rax
movq %rax, -0x8(%rbp)
movq -0x8(%rbp), %rax
addq $0x60, %rsp
popq %rbp
retq
nopl (%rax)