Commit e1633d82 by Daniel Franke

re PR fortran/29962 (Initialization expressions)

gcc/fortran:
2007-07-22  Daniel Franke  <franke.daniel@gmail.com>

	PR fortran/29962
	PR fortran/31253
	PR fortran/31265
	PR fortran/31639
	* gfortran.h (gfc_intrinsic_sym): Changed members elemental, pure,
	generic, specific, actual_ok, noreturn into bits of a bitfield, 
	added bits for inquiry, transformational, conversion.
	* check.c (non_init_transformational): Removed, removed all callers.
	* intrinsic.c (enum class): New.
	(add_sym*): Replaced argument elemetal by enum class. Changed all
	callers.
	(add_functions): Assign appropriate classes to intrinsic functions.
	(add_subroutines): Assign appropriate classes to intrinsic subroutines.
	(add_conv): Set conversion attribute.
	(gfc_init_expr_extensions): Removed, removed all callers.
	(gfc_intrinsic_func_interface): Reimplemented check for non-standard
	initializatione expressions.
	* expr.c (check_specification_function): New.
	(gfc_is_constant_expr): Added check for specification functions.
	(check_init_expr_arguments): New.
	(check_inquiry): Changed return value to MATCH, added checks for
	inquiry functions defined by F2003.
	(check_transformational): New.
	(check_null): New.
	(check_elemental): New.
	(check_conversion): New.
	(check_init_expr): Call new check functions, add more specific error
	messages.

gcc/testsuite:
2007-07-22  Daniel Franke  <franke.daniel@gmail.com>

	PR fortran/29962
	* gfortran.dg/array_initializer_1.f90: Removed warning.
	* gfortran.dg/initialization_1.f90: Adjusted messages.
	* gfortran.dg/nested_modules_6.f90: Removed warning.

	PR fortran/31253
	* gfortran.dg/initialization_7.f90: New test.

	PR fortran/31639
	* gfortran.dg/initialization_8.f90: New test.

