diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 11527685c54205956beb5927dfd908edb99f44ad..464b36dcfb544b55b4d52f52c8389d0a7b395e15 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,9 @@
+2006-03-03  Roger Sayle  <roger@eyesopen.com>
+
+	PR tree-optimization/26524
+	* tree-scalar-evolution.c (interpret_rhs_modify_expr): Use
+	fold_convert to create a constant of the appropriate type.
+
 2006-03-03  Richard Sandiford  <richard@codesourcery.com>
 
 	* doc/tm.texi: Refer to SYMBOL_REF_HAS_BLOCK_INFO_P instead of
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 6765c46e9845c4346fa4bfa4c16fe9b96030d7dc..28dcd430c22d844260989754dc0a45273fd51c65 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2006-03-03  Roger Sayle  <roger@eyesopen.com>
+
+	PR tree-optimization/26524
+	* gfortran.dg/pr26524.f: New test case.
+
 2006-03-02  Kaveh R. Ghazi  <ghazi@caip.rutgers.edu>
 
 	* g++.dg/template/repo5.C: Cleanup repo files.
diff --git a/gcc/testsuite/gfortran.dg/pr26524.f b/gcc/testsuite/gfortran.dg/pr26524.f
new file mode 100644
index 0000000000000000000000000000000000000000..3997477420dc31383eaa6a33bbba346031687a83
--- /dev/null
+++ b/gcc/testsuite/gfortran.dg/pr26524.f
@@ -0,0 +1,16 @@
+C PR tree-optimization/26524
+C { dg-do compile }
+C { dg-options "-O2 -ffast-math" }
+      SUBROUTINE CLATM5( PRTYPE, M, N, A, LDA, B, LDB, C, LDC, D, LDD,
+     $                   E, LDE, F, LDF, R, LDR, L, LDL, ALPHA, QBLCKA,
+     $                   QBLCKB )
+      COMPLEX            A( LDA, * ), B( LDB, * ), C( LDC, * ),
+     $                   L( LDL, * ), R( LDR, * )
+      COMPLEX            IMEPS, REEPS
+         DO 240 I = 1, M
+               IF( MOD( I, 2 ).NE.0 .AND. I.LT.M ) THEN
+                  A( I, I-1 ) = -IMEPS*2
+               END IF
+  240    CONTINUE
+      END
+
diff --git a/gcc/tree-scalar-evolution.c b/gcc/tree-scalar-evolution.c
index 998b6aa459f00d358401442b52ae3c22cb3ca2b5..a346aa5d9e25f3d7f5339693cd1bd9798cedd5dc 100644
--- a/gcc/tree-scalar-evolution.c
+++ b/gcc/tree-scalar-evolution.c
@@ -1647,9 +1647,9 @@ interpret_rhs_modify_expr (struct loop *loop, tree at_stmt,
       opnd10 = TREE_OPERAND (opnd1, 0);
       chrec10 = analyze_scalar_evolution (loop, opnd10);
       chrec10 = chrec_convert (type, chrec10, at_stmt);
-      res = chrec_fold_multiply (type, chrec10, SCALAR_FLOAT_TYPE_P (type)
-				  ? build_real (type, dconstm1)
-				  : build_int_cst_type (type, -1));
+      /* TYPE may be integer, real or complex, so use fold_convert.  */
+      res = chrec_fold_multiply (type, chrec10,
+				 fold_convert (type, integer_minus_one_node));
       break;
 
     case MULT_EXPR: