summaryrefslogtreecommitdiffstats
path: root/clang
diff options
context:
space:
mode:
authorDavid Chisnall <csdavec@swan.ac.uk>2012-04-11 15:29:15 +0000
committerDavid Chisnall <csdavec@swan.ac.uk>2012-04-11 15:29:15 +0000
commit28397be05985863cf3915aa789e574f63204bb70 (patch)
tree39347ad9222c540d0c958ba1701fae085afca1d7 /clang
parent2335a5cb853c596ee44bae7fdaf7c2e9f2fd3b44 (diff)
downloadbcm5719-llvm-28397be05985863cf3915aa789e574f63204bb70.tar.gz
bcm5719-llvm-28397be05985863cf3915aa789e574f63204bb70.zip
Allow c++ initialisers to initialise _Atomic fields.
llvm-svn: 154499
Diffstat (limited to 'clang')
-rw-r--r--clang/lib/Sema/SemaOverload.cpp7
-rw-r--r--clang/test/CodeGenCXX/atomicinit.cpp12
2 files changed, 19 insertions, 0 deletions
diff --git a/clang/lib/Sema/SemaOverload.cpp b/clang/lib/Sema/SemaOverload.cpp
index e4c6fdfb59c..4ba25c4eeba 100644
--- a/clang/lib/Sema/SemaOverload.cpp
+++ b/clang/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<AtomicType>()) {
+ 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/clang/test/CodeGenCXX/atomicinit.cpp b/clang/test/CodeGenCXX/atomicinit.cpp
new file mode 100644
index 00000000000..17c5b62a3ac
--- /dev/null
+++ b/clang/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) {}
OpenPOWER on IntegriCloud