forked from OSchip/llvm-project
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 llvm-svn: 337410
This commit is contained in:
parent
a747d3ca60
commit
7d60a0f118
|
@ -481,6 +481,7 @@ ExprResult Sema::ImpCastExprToType(Expr *E, QualType Ty,
|
|||
case CK_ArrayToPointerDecay:
|
||||
case CK_FunctionToPointerDecay:
|
||||
case CK_ToVoid:
|
||||
case CK_NonAtomicToAtomic:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Reference in New Issue