c++: tweak for -Wrange-loop-construct [PR116731]

This PR reports that the warning would be better off using a check
for trivially constructible rather than trivially copyable.

LLVM accepted a similar fix:
https://github.com/llvm/llvm-project/issues/47355

	PR c++/116731

gcc/cp/ChangeLog:

	* parser.cc (warn_for_range_copy): Check if TYPE is trivially
	constructible, not copyable.

gcc/testsuite/ChangeLog:

	* g++.dg/warn/Wrange-loop-construct3.C: New test.

Reviewed-by: Jason Merrill <jason@redhat.com>
This commit is contained in:
Marek Polacek 2024-09-17 16:58:37 -04:00
parent e23e5370d5
commit 6ac4e2f4b2
2 changed files with 62 additions and 3 deletions

View file

@ -14394,11 +14394,13 @@ warn_for_range_copy (tree decl, tree expr)
else if (!CP_TYPE_CONST_P (type))
return;
/* Since small trivially copyable types are cheap to copy, we suppress the
warning for them. 64B is a common size of a cache line. */
/* Since small trivially constructible types are cheap to construct, we
suppress the warning for them. 64B is a common size of a cache line. */
tree vec = make_tree_vec (1);
TREE_VEC_ELT (vec, 0) = TREE_TYPE (expr);
if (TREE_CODE (TYPE_SIZE_UNIT (type)) != INTEGER_CST
|| (tree_to_uhwi (TYPE_SIZE_UNIT (type)) <= 64
&& trivially_copyable_p (type)))
&& is_trivially_xible (INIT_EXPR, type, vec)))
return;
/* If we can initialize a reference directly, suggest that to avoid the

View file

@ -0,0 +1,57 @@
// PR c++/116731
// { dg-do compile { target c++11 } }
// { dg-options "-Wrange-loop-construct" }
void
f0 ()
{
struct S {
char a[64];
S& operator=(const S&) { return *this; };
};
S arr[8];
for (const auto r : arr)
(void) r;
}
void
f1 ()
{
struct S {
char a[65];
S& operator=(const S&) { return *this; };
};
S arr[8];
for (const auto r : arr) // { dg-warning "creates a copy" }
(void) r;
}
void
f2 ()
{
struct S {
char a[64];
S& operator=(const S&) { return *this; };
~S() { }
};
S arr[8];
for (const auto r : arr) // { dg-warning "creates a copy" }
(void) r;
}
void
f3 ()
{
struct S {
char a[65];
S& operator=(const S&) { return *this; };
~S() { }
};
S arr[8];
for (const auto r : arr) // { dg-warning "creates a copy" }
(void) r;
}