Hi! cp_maybe_instrument_return is looking for a return stmt at the end of function to decide whether to omit -fsanitize=return instrumentation or __builtin_unreachable addition. If a STATEMENT_LIST has a return followed by DEBUG_BEGIN_STMT (or multiple of them), it doesn't find the return though.
Fixed thusly, bootstrapped/regtested on x86_64-linux and i686-linux, ok for trunk? 2018-07-10 Jakub Jelinek <ja...@redhat.com> PR sanitizer/86406 * cp-gimplify.c (cp_maybe_instrument_return): Skip trailing DEBUG_BEGIN_STMTs. * g++.dg/ubsan/pr86406.C: New test. --- gcc/cp/cp-gimplify.c.jj 2018-07-05 11:41:51.687718588 +0200 +++ gcc/cp/cp-gimplify.c 2018-07-09 09:57:16.368775004 +0200 @@ -1621,6 +1621,13 @@ cp_maybe_instrument_return (tree fndecl) case STATEMENT_LIST: { tree_stmt_iterator i = tsi_last (t); + while (!tsi_end_p (i)) + { + tree p = tsi_stmt (i); + if (TREE_CODE (p) != DEBUG_BEGIN_STMT) + break; + tsi_prev (&i); + } if (!tsi_end_p (i)) { t = tsi_stmt (i); --- gcc/testsuite/g++.dg/ubsan/pr86406.C.jj 2018-07-09 09:58:57.362878125 +0200 +++ gcc/testsuite/g++.dg/ubsan/pr86406.C 2018-07-09 09:58:37.716858063 +0200 @@ -0,0 +1,33 @@ +// PR sanitizer/86406 +// { dg-do compile } +// { dg-options "-fcompare-debug -fsanitize=undefined -g -O1" } + +typedef enum { } cmd_status; +class ECell; +class ECell_const_ptr { }; +class ECell_ptr +{ + ECell *mp_element; + ECell *getPointer () const { return mp_element; } +public: + operator ECell_const_ptr () const { return ECell_const_ptr(); } +}; + +extern ECell_ptr NULL_CELL; +class VwUI_2DCellLayerView; +class view_cell_layoutImpl +{ + cmd_status handleChangeFlags (VwUI_2DCellLayerView * + p_ui_celllayerview, + ECell_const_ptr p_peekCell); + cmd_status openCellLayoutView (); +}; + +cmd_status +view_cell_layoutImpl::openCellLayoutView () +{ + ECell_const_ptr pcell = NULL_CELL; + VwUI_2DCellLayerView *p_user_interface; + return handleChangeFlags (p_user_interface, pcell); + ; +} Jakub