@@ -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
new file mode 100644
@@ -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;
+}