]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
backport: re PR target/82112 (internal compiler error: in fold_convert_loc, at fold...
authorJakub Jelinek <jakub@redhat.com>
Sat, 16 Sep 2017 18:39:47 +0000 (20:39 +0200)
committerJakub Jelinek <jakub@gcc.gnu.org>
Sat, 16 Sep 2017 18:39:47 +0000 (20:39 +0200)
Backported from mainline
2017-09-12  Jakub Jelinek  <jakub@redhat.com>

PR target/82112
* c-common.c (sync_resolve_size): Instead of c_dialect_cxx ()
assertion check that in the condition.
(get_atomic_generic_size): Likewise.  Before testing if parameter
has pointer type, if it has array type, call for C++
default_conversion to perform array-to-pointer conversion.

* c-c++-common/pr82112.c: New test.
* gcc.dg/pr82112.c: New test.

From-SVN: r252886

gcc/c-family/ChangeLog
gcc/c-family/c-common.c
gcc/testsuite/ChangeLog
gcc/testsuite/c-c++-common/pr82112.c [new file with mode: 0644]
gcc/testsuite/gcc.dg/pr82112.c [new file with mode: 0644]

index bbe467d3adfee5b11da99f11fc01e5e7e30419fe..1d3f3bbe22bf033f257e8d427401cc118365e6c5 100644 (file)
@@ -1,6 +1,15 @@
 2017-09-16  Jakub Jelinek  <jakub@redhat.com>
 
        Backported from mainline
+       2017-09-12  Jakub Jelinek  <jakub@redhat.com>
+
+       PR target/82112
+       * c-common.c (sync_resolve_size): Instead of c_dialect_cxx ()
+       assertion check that in the condition.
+       (get_atomic_generic_size): Likewise.  Before testing if parameter
+       has pointer type, if it has array type, call for C++
+       default_conversion to perform array-to-pointer conversion.
+
        2017-07-27  Jakub Jelinek  <jakub@redhat.com>
 
        PR c/45784
index 35245703202e0d85155c4c18af5c03358af653b6..4a1c2e41f99f59e4bd3d4d23dea8d927b5898ab3 100644 (file)
@@ -10534,10 +10534,9 @@ sync_resolve_size (tree function, vec<tree, va_gc> *params)
     }
 
   type = TREE_TYPE ((*params)[0]);
-  if (TREE_CODE (type) == ARRAY_TYPE)
+  if (TREE_CODE (type) == ARRAY_TYPE && c_dialect_cxx ())
     {
       /* Force array-to-pointer decay for C++.  */
-      gcc_assert (c_dialect_cxx());
       (*params)[0] = default_conversion ((*params)[0]);
       type = TREE_TYPE ((*params)[0]);
     }
@@ -10692,10 +10691,9 @@ 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)
+  if (TREE_CODE (type_0) == ARRAY_TYPE && c_dialect_cxx ())
     {
       /* Force array-to-pointer decay for C++.  */
-      gcc_assert (c_dialect_cxx());
       (*params)[0] = default_conversion ((*params)[0]);
       type_0 = TREE_TYPE ((*params)[0]);
     }
@@ -10734,6 +10732,12 @@ get_atomic_generic_size (location_t loc, tree function,
       /* __atomic_compare_exchange has a bool in the 4th position, skip it.  */
       if (n_param == 6 && x == 3)
         continue;
+      if (TREE_CODE (type) == ARRAY_TYPE && c_dialect_cxx ())
+       {
+         /* Force array-to-pointer decay for C++.  */
+         (*params)[x] = default_conversion ((*params)[x]);
+         type = TREE_TYPE ((*params)[x]);
+       }
       if (!POINTER_TYPE_P (type))
        {
          error_at (loc, "argument %d of %qE must be a pointer type", x + 1,
index 853812a487d9c9a03cb932379f3320c54379fc0d..be66391fb7d1d17f88ca8a2d5b2e4ba513badb0d 100644 (file)
@@ -1,6 +1,12 @@
 2017-09-16  Jakub Jelinek  <jakub@redhat.com>
 
        Backported from mainline
+       2017-09-12  Jakub Jelinek  <jakub@redhat.com>
+
+       PR target/82112
+       * c-c++-common/pr82112.c: New test.
+       * gcc.dg/pr82112.c: New test.
+
        2017-08-08  Richard Biener  <rguenther@suse.de>
 
        PR middle-end/81766
diff --git a/gcc/testsuite/c-c++-common/pr82112.c b/gcc/testsuite/c-c++-common/pr82112.c
new file mode 100644 (file)
index 0000000..724d74c
--- /dev/null
@@ -0,0 +1,13 @@
+/* PR target/82112 */
+/* { dg-do compile } */
+
+int c[10], d[10], e[10], f[10], g[10], h[10], i[10], j[10], k[10], l[10];
+
+void
+foo (void)
+{
+  __atomic_load (c, d, __ATOMIC_ACQUIRE);
+  __atomic_store (e, f, __ATOMIC_SEQ_CST);
+  __atomic_exchange (g, h, i, __ATOMIC_RELAXED);
+  __atomic_compare_exchange (j, k, l, 1, __ATOMIC_RELAXED, __ATOMIC_RELAXED);
+}
diff --git a/gcc/testsuite/gcc.dg/pr82112.c b/gcc/testsuite/gcc.dg/pr82112.c
new file mode 100644 (file)
index 0000000..4ca6919
--- /dev/null
@@ -0,0 +1,21 @@
+/* PR target/82112 */
+/* { dg-do compile } */
+/* { dg-options "-std=gnu90" } */
+
+struct S { int a[10]; } bar (void);
+int b, c;
+
+void
+foo (void)
+{
+  __atomic_load (bar ().a, &b, __ATOMIC_ACQUIRE);      /* { dg-error "argument 1 of .__atomic_load. must be a non-void pointer type" } */
+  __atomic_load (&b, bar ().a, __ATOMIC_ACQUIRE);      /* { dg-error "argument 2 of .__atomic_load. must be a pointer type" } */
+  __atomic_store (bar ().a, &b, __ATOMIC_SEQ_CST);     /* { dg-error "argument 1 of .__atomic_store. must be a non-void pointer type" } */
+  __atomic_store (&b, bar ().a, __ATOMIC_SEQ_CST);     /* { dg-error "argument 2 of .__atomic_store. must be a pointer type" } */
+  __atomic_exchange (bar ().a, &b, &c, __ATOMIC_RELAXED);      /* { dg-error "argument 1 of .__atomic_exchange. must be a non-void pointer type" } */
+  __atomic_exchange (&b, bar ().a, &c, __ATOMIC_RELAXED);      /* { dg-error "argument 2 of .__atomic_exchange. must be a pointer type" } */
+  __atomic_exchange (&b, &c, bar ().a, __ATOMIC_RELAXED);      /* { dg-error "argument 3 of .__atomic_exchange. must be a pointer type" } */
+  __atomic_compare_exchange (bar ().a, &b, &c, 1, __ATOMIC_RELAXED, __ATOMIC_RELAXED); /* { dg-error "argument 1 of .__atomic_compare_exchange. must be a non-void pointer type" } */
+  __atomic_compare_exchange (&b, bar ().a, &c, 1, __ATOMIC_RELAXED, __ATOMIC_RELAXED); /* { dg-error "argument 2 of .__atomic_compare_exchange. must be a pointer type" } */
+  __atomic_compare_exchange (&b, &c, bar ().a, 1, __ATOMIC_RELAXED, __ATOMIC_RELAXED); /* { dg-error "argument 3 of .__atomic_compare_exchange. must be a pointer type" } */
+}