doug.gregor requested changes to this revision. doug.gregor added a comment. This revision now requires changes to proceed.
I think most of the complexity here will fold away when ObjCTypeParamType becomes sugar for the underlying ObjCObjectPointerType. ================ Comment at: lib/AST/Type.cpp:1095 @@ +1094,3 @@ + return ctx.getQualifiedType(argType, splitType.Quals); + // Apply protocol lists if exists. Should we combine protocol list? + if (const auto *objcPtr = dyn_cast<ObjCObjectPointerType>(argType)) { ---------------- I think we should combine the protocol lists. ================ Comment at: lib/AST/Type.cpp:1290 @@ +1289,3 @@ +/// in @implementation. @implementation does not take type parameters. +QualType QualType::handleObjCTypeParamType(ASTContext &ctx) const { + return simpleTransform(ctx, *this, ---------------- I think you won't need this if you take the approach I suggested on the previous patch of making ObjCTypeParamType type sugar for, effectively, the type you're computing here. ================ Comment at: lib/Sema/SemaExprObjC.cpp:388 @@ +387,3 @@ + if (auto *TPT = T->getAs<ObjCTypeParamType>()) + T = TPT->getDecl()->getUnderlyingType(); + ---------------- Dropping protocol qualifiers here? Again, I think this would be solved by treating ObjCTypeParamType as sugar. ================ Comment at: lib/Sema/SemaExprObjC.cpp:824 @@ -820,1 +823,3 @@ + (!isa<ObjCTypeParamType>(PtrT->getPointeeType()) && + !Context.hasSameUnqualifiedType(PtrT->getPointeeType(), IdT))) { Diag(SR.getBegin(), diag::err_objc_literal_method_sig) ---------------- Also unnecessary w/ the desugaring approach? ================ Comment at: lib/Sema/SemaType.cpp:901 @@ -900,2 +900,3 @@ // Objective-C object pointer types must be substitutable for the bounds. - if (const auto *typeArgObjC = typeArg->getAs<ObjCObjectPointerType>()) { + if (typeArg->getAs<ObjCObjectPointerType>() || + isa<ObjCTypeParamType>(typeArg)) { ---------------- ... same comment about desugaring. ================ Comment at: lib/Sema/SemaType.cpp:917 @@ +916,3 @@ + const ObjCObjectPointerType *typeArgObjC = nullptr; + if (isa<ObjCTypeParamType>(typeArg)) { + typeArgObjC = typeArg->getAs<ObjCTypeParamType>()->getDecl()-> ---------------- Here too :) ================ Comment at: lib/Sema/SemaType.cpp:3397 @@ -3365,2 +3396,3 @@ // Look at Objective-C object pointers. - if (auto objcObjectPtr = type->getAs<ObjCObjectPointerType>()) { + if (type->getAs<ObjCObjectPointerType>() || + isa<ObjCTypeParamType>(type)) { ---------------- ... same comment about desugaring. ================ Comment at: lib/StaticAnalyzer/Core/CallEvent.cpp:63 @@ -62,2 +62,3 @@ - if (T->isAnyPointerType() || T->isReferenceType()) + if ((T->isAnyPointerType() && !isa<ObjCTypeParamType>(T)) || + T->isReferenceType()) ---------------- ... same comment about desugaring. ================ Comment at: lib/StaticAnalyzer/Core/CallEvent.cpp:133 @@ -131,1 +132,3 @@ static bool isPointerToConst(QualType Ty) { + if (isa<ObjCTypeParamType>(Ty)) + return false; ---------------- ... same comment about desugaring. https://reviews.llvm.org/D23080 _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits