]> granicus.if.org Git - clang/commitdiff
Allow c++ initialisers to initialise _Atomic fields.
authorDavid Chisnall <csdavec@swan.ac.uk>
Wed, 11 Apr 2012 15:29:15 +0000 (15:29 +0000)
committerDavid Chisnall <csdavec@swan.ac.uk>
Wed, 11 Apr 2012 15:29:15 +0000 (15:29 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@154499 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Sema/SemaOverload.cpp
test/CodeGenCXX/atomicinit.cpp [new file with mode: 0644]

index e4c6fdfb59c2f2e870e62d267e96011993332739..4ba25c4eeba7f6769267918d3a692bca0fb2b024 100644 (file)
@@ -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/test/CodeGenCXX/atomicinit.cpp b/test/CodeGenCXX/atomicinit.cpp
new file mode 100644 (file)
index 0000000..17c5b62
--- /dev/null
@@ -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) {}