Как проверить равенство итератора?
В моем llvm
Код, я пытаюсь проверить, если итератор InsertPos указывает на последнюю инструкцию базового блока, с помощью следующего кода.
BasicBlock::iterator InsertPos = BB->begin();
LLVMContext &Context = BB->getContext();
while ( !( isa<CallInst>(InsertPos) ||
( InsertPos == BB->getTerminator() ) ) ) // <-- Error here
++InsertPos;
Тем не мение, clang
дает мне следующую ошибку.
Basic2.cpp:82:54: error: use of overloaded operator '==' is ambiguous (with operand types 'BasicBlock::iterator' (aka 'ilist_iterator<llvm::Instruction>')
and 'llvm::TerminatorInst *')
while ( !( isa<CallInst>(InsertPos) || ( InsertPos == BB->getTerminator() ) ) )
~~~~~~~~~ ^ ~~~~~~~~~~~~~~~~~~~
/home/hmushtaq/llvm/include/llvm/ADT/ilist.h:204:8: note: candidate function
bool operator==(const ilist_iterator &RHS) const {
^
Basic2.cpp:82:54: note: built-in candidate operator==(class llvm::Instruction *, class llvm::Instruction *)
while ( !( isa<CallInst>(InsertPos) || ( InsertPos == BB->getTerminator() ) ) )
^
Basic2.cpp:82:54: note: built-in candidate operator==(restrict class llvm::Instruction *, restrict class llvm::Instruction *)
Basic2.cpp:82:54: note: built-in candidate operator==(const restrict class llvm::Instruction *, const restrict class llvm::Instruction *)
Basic2.cpp:82:54: note: built-in candidate operator==(volatile class llvm::Instruction *, volatile class llvm::Instruction *)
Basic2.cpp:82:54: note: built-in candidate operator==(const volatile class llvm::Instruction *, const volatile class llvm::Instruction *)
Basic2.cpp:82:54: note: built-in candidate operator==(volatile restrict class llvm::Instruction *, volatile restrict class llvm::Instruction *)
Basic2.cpp:82:54: note: built-in candidate operator==(const class llvm::Instruction *, const class llvm::Instruction *)
Basic2.cpp:82:54: note: built-in candidate operator==(const volatile restrict class llvm::Instruction *, const volatile restrict class llvm::Instruction *)
Как правильно это сделать?
2 ответа
BB->getTerminator()
возвращает указатель (TerminatorInst *
), в то время как InsertPos
это итератор (BasicBlock::iterator
). Типы не совпадают.
Может быть, вы могли бы попробовать
&*InsertPos == BB->getTerminator()
Вы также можете проверить, является ли Инструкция терминатором с помощью isTerminator()
метод.
InsertPos->isTerminator()
Я решил это так.
BasicBlock::iterator InsertPos = BB->begin();
BasicBlock::iterator TermPos = BB->getTerminator(); // <-- Added this variable
while ( !( isa<CallInst>(InsertPos) || ( InsertPos == TermPos ) ) )
++InsertPos;