forked from OSchip/llvm-project
IR: Fix const-correctness of SwitchInst::CaseIterator and CaseHandle
Fix some confusion between the two types of `const` a pointer/iterator can have. Users of a SwitchInst::CaseIterator should not (and do not!) manually mutate the SwitchInst::CaseHandle that tracks its internal state. Change operator*() to return `const CaseHandle&`, remove the non-const-qualified operator*(), and const-qualify CaseHandle::setValue() and CaseHandle::setSuccessor(). Differential Revision: https://reviews.llvm.org/D113788
This commit is contained in:
parent
c3edab8f78
commit
a678c6743f
|
@ -3350,14 +3350,14 @@ public:
|
|||
CaseHandle(SwitchInst *SI, ptrdiff_t Index) : CaseHandleImpl(SI, Index) {}
|
||||
|
||||
/// Sets the new value for current case.
|
||||
void setValue(ConstantInt *V) {
|
||||
void setValue(ConstantInt *V) const {
|
||||
assert((unsigned)Index < SI->getNumCases() &&
|
||||
"Index out the number of cases.");
|
||||
SI->setOperand(2 + Index*2, reinterpret_cast<Value*>(V));
|
||||
}
|
||||
|
||||
/// Sets the new successor for current case.
|
||||
void setSuccessor(BasicBlock *S) {
|
||||
void setSuccessor(BasicBlock *S) const {
|
||||
SI->setSuccessor(getSuccessorIndex(), S);
|
||||
}
|
||||
};
|
||||
|
@ -3366,7 +3366,7 @@ public:
|
|||
class CaseIteratorImpl
|
||||
: public iterator_facade_base<CaseIteratorImpl<CaseHandleT>,
|
||||
std::random_access_iterator_tag,
|
||||
CaseHandleT> {
|
||||
const CaseHandleT> {
|
||||
using SwitchInstT = typename CaseHandleT::SwitchInstType;
|
||||
|
||||
CaseHandleT Case;
|
||||
|
@ -3425,7 +3425,6 @@ public:
|
|||
assert(Case.SI == RHS.Case.SI && "Incompatible operators.");
|
||||
return Case.Index < RHS.Case.Index;
|
||||
}
|
||||
CaseHandleT &operator*() { return Case; }
|
||||
const CaseHandleT &operator*() const { return Case; }
|
||||
};
|
||||
|
||||
|
@ -3520,7 +3519,7 @@ public:
|
|||
const_cast<const SwitchInst *>(this)->findCaseValue(C)->getCaseIndex());
|
||||
}
|
||||
ConstCaseIt findCaseValue(const ConstantInt *C) const {
|
||||
ConstCaseIt I = llvm::find_if(cases(), [C](ConstCaseHandle &Case) {
|
||||
ConstCaseIt I = llvm::find_if(cases(), [C](const ConstCaseHandle &Case) {
|
||||
return Case.getCaseValue() == C;
|
||||
});
|
||||
if (I != case_end())
|
||||
|
|
Loading…
Reference in New Issue