https://gcc.gnu.org/bugzilla/show_bug.cgi?id=84686
Bug ID: 84686
Summary: Parenthesized discarded value expression are not
evaluated with option -std=c++14
Product: gcc
Version: 8.0.1
Status: UNCONFIRMED
Severity: normal
Priority: P3
Component: c++
Assignee: unassigned at gcc dot gnu.org
Reporter: okannen at gmail dot com
Target Milestone: ---
This bug appears first in version 4.9 and is still here in version 7.3 and
above.
Compilation option: -std=c++14 or a newer c++ version.
*Description:
Evaluation of discarded value expression are not performed if the expression
is parenthesized:
volatile int i;
i; //evaluated (a load is performed)
(i); //unevaluated => the load shall be performed
(void)i; //evaluated (a load is performed)
(void)(i); //unevaluated => the load shall be performed
(void)i; //evaluated (a load is performed)
(void)(i); //unevaluated => the load shall be performed
(i,i); // the two subexpression are evaluated
((i),(i)); // no evaluation, => two loads shall happen
Remark: Clang does perform all loads.
*C++ standard requirements (N4140)
**[expr.prim.general]/6:
A parenthesized expression is a primary expression whose type and value are
identical to those of the enclosed expression. The presence of parentheses does
not affect whether the expression is an lvalue. The parenthesized expression
can be used in exactly the same contexts as those where the enclosed expression
can be used, and with the same meaning, except as otherwise indicated.
**[expr]/11:
In some contexts, an expression only appears for its side effects. Such an
expression is called a discarded-value expression. The expression is evaluated
and its value is discarded. The array-to-pointer ([conv.array]) and
function-to-pointer ([conv.func]) standard conversions are not applied. The
lvalue-to-rvalue conversion ([conv.lval]) is applied if and only if the
expression is a glvalue of volatile-qualified type and it is one of the
following:
- ( expression ), where expression is one of these expressions,
- [...]