[gcc r16-7093] c++: -Wunused-value on ternary indexed by non-constant
Jason Merrill
jason@gcc.gnu.org
Wed Jan 28 02:30:59 GMT 2026
https://gcc.gnu.org/g:b0db0df2b2f8e152aca2c8d19643e259dab23cbb
commit r16-7093-gb0db0df2b2f8e152aca2c8d19643e259dab23cbb
Author: Johannes Altmanninger <aclopte@gmail.com>
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 <aclopte@gmail.com>
Co-authored-by: Jason Merrill <jason@redhat.com>
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" }
+}
More information about the Gcc-cvs
mailing list