Index: lib/Sema/SemaChecking.cpp =================================================================== --- lib/Sema/SemaChecking.cpp (revision 219686) +++ lib/Sema/SemaChecking.cpp (working copy) @@ -6754,8 +6754,8 @@ /// Diagnose when expression is an integer constant expression and its evaluation /// results in integer overflow void Sema::CheckForIntOverflow (Expr *E) { - if (isa(E->IgnoreParens())) - E->EvaluateForOverflow(Context); + if (isa(E->IgnoreParenCasts())) + E->IgnoreParenCasts()->EvaluateForOverflow(Context); } namespace { Index: test/Sema/switch-1.c =================================================================== --- test/Sema/switch-1.c (revision 219686) +++ test/Sema/switch-1.c (working copy) @@ -20,3 +20,8 @@ return (i, 65537) * 65537; // expected-warning {{overflow in expression; result is 131073 with type 'int'}} \ // expected-warning {{expression result unused}} } + +// rdar://18405357 +unsigned long long l = 65536 * 65536; // expected-warning {{overflow in expression; result is 0 with type 'int'}} +unsigned long long l2 = 65536 * (unsigned)65536; +unsigned long long l3 = 65536 * 65536ULL;