Commit f5408dc3 authored by George Burgess IV's avatar George Burgess IV
Browse files

Merging r276232:

------------------------------------------------------------------------
r276232 | gbiv | 2016-07-20 20:28:13 -0700 (Wed, 20 Jul 2016) | 13 lines

[Sema] Fix PR28623.

In atomic builtins, we assumed that the LValue conversion on the first
argument would succeed. So, we would crash given code like:

```
void ovl(char);
void ovl(int);
__atomic_store_n(ovl, 0, 0);
```

This patch makes us not assume that said conversion is successful. :)

------------------------------------------------------------------------

llvm-svn: 276489
parent 765e9c1d
Loading
Loading
Loading
Loading
+5 −1
Original line number Diff line number Diff line
@@ -2399,7 +2399,11 @@ ExprResult Sema::SemaAtomicOpsOverloaded(ExprResult TheCallResult,

  // Inspect the first argument of the atomic operation.
  Expr *Ptr = TheCall->getArg(0);
  Ptr = DefaultFunctionArrayLvalueConversion(Ptr).get();
  ExprResult ConvertedPtr = DefaultFunctionArrayLvalueConversion(Ptr);
  if (ConvertedPtr.isInvalid())
    return ExprError();

  Ptr = ConvertedPtr.get();
  const PointerType *pointerType = Ptr->getType()->getAs<PointerType>();
  if (!pointerType) {
    Diag(DRE->getLocStart(), diag::err_atomic_builtin_must_be_pointer)
+9 −0
Original line number Diff line number Diff line
// 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}}
}