From: Jason Merrill Date: Fri, 11 Apr 2014 18:25:13 +0000 (-0400) Subject: re PR c++/57926 (Atomic functions broken with C++ but not C?) X-Git-Tag: releases/gcc-5.1.0~8174 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=6415bd5d630913820a86a83683e0bcafb0cabbd4;p=thirdparty%2Fgcc.git 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 --- diff --git a/gcc/c-family/ChangeLog b/gcc/c-family/ChangeLog index 152c3b7def33..c780dfd834f5 100644 --- a/gcc/c-family/ChangeLog +++ b/gcc/c-family/ChangeLog @@ -1,3 +1,9 @@ +2014-04-11 Jason Merrill + + 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 PR sanitizer/60745 diff --git a/gcc/c-family/c-common.c b/gcc/c-family/c-common.c index 03731b4b81f5..1d56bc02ec82 100644 --- a/gcc/c-family/c-common.c +++ b/gcc/c-family/c-common.c @@ -10202,6 +10202,13 @@ sync_resolve_size (tree function, vec *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", diff --git a/gcc/testsuite/g++.dg/ext/atomic-2.C b/gcc/testsuite/g++.dg/ext/atomic-2.C new file mode 100644 index 000000000000..ac363eb16dac --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/atomic-2.C @@ -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); +}