On Fri, Aug 23, 2019 at 02:43:42PM -0700, Jason Merrill wrote: > On 8/23/19 9:32 AM, Marek Polacek wrote: > > This patch implements another C++20 feature, partially deprecating volatile. > > You can read the proposal here: <http://wg21.link/p1152r4>. I encourage > > interested people to read the background in <http://wg21.link/p1152r0> which > > provides a lot of interesting volatile-related information. > > > > Note that P1152R4 differs slightly from what's now in the standard: the > > mention > > of "non-class type" was dropped. (Assignment to objects of a class type is > > defined by the copy/move assignment operator.) > > > > The gist is that expressions that involve both load and store of a volatile > > lvalue, such as ++ or += are deprecated, as are volatile-qualified parameter > > and return types. Chained assignments of the form "a = b = c" are also > > deprecated because there's some confusion as to if 'b' is re-read before > > storing > > the value to 'a' (GCC claims not to do it). See Annex D > > [depr.volatile.type]. > > > > [expr.ass] further says that "A simple assignment whose left operand is of > > a volatile-qualified type is deprecated unless the assignment is either > > a discarded-value expression or appears in an unevaluated context." > > and therein lies the rub. When parsing/building the MODIFY_EXPR, we don't > > know > > if the assignment's value is going to be discared. We only know that after > > mark_discarded_use has run, which for expression-statements takes place in > > finish_expr_stmt -> conver_to_void, and that is quite late. > > It wouldn't work to warn in mark_[lr]value_use?
My worry is that we might be calling those too often and generate redundant diagnostics but I'll have to play with that a bit before I can say for sure. Marek