llvm/clang/test/SemaCXX/atomic-ops.cpp

// RUN: %clang_cc1 %s -verify -fsyntax-only -triple=i686-linux-gnu -std=c++11

// We crashed when we couldn't properly convert the first arg of __atomic_* to
// an lvalue.
void PR28623() {
  void helper(int); // expected-note{{target}}
  void helper(char); // expected-note{{target}}
  __atomic_store_n(helper, 0, 0); // expected-error{{reference to overloaded function could not be resolved}}
}

template<typename>
struct X {
  char arr[1];
};

extern X<void>* p, *q;

// They should be accepted.
void f() {
  __atomic_exchange(p, p, q, __ATOMIC_RELAXED);
  __atomic_load(p, p, __ATOMIC_RELAXED);
  __atomic_store(p, p, __ATOMIC_RELAXED);
  __atomic_compare_exchange(p, p, q, 0, __ATOMIC_RELAXED, __ATOMIC_RELAXED);
}