re PR c++/57926 (Atomic functions broken with C++ but not C?)

PR c++/57926
	* c-common.c (sync_resolve_size, get_atomic_generic_size): Call
	default_conversion for an array argument.

From-SVN: r209316
This commit is contained in:
Jason Merrill 2014-04-11 14:25:13 -04:00 committed by Jason Merrill
parent 636201978b
commit 6415bd5d63
3 changed files with 34 additions and 0 deletions

View File

@ -1,3 +1,9 @@
2014-04-11 Jason Merrill <jason@redhat.com>
PR c++/57926
* c-common.c (sync_resolve_size, get_atomic_generic_size): Call
default_conversion for an array argument.
2014-04-08 Marek Polacek <polacek@redhat.com>
PR sanitizer/60745

View File

@ -10202,6 +10202,13 @@ sync_resolve_size (tree function, vec<tree, va_gc> *params)
}
type = TREE_TYPE ((*params)[0]);
if (TREE_CODE (type) == ARRAY_TYPE)
{
/* Force array-to-pointer decay for C++. */
gcc_assert (c_dialect_cxx());
(*params)[0] = default_conversion ((*params)[0]);
type = TREE_TYPE ((*params)[0]);
}
if (TREE_CODE (type) != POINTER_TYPE)
goto incompatible;
@ -10353,6 +10360,13 @@ get_atomic_generic_size (location_t loc, tree function,
/* Get type of first parameter, and determine its size. */
type_0 = TREE_TYPE ((*params)[0]);
if (TREE_CODE (type_0) == ARRAY_TYPE)
{
/* Force array-to-pointer decay for C++. */
gcc_assert (c_dialect_cxx());
(*params)[0] = default_conversion ((*params)[0]);
type_0 = TREE_TYPE ((*params)[0]);
}
if (TREE_CODE (type_0) != POINTER_TYPE || VOID_TYPE_P (TREE_TYPE (type_0)))
{
error_at (loc, "argument 1 of %qE must be a non-void pointer type",

View File

@ -0,0 +1,14 @@
// PR c++/57926
long Mutex[1];
int AcquireLogMutex(void)
{
return __atomic_exchange_n(Mutex, 1, __ATOMIC_SEQ_CST);
}
void ReleaseLogMutex(void)
{
long i = 0;
__atomic_store(Mutex, &i, __ATOMIC_SEQ_CST);
}