c++: avoid ARM -Wunused-value [PR114970]
Because of the __builtin_is_constant_evaluated, maybe_constant_init in expand_default_init fails, so the constexpr constructor isn't folded until cp_fold, which then calls cp_build_init_expr_for_ctor, which builds a COMPOUND_EXPR in case the enclosing expression is relying on the ARM behavior of returning 'this'. As in other places, avoid -Wunused-value on artificial COMPOUND_EXPR. PR c++/114970 gcc/cp/ChangeLog: * cp-gimplify.cc (cp_build_init_expr_for_ctor): Suppress warnings on return_this COMPOUND_EXPR. gcc/testsuite/ChangeLog: * g++.dg/opt/is_constant_evaluated4.C: New test.
This commit is contained in:
parent
44478b69d7
commit
4acdfb71d4
2 changed files with 25 additions and 2 deletions
|
@ -1199,8 +1199,11 @@ cp_build_init_expr_for_ctor (tree call, tree init)
|
|||
tree s = build_fold_indirect_ref_loc (loc, a);
|
||||
init = cp_build_init_expr (s, init);
|
||||
if (return_this)
|
||||
init = build2_loc (loc, COMPOUND_EXPR, TREE_TYPE (call), init,
|
||||
fold_convert_loc (loc, TREE_TYPE (call), a));
|
||||
{
|
||||
init = build2_loc (loc, COMPOUND_EXPR, TREE_TYPE (call), init,
|
||||
fold_convert_loc (loc, TREE_TYPE (call), a));
|
||||
suppress_warning (init);
|
||||
}
|
||||
return init;
|
||||
}
|
||||
|
||||
|
|
20
gcc/testsuite/g++.dg/opt/is_constant_evaluated4.C
Normal file
20
gcc/testsuite/g++.dg/opt/is_constant_evaluated4.C
Normal file
|
@ -0,0 +1,20 @@
|
|||
// PR c++/114970
|
||||
// { dg-do compile { target c++17 } }
|
||||
// { dg-additional-options "-O -Wunused-value" }
|
||||
|
||||
struct sv
|
||||
{
|
||||
const char* str;
|
||||
unsigned len;
|
||||
|
||||
constexpr sv(const char *p): str(p), len(0)
|
||||
{
|
||||
if (__builtin_is_constant_evaluated ()) { len = 42; }
|
||||
}
|
||||
};
|
||||
|
||||
int main()
|
||||
{
|
||||
sv s ("foo");
|
||||
return s.len;
|
||||
}
|
Loading…
Add table
Reference in a new issue