blob: d8fd8361ead3bb1cc7dbb915981a34b25d249560 [file] [log] [blame]
/* { 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"} } */