diff --git a/gcc/sanopt.cc b/gcc/sanopt.cc index b356a21eca3..85489739507 100644 --- a/gcc/sanopt.cc +++ b/gcc/sanopt.cc @@ -1300,6 +1300,7 @@ pass_sanopt::execute (function *fun) basic_block bb; int asan_num_accesses = 0; bool contains_asan_mark = false; + int ret = 0; /* Try to remove redundant checks. */ if (optimize @@ -1352,6 +1353,7 @@ pass_sanopt::execute (function *fun) if (gimple_call_internal_p (stmt)) { enum internal_fn ifn = gimple_call_internal_fn (stmt); + int this_ret = TODO_cleanup_cfg; switch (ifn) { case IFN_UBSAN_NULL: @@ -1387,8 +1389,10 @@ pass_sanopt::execute (function *fun) no_next = hwasan_expand_mark_ifn (&gsi); break; default: + this_ret = 0; break; } + ret |= this_ret; } else if (gimple_call_builtin_p (stmt, BUILT_IN_NORMAL)) { @@ -1418,7 +1422,7 @@ pass_sanopt::execute (function *fun) if (need_commit_edge_insert) gsi_commit_edge_inserts (); - return 0; + return ret; } } // anon namespace diff --git a/gcc/testsuite/gcc.dg/asan/pr106190.c b/gcc/testsuite/gcc.dg/asan/pr106190.c new file mode 100644 index 00000000000..10eb2789a49 --- /dev/null +++ b/gcc/testsuite/gcc.dg/asan/pr106190.c @@ -0,0 +1,15 @@ +/* PR middle-end/106190 */ +/* { dg-do compile } */ +/* { dg-options "-fnon-call-exceptions -fsanitize=address,undefined -fno-sanitize-recover=all" } */ + +int +main () +{ + int a; + int *b[1]; + int c[10]; + int d[1][1]; + for (a = 0; a < 1; a++) + d[1][a] = 0; + return 0; +}