Author: lebedevri Date: Thu Nov 1 01:56:51 2018 New Revision: 345816 URL: http://llvm.org/viewvc/llvm-project?rev=345816&view=rev Log: [clang][CodeGen] ImplicitIntegerSignChangeSanitizer: actually ignore NOP casts.
I fully expected for that to be handled by the canonical type check, but it clearly wasn't. Sadly, somehow it hide until now. Reported by Eli Friedman. Modified: cfe/trunk/lib/CodeGen/CGExprScalar.cpp cfe/trunk/test/CodeGen/catch-implicit-integer-sign-changes-true-negatives.c Modified: cfe/trunk/lib/CodeGen/CGExprScalar.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CGExprScalar.cpp?rev=345816&r1=345815&r2=345816&view=diff ============================================================================== --- cfe/trunk/lib/CodeGen/CGExprScalar.cpp (original) +++ cfe/trunk/lib/CodeGen/CGExprScalar.cpp Thu Nov 1 01:56:51 2018 @@ -1127,10 +1127,9 @@ void ScalarExprEmitter::EmitIntegerSignC // Now, we do not need to emit the check in *all* of the cases. // We can avoid emitting it in some obvious cases where it would have been // dropped by the opt passes (instcombine) always anyways. - // If it's a cast between the same type, just differently-sugared. no check. - QualType CanonSrcType = CGF.getContext().getCanonicalType(SrcType); - QualType CanonDstType = CGF.getContext().getCanonicalType(DstType); - if (CanonSrcType == CanonDstType) + // If it's a cast between effectively the same type, no check. + // NOTE: this is *not* equivalent to checking the canonical types. + if (SrcSigned == DstSigned && SrcBits == DstBits) return; // At least one of the values needs to have signed type. // If both are unsigned, then obviously, neither of them can be negative. Modified: cfe/trunk/test/CodeGen/catch-implicit-integer-sign-changes-true-negatives.c URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGen/catch-implicit-integer-sign-changes-true-negatives.c?rev=345816&r1=345815&r2=345816&view=diff ============================================================================== --- cfe/trunk/test/CodeGen/catch-implicit-integer-sign-changes-true-negatives.c (original) +++ cfe/trunk/test/CodeGen/catch-implicit-integer-sign-changes-true-negatives.c Thu Nov 1 01:56:51 2018 @@ -138,3 +138,15 @@ uint32_t unsigned_int_to_uint32(unsigned uint32_t uint32_to_uint32(uint32_t src) { return src; } + +// "Transparent" Enum. +// ========================================================================== // + +enum a { b = ~2147483647 }; +enum a c(); +void d(int); +void e(); +void e() { + enum a f = c(); + d(f); +} _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits