The traits interface is supposed to support non-pointer element types, so there's no real reason for typed_noop_remove to be specifically for pointers. It should be usable by anything that wants a no-op remove().
gcc/ * hash-traits.h (typed_noop_remove): Don't require a pointer type. Index: gcc/hash-traits.h =================================================================== --- gcc/hash-traits.h 2015-06-15 16:05:24.059210397 +0100 +++ gcc/hash-traits.h 2015-06-15 16:05:24.051210490 +0100 @@ -44,7 +44,7 @@ typed_free_remove <Type>::remove (Type * template <typename Type> struct typed_noop_remove { - static inline void remove (Type *p); + static inline void remove (Type &); }; @@ -52,7 +52,7 @@ struct typed_noop_remove template <typename Type> inline void -typed_noop_remove <Type>::remove (Type *p ATTRIBUTE_UNUSED) +typed_noop_remove <Type>::remove (Type &) { } @@ -169,7 +169,7 @@ struct ggc_cache_remove : ggc_remove<T> is deleted. */ template <typename T> -struct nofree_ptr_hash : pointer_hash <T>, typed_noop_remove <T> {}; +struct nofree_ptr_hash : pointer_hash <T>, typed_noop_remove <T *> {}; /* Traits for pointer elements that should be freed via free() when an element is deleted. */