/* { dg-additional-options "-fconserve-stack" } */

/* Check to make sure that if
   rfc4106_set_hash_subkey gets split,
   the error function does not gets split away
   from the if statement conditionalizing it. */

struct crypto_aes_ctx {
  char key_dec[128];
};

int rfc4106_set_hash_subkey_hash_subkey;

void __write_overflow(void)__attribute__((__error__("")));
void __write_overflow1(void);
void aes_encrypt(void*);

void fortify_panic(const char*) __attribute__((__noreturn__)) ;

char *rfc4106_set_hash_subkey(struct crypto_aes_ctx *ctx) {
  void *a = &ctx->key_dec[0];
  unsigned p_size =  __builtin_object_size(a, 0);
#ifdef __OPTIMIZE__
  if (p_size < 16) {
    __write_overflow1();
    fortify_panic(__func__);
  }
  if (p_size < 32) {
    __write_overflow();
    fortify_panic(__func__);
  }
#endif
  aes_encrypt(ctx);
  return ctx->key_dec;
}

char *(*gg)(struct crypto_aes_ctx *) = rfc4106_set_hash_subkey;

void a(void)
{
  struct crypto_aes_ctx ctx;
  rfc4106_set_hash_subkey(&ctx);
}
void b(void)
{
  struct crypto_aes_ctx ctx;
  ctx.key_dec[0] = 0;
  rfc4106_set_hash_subkey(&ctx);
}

