From: David Chisnall Date: Wed, 11 Apr 2012 15:29:15 +0000 (+0000) Subject: Allow c++ initialisers to initialise _Atomic fields. X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=3a3c9b26ded46cb9055564adb2f48911eef84ace;p=clang Allow c++ initialisers to initialise _Atomic fields. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@154499 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/Sema/SemaOverload.cpp b/lib/Sema/SemaOverload.cpp index e4c6fdfb59..4ba25c4eeb 100644 --- a/lib/Sema/SemaOverload.cpp +++ b/lib/Sema/SemaOverload.cpp @@ -1316,6 +1316,13 @@ static bool IsStandardConversion(Sema &S, Expr* From, QualType ToType, SCS.setFromType(FromType); SCS.CopyConstructor = 0; + // Allow conversion to _Atomic types. These are C11 and are provided as an + // extension in C++ mode. + if (const AtomicType *ToAtomicType = ToType->getAs()) { + if (ToAtomicType->getValueType() == FromType) + return true; + } + // There are no standard conversions for class types in C++, so // abort early. When overloading in C, however, we do permit if (FromType->isRecordType() || ToType->isRecordType()) { diff --git a/test/CodeGenCXX/atomicinit.cpp b/test/CodeGenCXX/atomicinit.cpp new file mode 100644 index 0000000000..17c5b62a3a --- /dev/null +++ b/test/CodeGenCXX/atomicinit.cpp @@ -0,0 +1,12 @@ +// RUN: %clang_cc1 %s -emit-llvm -o - -triple=i686-apple-darwin9 | FileCheck %s +struct A { + _Atomic(int) i; + A(int j); + void v(int j); +}; +// Storing to atomic values should be atomic +// CHECK: store atomic i32 +void A::v(int j) { i = j; } +// Initialising atomic values should not be atomic +// CHECK-NOT: store atomic +A::A(int j) : i(j) {}