// File: /workspace/github_c_makefile_star2_O2/hikalium[P]compilium/parser.c
// Function: ParseDirectDecltor
struct Node *ParseDirectDecltor() {
  // always allow abstract decltors
  struct Node *n = NULL;
  struct Node *t;
  if ((t = ConsumePunctuator("("))) {
    n = AllocNode(kASTDirectDecltor);
    n->op = t;
    n->value = ParseDecltor();
    assert(n->value);
    ExpectPunctuator(")");
  } else if ((t = ConsumeToken(kTokenIdent))) {
    n = AllocNode(kASTDirectDecltor);
    n->op = t;
  }
  while (true) {
    if ((t = ConsumePunctuator("("))) {
      struct Node *op = t;
      struct Node *args = AllocList();
      if (!ConsumePunctuator(")")) {
        while (1) {
          if ((t = ConsumePunctuator("..."))) {
            PushToList(args, t);
          } else {
            struct Node *arg = ParseParamDecl();
            if (!arg) {
              ErrorWithToken(NextToken(), "Expected ParamDecl here");
            }
            PushToList(args, arg);
          }
          if (!ConsumePunctuator(",")) break;
        }
        ExpectPunctuator(")");
      }
      struct Node *nn = AllocNode(kASTDirectDecltor);
      nn->op = op;
      nn->right = args;
      nn->left = n;
      n = nn;
    }
    if ((t = ConsumePunctuator("["))) {
      struct Node *nn = AllocNode(kASTDirectDecltor);
      nn->op = t;
      nn->right = ParseAssignExpr();
      nn->left = n;
      n = nn;
      ExpectPunctuator("]");
      continue;
    }
    break;
  }
  return n;
}

// Assembly:
pushq %rbp
pushq %r15
pushq %r14
pushq %r13
pushq %r12
pushq %rbx
pushq %rax
leaq 0x44e7(%rip), %rdi      # 0xb5c4
callq 0x8ad7
testq %rax, %rax
je 0x711c
movq %rax, %r14
pushq $0xb
popq %rdi
callq 0x319d
movq %rax, %rbx
movq %r14, 0x10(%rax)
callq 0x7257
movq %rax, 0xa0(%rbx)
testq %rax, %rax
je 0x723f
leaq 0x5760(%rip), %rdi      # 0xc875
callq 0x8b1b
jmp 0x713f
pushq $0x4
popq %rdi
callq 0x8a20
testq %rax, %rax
je 0x713d
movq %rax, %r14
pushq $0xb
popq %rdi
callq 0x319d
movq %rax, %rbx
movq %r14, 0x10(%rax)
jmp 0x713f
xorl %ebx, %ebx
pushq $0xb
popq %rbp
leaq 0x4558(%rip), %r13      # 0xb6a1
leaq 0x40ca(%rip), %r12      # 0xb21a
leaq 0x446d(%rip), %rdi      # 0xb5c4
callq 0x8ad7
testq %rax, %rax
je 0x71d4
movq %rax, %r14
xorl %eax, %eax
callq 0x3ea7
movq %rax, %r15
leaq 0x5700(%rip), %rdi      # 0xc875
callq 0x8ad7
testq %rax, %rax
jne 0x71be
movq %r13, %rdi
callq 0x8ad7
testq %rax, %rax
jne 0x719a
callq 0x7304
testq %rax, %rax
je 0x7229
movq %r15, %rdi
movq %rax, %rsi
callq 0x3f25
movq %r12, %rdi
callq 0x8ad7
testq %rax, %rax
jne 0x717f
leaq 0x56bc(%rip), %rdi      # 0xc875
callq 0x8b1b
movl %ebp, %edi
callq 0x319d
movq %r14, 0x10(%rax)
movq %r15, 0x20(%rax)
movq %rbx, 0x18(%rax)
movq %rax, %rbx
leaq 0x43be(%rip), %rdi      # 0xb599
callq 0x8ad7
testq %rax, %rax
je 0x7217
movq %rax, %r14
movl %ebp, %edi
callq 0x319d
movq %rax, %r15
movq %r14, 0x10(%rax)
callq 0x6b57
movq %rax, 0x20(%r15)
movq %rbx, 0x18(%r15)
leaq 0x4faf(%rip), %rdi      # 0xc1b9
callq 0x8b1b
movq %r15, %rbx
jmp 0x7150
movq %rbx, %rax
addq $0x8, %rsp
popq %rbx
popq %r12
popq %r13
popq %r14
popq %r15
popq %rbp
retq
callq 0x8b6e
leaq 0x507d(%rip), %rsi      # 0xc2b2
movq %rax, %rdi
xorl %eax, %eax
callq 0x3de9
leaq 0x5063(%rip), %rdi      # 0xc2a9
leaq 0x4fb9(%rip), %rsi      # 0xc206
movl $0x1a2, %edx            # imm = 0x1A2
callq 0x3cc4