From cc76c502a761ddaee215bcbd8fe4720e46d3b9dd Mon Sep 17 00:00:00 2001 From: Jason Merrill Date: Wed, 6 Apr 2022 10:59:40 -0400 Subject: [PATCH] c++: -Wunused-value and array init [PR104702] Here, because of problems with the new warning-control code and expressions that change location, the suppress_warning on the INDIRECT_REF didn't work. Those problems still need to be worked out, but it's simple to avoid needing to use suppress_warning in the first place by using a reference instead. PR c++/104702 gcc/cp/ChangeLog: * init.cc (build_vec_init): Use a reference for the result. gcc/testsuite/ChangeLog: * g++.dg/warn/Wunused-19.C: New test. --- gcc/cp/init.cc | 5 ++--- gcc/testsuite/g++.dg/warn/Wunused-19.C | 16 ++++++++++++++++ 2 files changed, 18 insertions(+), 3 deletions(-) create mode 100644 gcc/testsuite/g++.dg/warn/Wunused-19.C diff --git a/gcc/cp/init.cc b/gcc/cp/init.cc index 01e7623..c20ed21 100644 --- a/gcc/cp/init.cc +++ b/gcc/cp/init.cc @@ -4908,10 +4908,9 @@ build_vec_init (tree base, tree maxindex, tree init, /* Now make the result have the correct type. */ if (TREE_CODE (atype) == ARRAY_TYPE) { - atype = build_pointer_type (atype); + atype = build_reference_type (atype); stmt_expr = build1 (NOP_EXPR, atype, stmt_expr); - stmt_expr = cp_build_fold_indirect_ref (stmt_expr); - suppress_warning (stmt_expr /* What warning? */); + stmt_expr = convert_from_reference (stmt_expr); } return stmt_expr; diff --git a/gcc/testsuite/g++.dg/warn/Wunused-19.C b/gcc/testsuite/g++.dg/warn/Wunused-19.C new file mode 100644 index 0000000..2fc70b0 --- /dev/null +++ b/gcc/testsuite/g++.dg/warn/Wunused-19.C @@ -0,0 +1,16 @@ +// PR c++/104702 +// { dg-additional-options "-fno-exceptions -Wunused-value" } + +struct FlyString { + FlyString(char const*); + ~FlyString(); +}; + +struct Array { FlyString __data[1]; }; + +void frobnicate(Array&); + +int main() { + Array s_reserved_words = { "" }; // { dg-bogus "value computed is not used" } + frobnicate(s_reserved_words); +} -- 2.7.4