From-SVN: r126826
parent 4195a767
......@@ -398,18 +398,6 @@ identical_dimen_shape (gfc_expr *a, int ai, gfc_expr *b, int bi)
}
/* Error return for transformational intrinsics not allowed in
initialization expressions. */
static try
non_init_transformational (void)
{
gfc_error ("transformational intrinsic '%s' at %L is not permitted "
"in an initialization expression", gfc_current_intrinsic,
gfc_current_intrinsic_where);
return FAILURE;
}
/***** Check functions *****/
/* Check subroutine suitable for intrinsics taking a real argument and
......@@ -489,9 +477,6 @@ gfc_check_all_any (gfc_expr *mask, gfc_expr *dim)
if (dim_check (dim, 1, 1) == FAILURE)
return FAILURE;
if (gfc_init_expr)
return non_init_transformational ();
return SUCCESS;
}
......@@ -809,9 +794,6 @@ gfc_check_count (gfc_expr *mask, gfc_expr *dim)
if (dim_check (dim, 1, 1) == FAILURE)
return FAILURE;
if (gfc_init_expr)
return non_init_transformational ();
return SUCCESS;
}
......@@ -835,9 +817,6 @@ gfc_check_cshift (gfc_expr *array, gfc_expr *shift, gfc_expr *dim)
if (dim_check (dim, 2, 1) == FAILURE)
return FAILURE;
if (gfc_init_expr)
return non_init_transformational ();
return SUCCESS;
}
......@@ -937,9 +916,6 @@ gfc_check_dot_product (gfc_expr *vector_a, gfc_expr *vector_b)
return FAILURE;
}
if (gfc_init_expr)
return non_init_transformational ();
return SUCCESS;
}
......@@ -975,9 +951,6 @@ gfc_check_eoshift (gfc_expr *array, gfc_expr *shift, gfc_expr *boundary,
if (dim_check (dim, 1, 1) == FAILURE)
return FAILURE;
if (gfc_init_expr)
return non_init_transformational ();
return SUCCESS;
}
......@@ -1648,9 +1621,6 @@ gfc_check_matmul (gfc_expr *matrix_a, gfc_expr *matrix_b)
return FAILURE;
}
if (gfc_init_expr)
return non_init_transformational ();
return SUCCESS;
}
......@@ -1709,9 +1679,6 @@ gfc_check_minloc_maxloc (gfc_actual_arglist *ap)
return FAILURE;
}
if (gfc_init_expr)
return non_init_transformational ();
return SUCCESS;
}
......@@ -1779,9 +1746,6 @@ gfc_check_minval_maxval (gfc_actual_arglist *ap)
|| array_check (ap->expr, 0) == FAILURE)
return FAILURE;
if (gfc_init_expr)
return non_init_transformational ();
return check_reduction (ap);
}
......@@ -1793,9 +1757,6 @@ gfc_check_product_sum (gfc_actual_arglist *ap)
|| array_check (ap->expr, 0) == FAILURE)
return FAILURE;
if (gfc_init_expr)
return non_init_transformational ();
return check_reduction (ap);
}
......@@ -1948,9 +1909,6 @@ gfc_check_pack (gfc_expr *array, gfc_expr *mask, gfc_expr *vector)
/* TODO: More constraints here. */
}
if (gfc_init_expr)
return non_init_transformational ();
return SUCCESS;
}
......@@ -2374,9 +2332,6 @@ gfc_check_spread (gfc_expr *source, gfc_expr *dim, gfc_expr *ncopies)
if (scalar_check (ncopies, 2) == FAILURE)
return FAILURE;
if (gfc_init_expr)
return non_init_transformational ();
return SUCCESS;
}
......@@ -2637,9 +2592,6 @@ gfc_check_transpose (gfc_expr *matrix)
if (rank_check (matrix, 0, 2) == FAILURE)
return FAILURE;
if (gfc_init_expr)
return non_init_transformational ();
return SUCCESS;
}
......@@ -2678,9 +2630,6 @@ gfc_check_unpack (gfc_expr *vector, gfc_expr *mask, gfc_expr *field)
if (same_type_check (vector, 0, field, 2) == FAILURE)
return FAILURE;
if (gfc_init_expr)
return non_init_transformational ();
return SUCCESS;
}
......
......@@ -1392,7 +1392,10 @@ typedef struct gfc_intrinsic_sym
const char *name, *lib_name;
gfc_intrinsic_arg *formal;
gfc_typespec ts;
int elemental, pure, generic, specific, actual_ok, standard, noreturn;
unsigned elemental:1, inquiry:1, transformational:1, pure:1,
generic:1, specific:1, actual_ok:1, noreturn:1, conversion:1;
int standard;
gfc_simplify_f simplify;
gfc_check_f check;
......
This source diff could not be displayed because it is too large. You can view the blob instead.
......@@ -12,8 +12,7 @@
real, parameter :: z(2) = x(2:3, 3) + 1
real, parameter :: r(6) = (/(x(i:i +1, i), i = 1,3)/)
real, parameter :: s(12) = (/((x(i, i:j-1:-1), i = 3,4), j = 2,3)/)
real, parameter :: t(8) = (/(z, &
real (i)**3, y(i), i = 2, 3)/) ! { dg-warning "nonstandard" }
real, parameter :: t(8) = (/(z, real (i)**3, y(i), i = 2, 3)/)
integer, parameter :: ii = 4
......
......@@ -27,8 +27,8 @@ contains
integer :: l1 = len (ch1) ! { dg-warning "assumed character length variable" }
! These are warnings because they are gfortran extensions.
integer :: m3 = size (x, 1) ! { dg-warning "Evaluation of nonstandard initialization" }
integer :: m4(2) = shape (z) ! { dg-warning "Evaluation of nonstandard initialization" }
integer :: m3 = size (x, 1) ! { dg-error "assumed size array" }
integer :: m4(2) = shape (z)
! This does not depend on non-constant properties.
real(8) :: big = huge (x)
......
! { dg-do compile }
!
! PR fortran/31253 -- ICE on invlid initialization expression
! Contributed by: Mikael Morin <mikael DOT morin AT tele2 DOT fr>
!
subroutine probleme(p)
real(kind=8), dimension(:) :: p
integer :: nx = size(p, 1) ! { dg-error "deferred array" }
integer :: nix
nix = nx
end subroutine
! { dg-do compile }
! PR fortran/31639 -- ICE on invalid initialization expression
function f()
integer :: i = irand() ! { dg-error "not permitted in an initialization expression" }
f = i
end function
......@@ -28,7 +28,7 @@ module vamp_rest
end module vamp_rest
use vamp_rest
real :: x(2, 2) = reshape ([1.,2.,3.,4.], [2,2]) ! { dg-warning "nonstandard" }
real :: x(2, 2) = reshape ([1.,2.,3.,4.], [2,2])
print *, s_last
print *, diag (x)
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