From: Sean Silva Date: Thu, 11 Oct 2012 23:31:18 +0000 (+0000) Subject: Add missing classof(). X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=d680b986651227b10f1e307861bc23cc89064161;p=clang Add missing classof(). Somewhat troublingly, without this implemented, the check inside isa_impl<> would silently use the parent's `classof()` when determining whether it was okay to downcast from the parent to the child! Bug analysis: A build failure after removing the parent's `classof()` initially alerted me to the bug, after which a little bit of thinking and reading of the code identified the root cause. The compiler could be made to prevent this bug from happening if there were a way to ensure that in the code template struct isa_impl { static inline bool doit(const From &Val) { return To::classof(&Val); } }; that `To::classof` is actually inside the class `To`, and not in a base class. I am not aware of a way to check this in C++. If there is a means to perform that check, please bring it up on the list and this will be fixed. There is a high likelihood that there are other instances of this same bug in the codebase. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@165769 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/include/clang/StaticAnalyzer/Core/BugReporter/PathDiagnostic.h b/include/clang/StaticAnalyzer/Core/BugReporter/PathDiagnostic.h index b5ed00316f..9003a22636 100644 --- a/include/clang/StaticAnalyzer/Core/BugReporter/PathDiagnostic.h +++ b/include/clang/StaticAnalyzer/Core/BugReporter/PathDiagnostic.h @@ -399,6 +399,10 @@ public: virtual void flattenLocations() { Pos.flatten(); } virtual void Profile(llvm::FoldingSetNodeID &ID) const; + + static bool classof(const PathDiagnosticPiece *P) { + return P->getKind() == Event || P->getKind() == Macro; + } }; /// \brief Interface for classes constructing Stack hints.