<div dir="ltr"><div dir="ltr"><br></div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Tue, Aug 25, 2020 at 5:52 AM Robinson, Paul via cfe-dev <<a href="mailto:cfe-dev@lists.llvm.org">cfe-dev@lists.llvm.org</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">We had someone trip over a case that reduces to this:<br>
<br>
F:\scratch>type tc6347.cpp<br>
#include <utility><br>
std::pair<unsigned, bool> data[10];<br>
void bar() {<br>
  for (const auto item : data)<br>
    (void)item.first;<br>
}<br>
<br>
F:\scratch>%wo%\clang -c -Wall tc6347.cpp<br>
tc6347.cpp:4:19: warning: loop variable 'item' of type 'const std::pair<unsigned<br>
      int, bool>' creates a copy from type 'const std::pair<unsigned int, bool>'<br>
      [-Wrange-loop-construct]<br>
  for (const auto item : data)<br>
                  ^<br>
tc6347.cpp:4:8: note: use reference type 'const std::pair<unsigned int, bool> &'<br>
      to prevent copying<br>
  for (const auto item : data)<br>
       ^~~~~~~~~~~~~~~~~<br>
                  &<br>
1 warning generated.<br>
<br>
F:\scratch><br>
<br>
<br>
This used to compile cleanly.  It turns out that the diagnostic<br>
used to be suppressed for POD types, and now it is suppressed for<br>
trivially-copyable types.<br>
<br>
So... a std::pair of two scalars is not trivially copyable?<br></blockquote><div><br>Looks like it isn't trivially copy /assignable/, but it is trivially copy constructible in both libc++ and libstdc++: <a href="https://godbolt.org/z/Md9f78">https://godbolt.org/z/Md9f78</a><br><br>So, one question (why is std::pair of two trivial types not trivially assignable?) and /probably/ one bug (why does the warning flag on a trivially copy constructible type).<br><br>From what I can tell, reading this ( <a href="https://stackoverflow.com/questions/58283694/why-is-pair-of-const-trivially-copyable-but-pair-is-not">https://stackoverflow.com/questions/58283694/why-is-pair-of-const-trivially-copyable-but-pair-is-not</a> ) and the C++17 spec, it just doesn't specify the copy and move assignment operators as defaulted, or say anything about their triviality, so they aren't trivial even for trivial types. Perhaps an oversight when thinking about the other complexities of when they shuold be deleted. </div><div><br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">
I'd have thought it would be, but then C++ is full of surprises.<br>
<br>
Thanks,<br>
--paulr<br>
<br>
_______________________________________________<br>
cfe-dev mailing list<br>
<a href="mailto:cfe-dev@lists.llvm.org" target="_blank">cfe-dev@lists.llvm.org</a><br>
<a href="https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-dev" rel="noreferrer" target="_blank">https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-dev</a><br>
</blockquote></div></div>