Author: jfb Date: Wed Jul 18 11:01:41 2018 New Revision: 337410 URL: http://llvm.org/viewvc/llvm-project?rev=337410&view=rev Log: Support implicit _Atomic struct load / store
Summary: Using _Atomic to do implicit load / store is just a seq_cst atomic_load / atomic_store. Stores currently assert in Sema::ImpCastExprToType with 'can't implicitly cast lvalue to rvalue with this cast kind', but that's erroneous. The codegen is fine as the test shows. While investigating I found that Richard had found the problem here: https://reviews.llvm.org/D46112#1113557 <rdar://problem/40347123> Reviewers: dexonsmith Subscribers: cfe-commits, efriedma, rsmith, aaron.ballman Differential Revision: https://reviews.llvm.org/D49458 Modified: cfe/trunk/lib/Sema/Sema.cpp cfe/trunk/test/CodeGen/atomic-ops.c Modified: cfe/trunk/lib/Sema/Sema.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/Sema.cpp?rev=337410&r1=337409&r2=337410&view=diff ============================================================================== --- cfe/trunk/lib/Sema/Sema.cpp (original) +++ cfe/trunk/lib/Sema/Sema.cpp Wed Jul 18 11:01:41 2018 @@ -481,6 +481,7 @@ ExprResult Sema::ImpCastExprToType(Expr case CK_ArrayToPointerDecay: case CK_FunctionToPointerDecay: case CK_ToVoid: + case CK_NonAtomicToAtomic: break; } } Modified: cfe/trunk/test/CodeGen/atomic-ops.c URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGen/atomic-ops.c?rev=337410&r1=337409&r2=337410&view=diff ============================================================================== --- cfe/trunk/test/CodeGen/atomic-ops.c (original) +++ cfe/trunk/test/CodeGen/atomic-ops.c Wed Jul 18 11:01:41 2018 @@ -183,6 +183,18 @@ struct S { double x; }; +void implicit_store(_Atomic(struct S) *a, struct S s) { + // CHECK-LABEL: @implicit_store( + // CHECK: store atomic i64 %{{.*}}, i64* %{{.*}} seq_cst, align 8 + *a = s; +} + +struct S implicit_load(_Atomic(struct S) *a) { + // CHECK-LABEL: @implicit_load( + // CHECK: load atomic i64, i64* %{{.*}} seq_cst, align 8 + return *a; +} + struct S fd1(struct S *a) { // CHECK-LABEL: @fd1 // CHECK: [[RETVAL:%.*]] = alloca %struct.S, align 4 _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits