/* { dg-do compile } */ /* { dg-options "-O2 -fconserve-stack -fdump-tree-optimized" } */ /* 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. Checking this via the scan tree also. */ 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); } /* This testcase should still split out one of the above basic blocks dealing with __write_overflow. */ /* { dg-final { scan-tree-dump-times "Function rfc4106_set_hash_subkey.part" 1 "optimized" } } */