Use only explicit bool conversion operators

BitVector/SmallBitVector::reference::operator bool remain implicit since
they model more exactly a bool, rather than something else that can be
boolean tested.

The most common (non-buggy) case are where such objects are used as
return expressions in bool-returning functions or as boolean function
arguments. In those cases I've used (& added if necessary) a named
function to provide the equivalent (or sometimes negative, depending on
convenient wording) test.

One behavior change (YAMLParser) was made, though no test case is
included as I'm not sure how to reach that code path. Essentially any
comparison of llvm::yaml::document_iterators would be invalid if neither
iterator was at the end.

This helped uncover a couple of bugs in Clang - test cases provided for
those in a separate commit along with similar changes to `operator bool`
instances in Clang.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@181868 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
David Blaikie 2013-05-15 07:36:59 +00:00
parent 1fe14c56f1
commit 453f4f0130
13 changed files with 23 additions and 17 deletions

View File

@ -496,7 +496,7 @@ public:
NodeRef() {} NodeRef() {}
/// operator bool - Detect a null ref. /// operator bool - Detect a null ref.
operator bool() const { return pip.getOpaqueValue(); } LLVM_EXPLICIT operator bool() const { return pip.getOpaqueValue(); }
/// NodeRef - Create a reference to the node p with n elements. /// NodeRef - Create a reference to the node p with n elements.
template <typename NodeT> template <typename NodeT>

View File

@ -70,8 +70,9 @@ public:
T *operator->() const { return Ptr; } T *operator->() const { return Ptr; }
T *get() const { return Ptr; } T *get() const { return Ptr; }
operator bool() const { return Ptr != 0; } LLVM_EXPLICIT operator bool() const { return Ptr != 0; }
bool operator!() const { return Ptr == 0; } bool operator!() const { return Ptr == 0; }
bool isValid() const { return Ptr != 0; }
void swap(OwningPtr &RHS) { void swap(OwningPtr &RHS) {
T *Tmp = RHS.Ptr; T *Tmp = RHS.Ptr;
@ -132,7 +133,7 @@ public:
} }
T *get() const { return Ptr; } T *get() const { return Ptr; }
operator bool() const { return Ptr != 0; } LLVM_EXPLICIT operator bool() const { return Ptr != 0; }
bool operator!() const { return Ptr == 0; } bool operator!() const { return Ptr == 0; }
void swap(OwningArrayPtr &RHS) { void swap(OwningArrayPtr &RHS) {

View File

@ -109,7 +109,7 @@ namespace llvm {
// we recursively strip off low bits if we have a nested PointerUnion. // we recursively strip off low bits if we have a nested PointerUnion.
return !PointerLikeTypeTraits<PT1>::getFromVoidPointer(Val.getPointer()); return !PointerLikeTypeTraits<PT1>::getFromVoidPointer(Val.getPointer());
} }
operator bool() const { return !isNull(); } LLVM_EXPLICIT operator bool() const { return !isNull(); }
/// is<T>() return true if the Union currently holds the type matching T. /// is<T>() return true if the Union currently holds the type matching T.
template<typename T> template<typename T>
@ -174,6 +174,11 @@ namespace llvm {
return V; return V;
} }
}; };
template<typename PT1, typename PT2>
bool operator==(PointerUnion<PT1, PT2> lhs, PointerUnion<PT1, PT2> rhs) {
return lhs.getOpaqueValue() == rhs.getOpaqueValue();
}
// Teach SmallPtrSet that PointerUnion is "basically a pointer", that has // Teach SmallPtrSet that PointerUnion is "basically a pointer", that has
// # low bits available = min(PT1bits,PT2bits)-1. // # low bits available = min(PT1bits,PT2bits)-1.
@ -251,7 +256,7 @@ namespace llvm {
/// isNull - Return true if the pointer held in the union is null, /// isNull - Return true if the pointer held in the union is null,
/// regardless of which type it is. /// regardless of which type it is.
bool isNull() const { return Val.isNull(); } bool isNull() const { return Val.isNull(); }
operator bool() const { return !isNull(); } LLVM_EXPLICIT operator bool() const { return !isNull(); }
/// is<T>() return true if the Union currently holds the type matching T. /// is<T>() return true if the Union currently holds the type matching T.
template<typename T> template<typename T>
@ -359,7 +364,7 @@ namespace llvm {
/// isNull - Return true if the pointer held in the union is null, /// isNull - Return true if the pointer held in the union is null,
/// regardless of which type it is. /// regardless of which type it is.
bool isNull() const { return Val.isNull(); } bool isNull() const { return Val.isNull(); }
operator bool() const { return !isNull(); } LLVM_EXPLICIT operator bool() const { return !isNull(); }
/// is<T>() return true if the Union currently holds the type matching T. /// is<T>() return true if the Union currently holds the type matching T.
template<typename T> template<typename T>

View File

@ -77,7 +77,7 @@ public:
} }
/// \brief Test whether the inline cost is low enough for inlining. /// \brief Test whether the inline cost is low enough for inlining.
operator bool() const { LLVM_EXPLICIT operator bool() const {
return Cost < Threshold; return Cost < Threshold;
} }

View File

