From b0db0df2b2f8e152aca2c8d19643e259dab23cbb Mon Sep 17 00:00:00 2001 From: Johannes Altmanninger Date: Mon, 26 Jan 2026 18:16:53 +0800 Subject: [PATCH] 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 --- gcc/cp/typeck.cc | 1 + gcc/testsuite/g++.dg/warn/Wunused-value-2.C | 18 ++++++++++++++++++ 2 files changed, 19 insertions(+) create mode 100644 gcc/testsuite/g++.dg/warn/Wunused-value-2.C 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" } +} -- 2.47.3