diff options
-rw-r--r-- | clang/lib/Sema/SemaChecking.cpp | 8 | ||||
-rw-r--r-- | clang/test/SemaObjC/sign-conversion.m | 21 |
2 files changed, 28 insertions, 1 deletions
diff --git a/clang/lib/Sema/SemaChecking.cpp b/clang/lib/Sema/SemaChecking.cpp index a0998a46c66..e8d84f604eb 100644 --- a/clang/lib/Sema/SemaChecking.cpp +++ b/clang/lib/Sema/SemaChecking.cpp @@ -5133,7 +5133,13 @@ void AnalyzeImplicitConversions(Sema &S, Expr *OrigE, SourceLocation CC) { 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(); diff --git a/clang/test/SemaObjC/sign-conversion.m b/clang/test/SemaObjC/sign-conversion.m new file mode 100644 index 00000000000..65609e9352e --- /dev/null +++ b/clang/test/SemaObjC/sign-conversion.m @@ -0,0 +1,21 @@ +// 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'}} +} |