Как проверить равенство итератора? - PullRequest
2 голосов
/ 24 февраля 2012

В моем коде 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 ]

3 голосов
/ 24 февраля 2012

BB->getTerminator() возвращает указатель (TerminatorInst *), а InsertPos - итератор (BasicBlock::iterator). Типы не совпадают.

Может быть, вы могли бы попробовать

&*InsertPos == BB->getTerminator()

Вы также можете проверить, является ли Инструкция инструкцией с помощью метода isTerminator() .

InsertPos->isTerminator()
1 голос
/ 24 февраля 2012

Я решил это так.

BasicBlock::iterator InsertPos = BB->begin();
BasicBlock::iterator TermPos = BB->getTerminator(); // <-- Added this variable

while ( !( isa<CallInst>(InsertPos) || ( InsertPos == TermPos ) ) ) 
  ++InsertPos;
...