// File: /workspace/github_c_makefile_star2_O0/johsteffens[P]beth/xoico/src/xoico.xo.c
// Function: xoico_che_s_trans_member
er_t xoico_che_s_trans_member( xoico_che_s* o, x_source* source, xoico_che_result* result )
{
    // xoico_che.x:930:1
    
    if(      x_source_parse_bl(source,"#?'.'"  ) ) BLM_TRY(xoico_che_result_a_push_sc(result,"." ))
    else if( x_source_parse_bl(source,"#?'->'" ) ) BLM_TRY(xoico_che_result_a_push_sc(result,"->" ))
    
    BLM_TRY(xoico_che_s_trans_whitespace(o,source, result ))
    
    char c = x_source_inspect_char(source);
    
    if( c == '*' || c == '&' )
    {
        return  x_source_parse_error_fa(source,"Postfix operators '&' and '*' are deprecated.\n" );
    }
    
    if( c >= '0' && c <= '9' )
    {
        return  x_source_parse_error_fa(source,"Setting indirection: Expression not tractable\n" );
    }
    
    tp_t tp_identifier = xoico_che_s_get_identifier(o,source, false );
    
    if( xoico_che_s_is_builtin_func(o,tp_identifier ) )
    {
        return  x_source_parse_error_fa(source,"Expression before '#<sc_t>' not tractable\n", xoico_che_s_nameof(o,tp_identifier ) );
    }
    
    BLM_TRY(xoico_che_s_trans_identifier(o,source, result, NULL ))
    BLM_TRY(xoico_che_s_trans_whitespace(o,source, result ))
    if( x_source_parse_bl(source,"#?'('") )
    {
        return  x_source_parse_error_fa(source,"Untraced member function '#<sc_t>'\n", xoico_che_s_nameof(o,tp_identifier ) );
    }
    
    return  0;
}

er_t xoico_che_s_try_take_typespec( xoico_che_s* o, x_source* source, xoico_typespec_s* typespec, bl_t require_tractable_type, bl_t* success )
{
    // xoico_che.x:978:1
    
    if( success ) (*(success)) = false;
    
    sz_t index = x_source_get_index(source);
    
    BLM_TRY(xoico_che_s_trans_whitespace(o,source, NULL ))
    tp_t tp_identifier = xoico_che_s_get_identifier(o,source, true );
    
    if( !tp_identifier )
    {
        x_source_set_index(source,index );
        return  0;
    }
    
    BLM_TRY(xoico_che_s_trans_whitespace(o,source, NULL ))
    
    // take fails if identifier is used as function
    if( x_source_parse_bl(source,"#?'('" ) )
    {
        x_source_set_index(source,index );
        return  0;
    }
    
    tp_t access_class = 0;
    
    switch( tp_identifier )
    {
        case TYPEOF_c:
        case TYPEOF_const:
            access_class = TYPEOF_const;
            break;
    
        case TYPEOF_m:
        case TYPEOF_mutable:
            access_class = TYPEOF_mutable;
            break;
    
        case TYPEOF_d:
        case TYPEOF_discardable:
            access_class = TYPEOF_discardable;
            break;
    
        default: break;
    }
    
    if( access_class )
    {
        tp_identifier = xoico_che_s_get_identifier(o,source, true );
        if( !tp_identifier )
        {
            x_source_set_index(source,index );
            return  0;
        }
        BLM_TRY(xoico_che_s_trans_whitespace(o,source, NULL ))
    }
    
    while( tp_identifier )
    {
        if     ( tp_identifier == TYPEOF_static   && !typespec->flag_static   ) typespec->flag_static   = true;
        else if( tp_identifier == TYPEOF_volatile && !typespec->flag_volatile ) typespec->flag_volatile = true;
        else if( tp_identifier == TYPEOF_aware    && !typespec->flag_aware    ) typespec->flag_aware    = true;
        else if( tp_identifier == TYPEOF_obliv    && !typespec->flag_obliv    ) typespec->flag_obliv    = true;
        else break;
    
        tp_identifier = 0;
        BLM_TRY(xoico_che_s_trans_identifier(o,source, NULL,&( tp_identifier )))
        BLM_TRY(xoico_che_s_trans_whitespace(o,source, NULL ))
    }
    
    typespec->type = tp_identifier;
    
    if( x_source_parse_bl(source,"#?'.' " ) )
    {
        if( !x_source_parse_bl(source,"#?([0]>='0'&&[0]<='9') " ) )
        {
            x_source_set_index(source,index );
            return  0;
        }
    
        sz_t indirection = 0;
        BLM_TRY(x_source_parse_fa(source,"#<sz_t*> ", (&(indirection)) ))
        typespec->indirection = indirection;
    }
    else
    {
        while( x_source_parse_bl(source,"#?'*' " ) ) typespec->indirection++;
    }
    
    if( require_tractable_type )
    {
        if( !( tp_identifier == ((tp_t)(TYPEOF_type_deduce)) || xoico_che_s_is_type(o,tp_identifier ) ) )
        {
            x_source_set_index(source,index );
            return  0;
        }
    }
    
    if( x_source_parse_bl(source," #?'^'") ) typespec->flag_scope = true;
    
    if( x_source_parse_bl(source," #?w'restrict'") ) typespec->flag_restrict = true;
    
    if( typespec->indirection > 0 && access_class == 0 )
    {
        access_class = TYPEOF_const; // const is default
    }
    
    typespec->access_class = access_class;
    
    if( success ) (*(success)) = true;
    return  0;
}

