]> granicus.if.org Git - clang/commitdiff
Objective-C: More cases of -Wsign-conversion not
authorFariborz Jahanian <fjahanian@apple.com>
Wed, 15 May 2013 22:25:03 +0000 (22:25 +0000)
committerFariborz Jahanian <fjahanian@apple.com>
Wed, 15 May 2013 22:25:03 +0000 (22:25 +0000)
working on new Objective-C array subscripting
syntax. // rdar://13855682

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

lib/Sema/SemaChecking.cpp
test/SemaObjC/sign-conversion.m

index e8d84f604ebbe9be0af71590e83ed54d4b109418..3471c00440658a1674a08b4c634c73ae40ced7a8 100644 (file)
@@ -5135,11 +5135,13 @@ void AnalyzeImplicitConversions(Sema &S, Expr *OrigE, SourceLocation CC) {
   // Now continue drilling into this expression.
   
   if (PseudoObjectExpr * POE = dyn_cast<PseudoObjectExpr>(E)) {
-    Expr *Result = POE->getResultExpr();
-    if (const OpaqueValueExpr *OVE = dyn_cast_or_null<OpaqueValueExpr>(Result))
-      return AnalyzeImplicitConversions(S, OVE->getSourceExpr(), CC);
+    if (POE->getResultExpr())
+      E = POE->getResultExpr();
   }
   
+  if (const OpaqueValueExpr *OVE = dyn_cast<OpaqueValueExpr>(E))
+    return AnalyzeImplicitConversions(S, OVE->getSourceExpr(), CC);
+  
   // Skip past explicit casts.
   if (isa<ExplicitCastExpr>(E)) {
     E = cast<ExplicitCastExpr>(E)->getSubExpr()->IgnoreParenImpCasts();
index 65609e9352e2f37a41c4d7e0e2e424f4d4ac566f..584ea1920271add9cae306351d00146f38a3dc30 100644 (file)
@@ -1,21 +1,39 @@
 // RUN: %clang_cc1 -fsyntax-only -verify -Wsign-conversion %s
 // rdar://13855394
 
+typedef unsigned int NSUInteger;
+
 @interface NSObject
 - new;
+- (NSUInteger)hash;
 @end
 
 @interface X : NSObject
-@property unsigned int uint;
+@property NSUInteger uint;
 @end
 
-@implementation X 
-@synthesize uint;
+@interface NSArray : NSObject 
+
+- (NSUInteger)count;
+- (id)objectAtIndex:(NSUInteger)index;
+- (id)objectAtIndexedSubscript:(NSUInteger)index;
+
 @end
 
 void foo() {
     X *x = [X new];
     signed int sint = -1;
-    [x setUint:sint];  // expected-warning {{implicit conversion changes signedness: 'int' to 'unsigned int'}}
-    x.uint = sint; // expected-warning {{implicit conversion changes signedness: 'int' to 'unsigned int'}}
+    [x setUint:sint];  // expected-warning {{implicit conversion changes signedness: 'int' to 'NSUInteger'}}
+    x.uint = sint; // expected-warning {{implicit conversion changes signedness: 'int' to 'NSUInteger'}}
+}
+
+// rdar://13855682
+void Test1() {
+signed int si = -1;
+NSArray *array;
+
+(void)((NSObject*)array[si]).hash; // expected-warning {{implicit conversion changes signedness: 'int' to 'NSUInteger'}}
+
+(void)[((NSObject*)array[si]) hash]; // expected-warning {{implicit conversion changes signedness: 'int' to 'NSUInteger'}}
+(void)array[si]; // expected-warning {{implicit conversion changes signedness: 'int' to 'NSUInteger'}}
 }