re PR fortran/35740 (a = conjg(transpose(a)) still gives wrong results, see bug...
authorPaul Thomas <pault@gcc.gnu.org>
Sun, 30 Mar 2008 14:13:21 +0000 (14:13 +0000)
committerPaul Thomas <pault@gcc.gnu.org>
Sun, 30 Mar 2008 14:13:21 +0000 (14:13 +0000)
2008-03-30  Paul Thomas  <pault@gcc.gnu.org>

PR fortran/35740
* resolve.c (resolve_function, resolve_call): If the procedure
is elemental do not look for noncopying intrinsics.

2008-03-30  Paul Thomas  <pault@gcc.gnu.org>

PR fortran/35740
* gfortran.dg/transpose_conjg_1.f90: New test.

From-SVN: r133729

gcc/fortran/ChangeLog
gcc/fortran/resolve.c
gcc/testsuite/ChangeLog
gcc/testsuite/gfortran.dg/transpose_conjg_1.f90 [new file with mode: 0644]

index 6615fd35051d0f513c72daaf9966e383529bdbdb..b56aa730e68e5a55b195f87bad0595dfba22e5e7 100644 (file)
@@ -1,3 +1,9 @@
+2008-03-30  Paul Thomas  <pault@gcc.gnu.org>
+
+       PR fortran/35740
+       * resolve.c (resolve_function, resolve_call): If the procedure
+       is elemental do not look for noncopying intrinsics.
+
 2008-03-29  Paul Thomas  <pault@gcc.gnu.org>
 
        PR fortran/35698
index 41b1addbab334b838c3d952b6fc78b6db963fe4e..af9ef55ce41412fa3197b3bc0245848a16061974 100644 (file)
@@ -2374,7 +2374,12 @@ resolve_function (gfc_expr *expr)
       gfc_expr_set_symbols_referenced (expr->ts.cl->length);
     }
 
-  if (t == SUCCESS)
+  if (t == SUCCESS
+       && !((expr->value.function.esym
+               && expr->value.function.esym->attr.elemental)
+                       ||
+            (expr->value.function.isym
+               && expr->value.function.isym->elemental)))
     find_noncopying_intrinsics (expr->value.function.esym,
                                expr->value.function.actual);
 
@@ -2845,7 +2850,7 @@ resolve_call (gfc_code *c)
   if (resolve_elemental_actual (NULL, c) == FAILURE)
     return FAILURE;
 
-  if (t == SUCCESS)
+  if (t == SUCCESS && !(c->resolved_sym && c->resolved_sym->attr.elemental))
     find_noncopying_intrinsics (c->resolved_sym, c->ext.actual);
   return t;
 }
index 4f4b404f6d2925dcc2af746c010fe5ac27638831..5b61aee553625563c2ee5b1218ada7dc21e02e03 100644 (file)
@@ -1,3 +1,8 @@
+2008-03-30  Paul Thomas  <pault@gcc.gnu.org>
+
+       PR fortran/35740
+       * gfortran.dg/transpose_conjg_1.f90: New test.
+
 2008-03-29  Laurent GUERBY  <laurent@guerby.net>
 
        * gnat.dg/socket2.adb: Remove since identical to socket1.adb.
diff --git a/gcc/testsuite/gfortran.dg/transpose_conjg_1.f90 b/gcc/testsuite/gfortran.dg/transpose_conjg_1.f90
new file mode 100644 (file)
index 0000000..3b28827
--- /dev/null
@@ -0,0 +1,37 @@
+!  { dg-do run }
+!  Tests the fix for PR35740, where the trick of interchanging the descriptor
+!  dimensions to implement TRANSPOSE did not work if it is an argument of
+!  an elemental function - eg. CONJG.  The fix forces a library call for such
+!  cases.  During the diagnosis of the PR, it was found that the scalarizer was
+!  completely thrown if the argument of TRANSPOSE was a non-variable
+!  expression; eg a + c below.  This is also fixed by the library call.
+!
+!  Contributed by Dominik Muth <dominik.muth@gmx.de>
+!
+program main
+  implicit none
+  complex, dimension(2,2) :: a,b,c,d
+  a(1,1) = (1.,1.)
+  a(2,1) = (2.,2.)
+  a(1,2) = (3.,3.)
+  a(2,2) = (4.,4.)
+!
+  b = a
+  b = conjg(transpose(b))
+  d = a
+  d = transpose(conjg(d))
+  if (any (b /= d)) call abort ()
+!
+  d = matmul (b,  a )
+  if (any (d /= matmul (transpose(conjg(a)), a))) call abort ()
+  if (any (d /= matmul (conjg(transpose(a)), a))) call abort ()
+!
+  c = (0.0,1.0)
+  b = conjg(transpose(a + c))
+  d = transpose(conjg(a + c))
+  if (any (b /= d)) call abort ()
+!
+  d = matmul (b,  a + c)
+  if (any (d /= matmul (transpose(conjg(a + c)), a + c))) call abort ()
+  if (any (d /= matmul (conjg(transpose(a + c)), a + c))) call abort ()
+ END program main