================================================================================
If statements
================================================================================

int main() {
  if (a)
    1;

  if (!a) {
    2;
  } else {
    3;
  }
}

--------------------------------------------------------------------------------

(translation_unit
  (function_definition
    (primitive_type)
    (function_declarator
      (identifier)
      (parameter_list))
    (compound_statement
      (if_statement
        (parenthesized_expression
          (identifier))
        (expression_statement
          (number_literal)))
      (if_statement
        (parenthesized_expression
          (unary_expression
            (identifier)))
        (compound_statement
          (expression_statement
            (number_literal)))
        (else_clause
          (compound_statement
            (expression_statement
              (number_literal))))))))

================================================================================
For loops
================================================================================

int main() {
  for (;;)
    1;

  for (int i = 0; i < 5; next(), i++) {
    2;
  }

  for (start(); check(); step())
    3;

  for (i = 0, j = 0, k = 0, l = 0; i < 1, j < 1; i++, j++, k++, l++)
    1;
}

--------------------------------------------------------------------------------

(translation_unit
  (function_definition
    (primitive_type)
    (function_declarator
      (identifier)
      (parameter_list))
    (compound_statement
      (for_statement
        (expression_statement
          (number_literal)))
      (for_statement
        (declaration
          (primitive_type)
          (init_declarator
            (identifier)
            (number_literal)))
        (binary_expression
          (identifier)
          (number_literal))
        (comma_expression
          (call_expression
            (identifier)
            (argument_list))
          (update_expression
            (identifier)))
        (compound_statement
          (expression_statement
            (number_literal))))
      (for_statement
        (call_expression
          (identifier)
          (argument_list))
        (call_expression
          (identifier)
          (argument_list))
        (call_expression
          (identifier)
          (argument_list))
        (expression_statement
          (number_literal)))
      (for_statement
        (comma_expression
          (assignment_expression
            (identifier)
            (number_literal))
          (comma_expression
            (assignment_expression
              (identifier)
              (number_literal))
            (comma_expression
              (assignment_expression
                (identifier)
                (number_literal))
              (assignment_expression
                (identifier)
                (number_literal)))))
        (comma_expression
          (binary_expression
            (identifier)
            (number_literal))
          (binary_expression
            (identifier)
            (number_literal)))
        (comma_expression
          (update_expression
            (identifier))
          (comma_expression
            (update_expression
              (identifier))
            (comma_expression
              (update_expression
                (identifier))
              (update_expression
                (identifier)))))
        (expression_statement
          (number_literal))))))

================================================================================
While loops
================================================================================

int main() {
  while (x)
    printf("hi");
}

--------------------------------------------------------------------------------

(translation_unit
  (function_definition
    (primitive_type)
    (function_declarator
      (identifier)
      (parameter_list))
    (compound_statement
      (while_statement
        (parenthesized_expression
          (identifier))
        (expression_statement
          (call_expression
            (identifier)
            (argument_list
              (string_literal
                (string_content)))))))))

================================================================================
Labeled statements
================================================================================

void foo(T *t) {
recur:
  t = t->next();
  if (t) goto recur;
}

--------------------------------------------------------------------------------

(translation_unit
  (function_definition
    (primitive_type)
    (function_declarator
      (identifier)
      (parameter_list
        (parameter_declaration
          (type_identifier)
          (pointer_declarator
            (identifier)))))
    (compound_statement
      (labeled_statement
        (statement_identifier)
        (expression_statement
          (assignment_expression
            (identifier)
            (call_expression
              (field_expression
                (identifier)
                (field_identifier))
              (argument_list)))))
      (if_statement
        (parenthesized_expression
          (identifier))
        (goto_statement
          (statement_identifier))))))

================================================================================
Switch statements
================================================================================

void foo(int a) {
  switch (a) {
    puts("entered switch!");

    case 3:
    case 5:
      if (b) {
        c();
      }
      break;

    default:
      c();
      break;
  }
}

--------------------------------------------------------------------------------

(translation_unit
  (function_definition
    (primitive_type)
    (function_declarator
      (identifier)
      (parameter_list
        (parameter_declaration
          (primitive_type)
          (identifier))))
    (compound_statement
      (switch_statement
        (parenthesized_expression
          (identifier))
        (compound_statement
          (expression_statement
            (call_expression
              (identifier)
              (argument_list
                (string_literal
                  (string_content)))))
          (case_statement
            (number_literal))
          (case_statement
            (number_literal)
            (if_statement
              (parenthesized_expression
                (identifier))
              (compound_statement
                (expression_statement
                  (call_expression
                    (identifier)
                    (argument_list)))))
            (break_statement))
          (case_statement
            (expression_statement
              (call_expression
                (identifier)
                (argument_list)))
            (break_statement)))))))

================================================================================
Case statements separate from switch statements
================================================================================

int main() {
  switch (count % 8) {
  case 0:
    do {
      *to = *from++;
      case 2: *to = *from++;
      case 1: *to = *from++;
    } while (--n > 0);
  }
}

