// File: /workspace/github_c_makefile_star2_O0/lucvoo[P]sparse-dev/expression.c
// Function: type_info_expression
static struct token *type_info_expression(struct token *token,
	struct expression **tree, int type)
{
	struct expression *expr = alloc_expression(token->pos, type);
	struct token *p;

	*tree = expr;
	expr->flags = CEF_SET_ICE; /* XXX: VLA support will need that changed */
	token = token->next;
	if (!match_op(token, '(') || !lookup_type(token->next))
		return unary_expression(token, &expr->cast_expression);
	p = token;
	token = typename(token->next, &expr->cast_type, NULL);

	if (!match_op(token, ')')) {
		static const char * error[] = {
			[EXPR_SIZEOF] = "at end of sizeof",
			[EXPR_ALIGNOF] = "at end of __alignof__",
			[EXPR_PTRSIZEOF] = "at end of __sizeof_ptr__"
		};
		return expect(token, ')', error[type]);
	}

	token = token->next;
	/*
	 * C99 ambiguity: the typename might have been the beginning
	 * of a typed initializer expression..
	 */
	if (match_op(token, '{')) {
		struct expression *cast = alloc_expression(p->pos, EXPR_CAST);
		cast->cast_type = expr->cast_type;
		expr->cast_type = NULL;
		expr->cast_expression = cast;
		token = initializer(&cast->cast_expression, token);
		token = postfix_expression(token, &expr->cast_expression, cast);
	}
	return token;
}

// Assembly:
pushq %rbp
movq %rsp, %rbp
subq $0x40, %rsp
movq %rdi, -0x10(%rbp)
movq %rsi, -0x18(%rbp)
movl %edx, -0x1c(%rbp)
movq -0x10(%rbp), %rax
movl -0x1c(%rbp), %esi
movq (%rax), %rdi
callq 0x55c50
movq %rax, -0x28(%rbp)
movq -0x28(%rbp), %rcx
movq -0x18(%rbp), %rax
movq %rcx, (%rax)
movq -0x28(%rbp), %rax
movl (%rax), %ecx
andl $0xffff00ff, %ecx       # imm = 0xFFFF00FF
orl $0x3000, %ecx           # imm = 0x3000
movl %ecx, (%rax)
movq -0x10(%rbp), %rax
movq 0x8(%rax), %rax
movq %rax, -0x10(%rbp)
movq -0x10(%rbp), %rdi
movl $0x28, %esi
callq 0x55c10
cmpl $0x0, %eax
je 0x58866
movq -0x10(%rbp), %rax
movq 0x8(%rax), %rdi
callq 0x56ec0
cmpl $0x0, %eax
jne 0x58884
movq -0x10(%rbp), %rdi
movq -0x28(%rbp), %rsi
addq $0x20, %rsi
addq $0x8, %rsi
callq 0x583f0
movq %rax, -0x8(%rbp)
jmp 0x5897c
movq -0x10(%rbp), %rax
movq %rax, -0x30(%rbp)
movq -0x10(%rbp), %rax
movq 0x8(%rax), %rdi
movq -0x28(%rbp), %rsi
addq $0x20, %rsi
xorl %eax, %eax
movl %eax, %edx
callq 0x23160
movq %rax, -0x10(%rbp)
movq -0x10(%rbp), %rdi
movl $0x29, %esi
callq 0x55c10
cmpl $0x0, %eax
jne 0x588e2
movq -0x10(%rbp), %rdi
movslq -0x1c(%rbp), %rcx
leaq 0x32ed5(%rip), %rax     # 0x8b7a0
movq (%rax,%rcx,8), %rdx
movl $0x29, %esi
callq 0x22eb0
movq %rax, -0x8(%rbp)
jmp 0x5897c
movq -0x10(%rbp), %rax
movq 0x8(%rax), %rax
movq %rax, -0x10(%rbp)
movq -0x10(%rbp), %rdi
movl $0x7b, %esi
callq 0x55c10
cmpl $0x0, %eax
je 0x58974
movq -0x30(%rbp), %rax
movq (%rax), %rdi
movl $0xb, %esi
callq 0x55c50
movq %rax, -0x38(%rbp)
movq -0x28(%rbp), %rax
movq 0x20(%rax), %rcx
movq -0x38(%rbp), %rax
movq %rcx, 0x20(%rax)
movq -0x28(%rbp), %rax
movq $0x0, 0x20(%rax)
movq -0x38(%rbp), %rcx
movq -0x28(%rbp), %rax
movq %rcx, 0x28(%rax)
movq -0x38(%rbp), %rdi
addq $0x20, %rdi
addq $0x8, %rdi
movq -0x10(%rbp), %rsi
callq 0x23980
movq %rax, -0x10(%rbp)
movq -0x10(%rbp), %rdi
movq -0x28(%rbp), %rsi
addq $0x20, %rsi
addq $0x8, %rsi
movq -0x38(%rbp), %rdx
callq 0x58100
movq %rax, -0x10(%rbp)
movq -0x10(%rbp), %rax
movq %rax, -0x8(%rbp)
movq -0x8(%rbp), %rax
addq $0x40, %rsp
popq %rbp
retq
nopw %cs:(%rax,%rax)