(command.CommandList
  children: [
    (command.ShAssignment
      pairs: [
        (assign_pair
          lhs: (sh_lhs_expr.Name name:n_args)
          op: assign_op.Equal
          rhs: {(10000)}
          spids: [59]
        )
      ]
    )
    (command.Simple
      words: [{(cat)}]
      redirects: [
        (redir.HereDoc
          op: (Token id:Id.Redir_DLess val:'<<' span_id:65)
          fd: -1
          here_begin: {(SQ (Token id:Id.Lit_Chars val:EOF span_id:67))}
          here_end_span_id: 82
          stdin_parts: [
            ('#include <stdio.h>\n')
            ('#include <mcheck.h>\n')
            ('\n')
            ('/*\n')
            ('  Compile do_test without optimization: GCC 4.9/5.0/6.0 takes a long time\n')
            ('  to build this source. https://gcc.gnu.org/bugzilla/show_bug.cgi?id=67396  */\n')
            ('\n')
            ('__attribute__ ((optimize ("-O0")))\n')
            ('int do_test (void)\n')
            ('{\n')
            ('    mtrace ();\n')
            ('    printf (\n')
          ]
        )
      ]
    )
    (command.ForExpr
      init: 
        (arith_expr.BinaryAssign
          op_id: Id.Arith_Equal
          left: (sh_lhs_expr.Name name:j)
          right: (arith_expr.ArithWord w:{(Id.Lit_Digits 0)})
        )
      cond: 
        (arith_expr.Binary
          op_id: Id.Arith_Less
          left: (arith_expr.VarRef token:(Token id:Id.Lit_ArithVarLike val:j span_id:94))
          right: 
            (arith_expr.Binary
              op_id: Id.Arith_Slash
              left: (arith_expr.ArithWord w:{($ Id.VSub_DollarName '$n_args')})
              right: (arith_expr.ArithWord w:{(Id.Lit_Digits 10)})
            )
        )
      update: (arith_expr.UnaryAssign op_id:Id.Node_PostDPlus child:(sh_lhs_expr.Name name:j))
      body: 
        (command.DoGroup
          children: [
            (command.ForExpr
              init: 
                (arith_expr.BinaryAssign
                  op_id: Id.Arith_Equal
                  left: (sh_lhs_expr.Name name:k)
                  right: (arith_expr.ArithWord w:{(Id.Lit_Digits 0)})
                )
              cond: 
                (arith_expr.Binary
                  op_id: Id.Arith_Less
                  left: (arith_expr.VarRef token:(Token id:Id.Lit_ArithVarLike val:k span_id:124))
                  right: (arith_expr.ArithWord w:{(Id.Lit_Digits 10)})
                )
              update: (arith_expr.UnaryAssign op_id:Id.Node_PostDPlus child:(sh_lhs_expr.Name name:k))
              body: 
                (command.DoGroup
                  children: [
                    (C {(printf)} {(SQ (Token id:Id.Lit_Chars val:'"%%%d$s" ' span_id:143))} 
                      {
                        (word_part.ArithSub
                          anode: 
                            (arith_expr.Binary
                              op_id: Id.Arith_Plus
                              left: 
                                (arith_expr.Binary
                                  op_id: Id.Arith_Plus
                                  left: 
                                    (arith_expr.Binary
                                      op_id: Id.Arith_Star
                                      left: (arith_expr.ArithWord w:{(Id.Lit_Digits 10)})
                                      right: (arith_expr.ArithWord w:{($ Id.VSub_DollarName '$j')})
                                    )
                                  right: (arith_expr.ArithWord w:{($ Id.VSub_DollarName '$k')})
                                )
                              right: (arith_expr.ArithWord w:{(Id.Lit_Digits 1)})
                            )
                        )
                      }
                    )
                  ]
                )
            )
            (C {(printf)} {(DQ (Id.Lit_Other '\\') (n))})
          ]
        )
    )
    (C {(printf)} {(SQ (Token id:Id.Lit_Chars val:'"%%%d$s",\\n' span_id:180))} 
      {
        (word_part.ArithSub
          anode: 
            (arith_expr.Binary
              op_id: Id.Arith_Plus
              left: (arith_expr.ArithWord w:{($ Id.VSub_DollarName '$n_args')})
              right: (arith_expr.ArithWord w:{(Id.Lit_Digits 1)})
            )
        )
      }
    )
    (command.ForExpr
      init: 
        (arith_expr.BinaryAssign
          op_id: Id.Arith_Equal
          left: (sh_lhs_expr.Name name:j)
          right: (arith_expr.ArithWord w:{(Id.Lit_Digits 0)})
        )
      cond: 
        (arith_expr.Binary
          op_id: Id.Arith_Less
          left: (arith_expr.VarRef token:(Token id:Id.Lit_ArithVarLike val:j span_id:203))
          right: 
            (arith_expr.Binary
              op_id: Id.Arith_Slash
              left: (arith_expr.ArithWord w:{($ Id.VSub_DollarName '$n_args')})
              right: (arith_expr.ArithWord w:{(Id.Lit_Digits 10)})
            )
        )
      update: (arith_expr.UnaryAssign op_id:Id.Node_PostDPlus child:(sh_lhs_expr.Name name:j))
      body: 
        (command.DoGroup
          children: [
            (command.ForExpr
              init: 
                (arith_expr.BinaryAssign
                  op_id: Id.Arith_Equal
                  left: (sh_lhs_expr.Name name:k)
                  right: (arith_expr.ArithWord w:{(Id.Lit_Digits 0)})
                )
              cond: 
                (arith_expr.Binary
                  op_id: Id.Arith_Less
                  left: (arith_expr.VarRef token:(Token id:Id.Lit_ArithVarLike val:k span_id:233))
                  right: (arith_expr.ArithWord w:{(Id.Lit_Digits 10)})
                )
              update: (arith_expr.UnaryAssign op_id:Id.Node_PostDPlus child:(sh_lhs_expr.Name name:k))
              body: 
                (command.DoGroup
                  children: [(C {(printf)} {(SQ (Token id:Id.Lit_Chars val:'"a", ' span_id:252))})]
                )
            )
            (C {(printf)} {(DQ ('  /* %4d */') (Id.Lit_Other '\\') (n))} 
              {
                (word_part.ArithSub
                  anode: 
                    (arith_expr.Binary
                      op_id: Id.Arith_Plus
                      left: 
                        (arith_expr.Binary
                          op_id: Id.Arith_Star
                          left: (arith_expr.ArithWord w:{(Id.Lit_Digits 10)})
                          right: (arith_expr.ArithWord w:{($ Id.VSub_DollarName '$j')})
                        )
                      right: (arith_expr.ArithWord w:{($ Id.VSub_DollarName '$k')})
                    )
                )
              }
            )
          ]
        )
    )
    (C {(printf)} {(SQ (Token id:Id.Lit_Chars val:'"\\\\n");' span_id:286))})
    (command.Simple
      words: [{(cat)}]
      redirects: [
        (redir.HereDoc
          op: (Token id:Id.Redir_DLess val:'<<' span_id:293)
          fd: -1
          here_begin: {(SQ (Token id:Id.Lit_Chars val:EOF span_id:295))}
          here_end_span_id: 305
          stdin_parts: [
            ('\n')
            ('  return 0;\n')
            ('}\n')
            ('\n')
            ('#define TEST_FUNCTION do_test ()\n')
            ('#include "../test-skeleton.c"\n')
            ('\n')
          ]
        )
      ]
    )
  ]
)