The following code snippet is failing the "operation on 'xxx' may be undefined" warning in gcc 4.5.1, but it doesn't report an issue in under the 4.3 gcc. I'm probably too close to the code, but can't see where the undefined operation is occurring...

Code:
#define rb_parent(r)   ((struct rb_node *)((r)->rb_parent_color & ~3))
#define rb_color(r)   ((r)->rb_parent_color & 1)
#define rb_is_red(r)   (!rb_color(r))
#define rb_is_black(r) rb_color(r)
#define rb_set_red(r)  do { (r)->rb_parent_color &= ~1; } while (0)
#define rb_set_black(r)  do { (r)->rb_parent_color |= 1; } while (0)
#define PHYSICAL_ADDR( r )  ((struct rb_node *)((size_t)(r)+(size_t)((r)?p_base:0)))
#define RELATIVE_ADDR( r ) ((struct rb_node *)((size_t)(r)-(size_t)((r)?p_base:0)))

static void rb_insert_color(struct rb_node *p_node, struct rb_root *p_root)
{
    struct rb_node *p_phys_node =  PHYSICAL_ADDR(p_node);
    struct rb_node *p_parent, *p_phys_parent, *p_grandparent, *p_phys_grandparent;

    while ( ( p_phys_parent = ( PHYSICAL_ADDR( p_parent = rb_parent( p_phys_node ) ) ) ) && rb_is_red( p_phys_parent ) )
    {
    }
The exact error I get is:

rbtree.c:155:33: error: operation on p_parent may be undefined