ca6c722561
As the testcases shows, the -Wconversion warning behaves quite differently when -fsanitize=undefined vs. when not sanitizing, but in the end it is not something specific to sanitizing, if a user uses return static_cast<uc>(static_cast<uc>((d++, a) << 1U) | b) | c; instead of return static_cast<uc>(static_cast<uc>(a << 1U) | b) | c; and thus there is some COMPOUND_EXPR involved, cp_build_binary_op behaves significantly different, e.g. shorten_binary_op will have different result (uc for the case without COMPOUND_EXPR, int with it), but it isn't limited to that. > How about improving get_narrower to handle COMPOUND_EXPR? I'd think that > would do the trick without affecting evaluation order. Not completely, had to change also warnings_for_convert_and_check, but with that it works. The float-cast-overflow* changes are needed because now with -O1+ we emit lots of -Woverflow warnings on the testcase, but we do emit those warnings on the testcase even when compiling just with -O1 and without -fsanitize=float-cast-overflow, so it seems to me a change in the right direction, having -fsanitize= or explicit comma expressions smaller effect on the warnings that are emitted. 2020-03-23 Jakub Jelinek <jakub@redhat.com> PR c++/91993 * tree.c (get_narrower): Handle COMPOUND_EXPR by recursing on ultimate rhs and if returned something different, reconstructing the COMPOUND_EXPRs. * c-warn.c (warnings_for_convert_and_check): For expr and/or result being COMPOUND_EXPRs, skip to ultimate rhs. * g++.dg/warn/Wconversion-pr91993.C: New test. * g++.dg/ubsan/pr91993.C: New test. * c-c++-common/ubsan/float-cast-overflow-1.c: Add -Wno-overflow to dg-options. * c-c++-common/ubsan/float-cast-overflow-2.c: Likewise. * c-c++-common/ubsan/float-cast-overflow-4.c: Likewise. |
||
---|---|---|
.. | ||
c-ada-spec.c | ||
c-ada-spec.h | ||
c-attribs.c | ||
c-common.c | ||
c-common.def | ||
c-common.h | ||
c-cppbuiltin.c | ||
c-dump.c | ||
c-format.c | ||
c-format.h | ||
c-gimplify.c | ||
c-indentation.c | ||
c-indentation.h | ||
c-lex.c | ||
c-objc.h | ||
c-omp.c | ||
c-opts.c | ||
c-pch.c | ||
c-ppoutput.c | ||
c-pragma.c | ||
c-pragma.h | ||
c-pretty-print.c | ||
c-pretty-print.h | ||
c-semantics.c | ||
c-spellcheck.cc | ||
c-spellcheck.h | ||
c-target-def.h | ||
c-target.def | ||
c-target.h | ||
c-ubsan.c | ||
c-ubsan.h | ||
c-warn.c | ||
c.opt | ||
ChangeLog | ||
ChangeLog.gimple-classes | ||
cppspec.c | ||
known-headers.cc | ||
known-headers.h | ||
name-hint.h | ||
stub-objc.c |