aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorJakub Dupak <dev@jakubdupak.com>2023-10-19 11:04:29 +0200
committerCohenArthur <arthur.cohen@embecosm.com>2023-10-26 15:05:49 +0000
commit8aac66b06e352ed869b76098dd07273d813128fc (patch)
tree08c39722ccf38d2a27dc6f5f8644412512565b94 /gcc
parent85f924f470682b5c71b8bf501e6a143701303a93 (diff)
downloadgcc-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>
Diffstat (limited to 'gcc')
-rw-r--r--gcc/rust/checks/errors/borrowck/rust-bir-dump.cc17
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;
}
}