summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--clang/lib/Sema/SemaChecking.cpp8
-rw-r--r--clang/test/SemaObjC/sign-conversion.m28
2 files changed, 28 insertions, 8 deletions
diff --git a/clang/lib/Sema/SemaChecking.cpp b/clang/lib/Sema/SemaChecking.cpp
index e8d84f604eb..3471c004406 100644
--- a/clang/lib/Sema/SemaChecking.cpp
+++ b/clang/lib/Sema/SemaChecking.cpp
@@ -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();
diff --git a/clang/test/SemaObjC/sign-conversion.m b/clang/test/SemaObjC/sign-conversion.m
index 65609e9352e..584ea192027 100644
--- a/clang/test/SemaObjC/sign-conversion.m
+++ b/clang/test/SemaObjC/sign-conversion.m
@@ -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'}}
}
OpenPOWER on IntegriCloud