volatile types are not trivially copyable.
PR17123. llvm-svn: 190484
This commit is contained in:
parent
de432143bd
commit
aa76981400
|
@ -1097,15 +1097,18 @@ bool QualType::isTriviallyCopyableType(ASTContext &Context) const {
|
|||
}
|
||||
}
|
||||
|
||||
// C++0x [basic.types]p9
|
||||
// C++11 [basic.types]p9
|
||||
// Scalar types, trivially copyable class types, arrays of such types, and
|
||||
// cv-qualified versions of these types are collectively called trivial
|
||||
// types.
|
||||
// non-volatile const-qualified versions of these types are collectively
|
||||
// called trivially copyable types.
|
||||
|
||||
QualType CanonicalType = getCanonicalType();
|
||||
if (CanonicalType->isDependentType())
|
||||
return false;
|
||||
|
||||
if (CanonicalType.isVolatileQualified())
|
||||
return false;
|
||||
|
||||
// Return false for incomplete types after skipping any incomplete array types
|
||||
// which are expressly allowed by the standard and thus our API.
|
||||
if (CanonicalType->isIncompleteType())
|
||||
|
|
|
@ -1038,7 +1038,8 @@ ExprResult Sema::SemaAtomicOpsOverloaded(ExprResult TheCallResult,
|
|||
return ExprError();
|
||||
}
|
||||
|
||||
if (!IsC11 && !AtomTy.isTriviallyCopyableType(Context)) {
|
||||
if (!IsC11 && !AtomTy.isTriviallyCopyableType(Context) &&
|
||||
!AtomTy->isScalarType()) {
|
||||
// For GNU atomics, require a trivially-copyable type. This is not part of
|
||||
// the GNU atomics specification, but we enforce it for sanity.
|
||||
Diag(DRE->getLocStart(), diag::err_atomic_op_needs_trivial_copy)
|
||||
|
|
|
@ -1072,6 +1072,9 @@ void is_trivially_copyable2()
|
|||
int t31[F(__is_trivially_copyable(SuperNonTrivialStruct))];
|
||||
int t32[F(__is_trivially_copyable(NonTCStruct))];
|
||||
int t33[F(__is_trivially_copyable(ExtDefaulted))];
|
||||
|
||||
int t34[T(__is_trivially_copyable(const int))];
|
||||
int t35[F(__is_trivially_copyable(volatile int))];
|
||||
}
|
||||
|
||||
struct CStruct {
|
||||
|
|
Loading…
Reference in New Issue