diff --git a/clang/lib/StaticAnalyzer/Core/RangeConstraintManager.cpp b/clang/lib/StaticAnalyzer/Core/RangeConstraintManager.cpp index f550aca808e564..9f64be7a5309e2 100644 --- a/clang/lib/StaticAnalyzer/Core/RangeConstraintManager.cpp +++ b/clang/lib/StaticAnalyzer/Core/RangeConstraintManager.cpp @@ -559,8 +559,20 @@ class EquivalenceClass : public llvm::FoldingSetNode { /// Return a set of class members for the given state. LLVM_NODISCARD inline SymbolSet getClassMembers(ProgramStateRef State) const; + /// Return true if the current class is trivial in the given state. + /// A class is trivial if and only if there is not any member relations stored + /// to it in State/ClassMembers. + /// An equivalence class with one member might seem as it does not hold any + /// meaningful information, i.e. that is a tautology. However, during the + /// removal of dead symbols we do not remove classes with one member for + /// resource and performance reasons. Consequently, a class with one member is + /// not necessarily trivial. It could happen that we have a class with two + /// members and then during the removal of dead symbols we remove one of its + /// members. In this case, the class is still non-trivial (it still has the + /// mappings in ClassMembers), even though it has only one member. LLVM_NODISCARD inline bool isTrivial(ProgramStateRef State) const; + /// Return true if the current class is trivial and its only member is dead. LLVM_NODISCARD inline bool isTriviallyDead(ProgramStateRef State, SymbolReaper &Reaper) const;