diff --git a/clang/lib/AST/ExprConstant.cpp b/clang/lib/AST/ExprConstant.cpp index 6bfb3a37b2433..49572b0f5869b 100644 --- a/clang/lib/AST/ExprConstant.cpp +++ b/clang/lib/AST/ExprConstant.cpp @@ -14839,6 +14839,7 @@ class AtomicExprEvaluator : switch (E->getCastKind()) { default: return ExprEvaluatorBaseTy::VisitCastExpr(E); + case CK_NullToPointer: case CK_NonAtomicToAtomic: return This ? EvaluateInPlace(Result, Info, *This, E->getSubExpr()) : Evaluate(Result, Info, E->getSubExpr()); diff --git a/clang/test/CodeGen/atomic.c b/clang/test/CodeGen/atomic.c index f232d5b63ac74..69f06eedb7caa 100644 --- a/clang/test/CodeGen/atomic.c +++ b/clang/test/CodeGen/atomic.c @@ -1,5 +1,9 @@ // RUN: %clang_cc1 %s -emit-llvm -o - -triple=i686-apple-darwin9 | FileCheck %s +// CHECK: @[[GLOB_POINTER:.+]] = internal global ptr null +// CHECK: @[[GLOB_INT:.+]] = internal global i32 0 +// CHECK: @[[GLOB_FLT:.+]] = internal global float {{[0e\+-\.]+}}, align + int atomic(void) { // non-sensical test for sync functions int old; @@ -118,3 +122,19 @@ void addrspace(int __attribute__((address_space(256))) * P) { __sync_xor_and_fetch(P, 123); // CHECK: atomicrmw xor ptr addrspace(256){{.*}}, i32 123 seq_cst, align 4 } + +// Ensure that global initialization of atomics is correct. +static _Atomic(int *) glob_pointer = (void *)0; +static _Atomic int glob_int = 0; +static _Atomic float glob_flt = 0.0f; + +void force_global_uses(void) { + (void)glob_pointer; + // CHECK: %[[LOCAL_INT:.+]] = load atomic i32, ptr @[[GLOB_POINTER]] seq_cst + // CHECK-NEXT: inttoptr i32 %[[LOCAL_INT]] to ptr + (void)glob_int; + // CHECK: load atomic i32, ptr @[[GLOB_INT]] seq_cst + (void)glob_flt; + // CHECK: %[[LOCAL_FLT:.+]] = load atomic i32, ptr @[[GLOB_FLT]] seq_cst + // CHECK-NEXT: bitcast i32 %[[LOCAL_FLT]] to float +}