diff --git a/clang/lib/Sema/SemaExpr.cpp b/clang/lib/Sema/SemaExpr.cpp index a63ce1e598d0..28a826f555e9 100644 --- a/clang/lib/Sema/SemaExpr.cpp +++ b/clang/lib/Sema/SemaExpr.cpp @@ -4434,6 +4434,16 @@ Sema::CheckAssignmentConstraints(QualType lhsType, QualType rhsType) { if (rhsType->isObjCObjectPointerType()) { if (lhsType->isObjCBuiltinType() || rhsType->isObjCBuiltinType()) return Compatible; + QualType lhptee = + lhsType->getAs()->getPointeeType(); + QualType rhptee = + rhsType->getAs()->getPointeeType(); + // make sure we operate on the canonical type + lhptee = Context.getCanonicalType(lhptee); + rhptee = Context.getCanonicalType(rhptee); + if (!lhptee.isAtLeastAsQualifiedAs(rhptee)) + return CompatiblePointerDiscardsQualifiers; + if (Context.typesAreCompatible(lhsType, rhsType)) return Compatible; if (lhsType->isObjCQualifiedIdType() || rhsType->isObjCQualifiedIdType()) diff --git a/clang/test/SemaObjC/method-arg-qualifier-warning.m b/clang/test/SemaObjC/method-arg-qualifier-warning.m new file mode 100644 index 000000000000..c3009f052d5c --- /dev/null +++ b/clang/test/SemaObjC/method-arg-qualifier-warning.m @@ -0,0 +1,20 @@ +// RUN: clang-cc -fsyntax-only -verify %s + +typedef signed char BOOL; + +@interface NSString +- (BOOL)isEqualToString:(NSString *)aString; +@end + +static const NSString * Identifier1 = @"Identifier1"; +static NSString const * Identifier2 = @"Identifier2"; +static NSString * const Identifier3 = @"Identifier3"; + +int main () { + + [@"Identifier1" isEqualToString:Identifier1]; // expected-warning {{sending 'NSString const *' discards qualifiers, expected 'NSString *'}} + [@"Identifier2" isEqualToString:Identifier2]; // expected-warning {{sending 'NSString const *' discards qualifiers, expected 'NSString *'}} + [@"Identifier3" isEqualToString:Identifier3]; + return 0; +} +