From: Eli Friedman Date: Wed, 11 Sep 2013 03:49:34 +0000 (+0000) Subject: volatile types are not trivially copyable. X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=a3d727ba775eaecd4fd69e1c90b81732394716a6;p=clang volatile types are not trivially copyable. PR17123. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@190484 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/AST/Type.cpp b/lib/AST/Type.cpp index 8027f52216..7421bae7bf 100644 --- a/lib/AST/Type.cpp +++ b/lib/AST/Type.cpp @@ -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()) diff --git a/lib/Sema/SemaChecking.cpp b/lib/Sema/SemaChecking.cpp index 82eca73e8c..cba5ffe5fa 100644 --- a/lib/Sema/SemaChecking.cpp +++ b/lib/Sema/SemaChecking.cpp @@ -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) diff --git a/test/SemaCXX/type-traits.cpp b/test/SemaCXX/type-traits.cpp index f9e679187d..1dc215625c 100644 --- a/test/SemaCXX/type-traits.cpp +++ b/test/SemaCXX/type-traits.cpp @@ -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 {