If the package has patches with it then 'emerge clean' chokes on patched files and leave them. Most obvious example is linux sources. May be it's not a bug but a request for improvement - add --force option to override !mtime .
This is actually not because they are patched. It is not removing all of your .o files since they are new.
If 'emerge clean' leaves .o files then it's definitely a bug - it should run 'make clean' before removing files. For linux sources it would be better to run 'make mrproper' of course. But there are still plenty of .h files which I think were result of applying patches. Upon further pondering through ebuild command and .ebuild files I found that there is no any kind of pkg_clean{} or src_remove{} function. This should probably go to request for improvements - portage has to perform all basic package manipulation functions : add, list/query , replace/update ,remove. I can do most of it with different level of difficulty (from user prospective) - add or update package is easy (one command), get version or show dependencies is a bit trickier (2 commands), remove package - very cumbersome. Just force creators of ebuilds to include pkg_remove{} function and have a fallback default function.
pkg_prerm()