vsapsai updated this revision to Diff 263544. vsapsai added a comment. Make compatibility mode accept correct types per James' Y Knight helpful suggestion.
Repository: rG LLVM Github Monorepo CHANGES SINCE LAST ACTION https://reviews.llvm.org/D79511/new/ https://reviews.llvm.org/D79511 Files: clang/lib/AST/ASTContext.cpp clang/test/SemaObjC/block-type-safety.m Index: clang/test/SemaObjC/block-type-safety.m =================================================================== --- clang/test/SemaObjC/block-type-safety.m +++ clang/test/SemaObjC/block-type-safety.m @@ -167,7 +167,7 @@ void (^blockWithParam)(NSAllArray *); void (^genericBlockWithParam)(id<Foo>); genericBlockWithParam = blockWithParam; - blockWithParam = genericBlockWithParam; // expected-error {{incompatible block pointer types assigning to 'void (^)(NSAllArray *)' from 'void (^)(id<Foo>)'}} + blockWithParam = genericBlockWithParam; return 0; } #endif Index: clang/lib/AST/ASTContext.cpp =================================================================== --- clang/lib/AST/ASTContext.cpp +++ clang/lib/AST/ASTContext.cpp @@ -8501,7 +8501,11 @@ if (LHSOPT->isObjCQualifiedIdType() || RHSOPT->isObjCQualifiedIdType()) { if (getLangOpts().CompatibilityQualifiedIdBlockParamTypeChecking) - return finish(ObjCQualifiedIdTypesAreCompatible(LHSOPT, RHSOPT, false)); + // Use for block parameters previous type checking for compatibility. + return finish(ObjCQualifiedIdTypesAreCompatible(LHSOPT, RHSOPT, false) || + // Or corrected type checking as in non-compat mode. + (!BlockReturnType && + ObjCQualifiedIdTypesAreCompatible(RHSOPT, LHSOPT, false))); else return finish(ObjCQualifiedIdTypesAreCompatible( (BlockReturnType ? LHSOPT : RHSOPT),
Index: clang/test/SemaObjC/block-type-safety.m =================================================================== --- clang/test/SemaObjC/block-type-safety.m +++ clang/test/SemaObjC/block-type-safety.m @@ -167,7 +167,7 @@ void (^blockWithParam)(NSAllArray *); void (^genericBlockWithParam)(id<Foo>); genericBlockWithParam = blockWithParam; - blockWithParam = genericBlockWithParam; // expected-error {{incompatible block pointer types assigning to 'void (^)(NSAllArray *)' from 'void (^)(id<Foo>)'}} + blockWithParam = genericBlockWithParam; return 0; } #endif Index: clang/lib/AST/ASTContext.cpp =================================================================== --- clang/lib/AST/ASTContext.cpp +++ clang/lib/AST/ASTContext.cpp @@ -8501,7 +8501,11 @@ if (LHSOPT->isObjCQualifiedIdType() || RHSOPT->isObjCQualifiedIdType()) { if (getLangOpts().CompatibilityQualifiedIdBlockParamTypeChecking) - return finish(ObjCQualifiedIdTypesAreCompatible(LHSOPT, RHSOPT, false)); + // Use for block parameters previous type checking for compatibility. + return finish(ObjCQualifiedIdTypesAreCompatible(LHSOPT, RHSOPT, false) || + // Or corrected type checking as in non-compat mode. + (!BlockReturnType && + ObjCQualifiedIdTypesAreCompatible(RHSOPT, LHSOPT, false))); else return finish(ObjCQualifiedIdTypesAreCompatible( (BlockReturnType ? LHSOPT : RHSOPT),
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits