backport: re PR target/82112 (internal compiler error: in fold_convert_loc, at fold-const.c:2262)

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: r252803
This commit is contained in:
Jakub Jelinek 2017-09-15 13:22:57 +02:00 committed by Jakub Jelinek
parent 84b42a8f0f
commit c395cf94fc
5 changed files with 63 additions and 4 deletions

View File

@ -1,3 +1,15 @@
2017-09-15 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-09-15 Martin Liska <mliska@suse.cz>
Backport from mainline

View File

@ -6576,10 +6576,9 @@ sync_resolve_size (tree function, vec<tree, va_gc> *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]);
}
@ -6741,10 +6740,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]);
}
@ -6783,6 +6781,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,

View File

@ -1,3 +1,12 @@
2017-09-15 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-09-15 Martin Liska <mliska@suse.cz>
Backport from mainline

View File

@ -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);
}

View File

@ -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" } */
}