Commit 995d4d1c by Daniel Kraft Committed by Daniel Kraft

re PR fortran/46794 (ICE on valid code involving power of small integer kinds)

2010-12-04  Daniel Kraft  <d@domob.eu>

	PR fortran/46794
	* trans-expr.c (gfc_conv_power_op): Handle kind of result expression
	correctly for integer kind 1 and 2 operands.

2010-12-04  Daniel Kraft  <d@domob.eu>

	PR fortran/46794
	* gfortran.dg/power2.f90: New test.

From-SVN: r167453
parent 9b2b801a
2010-12-04 Daniel Kraft <d@domob.eu>
PR fortran/46794
* trans-expr.c (gfc_conv_power_op): Handle kind of result expression
correctly for integer kind 1 and 2 operands.
2010-12-03 Thomas Koenig <tkoenig@gcc.gnu.org> 2010-12-03 Thomas Koenig <tkoenig@gcc.gnu.org>
PR fortran/44352 PR fortran/44352
......
...@@ -976,6 +976,7 @@ gfc_conv_power_op (gfc_se * se, gfc_expr * expr) ...@@ -976,6 +976,7 @@ gfc_conv_power_op (gfc_se * se, gfc_expr * expr)
tree gfc_int4_type_node; tree gfc_int4_type_node;
int kind; int kind;
int ikind; int ikind;
int res_ikind_1, res_ikind_2;
gfc_se lse; gfc_se lse;
gfc_se rse; gfc_se rse;
tree fndecl = NULL; tree fndecl = NULL;
...@@ -996,6 +997,13 @@ gfc_conv_power_op (gfc_se * se, gfc_expr * expr) ...@@ -996,6 +997,13 @@ gfc_conv_power_op (gfc_se * se, gfc_expr * expr)
gfc_int4_type_node = gfc_get_int_type (4); gfc_int4_type_node = gfc_get_int_type (4);
/* In case of integer operands with kinds 1 or 2, we call the integer kind 4
library routine. But in the end, we have to convert the result back
if this case applies -- with res_ikind_K, we keep track whether operand K
falls into this case. */
res_ikind_1 = -1;
res_ikind_2 = -1;
kind = expr->value.op.op1->ts.kind; kind = expr->value.op.op1->ts.kind;
switch (expr->value.op.op2->ts.type) switch (expr->value.op.op2->ts.type)
{ {
...@@ -1006,6 +1014,7 @@ gfc_conv_power_op (gfc_se * se, gfc_expr * expr) ...@@ -1006,6 +1014,7 @@ gfc_conv_power_op (gfc_se * se, gfc_expr * expr)
case 1: case 1:
case 2: case 2:
rse.expr = convert (gfc_int4_type_node, rse.expr); rse.expr = convert (gfc_int4_type_node, rse.expr);
res_ikind_2 = ikind;
/* Fall through. */ /* Fall through. */
case 4: case 4:
...@@ -1028,7 +1037,10 @@ gfc_conv_power_op (gfc_se * se, gfc_expr * expr) ...@@ -1028,7 +1037,10 @@ gfc_conv_power_op (gfc_se * se, gfc_expr * expr)
case 1: case 1:
case 2: case 2:
if (expr->value.op.op1->ts.type == BT_INTEGER) if (expr->value.op.op1->ts.type == BT_INTEGER)
lse.expr = convert (gfc_int4_type_node, lse.expr); {
lse.expr = convert (gfc_int4_type_node, lse.expr);
res_ikind_1 = kind;
}
else else
gcc_unreachable (); gcc_unreachable ();
/* Fall through. */ /* Fall through. */
...@@ -1121,6 +1133,15 @@ gfc_conv_power_op (gfc_se * se, gfc_expr * expr) ...@@ -1121,6 +1133,15 @@ gfc_conv_power_op (gfc_se * se, gfc_expr * expr)
se->expr = build_call_expr_loc (input_location, se->expr = build_call_expr_loc (input_location,
fndecl, 2, lse.expr, rse.expr); fndecl, 2, lse.expr, rse.expr);
/* Convert the result back if it is of wrong integer kind. */
if (res_ikind_1 != -1 && res_ikind_2 != -1)
{
/* We want the maximum of both operand kinds as result. */
if (res_ikind_1 < res_ikind_2)
res_ikind_1 = res_ikind_2;
se->expr = convert (gfc_get_int_type (res_ikind_1), se->expr);
}
} }
......
2010-12-04 Daniel Kraft <d@domob.eu>
PR fortran/46794
* gfortran.dg/power2.f90: New test.
2010-12-03 Jakub Jelinek <jakub@redhat.com> 2010-12-03 Jakub Jelinek <jakub@redhat.com>
PR debug/46123 PR debug/46123
......
! { dg-do compile }
! PR fortran/46794
! Check that results of powers of integers with kinds 1 and 2 are
! correctly converted back; this used to ICE because a conversion
! from kind 4 to the correct one was missing.
! Contributed by Daniel Kraft, d@domob.eu.
PROGRAM main
IMPLICIT NONE
INTEGER(KIND=1) :: k1
INTEGER(KIND=2) :: k2
k1 = 1_1 + 1_1**k1
k2 = 1_2 + 1_2**k2
k2 = 1_1 + 1_1**k2
k2 = 1_1 + 1_2**k1
k2 = 1_1 + 1_2**k2
END PROGRAM main
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