From ec33aebb1cd640f0751614ccd1b759d0f41ffb2f Mon Sep 17 00:00:00 2001 From: Jakub Jelinek Date: Tue, 12 Sep 2017 13:49:29 +0200 Subject: [PATCH] re PR target/82112 (internal compiler error: in fold_convert_loc, at fold-const.c:2262) 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: r252003 --- gcc/ChangeLog | 9 +++++++++ gcc/c-family/c-common.c | 12 ++++++++---- gcc/testsuite/ChangeLog | 6 ++++++ gcc/testsuite/c-c++-common/pr82112.c | 13 +++++++++++++ gcc/testsuite/gcc.dg/pr82112.c | 21 +++++++++++++++++++++ 5 files changed, 57 insertions(+), 4 deletions(-) create mode 100644 gcc/testsuite/c-c++-common/pr82112.c create mode 100644 gcc/testsuite/gcc.dg/pr82112.c diff --git a/gcc/ChangeLog b/gcc/ChangeLog index c150b01abd2..52085f8c16e 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,12 @@ +2017-09-12 Jakub Jelinek + + 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-09-12 Richard Biener * tree-vect-generic.c (expand_vector_operations_1): Do nothing diff --git a/gcc/c-family/c-common.c b/gcc/c-family/c-common.c index d959dbc25bb..af50cc729a2 100644 --- a/gcc/c-family/c-common.c +++ b/gcc/c-family/c-common.c @@ -6478,10 +6478,9 @@ sync_resolve_size (tree function, vec *params, bool fetch) } argtype = 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]); } @@ -6646,10 +6645,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]); } @@ -6688,6 +6686,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, diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 3eef95d887e..2c04a2de518 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,9 @@ +2017-09-12 Jakub Jelinek + + PR target/82112 + * c-c++-common/pr82112.c: New test. + * gcc.dg/pr82112.c: New test. + 2017-09-10 Eric Botcazou PR ada/79441 diff --git a/gcc/testsuite/c-c++-common/pr82112.c b/gcc/testsuite/c-c++-common/pr82112.c new file mode 100644 index 00000000000..724d74cb33d --- /dev/null +++ b/gcc/testsuite/c-c++-common/pr82112.c @@ -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 index 00000000000..4ca69195acc --- /dev/null +++ b/gcc/testsuite/gcc.dg/pr82112.c @@ -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" } */ +} -- 2.30.2