re PR fortran/32942 (Wrong code with with -fdefault-integer-8)
authorSteven G. Kargl <kargl@gcc.gnu.org>
Tue, 31 Jul 2007 20:48:21 +0000 (20:48 +0000)
committerSteven G. Kargl <kargl@gcc.gnu.org>
Tue, 31 Jul 2007 20:48:21 +0000 (20:48 +0000)
2007-07-31  Steven G. Kargl  <kargl@gcc.gnu.org>

PR fortran/32942
* gfortran.dg/exponent_2.f90: New test.

2007-07-31  Steven G. Kargl  <kargl@gcc.gnu.org>

PR fortran/32942
*trans-intrinsic.c (gfc_conv_intrinsic_exponent): Convert to correct
type.

From-SVN: r127105

gcc/fortran/ChangeLog
gcc/fortran/trans-intrinsic.c
gcc/testsuite/ChangeLog
gcc/testsuite/gfortran.dg/exponent_2.f90 [new file with mode: 0644]

index 6fda297ec331caaef32d32aa203e73c49282cb7b..ce3e62cac8e6e9b757d93d1e4ccb1aa87a0c5fde 100644 (file)
@@ -1,3 +1,9 @@
+2007-07-31  Steven G. Kargl  <kargl@gcc.gnu.org>
+
+       PR fortran/32942
+       *trans-intrinsic.c (gfc_conv_intrinsic_exponent): Convert to correct
+       type.
+
 2007-07-29  Jerry DeLisle  <jvdelisle@gcc.gnu.org>
 
        * invoke.texi: Document -fsign-zero flag.
index 8f57ae17ca7286dd5458cd3737c22802fd5aaa61..578cd7f6f1290b1527a8a8b5ceb804e3b771d678 100644 (file)
@@ -718,9 +718,9 @@ gfc_conv_intrinsic_lib_function (gfc_se * se, gfc_expr * expr)
 /* Generate code for EXPONENT(X) intrinsic function.  */
 
 static void
-gfc_conv_intrinsic_exponent (gfc_se * se, gfc_expr * expr)
+gfc_conv_intrinsic_exponent (gfc_se *se, gfc_expr *expr)
 {
-  tree arg, fndecl;
+  tree arg, fndecl, type;
   gfc_expr *a1;
 
   gfc_conv_intrinsic_function_args (se, expr, &arg, 1);
@@ -744,7 +744,9 @@ gfc_conv_intrinsic_exponent (gfc_se * se, gfc_expr * expr)
       gcc_unreachable ();
     }
 
-  se->expr = build_call_expr (fndecl, 1, arg);
+  /* Convert it to the required type.  */
+  type = gfc_typenode_for_spec (&expr->ts);
+  se->expr = fold_convert (type, build_call_expr (fndecl, 1, arg));
 }
 
 /* Evaluate a single upper or lower bound.  */
@@ -2527,7 +2529,9 @@ gfc_conv_intrinsic_ishft (gfc_se * se, gfc_expr * expr)
                          build_int_cst (type, 0), tmp);
 }
 
+
 /* Circular shift.  AKA rotate or barrel shift.  */
+
 static void
 gfc_conv_intrinsic_ishftc (gfc_se * se, gfc_expr * expr)
 {
index 24c0d4bc50c5d9d38a6f45554aebd47a848185d9..4990638e685ca78ec5ae52821a71920b416e3763 100644 (file)
@@ -1,3 +1,8 @@
+2007-07-31  Steven G. Kargl  <kargl@gcc.gnu.org>
+
+       PR fortran/32942
+       * gfortran.dg/exponent_2.f90: New test.
+
 2007-07-30  Jan Sjodin  <jan.sjodin@amd.com>
 
        * gcc.dg/vect/vect-117.c: New test.
diff --git a/gcc/testsuite/gfortran.dg/exponent_2.f90 b/gcc/testsuite/gfortran.dg/exponent_2.f90
new file mode 100644 (file)
index 0000000..1b91706
--- /dev/null
@@ -0,0 +1,11 @@
+! { dg-do run }
+! { dg-options "-fdefault-integer-8" }
+! PR fortran/32942
+! Testcase contributed by Dominique d'Humieres <dominiq@lps.ens.fr>.
+integer i
+real x
+x = 3.0
+if (2 /= exponent(x)) call abort
+i = exponent (x)
+if (i /= 2) call abort
+end