https://gcc.gnu.org/bugzilla/show_bug.cgi?id=115635

--- Comment #2 from Sam James <sjames at gcc dot gnu.org> ---
(In reply to David Malcolm from comment #1)
> "make selftest-valgrind" is clean for me.  Note that if you can reproducer
> this standalone, "make selftest-gdb" is a handy way to run the selftests
> under the debugger.

Thanks, this is helpful. I can reproduce it consistently when running gcc
manually once the PM has built it, but not yet managed to reproduce with a
manual build yet.

> 
> FWIW, the output suggests that the assertion at line 1153 is failing:
> 
>   1147  /* Verify that empty paths are handled gracefully.  */
>   1148  
>   1149  static void
>   1150  test_empty_path (pretty_printer *event_pp)
>   1151  {
>   1152    test_diagnostic_path path (event_pp);
> ->1153    ASSERT_FALSE (path.interprocedural_p ());
>   1154  
> 
> "path" is empty i.e. num_events ought to be returning 0.
> 
> Hence I'd expect diagnostic_path::interprocedural_p:
> 
>    184  bool
>    185  diagnostic_path::interprocedural_p () const
>    186  {
>    187    /* Ignore leading events that are outside of any function.  */
>    188    unsigned first_fn_event_idx;
>    189    if (!get_first_event_in_a_function (&first_fn_event_idx))
>    190      return false;
> 
> to call get_first_event_in_a_function, and for that to get 0 for "num", and
> thus bail out with num == 0 again, never entering the loop here:
> 

OK, I set a breakpoint for interprocedural_p, and I hit it immediately:
(gdb) n
189       if (!get_first_event_in_a_function (&first_fn_event_idx))
(gdb) p first_fn_event_idx
$8 = 0

First, we don't know num:
(gdb) s
diagnostic_path::get_first_event_in_a_function (this=this@entry=0x7fffffffd078,
out_idx=out_idx@entry=0x7fffffffd014)
    at
/var/tmp/portage/sys-devel/gcc-15.0.9999/work/gcc-15.0.9999/gcc/diagnostic-path.cc:167
167       const unsigned num = num_events ();
(gdb) p num
$9 = <optimized out>


Stepping a handful of times, we get to the for loop for the first time:
(gdb) s
diagnostic_path::get_first_event_in_a_function (this=this@entry=0x7fffffffd078,
out_idx=out_idx@entry=0x7fffffffd014)
    at
/var/tmp/portage/sys-devel/gcc-15.0.9999/work/gcc-15.0.9999/gcc/diagnostic-path.cc:168
168       for (unsigned i = 0; i < num; i++)
(gdb) p num
$11 = 0

(gdb) bt
#0  diagnostic_path::get_first_event_in_a_function
(this=this@entry=0x7fffffffd078, out_idx=out_idx@entry=0x7fffffffd014)
    at
/var/tmp/portage/sys-devel/gcc-15.0.9999/work/gcc-15.0.9999/gcc/diagnostic-path.cc:168
#1  0x0000555556ebc723 in diagnostic_path::interprocedural_p
(this=this@entry=0x7fffffffd078) at
/var/tmp/portage/sys-devel/gcc-15.0.9999/work/gcc-15.0.9999/gcc/diagnostic-path.cc:189
#2  0x0000555556ee1bf3 in selftest::test_empty_path
(event_pp=event_pp@entry=0x5555587648f0) at
/var/tmp/portage/sys-devel/gcc-15.0.9999/work/gcc-15.0.9999/gcc/diagnostic-path.cc:1153
#3  0x0000555556ee2804 in selftest::diagnostic_path_cc_tests () at
/var/tmp/portage/sys-devel/gcc-15.0.9999/work/gcc-15.0.9999/gcc/diagnostic-path.cc:2379
#4  0x0000555556e8584c in selftest::run_tests () at
/var/tmp/portage/sys-devel/gcc-15.0.9999/work/gcc-15.0.9999/gcc/selftest-run-tests.cc:105
#5  0x000055555675cb73 in toplev::run_self_tests (this=<optimized out>) at
/var/tmp/portage/sys-devel/gcc-15.0.9999/work/gcc-15.0.9999/gcc/toplev.cc:2223
#6  0x00005555577b0009 in toplev::main (this=this@entry=0x7fffffffd416,
argc=<optimized out>, argv=<optimized out>)
    at
/var/tmp/portage/sys-devel/gcc-15.0.9999/work/gcc-15.0.9999/gcc/toplev.cc:2327
#7  0x00005555577ae5ee in main (argc=<optimized out>, argv=<optimized out>) at
/var/tmp/portage/sys-devel/gcc-15.0.9999/work/gcc-15.0.9999/gcc/main.cc:39
(gdb)

(gdb) s
selftest::test_empty_path (event_pp=event_pp@entry=0x5555587648f0) at
/var/tmp/portage/sys-devel/gcc-15.0.9999/work/gcc-15.0.9999/gcc/selftest.h:38
38        location (const char *file, int line, const char *function)
(gdb) s
1153      ASSERT_FALSE (path.interprocedural_p ());
(gdb)

(gdb) p path
$13 = {<diagnostic_path> = {_vptr.diagnostic_path = 0x5555584b5cc0 <vtable for
selftest::test_diagnostic_path+16>},
  m_threads = {<auto_vec<selftest::test_diagnostic_thread*, 0>> =
{<vec<selftest::test_diagnostic_thread*, va_heap, vl_ptr>> = {
        m_vec = 0x555558840780}, <No data fields>}, <No data fields>},
  m_events = {<auto_vec<selftest::test_diagnostic_event*, 0>> =
{<vec<selftest::test_diagnostic_event*, va_heap, vl_ptr>> = {m_vec = 0x0}, <No
data fields>}, <No data fields>},
  m_event_pp = 0x5555587648f0}

Reply via email to