--------------------------------------------------------------------------------

(translation_unit
  (function_definition
    (primitive_type)
    (function_declarator
      (identifier)
      (parameter_list))
    (compound_statement
      (switch_statement
        (parenthesized_expression
          (binary_expression
            (identifier)
            (number_literal)))
        (compound_statement
          (case_statement
            (number_literal)
            (do_statement
              (compound_statement
                (expression_statement
                  (assignment_expression
                    (pointer_expression
                      (identifier))
                    (pointer_expression
                      (update_expression
                        (identifier)))))
                (case_statement
                  (number_literal)
                  (expression_statement
                    (assignment_expression
                      (pointer_expression
                        (identifier))
                      (pointer_expression
                        (update_expression
                          (identifier))))))
                (case_statement
                  (number_literal)
                  (expression_statement
                    (assignment_expression
                      (pointer_expression
                        (identifier))
                      (pointer_expression
                        (update_expression
                          (identifier)))))))
              (parenthesized_expression
                (binary_expression
                  (update_expression
                    (identifier))
                  (number_literal))))))))))

================================================================================
Return statements
================================================================================

void foo() {
  return;
  return a;
  return a, b;
}

--------------------------------------------------------------------------------

(translation_unit
  (function_definition
    (primitive_type)
    (function_declarator
      (identifier)
      (parameter_list))
    (compound_statement
      (return_statement)
      (return_statement
        (identifier))
      (return_statement
        (comma_expression
          (identifier)
          (identifier))))))

================================================================================
Comments with asterisks
================================================================================

/*************************
 * odd number of asterisks
 *************************/
int a;

/**************************
 * even number of asterisks
 **************************/
int b;

--------------------------------------------------------------------------------

(translation_unit
  (comment)
  (declaration
    (primitive_type)
    (identifier))
  (comment)
  (declaration
    (primitive_type)
    (identifier)))

================================================================================
Comment with multiple backslashes
================================================================================

int a = 3; // Hello \\
World

--------------------------------------------------------------------------------

(translation_unit
  (declaration
    (primitive_type)
    (init_declarator
      (identifier)
      (number_literal)))
  (comment))

================================================================================
Attributes
================================================================================

void f() {
  [[a]] switch (b) {
   [[c]] case 1: {}
   case 2:
     [[fallthrough]];
   default:
  }
  [[a]] while (true) {}
  [[a]] if (true) {}
  [[a]] for (;;) {}
  [[a]] return;
  [[a]] a;
  [[a]];
  [[a]] label: {}
  [[a]] goto label;

  // these are c++ specific, but their bind locations should be c-compatible
  if (true) [[likely]] {} else [[unlikely]] {}
  do [[likely]] {} while (true);
}

--------------------------------------------------------------------------------

(translation_unit
  (function_definition
    (primitive_type)
    (function_declarator
      (identifier)
      (parameter_list))
    (compound_statement
      (attributed_statement
        (attribute_declaration
          (attribute
            (identifier)))
        (switch_statement
          (parenthesized_expression
            (identifier))
          (compound_statement
            (attributed_statement
              (attribute_declaration
                (attribute
                  (identifier)))
              (case_statement
                (number_literal)
                (compound_statement)))
            (case_statement
              (number_literal)
              (attributed_statement
                (attribute_declaration
                  (attribute
                    (identifier)))
                (expression_statement)))
            (case_statement))))
      (attributed_statement
        (attribute_declaration
          (attribute
            (identifier)))
        (while_statement
          (parenthesized_expression
            (true))
          (compound_statement)))
      (attributed_statement
        (attribute_declaration
          (attribute
            (identifier)))
        (if_statement
          (parenthesized_expression
            (true))
          (compound_statement)))
      (attributed_statement
        (attribute_declaration
          (attribute
            (identifier)))
        (for_statement
          (compound_statement)))
      (attributed_statement
        (attribute_declaration
          (attribute
            (identifier)))
        (return_statement))
      (attributed_statement
        (attribute_declaration
          (attribute
            (identifier)))
        (expression_statement
          (identifier)))
      (attributed_statement
        (attribute_declaration
          (attribute
            (identifier)))
        (expression_statement))
      (attributed_statement
        (attribute_declaration
          (attribute
            (identifier)))
        (labeled_statement
          (statement_identifier)
          (compound_statement)))
      (attributed_statement
        (attribute_declaration
          (attribute
            (identifier)))
        (goto_statement
          (statement_identifier)))
      (comment)
      (if_statement
        (parenthesized_expression
          (true))
        (attributed_statement
          (attribute_declaration
            (attribute
              (identifier)))
          (compound_statement))
        (else_clause
          (attributed_statement
            (attribute_declaration
              (attribute
                (identifier)))
            (compound_statement))))
      (do_statement
        (attributed_statement
          (attribute_declaration
            (attribute
              (identifier)))
          (compound_statement))
        (parenthesized_expression
          (true))))))
