================
@@ -8900,7 +8900,8 @@ void Sema::CheckMemaccessArguments(const CallExpr *Call,
           << Call->getCallee()->getSourceRange());
     else if (const auto *RT = PointeeTy->getAs<RecordType>()) {
 
-      bool IsTriviallyCopyableCXXRecord =
+      bool MayBeTriviallyCopyableCXXRecord =
+          RT->isIncompleteType() ||
----------------
AaronBallman wrote:

So you're basically talking about this case:
```
struct S;

void foo(S *s1, S *s2) {
  memcpy(s1, s2, 10);
}

struct S {
  S(const S&);
  S& operator=(const S &);
};
```
I'm not certain that's worth splitting off as its own diagnostic as `memcpy`, 
`memset`, etc all need you to pass in a size parameter and... anything the user 
puts there in case of an incomplete type is pretty suspect. Based on that, I 
think we may *want* the diagnostic for incomplete types, but that the 
diagnostic only makes sense in C++ regardless of whether the type is complete 
or not.

However, GCC silences the diagnostic for incomplete types: 
https://godbolt.org/z/bsPnrKf19 so I may be missing some use case where this 
construct is safer than I'm thinking.

https://github.com/llvm/llvm-project/pull/114095
_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to