/* { dg-do compile } */ /* { dg-options "-O2 -fdump-tree-isolate-paths -fdelete-null-pointer-checks -Wnull-dereference" } */ /* { dg-skip-if "" keeps_null_pointer_checks } */ typedef __SIZE_TYPE__ size_t; extern void *memset (void *__s, int __c, size_t __n) __attribute__ ((__nothrow__, __leaf__)) __attribute__ ((__nonnull__ (1))); struct rtx_def; typedef struct rtx_def *rtx; typedef struct VEC_rtx_base { unsigned num; unsigned alloc; rtx vec[1]; } VEC_rtx_base; static __inline__ rtx * VEC_rtx_base_address (VEC_rtx_base * vec_) { return vec_ ? vec_->vec : 0; } typedef struct VEC_rtx_gc { VEC_rtx_base base; } VEC_rtx_gc; static __inline__ void VEC_rtx_gc_safe_grow (VEC_rtx_gc ** vec_, int size_, const char *file_, unsigned line_, const char *function_) { ((*vec_) ? &(*vec_)->base : 0)->num = size_; /* { dg-warning "null pointer dereference" } */ } static __inline__ void VEC_rtx_gc_safe_grow_cleared (VEC_rtx_gc ** vec_, int size_, const char *file_, unsigned line_, const char *function_, int oldsize) { VEC_rtx_gc_safe_grow (vec_, size_, file_, line_, function_); memset (&(VEC_rtx_base_address ((*vec_) ? &(*vec_)->base : 0))[oldsize], 0, sizeof (rtx) * (size_ - oldsize)); } static VEC_rtx_gc *reg_base_value; unsigned int max_reg_num (void); int arf (void); void init_alias_analysis (void) { unsigned int maxreg = max_reg_num (); (VEC_rtx_gc_safe_grow_cleared (&(reg_base_value), maxreg, "../../../gcc-4.6.0/gcc/alias.c", 2755, __FUNCTION__, arf ())); } /* This is an example of how a NULL pointer dereference can show up without a PHI. Note VEC_rtx_gcc_safe_grow. If an earlier pass (such as VRP) isolates the NULL path for some reason or another we end up with an explicit NULL dereference in the IL. Yes, it started with a PHI, but by the time the path isolation code runs its explicit in the IL. */ /* { dg-final { scan-tree-dump-times "__builtin_trap" 1 "isolate-paths"} } */