diff --git a/llvm/include/llvm/Support/Casting.h b/llvm/include/llvm/Support/Casting.h index abb5a9aa11d8..3aab4367f5bb 100644 --- a/llvm/include/llvm/Support/Casting.h +++ b/llvm/include/llvm/Support/Casting.h @@ -23,8 +23,6 @@ namespace llvm { // isa Support Templates //===----------------------------------------------------------------------===// -template struct isa_impl_cl; - // Define a template that can be specialized by smart pointers to reflect the // fact that they are automatically dereferenced, and are not involved with the // template selection process... the default implementation is a noop. @@ -43,12 +41,9 @@ template struct simplify_type { } }; - -// isa - Return true if the parameter to the template is an instance of the -// template type argument. Used like this: -// -// if (isa(myVal)) { ... } -// +// The core of the implementation of isa is here; To and From should be +// the names of classes. This template can be specialized to customize the +// implementation of isa<> without rewriting it from scratch. template struct isa_impl { static inline bool doit(const From &Val) { @@ -56,66 +51,63 @@ struct isa_impl { } }; -template +template struct isa_impl_cl { + static inline bool doit(const From &Val) { + return isa_impl::doit(Val); + } +}; + +template struct isa_impl_cl { + static inline bool doit(const From &Val) { + return isa_impl::doit(Val); + } +}; + +template struct isa_impl_cl { + static inline bool doit(const From *Val) { + return isa_impl::doit(*Val); + } +}; + +template struct isa_impl_cl { + static inline bool doit(const From *Val) { + return isa_impl::doit(*Val); + } +}; + +template struct isa_impl_cl { + static inline bool doit(const From *Val) { + return isa_impl::doit(*Val); + } +}; + +template struct isa_impl_wrap { // When From != SimplifiedType, we can simplify the type some more by using // the simplify_type template. static bool doit(const From &Val) { - return isa_impl_cl::template - isa(simplify_type::getSimplifiedValue(Val)); + return isa_impl_wrap::SimpleType>::doit( + simplify_type::getSimplifiedValue(Val)); } }; template -struct isa_impl_wrap { +struct isa_impl_wrap { // When From == SimpleType, we are as simple as we are going to get. static bool doit(const FromTy &Val) { - return isa_impl::doit(Val); + return isa_impl_cl::doit(Val); } }; -// isa_impl_cl - Use class partial specialization to transform types to a single -// canonical form for isa_impl. +// isa - Return true if the parameter to the template is an instance of the +// template type argument. Used like this: +// +// if (isa(myVal)) { ... } // -template -struct isa_impl_cl { - template - static bool isa(const FromCl &Val) { - return isa_impl_wrap::SimpleType>::doit(Val); - } -}; - -// Specialization used to strip const qualifiers off of the FromCl type... -template -struct isa_impl_cl { - template - static bool isa(const FromCl &Val) { - return isa_impl_cl::template isa(Val); - } -}; - -// Define pointer traits in terms of base traits... -template -struct isa_impl_cl { - template - static bool isa(FromCl *Val) { - return isa_impl_cl::template isa(*Val); - } -}; - -// Define reference traits in terms of base traits... -template -struct isa_impl_cl { - template - static bool isa(FromCl &Val) { - return isa_impl_cl::template isa(&Val); - } -}; - template inline bool isa(const Y &Val) { - return isa_impl_cl::template isa(Val); + return isa_impl_wrap::SimpleType>::doit(Val); } //===----------------------------------------------------------------------===// diff --git a/llvm/lib/Transforms/Scalar/SCCP.cpp b/llvm/lib/Transforms/Scalar/SCCP.cpp index db8eb850448f..083412ed942d 100644 --- a/llvm/lib/Transforms/Scalar/SCCP.cpp +++ b/llvm/lib/Transforms/Scalar/SCCP.cpp @@ -655,7 +655,7 @@ bool SCCPSolver::isEdgeFeasible(BasicBlock *From, BasicBlock *To) { // Just mark all destinations executable! // TODO: This could be improved if the operand is a [cast of a] BlockAddress. - if (isa(&TI)) + if (isa(TI)) return true; #ifndef NDEBUG