+2006-11-28 Paul Thomas <pault@gcc.gnu.org>
+
+ PR fortran/29976
+ * trans-expr.c (gfc_conv_missing_dummy): Remove build_int_const
+ and replace with cast to type of se->expr of integer_zero_node.
+
2006-11-28 Paul Thomas <pault@gcc.gnu.org>
PR fortran/20880
present = gfc_conv_expr_present (arg->symtree->n.sym);
tmp = build3 (COND_EXPR, TREE_TYPE (se->expr), present, se->expr,
- build_int_cst (TREE_TYPE (se->expr), 0));
+ fold_convert (TREE_TYPE (se->expr), integer_zero_node));
+
tmp = gfc_evaluate_now (tmp, &se->pre);
se->expr = tmp;
if (ts.type == BT_CHARACTER)
--- /dev/null
+! { dg-do compile }
+! Tests the fix for PR29976, in which the call to CMPLX caused an
+! ICE with an optional dummy for the imaginary part.
+!
+! Contributed by Francois-Xavier Coudert <fxcoudert@gcc.gnu.org>
+!
+SUBROUTINE pw_sumup (alpha_im)
+ REAL, INTENT(in), OPTIONAL :: alpha_im
+ COMPLEX :: my_alpha_c
+ IF (PRESENT(alpha_im)) THEN
+ my_alpha_c = CMPLX(0.,alpha_im)
+ END IF
+END SUBROUTINE pw_sumup
+
+! Check non-intrinsic functions.
+SUBROUTINE pw_sumup_2 (alpha_im)
+ REAL, INTENT(in), OPTIONAL :: alpha_im
+ COMPLEX :: my_alpha_c
+ IF (PRESENT(alpha_im)) THEN
+ my_alpha_c = MY_CMPLX(0.,alpha_im)
+ END IF
+contains
+ complex function MY_CMPLX (re, im)
+ real, intent(in) :: re
+ real, intent(in), optional :: im
+ if (present (im)) then
+ MY_CMPLX = cmplx (re, im)
+ else
+ MY_CMPLX = cmplx (re, 0.0)
+ end if
+ end function MY_CMPLX
+END SUBROUTINE pw_sumup_2