The attached patch restores the "invalid access to non-static data member" error for invalid offsetof-like expressions involving members of virtually derived base classes that was inadvertently made ineffective as a result of the merge of the C++ delayed folding branch.
Martin
gcc/testsuite/ChangeLog: 2015-12-05 Martin Sebor <mse...@redhat.com> PR c++/68711 * g++.dg/other/offsetof8.C: New test. gcc/cp/ChangeLog: 2015-12-05 Martin Sebor <mse...@redhat.com> PR c++/68711 * typeck.c (build_class_member_access_expr): Strip NOPs before testing a potentially null operand for equality to zero. Index: gcc/cp/typeck.c =================================================================== --- gcc/cp/typeck.c (revision 231314) +++ gcc/cp/typeck.c (working copy) @@ -2358,8 +2358,14 @@ int type_quals; tree member_type; - null_object_p = (INDIRECT_REF_P (object) - && integer_zerop (TREE_OPERAND (object, 0))); + if (INDIRECT_REF_P (object)) + { + tree oper = TREE_OPERAND (object, 0); + STRIP_NOPS (oper); + null_object_p = integer_zerop (oper); + } + else + null_object_p = false; /* Convert OBJECT to the type of MEMBER. */ if (!same_type_p (TYPE_MAIN_VARIANT (object_type), Index: gcc/testsuite/g++.dg/other/offsetof8.C =================================================================== --- gcc/testsuite/g++.dg/other/offsetof8.C (revision 0) +++ gcc/testsuite/g++.dg/other/offsetof8.C (working copy) @@ -0,0 +1,12 @@ +// PR c++/68711 - [5 regression] SEGV on an invalid offsetof of a member +// of a virtual base +// { dg-do compile } + +struct A { int i; }; + +struct B: virtual A { }; + +int a[] = { + !&((B*)0)->i, // { dg-error "invalid access to non-static data member" } + __builtin_offsetof (B, i) // { dg-error "invalid access to non-static" } +};