https://gcc.gnu.org/g:b0db0df2b2f8e152aca2c8d19643e259dab23cbb

commit r16-7093-gb0db0df2b2f8e152aca2c8d19643e259dab23cbb
Author: Johannes Altmanninger <[email protected]>
Date:   Mon Jan 26 18:16:53 2026 +0800

    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 <index ()>, 1)
              {
                (void) "a"[SAVE_EXPR <index ()>];
              }
            else
              {
                (void) "b"[SAVE_EXPR <index ()>];
              }
    
    Observe that we evaluate index() (and save it) before evaluating the
    ternary expression.  Since "(void) SAVE_EXPR <index ()>" 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 <[email protected]>
    Co-authored-by: Jason Merrill <[email protected]>

Diff:
---
 gcc/cp/typeck.cc                            |  1 +
 gcc/testsuite/g++.dg/warn/Wunused-value-2.C | 18 ++++++++++++++++++
 2 files changed, 19 insertions(+)

diff --git a/gcc/cp/typeck.cc b/gcc/cp/typeck.cc
index 980f2d115a66..40bb9828bcc6 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 000000000000..8125aa518f0f
--- /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" }
+}

Reply via email to