Index: clang/lib/Sema/SemaChecking.cpp =================================================================== --- clang/lib/Sema/SemaChecking.cpp +++ clang/lib/Sema/SemaChecking.cpp @@ -14293,6 +14293,12 @@ if (S.SourceMgr.isInSystemMacro(CC)) return; + if (SourceBT && SourceBT->isInteger() && TargetBT && + TargetBT->isInteger() && + Source->isSignedIntegerType() == Target->isSignedIntegerType()) { + return; + } + unsigned DiagID = diag::warn_impcast_integer_sign; // Traditionally, gcc has warned about this under -Wsign-compare. Index: clang/test/Sema/sign-conversion.c =================================================================== --- clang/test/Sema/sign-conversion.c +++ clang/test/Sema/sign-conversion.c @@ -5,4 +5,8 @@ void test(int x) { unsigned t0 = x; // expected-warning {{implicit conversion changes signedness}} unsigned t1 = (t0 == 5 ? x : 0); // expected-warning {{operand of ? changes signedness}} + + // Clang has special treatment for left shift of literal '1'. + // Make sure there is no diagnostics. + long t2 = 1LL << x; }