From: Johannes Altmanninger Date: Mon, 26 Jan 2026 10:16:53 +0000 (+0800) Subject: c++: -Wunused-value on ternary indexed by non-constant X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=b0db0df2b2f8e152aca2c8d19643e259dab23cbb;p=thirdparty%2Fgcc.git c++: -Wunused-value on ternary indexed by non-constant On this expression: (true ? "a" : "b")[index()] "g++ -Wunused-value" incorrectly produces warning: left operand of comma operator has no effect [-Wunused-value] From the -fdump-tree-original output: if ((void) SAVE_EXPR , 1) { (void) "a"[SAVE_EXPR ]; } else { (void) "b"[SAVE_EXPR ]; } Observe that we evaluate index() (and save it) before evaluating the ternary expression. Since "(void) SAVE_EXPR " is ostensibly side-effect free, we get this warning. Since SAVE_EXPR is not useless, this is a false positive. Also the comma operator compiler-generated, so warning about it is wrong. Suppress this warning for this implicit expression. Test that the warning is gone for "$ternary[index()]" but we still warn on cases like "$ternary[(1, 0)]". gcc/cp/ChangeLog: * typeck.cc (cp_build_array_ref): Suppress unused-value warning for implicit comma expression. gcc/testsuite/ChangeLog: * g++.dg/warn/Wunused-value-2.C: New test. Signed-off-by: Johannes Altmanninger Co-authored-by: Jason Merrill --- diff --git a/gcc/cp/typeck.cc b/gcc/cp/typeck.cc index 980f2d115a6..40bb9828bcc 100644 --- a/gcc/cp/typeck.cc +++ b/gcc/cp/typeck.cc @@ -4244,6 +4244,7 @@ cp_build_array_ref (location_t loc, tree array, tree idx, { idx = save_expr (idx); op0 = save_expr (op0); + warning_sentinel w (warn_unused_value); tree tem = build_compound_expr (loc, op0, idx); op0 = build_compound_expr (loc, tem, op0); } diff --git a/gcc/testsuite/g++.dg/warn/Wunused-value-2.C b/gcc/testsuite/g++.dg/warn/Wunused-value-2.C new file mode 100644 index 00000000000..8125aa518f0 --- /dev/null +++ b/gcc/testsuite/g++.dg/warn/Wunused-value-2.C @@ -0,0 +1,18 @@ +// { dg-do compile } +// { dg-options "-Wall" } + +static int index() { return 0; } + +volatile int global; +static int index_with_side_effect() { + global += 1; + return 0; +} + +int main(int argc, char **argv) +{ + const bool cond = argc == 10; + (void)(cond ? "" : "")[index()]; + (void)(cond ? "" : "")[index_with_side_effect()]; + (void)(cond ? "" : "")[(1, 0)]; // { dg-warning "left operand of comma operator has no effect" } +}