aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFariborz Jahanian <fjahanian@apple.com>2009-12-08 03:35:08 +0000
committerFariborz Jahanian <fjahanian@apple.com>2009-12-08 03:35:08 +0000
commit7e42cf2ca1d7058e46dbec269b9462eaa52b7d79 (patch)
tree6dbcb482c4ae990937b0aff6fb540155b2e0418e
parentba03dfddc383918aef4d59a9ce1c0a0249692d5b (diff)
Patch to warn when discarding objective-c pointer type qualifiers
Still some refactoring to do. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@90830 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r--lib/Sema/SemaExpr.cpp10
-rw-r--r--test/SemaObjC/method-arg-qualifier-warning.m20
2 files changed, 30 insertions, 0 deletions
diff --git a/lib/Sema/SemaExpr.cpp b/lib/Sema/SemaExpr.cpp
index a63ce1e598..28a826f555 100644
--- a/lib/Sema/SemaExpr.cpp
+++ b/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<ObjCObjectPointerType>()->getPointeeType();
+ QualType rhptee =
+ rhsType->getAs<ObjCObjectPointerType>()->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/test/SemaObjC/method-arg-qualifier-warning.m b/test/SemaObjC/method-arg-qualifier-warning.m
new file mode 100644
index 0000000000..c3009f052d
--- /dev/null
+++ b/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;
+}
+