mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-29 14:20:29 +00:00
[adt] Twine(nullptr) derefs the nullptr. Add a deleted Twine(std::nullptr_t)
Summary: nullptr can implicitly convert to Twine as Twine(nullptr) in which case it resolves to Twine(const char *). This constructor derefs the pointer and therefore doesn't work. Add a Twine(std::nullptr_t) = delete to make it a compile time error. It turns out that in-tree usage of Twine(nullptr) is confined to a single private method in IRBuilder where foldConstant(... const Twine &Name = nullptr) and this method is only ever called with an explicit Name argument as making it a mandatory argument doesn't cause compile-time or run-time errors. Reviewers: jyknight Reviewed By: jyknight Subscribers: dexonsmith, kristina, llvm-commits Differential Revision: https://reviews.llvm.org/D56870 llvm-svn: 351572
This commit is contained in:
parent
f393143c45
commit
d287284d36
@ -274,6 +274,9 @@ namespace llvm {
|
||||
|
||||
assert(isValid() && "Invalid twine!");
|
||||
}
|
||||
/// Delete the implicit conversion from nullptr as Twine(const char *)
|
||||
/// cannot take nullptr.
|
||||
/*implicit*/ Twine(std::nullptr_t) = delete;
|
||||
|
||||
/// Construct from an std::string.
|
||||
/*implicit*/ Twine(const std::string &Str) : LHSKind(StdStringKind) {
|
||||
|
@ -1004,7 +1004,7 @@ private:
|
||||
}
|
||||
|
||||
Value *foldConstant(Instruction::BinaryOps Opc, Value *L,
|
||||
Value *R, const Twine &Name = nullptr) const {
|
||||
Value *R, const Twine &Name) const {
|
||||
auto *LC = dyn_cast<Constant>(L);
|
||||
auto *RC = dyn_cast<Constant>(R);
|
||||
return (LC && RC) ? Insert(Folder.CreateBinOp(Opc, LC, RC), Name) : nullptr;
|
||||
|
Loading…
Reference in New Issue
Block a user