======
sizeof
======

int Test() {
    return sizeof(a);
}

---

(source_file
  (function_definition
    returnType: (type
      (builtin_type)
    )
    name: (identifier)
    parameters: (parameter_declarations)
    body: (block
      (return_statement
        expression: (sizeof_expression
          type: (identifier)
        )
      )
    )
  )
)


===============================
sizeof - multidimensional array
===============================

int Test() {
    sizeof(this.foo);
    sizeof(a[][][]);
    sizeof(a[10][][]);
    sizeof(a[].b);
    sizeof(a[][][].b);
    return sizeof(a[]);
}

---

(source_file
  (function_definition
    returnType: (type
      (builtin_type)
    )
    name: (identifier)
    parameters: (parameter_declarations)
    body: (block
      (expression_statement
        (sizeof_expression
          type: (field_access
            target: (this)
            field: (identifier)
          )
        )
      )
      (expression_statement
        (sizeof_expression
          type: (identifier)
          type: (dimension)
          type: (dimension)
          type: (dimension)
        )
      )
      (expression_statement
        (sizeof_expression
          type: (array_indexed_access
            array: (identifier)
            index: (int_literal)
          )
          type: (dimension)
          type: (dimension)
        )
      )
      (expression_statement
        (sizeof_expression
          type: (array_scope_access
            scope: (identifier)
            (dimension)
            field: (identifier)
          )
        )
      )
      (expression_statement
        (sizeof_expression
          type: (array_scope_access
            scope: (identifier)
            (dimension)
            (dimension)
            (dimension)
            field: (identifier)
          )
        )
      )
      (return_statement
        expression: (sizeof_expression
          type: (identifier)
          type: (dimension)
        )
      )
    )
  )
)


==========================
sizeof without parentheses
==========================

int Test() {
    return sizeof a;
}

---

(source_file
  (function_definition
    returnType: (type
      (builtin_type)
    )
    name: (identifier)
    parameters: (parameter_declarations)
    body: (block
      (return_statement
        expression: (sizeof_expression
          type: (identifier)
        )
      )
    )
  )
)
