[clang] [clang] Fix 71315698c9 in presence of incomplete types (PR #114095)

Aaron Ballman via cfe-commits cfe-commits at lists.llvm.org
Tue Oct 29 10:54:54 PDT 2024


================
@@ -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


More information about the cfe-commits mailing list