forked from OSchip/llvm-project
Assert that we do not try to memcpy a non-POD class type in C++. This
particular issue was the cause of the Boost.Interprocess failures, and in general will lead to horrendous, hard-to-diagnose miscompiles. The assertion itself has survives self-host and a full Boost build, so we are close to eradicating this problem in C++. Note that the assertion is *not* turned on for Objective-C++, where we still have problems with introducing memcpy's of non-POD class types. That part of the assertion will go away as soon as we fix the known issues in Objective-C++. llvm-svn: 104227
This commit is contained in:
parent
02ccd28a92
commit
f22101a059
|
@ -760,7 +760,13 @@ void CodeGenFunction::EmitAggregateCopy(llvm::Value *DestPtr,
|
|||
// Ignore empty classes in C++.
|
||||
if (getContext().getLangOptions().CPlusPlus) {
|
||||
if (const RecordType *RT = Ty->getAs<RecordType>()) {
|
||||
if (cast<CXXRecordDecl>(RT->getDecl())->isEmpty())
|
||||
CXXRecordDecl *Record = cast<CXXRecordDecl>(RT->getDecl());
|
||||
assert((Record->hasTrivialCopyConstructor() ||
|
||||
Record->hasTrivialCopyAssignment() ||
|
||||
/*FIXME!*/getContext().getLangOptions().CPlusPlus) &&
|
||||
"Trying to aggregate-copy a type without a trivial copy "
|
||||
"constructor or assignment operator");
|
||||
if (Record->isEmpty())
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue