CheckImplicitConversion(S, E, T, 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);
+ }
+
// Skip past explicit casts.
if (isa<ExplicitCastExpr>(E)) {
E = cast<ExplicitCastExpr>(E)->getSubExpr()->IgnoreParenImpCasts();
--- /dev/null
+// RUN: %clang_cc1 -fsyntax-only -verify -Wsign-conversion %s
+// rdar://13855394
+
+@interface NSObject
+- new;
+@end
+
+@interface X : NSObject
+@property unsigned int uint;
+@end
+
+@implementation X
+@synthesize uint;
+@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'}}
+}