The following code is giving a operation on p_parent may be undefined warning using 4.5.1 The warning did not occur on 4.3.4, and although it's probably me being macro-blind, I can't for the life of me see the conflict. Nothing that I can see in the while statement should be modifying p_parent? staffan@bypass:~/src/flop> gcc -v Using built-in specs. COLLECT_GCC=gcc COLLECT_LTO_WRAPPER=/usr/lib64/gcc/x86_64-suse-linux/4.5/lto-wrapper Target: x86_64-suse-linux Configured with: ../configure --prefix=/usr --infodir=/usr/share/info --mandir=/usr/share/man --libdir=/usr/lib64 --libexecdir=/usr/lib64 --enable-languages=c,c++,objc,fortran,obj-c++,java,ada --enable-checking=release --with-gxx-include-dir=/usr/include/c++/4.5 --enable-ssp --disable-libssp --disable-plugin --with-bugurl=http://bugs.opensuse.org/ --with-pkgversion='SUSE Linux' --disable-libgcj --disable-libmudflap --with-slibdir=/lib64 --with-system-zlib --enable-__cxa_atexit --enable-libstdcxx-allocator=new --disable-libstdcxx-pch --enable-version-specific-runtime-libs --program-suffix=-4.5 --enable-linux-futex --without-system-libunwind --enable-gold --with-plugin-ld=/usr/bin/gold --with-arch-32=i586 --with-tune=generic --build=x86_64-suse-linux Thread model: posix gcc version 4.5.1 20101208 [gcc-4_5-branch revision 167585] (SUSE Linux) #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 ) ) { }