// Assembly:
pushq %rbp
movq %rsp, %rbp
subq $0x90, %rsp
movq %rdi, -0x10(%rbp)
movq %rsi, -0x18(%rbp)
movq %rdx, -0x20(%rbp)
movq -0x18(%rbp), %rdi
leaq 0x10e190(%rip), %rsi    # 0x133a62
callq 0x6700
testb $0x1, %al
jne 0x258dd
jmp 0x2591e
movq -0x20(%rbp), %rdi
leaq 0x1115b6(%rip), %rsi    # 0x136e9e
callq 0x23300
movq %rax, -0x28(%rbp)
cmpq $0x0, -0x28(%rbp)
je 0x2591c
movq -0x28(%rbp), %rax
movq %rax, -0x30(%rbp)
leaq 0x18ca29(%rip), %rax    # 0x1b2330
movq (%rax), %rdi
callq 0xc0720
movq -0x30(%rbp), %rax
movq %rax, -0x8(%rbp)
jmp 0x25b51
jmp 0x25977
movq -0x18(%rbp), %rdi
leaq 0x11122a(%rip), %rsi    # 0x136b53
callq 0x6700
testb $0x1, %al
jne 0x25934
jmp 0x25975
movq -0x20(%rbp), %rdi
leaq 0x11121b(%rip), %rsi    # 0x136b5a
callq 0x23300
movq %rax, -0x38(%rbp)
cmpq $0x0, -0x38(%rbp)
je 0x25973
movq -0x38(%rbp), %rax
movq %rax, -0x40(%rbp)
leaq 0x18c9d2(%rip), %rax    # 0x1b2330
movq (%rax), %rdi
callq 0xc0720
movq -0x40(%rbp), %rax
movq %rax, -0x8(%rbp)
jmp 0x25b51
jmp 0x25975
jmp 0x25977
movq -0x10(%rbp), %rdi
movq -0x18(%rbp), %rsi
movq -0x20(%rbp), %rdx
callq 0x23fd0
movq %rax, -0x48(%rbp)
cmpq $0x0, -0x48(%rbp)
je 0x259b7
movq -0x48(%rbp), %rax
movq %rax, -0x50(%rbp)
leaq 0x18c98e(%rip), %rax    # 0x1b2330
movq (%rax), %rdi
callq 0xc0720
movq -0x50(%rbp), %rax
movq %rax, -0x8(%rbp)
jmp 0x25b51
movq -0x18(%rbp), %rdi
callq 0xa440
movb %al, -0x51(%rbp)
movsbl -0x51(%rbp), %eax
cmpl $0x2a, %eax
je 0x259d5
movsbl -0x51(%rbp), %eax
cmpl $0x26, %eax
jne 0x259f0
movq -0x18(%rbp), %rdi
leaq 0x11117d(%rip), %rsi    # 0x136b5d
movb $0x0, %al
callq 0x4c80
movq %rax, -0x8(%rbp)
jmp 0x25b51
movsbl -0x51(%rbp), %eax
cmpl $0x30, %eax
jl 0x25a1d
movsbl -0x51(%rbp), %eax
cmpl $0x39, %eax
jg 0x25a1d
movq -0x18(%rbp), %rdi
leaq 0x11117f(%rip), %rsi    # 0x136b8c
movb $0x0, %al
callq 0x4c80
movq %rax, -0x8(%rbp)
jmp 0x25b51
movq -0x10(%rbp), %rdi
movq -0x18(%rbp), %rsi
xorl %edx, %edx
callq 0x23380
movq %rax, -0x60(%rbp)
movq -0x10(%rbp), %rdi
movq -0x60(%rbp), %rsi
callq 0x22660
testb $0x1, %al
jne 0x25a43
jmp 0x25a7c
movq -0x18(%rbp), %rax
movq %rax, -0x88(%rbp)
movq -0x10(%rbp), %rdi
movq -0x60(%rbp), %rsi
callq 0x22840
movq -0x88(%rbp), %rdi
movq %rax, %rdx
leaq 0x11114f(%rip), %rsi    # 0x136bbb
movb $0x0, %al
callq 0x4c80
movq %rax, -0x8(%rbp)
jmp 0x25b51
movq -0x10(%rbp), %rdi
movq -0x18(%rbp), %rsi
movq -0x20(%rbp), %rdx
xorl %eax, %eax
movl %eax, %ecx
callq 0x236f0
movq %rax, -0x68(%rbp)
cmpq $0x0, -0x68(%rbp)
je 0x25ac0
movq -0x68(%rbp), %rax
movq %rax, -0x70(%rbp)
leaq 0x18c885(%rip), %rax    # 0x1b2330
movq (%rax), %rdi
callq 0xc0720
movq -0x70(%rbp), %rax
movq %rax, -0x8(%rbp)
jmp 0x25b51
movq -0x10(%rbp), %rdi
movq -0x18(%rbp), %rsi
movq -0x20(%rbp), %rdx
callq 0x23fd0
movq %rax, -0x78(%rbp)
cmpq $0x0, -0x78(%rbp)
je 0x25afd
movq -0x78(%rbp), %rax
movq %rax, -0x80(%rbp)
leaq 0x18c845(%rip), %rax    # 0x1b2330
movq (%rax), %rdi
callq 0xc0720
movq -0x80(%rbp), %rax
movq %rax, -0x8(%rbp)
jmp 0x25b51
movq -0x18(%rbp), %rdi
leaq 0x10dd86(%rip), %rsi    # 0x13388e
callq 0x6700
testb $0x1, %al
jne 0x25b13
jmp 0x25b49
movq -0x18(%rbp), %rax
movq %rax, -0x90(%rbp)
movq -0x10(%rbp), %rdi
movq -0x60(%rbp), %rsi
callq 0x22840
movq -0x90(%rbp), %rdi
movq %rax, %rdx
leaq 0x1110aa(%rip), %rsi    # 0x136be6
movb $0x0, %al
callq 0x4c80
movq %rax, -0x8(%rbp)
jmp 0x25b51
movq $0x0, -0x8(%rbp)
movq -0x8(%rbp), %rax
addq $0x90, %rsp
popq %rbp
retq
nop