]> granicus.if.org Git - clang/commitdiff
Patch to warn when discarding objective-c pointer type qualifiers
authorFariborz Jahanian <fjahanian@apple.com>
Tue, 8 Dec 2009 03:35:08 +0000 (03:35 +0000)
committerFariborz Jahanian <fjahanian@apple.com>
Tue, 8 Dec 2009 03:35:08 +0000 (03:35 +0000)
Still some refactoring to do.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@90830 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Sema/SemaExpr.cpp
test/SemaObjC/method-arg-qualifier-warning.m [new file with mode: 0644]

index a63ce1e598d0c3d28cca62e8ab79068fa1cc775c..28a826f555e97045ca887ad2c247b5a69c840cbc 100644 (file)
@@ -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 (file)
index 0000000..c3009f0
--- /dev/null
@@ -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;
+}
+