aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJason Merrill <jason@redhat.com>2014-04-11 14:25:13 -0400
committerJason Merrill <jason@gcc.gnu.org>2014-04-11 14:25:13 -0400
commit6415bd5d630913820a86a83683e0bcafb0cabbd4 (patch)
tree913d5e1006ddcebe2f6e8d84e965f9ddbf9973e4
parent636201978b356a45b8626fc75fc63c8c2747dce5 (diff)
downloadgcc-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/ChangeLog6
-rw-r--r--gcc/c-family/c-common.c14
-rw-r--r--gcc/testsuite/g++.dg/ext/atomic-2.C14
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);
+}