diff options
author | Jason Merrill <jason@redhat.com> | 2014-04-11 14:25:13 -0400 |
---|---|---|
committer | Jason Merrill <jason@gcc.gnu.org> | 2014-04-11 14:25:13 -0400 |
commit | 6415bd5d630913820a86a83683e0bcafb0cabbd4 (patch) | |
tree | 913d5e1006ddcebe2f6e8d84e965f9ddbf9973e4 | |
parent | 636201978b356a45b8626fc75fc63c8c2747dce5 (diff) | |
download | gcc-6415bd5d630913820a86a83683e0bcafb0cabbd4.zip gcc-6415bd5d630913820a86a83683e0bcafb0cabbd4.tar.gz gcc-6415bd5d630913820a86a83683e0bcafb0cabbd4.tar.bz2 |
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
-rw-r--r-- | gcc/c-family/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/c-family/c-common.c | 14 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/ext/atomic-2.C | 14 |
3 files changed, 34 insertions, 0 deletions
diff --git a/gcc/c-family/ChangeLog b/gcc/c-family/ChangeLog index 152c3b7..c780dfd 100644 --- a/gcc/c-family/ChangeLog +++ b/gcc/c-family/ChangeLog @@ -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 diff --git a/gcc/c-family/c-common.c b/gcc/c-family/c-common.c index 03731b4..1d56bc0 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<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", 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 0000000..ac363eb --- /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); +} |