+2008-05-14 Francois-Xavier Coudert <fxcoudert@gcc.gnu.org>
+
+ PR fortran/36186
+ * simplify.c (only_convert_cmplx_boz): New function.
+ (gfc_simplify_cmplx, gfc_simplify_complex, gfc_simplify_dcmplx):
+ Call only_convert_cmplx_boz.
+
2008-05-14 Paul Thomas <pault@gcc.gnu.org>
- PR fortran/36233
- * interface.c (compare_actual_formal): Do not check sizes if the
- actual is BT_PROCEDURE.
+ PR fortran/36233
+ * interface.c (compare_actual_formal): Do not check sizes if the
+ actual is BT_PROCEDURE.
2008-05-14 Francois-Xavier Coudert <fxcoudert@gcc.gnu.org>
}
+/* Function called when we won't simplify an expression like CMPLX (or
+ COMPLEX or DCMPLX) but still want to convert BOZ arguments. */
+
+static gfc_expr *
+only_convert_cmplx_boz (gfc_expr *x, gfc_expr *y, int kind)
+{
+ if (x->is_boz)
+ {
+ gfc_typespec ts;
+ gfc_clear_ts (&ts);
+ ts.type = BT_REAL;
+ ts.kind = kind;
+ if (!gfc_convert_boz (x, &ts))
+ return &gfc_bad_expr;
+ }
+
+ if (y && y->is_boz)
+ {
+ gfc_typespec ts;
+ gfc_clear_ts (&ts);
+ ts.type = BT_REAL;
+ ts.kind = kind;
+ if (!gfc_convert_boz (y, &ts))
+ return &gfc_bad_expr;
+ }
+
+ return NULL;
+}
+
+
gfc_expr *
gfc_simplify_cmplx (gfc_expr *x, gfc_expr *y, gfc_expr *k)
{
int kind;
- if (x->expr_type != EXPR_CONSTANT
- || (y != NULL && y->expr_type != EXPR_CONSTANT))
- return NULL;
-
kind = get_kind (BT_REAL, k, "CMPLX", gfc_default_real_kind);
if (kind == -1)
return &gfc_bad_expr;
+ if (x->expr_type != EXPR_CONSTANT
+ || (y != NULL && y->expr_type != EXPR_CONSTANT))
+ return only_convert_cmplx_boz (x, y, kind);
+
return simplify_cmplx ("CMPLX", x, y, kind);
}
{
int kind;
- if (x->expr_type != EXPR_CONSTANT
- || (y != NULL && y->expr_type != EXPR_CONSTANT))
- return NULL;
-
if (x->ts.type == BT_INTEGER)
{
if (y->ts.type == BT_INTEGER)
kind = x->ts.kind;
}
+ if (x->expr_type != EXPR_CONSTANT
+ || (y != NULL && y->expr_type != EXPR_CONSTANT))
+ return only_convert_cmplx_boz (x, y, kind);
+
return simplify_cmplx ("COMPLEX", x, y, kind);
}
if (x->expr_type != EXPR_CONSTANT
|| (y != NULL && y->expr_type != EXPR_CONSTANT))
- return NULL;
+ return only_convert_cmplx_boz (x, y, gfc_default_double_kind);
return simplify_cmplx ("DCMPLX", x, y, gfc_default_double_kind);
}
+2008-05-14 Francois-Xavier Coudert <fxcoudert@gcc.gnu.org>
+
+ PR fortran/36186
+ * gfortran.dg/boz_11.f90: New test.
+ * gfortran.dg/boz_12.f90: New test.
+
2008-05-14 Paul Thomas <pault@gcc.gnu.org>
- PR fortran/36233
- * gfortran.dg/actual_procedure_1.f90: New test
+ PR fortran/36233
+ * gfortran.dg/actual_procedure_1.f90: New test
2008-05-14 Francois-Xavier Coudert <fxcoudert@gcc.gnu.org>
--- /dev/null
+! { dg-do run }
+!
+program test0
+ implicit none
+ real, parameter :: &
+ r = transfer(int(b'01000000001010010101001111111101',kind=4),0.)
+ complex, parameter :: z = r * (0, 1.)
+ real(kind=8), parameter :: rd = dble(b'00000000000000000000000000000000&
+ &01000000001010010101001111111101')
+ complex(kind=8), parameter :: zd = (0._8, 1._8) * rd
+ integer :: x = 0
+
+ if (cmplx(b'01000000001010010101001111111101',x,4) /= r) call abort
+ if (cmplx(x,b'01000000001010010101001111111101',4) /= z) call abort
+ if (complex(b'01000000001010010101001111111101',0) /= r) call abort
+ if (complex(0,b'01000000001010010101001111111101') /= z) call abort
+
+ !if (cmplx(b'00000000000000000000000000000000&
+ ! &01000000001010010101001111111101',x,8) /= rd) call abort
+ !if (cmplx(x,b'00000000000000000000000000000000&
+ ! &01000000001010010101001111111101',8) /= zd) call abort
+ !if (dcmplx(b'00000000000000000000000000000000&
+ ! &01000000001010010101001111111101',x) /= rd) call abort
+ !if (dcmplx(x,b'00000000000000000000000000000000&
+ ! &01000000001010010101001111111101') /= zd) call abort
+
+end program test0
--- /dev/null
+! { dg-do compile }
+!
+program test
+ implicit none
+ real x4
+ double precision x8
+
+ x4 = 1.7
+ x8 = 1.7
+ write(*,*) complex(x4,z'1FFFFFFFF') ! { dg-error "too" }
+ write(*,*) cmplx(x8,z'1FFFFFFFFFFFFFFFF') ! { dg-error "too" }
+ write(*,*) complex(x8,z'1FFFFFFFFFFFFFFFF') ! { dg-error "too" }
+ write(*,*) dcmplx(x8,z'1FFFFFFFFFFFFFFFF') ! { dg-error "too" }
+end program test