diff options
author | Jakub Dupak <dev@jakubdupak.com> | 2023-10-19 11:04:29 +0200 |
---|---|---|
committer | CohenArthur <arthur.cohen@embecosm.com> | 2023-10-26 15:05:49 +0000 |
commit | 8aac66b06e352ed869b76098dd07273d813128fc (patch) | |
tree | 08c39722ccf38d2a27dc6f5f8644412512565b94 | |
parent | 85f924f470682b5c71b8bf501e6a143701303a93 (diff) | |
download | gcc-8aac66b06e352ed869b76098dd07273d813128fc.zip gcc-8aac66b06e352ed869b76098dd07273d813128fc.tar.gz gcc-8aac66b06e352ed869b76098dd07273d813128fc.tar.bz2 |
borrowck: Dump: handle infinite loops
gcc/rust/ChangeLog:
* checks/errors/borrowck/rust-bir-dump.cc (simplify_cfg): Detech infinite loops.
Signed-off-by: Jakub Dupak <dev@jakubdupak.com>
-rw-r--r-- | gcc/rust/checks/errors/borrowck/rust-bir-dump.cc | 17 |
1 files changed, 16 insertions, 1 deletions
diff --git a/gcc/rust/checks/errors/borrowck/rust-bir-dump.cc b/gcc/rust/checks/errors/borrowck/rust-bir-dump.cc index ba53098..66870dd 100644 --- a/gcc/rust/checks/errors/borrowck/rust-bir-dump.cc +++ b/gcc/rust/checks/errors/borrowck/rust-bir-dump.cc @@ -1,5 +1,6 @@ #include <numeric> #include "rust-bir-dump.h" +#include "rust-diagnostics.h" namespace Rust { namespace BIR { @@ -76,7 +77,21 @@ simplify_cfg (Function &func, std::vector<BasicBlockId> &bb_fold_map) const BasicBlock &bb = func.basic_blocks[bb_fold_map[i]]; if (bb.statements.empty () && bb.is_goto_terminated ()) { - bb_fold_map[i] = bb.successors.at (0); + auto dst = bb.successors.at (0); + if (bb_fold_map[dst] != dst) + { + rust_error_at ( + UNKNOWN_LOCATION, + "BIR DUMP: Cannot fold CFG, because it contains an " + "infinite loop with no executable statements."); + rust_inform (UNKNOWN_LOCATION, + "Continuing with an unfolded CFG."); + // Reverting the fold map to the original state. + std::iota (bb_fold_map.begin (), bb_fold_map.end (), 0); + stabilized = true; + break; + } + bb_fold_map[i] = dst; stabilized = false; } } |