From 0d28487054cf399050b4535a459403a840133b4f Mon Sep 17 00:00:00 2001 From: jason Date: Fri, 11 Apr 2014 18:25:13 +0000 Subject: [PATCH] PR c++/57926 * c-common.c (sync_resolve_size, get_atomic_generic_size): Call default_conversion for an array argument. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@209316 138bc75d-0d04-0410-961f-82ee72b054a4 --- gcc/c-family/ChangeLog | 6 ++++++ gcc/c-family/c-common.c | 14 ++++++++++++++ gcc/testsuite/g++.dg/ext/atomic-2.C | 14 ++++++++++++++ 3 files changed, 34 insertions(+) create mode 100644 gcc/testsuite/g++.dg/ext/atomic-2.C diff --git a/gcc/c-family/ChangeLog b/gcc/c-family/ChangeLog index 152c3b7def3..c780dfd834f 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 03731b4b81f..1d56bc02ec8 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 00000000000..ac363eb16da --- /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); +} -- 2.11.4.GIT