forked from OSchip/llvm-project
[ADT] Annotate immutable list/set/map update methods with LLVM_NODISCARD.
Because immutable data structures are, well, immutable, methods like "append", "add", "set" create a copy of the list (set, map) instead of mutating the existing map. If the updated object is discarded, it clearly indicates a bug. Such bugs are introduced frequently, hence the warn_unused_result annotation. Differential Revision: https://reviews.llvm.org/D47496 llvm-svn: 333672
This commit is contained in:
parent
22746d7df3
commit
3260b00d48
|
@ -166,7 +166,7 @@ public:
|
|||
if (ownsAllocator()) delete &getAllocator();
|
||||
}
|
||||
|
||||
ImmutableList<T> concat(const T& Head, ImmutableList<T> Tail) {
|
||||
LLVM_NODISCARD ImmutableList<T> concat(const T &Head, ImmutableList<T> Tail) {
|
||||
// Profile the new list to see if it already exists in our cache.
|
||||
FoldingSetNodeID ID;
|
||||
void* InsertPos;
|
||||
|
@ -188,7 +188,7 @@ public:
|
|||
return L;
|
||||
}
|
||||
|
||||
ImmutableList<T> add(const T& D, ImmutableList<T> L) {
|
||||
LLVM_NODISCARD ImmutableList<T> add(const T& D, ImmutableList<T> L) {
|
||||
return concat(D, L);
|
||||
}
|
||||
|
||||
|
|
|
@ -114,12 +114,13 @@ public:
|
|||
|
||||
ImmutableMap getEmptyMap() { return ImmutableMap(F.getEmptyTree()); }
|
||||
|
||||
ImmutableMap add(ImmutableMap Old, key_type_ref K, data_type_ref D) {
|
||||
LLVM_NODISCARD ImmutableMap add(ImmutableMap Old, key_type_ref K,
|
||||
data_type_ref D) {
|
||||
TreeTy *T = F.add(Old.Root, std::pair<key_type,data_type>(K,D));
|
||||
return ImmutableMap(Canonicalize ? F.getCanonicalTree(T): T);
|
||||
}
|
||||
|
||||
ImmutableMap remove(ImmutableMap Old, key_type_ref K) {
|
||||
LLVM_NODISCARD ImmutableMap remove(ImmutableMap Old, key_type_ref K) {
|
||||
TreeTy *T = F.remove(Old.Root,K);
|
||||
return ImmutableMap(Canonicalize ? F.getCanonicalTree(T): T);
|
||||
}
|
||||
|
|
|
@ -1017,7 +1017,7 @@ public:
|
|||
/// of this operation is logarithmic in the size of the original set.
|
||||
/// The memory allocated to represent the set is released when the
|
||||
/// factory object that created the set is destroyed.
|
||||
ImmutableSet add(ImmutableSet Old, value_type_ref V) {
|
||||
LLVM_NODISCARD ImmutableSet add(ImmutableSet Old, value_type_ref V) {
|
||||
TreeTy *NewT = F.add(Old.Root, V);
|
||||
return ImmutableSet(Canonicalize ? F.getCanonicalTree(NewT) : NewT);
|
||||
}
|
||||
|
@ -1029,7 +1029,7 @@ public:
|
|||
/// of this operation is logarithmic in the size of the original set.
|
||||
/// The memory allocated to represent the set is released when the
|
||||
/// factory object that created the set is destroyed.
|
||||
ImmutableSet remove(ImmutableSet Old, value_type_ref V) {
|
||||
LLVM_NODISCARD ImmutableSet remove(ImmutableSet Old, value_type_ref V) {
|
||||
TreeTy *NewT = F.remove(Old.Root, V);
|
||||
return ImmutableSet(Canonicalize ? F.getCanonicalTree(NewT) : NewT);
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue