http://gcc.gnu.org/bugzilla/show_bug.cgi?id=55721
--- Comment #13 from Steve Ellcey <sje at gcc dot gnu.org> 2013-01-09 23:09:15 UTC --- Here is a C++ test case in case it involves differences from the C examples. This comes from libstdc++-v3/libsupc++/pointer_type_info.cc % cat bug4.cc namespace std { class type_info { public: bool operator==(const type_info& __arg) const { return (__name[0] != '*' && __builtin_strcmp (__name, __arg.__name) == 0); } virtual bool __is_function_p() const; const char *__name; }; } class __pbase_type_info : public std::type_info { public: const std::type_info* __pointee; }; class __pointer_type_info : public __pbase_type_info { virtual bool __pointer_catch(const __pbase_type_info* __thr_type, void** __thr_obj, unsigned __outer) const; }; bool __pointer_type_info::__pointer_catch (const __pbase_type_info *thrown_type, void **thr_obj, unsigned outer) const { if (outer < 2 && *__pointee == typeid (void)) return !thrown_type->__pointee->__is_function_p (); } g++ -c -mips64r2 -mabi=64 -O2 -g bug4.cc bug4.cc: In member function 'virtual bool __pointer_type_info::__pointer_catch(const __pbase_type_info*, void**, unsigned int) const': bug4.cc:24:6: note: non-delegitimized UNSPEC unknown (230) found in variable location bool __pointer_type_info::__pointer_catch (const __pbase_type_info *thrown_type, ^ %