Commit 93cb9a5a by Steven G. Kargl

re PR fortran/41922 (Diagnostic: No location shown for overlappingly initialized…

re PR fortran/41922 (Diagnostic: No location shown for overlappingly initialized EQUIVALENCEd character vars)

2016-07-30  Steven G. Kargl <kargl@gcc.gnu.org>

	PR fortran/41922
	* target-memory.c (expr_to_char): Pass in locus and use it in error
	messages.
	(gfc_merge_initializers): Ditto.
	* target-memory.h: Update prototype for gfc_merge_initializers ().
	* trans-common.c (get_init_field): Use the correct locus.

2016-07-30  Steven G. Kargl <kargl@gcc.gnu.org>

	PR fortran/41922
	* gfortran.dg/equiv_constraint_5.f90: Adjust the error message.
	* gfortran.dg/equiv_constraint_7.f90: Ditto.
	* gfortran.dg/pr41922.f90: New test.

From-SVN: r238915
parent 01afb976
2016-07-30 Steven G. Kargl <kargl@gcc.gnu.org> 2016-07-30 Steven G. Kargl <kargl@gcc.gnu.org>
PR fortran/41922
* target-memory.c (expr_to_char): Pass in locus and use it in error
messages.
(gfc_merge_initializers): Ditto.
* target-memory.h: Update prototype for gfc_merge_initializers ().
* trans-common.c (get_init_field): Use the correct locus.
2016-07-30 Steven G. Kargl <kargl@gcc.gnu.org>
PR fortran/68566 PR fortran/68566
* check.c (gfc_check_reshape): Check for constant expression. * check.c (gfc_check_reshape): Check for constant expression.
......
...@@ -639,7 +639,8 @@ gfc_target_interpret_expr (unsigned char *buffer, size_t buffer_size, ...@@ -639,7 +639,8 @@ gfc_target_interpret_expr (unsigned char *buffer, size_t buffer_size,
error. */ error. */
static size_t static size_t
expr_to_char (gfc_expr *e, unsigned char *data, unsigned char *chk, size_t len) expr_to_char (gfc_expr *e, locus *loc,
unsigned char *data, unsigned char *chk, size_t len)
{ {
int i; int i;
int ptr; int ptr;
...@@ -663,7 +664,7 @@ expr_to_char (gfc_expr *e, unsigned char *data, unsigned char *chk, size_t len) ...@@ -663,7 +664,7 @@ expr_to_char (gfc_expr *e, unsigned char *data, unsigned char *chk, size_t len)
continue; continue;
ptr = TREE_INT_CST_LOW(DECL_FIELD_OFFSET(cmp->backend_decl)) ptr = TREE_INT_CST_LOW(DECL_FIELD_OFFSET(cmp->backend_decl))
+ TREE_INT_CST_LOW(DECL_FIELD_BIT_OFFSET(cmp->backend_decl))/8; + TREE_INT_CST_LOW(DECL_FIELD_BIT_OFFSET(cmp->backend_decl))/8;
expr_to_char (c->expr, &data[ptr], &chk[ptr], len); expr_to_char (c->expr, loc, &data[ptr], &chk[ptr], len);
} }
return len; return len;
} }
...@@ -678,8 +679,12 @@ expr_to_char (gfc_expr *e, unsigned char *data, unsigned char *chk, size_t len) ...@@ -678,8 +679,12 @@ expr_to_char (gfc_expr *e, unsigned char *data, unsigned char *chk, size_t len)
{ {
if (chk[i] && (buffer[i] != data[i])) if (chk[i] && (buffer[i] != data[i]))
{ {
if (loc)
gfc_error ("Overlapping unequal initializers in EQUIVALENCE " gfc_error ("Overlapping unequal initializers in EQUIVALENCE "
"at %L", &e->where); "at %L", loc);
else
gfc_error ("Overlapping unequal initializers in EQUIVALENCE "
"at %C");
return 0; return 0;
} }
chk[i] = 0xFF; chk[i] = 0xFF;
...@@ -695,7 +700,8 @@ expr_to_char (gfc_expr *e, unsigned char *data, unsigned char *chk, size_t len) ...@@ -695,7 +700,8 @@ expr_to_char (gfc_expr *e, unsigned char *data, unsigned char *chk, size_t len)
the union declaration. */ the union declaration. */
size_t size_t
gfc_merge_initializers (gfc_typespec ts, gfc_expr *e, unsigned char *data, gfc_merge_initializers (gfc_typespec ts, gfc_expr *e, locus *loc,
unsigned char *data,
unsigned char *chk, size_t length) unsigned char *chk, size_t length)
{ {
size_t len = 0; size_t len = 0;
...@@ -705,8 +711,7 @@ gfc_merge_initializers (gfc_typespec ts, gfc_expr *e, unsigned char *data, ...@@ -705,8 +711,7 @@ gfc_merge_initializers (gfc_typespec ts, gfc_expr *e, unsigned char *data,
{ {
case EXPR_CONSTANT: case EXPR_CONSTANT:
case EXPR_STRUCTURE: case EXPR_STRUCTURE:
len = expr_to_char (e, &data[0], &chk[0], length); len = expr_to_char (e, loc, &data[0], &chk[0], length);
break; break;
case EXPR_ARRAY: case EXPR_ARRAY:
...@@ -718,7 +723,7 @@ gfc_merge_initializers (gfc_typespec ts, gfc_expr *e, unsigned char *data, ...@@ -718,7 +723,7 @@ gfc_merge_initializers (gfc_typespec ts, gfc_expr *e, unsigned char *data,
if (mpz_cmp_si (c->offset, 0) != 0) if (mpz_cmp_si (c->offset, 0) != 0)
len = elt_size * (size_t)mpz_get_si (c->offset); len = elt_size * (size_t)mpz_get_si (c->offset);
len = len + gfc_merge_initializers (ts, c->expr, &data[len], len = len + gfc_merge_initializers (ts, c->expr, loc, &data[len],
&chk[len], length - len); &chk[len], length - len);
} }
break; break;
......
...@@ -44,7 +44,7 @@ int gfc_interpret_derived (unsigned char *, size_t, gfc_expr *); ...@@ -44,7 +44,7 @@ int gfc_interpret_derived (unsigned char *, size_t, gfc_expr *);
int gfc_target_interpret_expr (unsigned char *, size_t, gfc_expr *, bool); int gfc_target_interpret_expr (unsigned char *, size_t, gfc_expr *, bool);
/* Merge overlapping equivalence initializers for trans-common.c. */ /* Merge overlapping equivalence initializers for trans-common.c. */
size_t gfc_merge_initializers (gfc_typespec, gfc_expr *, size_t gfc_merge_initializers (gfc_typespec, gfc_expr *, locus *,
unsigned char *, unsigned char *, unsigned char *, unsigned char *,
size_t); size_t);
......
...@@ -532,10 +532,15 @@ get_init_field (segment_info *head, tree union_type, tree *field_init, ...@@ -532,10 +532,15 @@ get_init_field (segment_info *head, tree union_type, tree *field_init,
memset (chk, '\0', (size_t)length); memset (chk, '\0', (size_t)length);
for (s = head; s; s = s->next) for (s = head; s; s = s->next)
if (s->sym->value) if (s->sym->value)
gfc_merge_initializers (s->sym->ts, s->sym->value, {
locus *loc = NULL;
if (s->sym->ns->equiv && s->sym->ns->equiv->eq)
loc = &s->sym->ns->equiv->eq->expr->where;
gfc_merge_initializers (s->sym->ts, s->sym->value, loc,
&data[s->offset], &data[s->offset],
&chk[s->offset], &chk[s->offset],
(size_t)s->length); (size_t)s->length);
}
for (i = 0; i < length; i++) for (i = 0; i < length; i++)
CONSTRUCTOR_APPEND_ELT (v, NULL, build_int_cst (type, data[i])); CONSTRUCTOR_APPEND_ELT (v, NULL, build_int_cst (type, data[i]));
......
2016-07-30 Steven G. Kargl <kargl@gcc.gnu.org> 2016-07-30 Steven G. Kargl <kargl@gcc.gnu.org>
PR fortran/41922
* gfortran.dg/equiv_constraint_5.f90: Adjust the error message.
* gfortran.dg/equiv_constraint_7.f90: Ditto.
* gfortran.dg/pr41922.f90: New test.
2016-07-30 Steven G. Kargl <kargl@gcc.gnu.org>
PR fortran/68566 PR fortran/68566
* gfortran.dg/pr68566.f90: new test. * gfortran.dg/pr68566.f90: new test.
......
...@@ -19,13 +19,13 @@ ...@@ -19,13 +19,13 @@
END TYPE T2 END TYPE T2
TYPE T3 TYPE T3
sequence sequence
integer :: i=2 ! { dg-error "Overlapping unequal initializers" } integer :: i=2
END TYPE T3 END TYPE T3
TYPE(T1) :: a1 TYPE(T1) :: a1
TYPE(T2) :: a2 TYPE(T2) :: a2
TYPE(T3) :: a3 TYPE(T3) :: a3
EQUIVALENCE (a1, a2) EQUIVALENCE (a1, a2)
EQUIVALENCE (a1, a3) EQUIVALENCE (a1, a3) ! { dg-error "Overlapping unequal initializers" }
write(6, *) a1, a2, a3 write(6, *) a1, a2, a3
END END
...@@ -5,7 +5,7 @@ ...@@ -5,7 +5,7 @@
! Started out being in BLOCK DATA; however, blockdata variables must be in ! Started out being in BLOCK DATA; however, blockdata variables must be in
! COMMON and therefore cannot have F95 style initializers.... ! COMMON and therefore cannot have F95 style initializers....
MODULE DATA MODULE DATA
INTEGER :: I=1,J=2 ! { dg-error "Overlapping unequal initializers" } INTEGER :: I=1,J=2
EQUIVALENCE(I,J) EQUIVALENCE(I,J) ! { dg-error "Overlapping unequal initializers" }
END MODULE DATA END MODULE DATA
END END
! { dg-do compile}
! { dg-options -std=gnu }
Subroutine RestoreR8Run()
Implicit NONE
Integer ISTORE
Real XSTORE
character CSTORE(8)
data cstore/8*' '/
data istore/0/
EQUIVALENCE (CSTORE(1),XSTORE,ISTORE) ! { dg-error "Overlapping unequal" }
end
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment