inline use_const_iterator use_begin() const { return Uses.begin(); }
inline use_iterator use_end() { return Uses.end(); }
inline use_const_iterator use_end() const { return Uses.end(); }
+ inline User *use_back() { return Uses.back(); }
+ inline const User *use_back() const { return Uses.back(); }
inline void use_push_back(User *I) { Uses.push_back(I); }
User *use_remove(use_iterator &I);
// if (isa<Type>(myVal)) { ... }
//
template <class X, class Y>
-inline bool isa(Y Val) { return X::classof(Val); }
+inline bool isa(Y Val) {
+ assert(Val && "isa<Ty>(NULL) invoked!");
+ return X::classof(Val);
+}
// cast<X> - Return the argument parameter cast to the specified type. This
// casting operator asserts that the type is correct, so it does not return null
-// on failure. Used Like this:
+// on failure. But it will correctly return NULL when the input is NULL.
+// Used Like this:
//
// cast< Instruction>(myVal)->getParent()
// cast<const Instruction>(myVal)->getParent()
//
template <class X, class Y>
inline X *cast(Y Val) {
- assert(isa<X>(Val) && "Invalid cast argument type!");
+ assert((Val == 0 || isa<X>(Val)) &&
+ "cast<Ty>() argument of uncompatible type!");
return (X*)(real_type<Y>::Type)Val;
}