http://gcc.gnu.org/bugzilla/show_bug.cgi?id=49519
--- Comment #7 from Yukhin Kirill <kirill.yukhin at intel dot com> 2011-06-30 15:22:58 UTC --- Expanding arguments in different ways occurs because corresponding GIMPLE statements are of different types. For 'good' case we have expression of type COMPONENT_REF While for 'bad' one it is just a MEM_REF For that different kinds we have slightly different expanding. The different expression types comes from front-end, at least in einline phase accesses are different: [include/boost/tuple/detail/tuple_basic.hpp : 130:14] D.167199_17 = MEM[(struct cons &)arg_list_2(D) + 12].head; [include/boost/tuple/detail/tuple_basic.hpp : 130:14] D.167198_18 = MEM[(struct cons &)arg_list_2(D) + 8].head; [include/boost/tuple/detail/tuple_basic.hpp : 130:14] D.167197_19 = MEM[(struct cons &)arg_list_2(D) + 4].head; [step-14.cc : 4271:1] D.167196_20 = MEM[(struct cons &)arg_list_2(D)]; [include/base/thread_management.h : 1534:13] D.167205_21 = (sizetype) fun_ptr$__delta_7; [include/base/thread_management.h : 1534:13] D.167204_22 = obj_1(D) + D.167205_21; [include/base/thread_management.h : 1534:13] iftmp.53_23 (D.167204_22, D.167196_20, D.167197_19, D.167198_18, D.167199_17); [include/base/thread_management.h : 1826:5] return; Having all that said I believe that the issue somewhat connected to fron-end generation. Jason, could you prompt me something? Your patch changes a line which has a comment: /* Do array-to-pointer, function-to-pointer conversion, and ignore top-level qualifiers as required. */ ...