When a category/extension doesn't repeat a type bound, corresponding
type parameter is substituted with id when used as a type argument. As
a result, in the added test case it was causing errors like
type argument 'T' (aka 'id') does not satisfy the bound ('id<NSCopying>') of type parameter 'T'
We are already checking that type parameters should be consistent
everywhere (see checkTypeParamListConsistency) and update
ObjCTypeParamDecl to have correct underlying type. And when we use the
type parameter as a method return type or a method parameter type, it is
substituted to the bounded type. But when we use the type parameter as a
type argument, we check ObjCTypeParamType that wasn't updated and
remains id.
Fix by updating not only ObjCTypeParamDecl UnderlyingType but also
TypeForDecl as we use the underlying type to create a canonical type for
ObjCTypeParamType (see ASTContext::getObjCTypeParamType).
This is a different approach to fixing the issue. The previous one was
02c2ab3d8872416589bd1a6ca3dfb96ba373a3b9 which was reverted in
4c539e8da1b3de38a53ef3f7497f5c45a3243b61. The problem with the previous
approach was that ObjCTypeParamType::desugar was returning underlying
type for ObjCTypeParamDecl without applying any protocols stored in
ObjCTypeParamType. It caused inconsistencies in comparing types before
and after desugaring.
rdar://problem/54329242
clang-format: please reformat the code