#include <stdlib.h>
#include <stdint.h>

/* Tests related to structs.  */

struct base {
  int16_t i;
};

struct sub {
  struct base b;
  int16_t j;
};

struct var_len {
  int16_t i;
  char arr[];
};


void test_1 (void)
{
  struct base *ptr = malloc (5 * sizeof (struct base));
  free (ptr);
}

void test_2 (void)
{
  int32_t *ptr = malloc (5 * sizeof (struct base));  /* { dg-line malloc2 } */
  free (ptr);

  /* { dg-warning "allocated buffer size is not a multiple of the pointee's size \\\[CWE-131\\\]" "warning" { target *-*-* } malloc2 } */
  /* { dg-message "\\d+ bytes" "note" { target *-*-* } malloc2 } */
  /* { dg-message "'int32_t \\*' (\\\{aka '(long )?int \\*'\\\})? here; 'sizeof \\(int32_t (\\\{aka (long )?int\\\})?\\)' is '4'" "note" { target *-*-* } malloc2 } */
}

void test_3 (void)
{
  /* Even though 10 bytes is not a multiple of 4, we do not warn to prevent
     a false positive in case s is the base struct of a struct inheritance.  */
  struct base *ptr = malloc (10);
  free (ptr);
}

void test_4 (void)
{
  struct var_len *ptr = malloc (10);
  free (ptr);
}

void test_5 (void)
{
  /* For constant sizes, we warn if the buffer
     is too small to hold a single struct.  */
  struct base *ptr = malloc (1);  /* { dg-line malloc5 } */
  free (ptr);

  /* { dg-warning "allocated buffer size is not a multiple of the pointee's size \\\[CWE-131\\\]" "warning" { target *-*-* } malloc5 } */
  /* { dg-message "1 bytes" "note" { target *-*-* } malloc5 } */
  /* { dg-message "'struct base \\*' here; 'sizeof \\(struct base\\)' is '\\d+'" "note" { target *-*-* } malloc5 } */
}