@ -162,7 +162,7 @@ namespace llvm {
} }
/// Return true for a valid index. /// Return true for a valid index.
operator bool() const { return isValid(); } LLVM_EXPLICIT operator bool() const { return isValid(); }
/// Print this index to the given raw_ostream. /// Print this index to the given raw_ostream.
void print(raw_ostream &os) const; void print(raw_ostream &os) const;

View File

@ -78,7 +78,7 @@ public:
InstrTy *getInstruction() const { return I.getPointer(); } InstrTy *getInstruction() const { return I.getPointer(); }
InstrTy *operator->() const { return I.getPointer(); } InstrTy *operator->() const { return I.getPointer(); }
operator bool() const { return I.getPointer(); } LLVM_EXPLICIT operator bool() const { return I.getPointer(); }
/// getCalledValue - Return the pointer to function that is being called. /// getCalledValue - Return the pointer to function that is being called.
/// ///

View File

@ -516,7 +516,7 @@ public:
if (isAtEnd() || Other.isAtEnd()) if (isAtEnd() || Other.isAtEnd())
return isAtEnd() && Other.isAtEnd(); return isAtEnd() && Other.isAtEnd();
return *Doc == *Other.Doc; return Doc == Other.Doc;
} }
bool operator !=(const document_iterator &Other) { bool operator !=(const document_iterator &Other) {
return !(*this == Other); return !(*this == Other);
@ -543,7 +543,7 @@ public:
private: private:
bool isAtEnd() const { bool isAtEnd() const {
return Doc == 0 || *Doc == 0; return !Doc || !*Doc;
} }
OwningPtr<Document> *Doc; OwningPtr<Document> *Doc;

View File

@ -89,7 +89,7 @@ bool MemoryDependenceAnalysis::runOnFunction(Function &) {
AA = &getAnalysis<AliasAnalysis>(); AA = &getAnalysis<AliasAnalysis>();
TD = getAnalysisIfAvailable<DataLayout>(); TD = getAnalysisIfAvailable<DataLayout>();
DT = getAnalysisIfAvailable<DominatorTree>(); DT = getAnalysisIfAvailable<DominatorTree>();
if (PredCache == 0) if (!PredCache)
PredCache.reset(new PredIteratorCache()); PredCache.reset(new PredIteratorCache());
return false; return false;
} }

View File

@ -713,7 +713,7 @@ bool RAGreedy::addSplitConstraints(InterferenceCache::Cursor Intf,
Intf.moveToBlock(BC.Number); Intf.moveToBlock(BC.Number);
BC.Entry = BI.LiveIn ? SpillPlacement::PrefReg : SpillPlacement::DontCare; BC.Entry = BI.LiveIn ? SpillPlacement::PrefReg : SpillPlacement::DontCare;
BC.Exit = BI.LiveOut ? SpillPlacement::PrefReg : SpillPlacement::DontCare; BC.Exit = BI.LiveOut ? SpillPlacement::PrefReg : SpillPlacement::DontCare;
BC.ChangesValue = BI.FirstDef; BC.ChangesValue = BI.FirstDef.isValid();
if (!Intf.hasInterference()) if (!Intf.hasInterference())
continue; continue;

View File

@ -65,7 +65,7 @@ unsigned SourceMgr::AddIncludeFile(const std::string &Filename,
MemoryBuffer::getFile(IncludedFile.c_str(), NewBuf); MemoryBuffer::getFile(IncludedFile.c_str(), NewBuf);
} }
if (NewBuf == 0) return ~0U; if (!NewBuf) return ~0U;
return AddNewSourceBuffer(NewBuf.take(), IncludeLoc); return AddNewSourceBuffer(NewBuf.take(), IncludeLoc);
} }

View File

@ -75,7 +75,7 @@ public:
} }
// True if Handle is valid. // True if Handle is valid.
operator bool() const { LLVM_EXPLICIT operator bool() const {
return HandleTraits::IsValid(Handle) ? true : false; return HandleTraits::IsValid(Handle) ? true : false;
} }

View File

@ -130,7 +130,7 @@ ReduceMiscompilingPasses::doTest(std::vector<std::string> &Prefix,
// //
OwningPtr<Module> PrefixOutput(ParseInputFile(BitcodeResult, OwningPtr<Module> PrefixOutput(ParseInputFile(BitcodeResult,
BD.getContext())); BD.getContext()));
if (PrefixOutput == 0) { if (!PrefixOutput) {
errs() << BD.getToolName() << ": Error reading bitcode file '" errs() << BD.getToolName() << ": Error reading bitcode file '"
<< BitcodeResult << "'!\n"; << BitcodeResult << "'!\n";
exit(1); exit(1);

View File

@ -98,7 +98,7 @@ protected:
void compileAndRun(int ExpectedRC = OriginalRC) { void compileAndRun(int ExpectedRC = OriginalRC) {
// This function shouldn't be called until after SetUp. // This function shouldn't be called until after SetUp.
ASSERT_TRUE(0 != TheJIT); ASSERT_TRUE(TheJIT.isValid());
ASSERT_TRUE(0 != Main); ASSERT_TRUE(0 != Main);
TheJIT->finalizeObject(); TheJIT->finalizeObject();