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:
Douglas Gregor 2010-05-20 15:39:01 +00:00
parent 02ccd28a92
commit f22101a059
1 changed files with 7 additions and 1 deletions

View File

@ -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;
}
}