[PATCH] Fortran: fix passing of optional dummy as actual to optional argument [PR55978]

2024-06-23 Thread Harald Anlauf
Dear all,

the attached patch fixes issues exhibited by the testcase in comment#19 of 
PR55978.

First, when passing an allocatable optional dummy array to an optional dummy,
we need to prevent accessing the data component of the array when the argument
is not present, and pass a null pointer instead.  This is straightforward.

Second, the case of a missing pointer optional dummy array should have worked,
but the presence check surprisingly did not work as expected at -O0 or -Og,
but at higher optimization levels.  Interestingly, the dump-tree looked right,
but running under gdb or investigating the assembler revealed that the order
of tests in a logical AND expression was opposed to what the tree-dump looked
like.  Replacing TRUTH_AND_EXPR by TRUTH_ANDIF_EXPR and checking the optimized
dump confirmed that this does fix the issue.

Note that the tree-dump is not changed by this replacement.  Does this mean
thar AND and ANDIF currently are not differentiated at this level?

Regtested on x86_64-pc-linux-gnu.  OK for mainline?

Would it be ok to backport this to 14-branch, too?

Thanks,
Harald

From 94e4c66d8374a12be38637620f362acf1fba5343 Mon Sep 17 00:00:00 2001
From: Harald Anlauf 
Date: Sun, 23 Jun 2024 22:36:43 +0200
Subject: [PATCH] Fortran: fix passing of optional dummy as actual to optional
 argument [PR55978]

gcc/fortran/ChangeLog:

	PR fortran/55978
	* trans-array.cc (gfc_conv_array_parameter): Do not dereference
	data component of a missing allocatable dummy array argument for
	passing as actual to optional dummy.  Harden logic of presence
	check for optional pointer dummy by using TRUTH_ANDIF_EXPR instead
	of TRUTH_AND_EXPR.

gcc/testsuite/ChangeLog:

	PR fortran/55978
	* gfortran.dg/optional_absent_12.f90: New test.
---
 gcc/fortran/trans-array.cc| 20 ++---
 .../gfortran.dg/optional_absent_12.f90| 30 +++
 2 files changed, 46 insertions(+), 4 deletions(-)
 create mode 100644 gcc/testsuite/gfortran.dg/optional_absent_12.f90

diff --git a/gcc/fortran/trans-array.cc b/gcc/fortran/trans-array.cc
index 19d69aec9c0..26237f43bec 100644
--- a/gcc/fortran/trans-array.cc
+++ b/gcc/fortran/trans-array.cc
@@ -8703,6 +8703,10 @@ gfc_conv_array_parameter (gfc_se * se, gfc_expr * expr, bool g77,
 	&& (sym->backend_decl != parent))
 this_array_result = false;

+  /* Passing an optional dummy argument as actual to an optional dummy?  */
+  bool pass_optional;
+  pass_optional = fsym && fsym->attr.optional && sym && sym->attr.optional;
+
   /* Passing address of the array if it is not pointer or assumed-shape.  */
   if (full_array_var && g77 && !this_array_result
   && sym->ts.type != BT_DERIVED && sym->ts.type != BT_CLASS)
@@ -8740,6 +8744,14 @@ gfc_conv_array_parameter (gfc_se * se, gfc_expr * expr, bool g77,
 	  if (size)
 	array_parameter_size (&se->pre, tmp, expr, size);
 	  se->expr = gfc_conv_array_data (tmp);
+	  if (pass_optional)
+	{
+	  tree cond = gfc_conv_expr_present (sym);
+	  se->expr = build3_loc (input_location, COND_EXPR,
+ TREE_TYPE (se->expr), cond, se->expr,
+ fold_convert (TREE_TYPE (se->expr),
+		   null_pointer_node));
+	}
   return;
 }
 }
@@ -8989,8 +9001,8 @@ gfc_conv_array_parameter (gfc_se * se, gfc_expr * expr, bool g77,
 	  tmp = fold_build2_loc (input_location, NE_EXPR, logical_type_node,
  fold_convert (TREE_TYPE (tmp), ptr), tmp);

-	  if (fsym && fsym->attr.optional && sym && sym->attr.optional)
-	tmp = fold_build2_loc (input_location, TRUTH_AND_EXPR,
+	  if (pass_optional)
+	tmp = fold_build2_loc (input_location, TRUTH_ANDIF_EXPR,
    logical_type_node,
    gfc_conv_expr_present (sym), tmp);

@@ -9024,8 +9036,8 @@ gfc_conv_array_parameter (gfc_se * se, gfc_expr * expr, bool g77,
   tmp = fold_build2_loc (input_location, NE_EXPR, logical_type_node,
 			 fold_convert (TREE_TYPE (tmp), ptr), tmp);

-  if (fsym && fsym->attr.optional && sym && sym->attr.optional)
-	tmp = fold_build2_loc (input_location, TRUTH_AND_EXPR,
+  if (pass_optional)
+	tmp = fold_build2_loc (input_location, TRUTH_ANDIF_EXPR,
 			   logical_type_node,
 			   gfc_conv_expr_present (sym), tmp);

diff --git a/gcc/testsuite/gfortran.dg/optional_absent_12.f90 b/gcc/testsuite/gfortran.dg/optional_absent_12.f90
new file mode 100644
index 000..1e61d91fb6d
--- /dev/null
+++ b/gcc/testsuite/gfortran.dg/optional_absent_12.f90
@@ -0,0 +1,30 @@
+! { dg-do run }
+! { dg-additional-options "-fcheck=array-temps" }
+!
+! PR fortran/55978 - comment#19
+!
+! Test passing of (missing) optional dummy to optional array argument
+
+program test
+  implicit none
+  integer, pointer :: p(:) => null()
+  call one (p)
+  call one (null())
+  call one ()
+  call three ()
+contains
+  subroutine one (y)
+integer, pointer, optional, intent(in) :: y(:)
+call two (y)
+  end subroutine one
+
+  subroutine three (z)
+integer, allocatable, optional, intent(in) ::

TO DOWNLOAD FREE FORTRAN

2024-06-23 Thread ΚΩΣΤΑΣ ΚΥΡΙΑΚΟΠΟΥΛΟΣ
TO THE GNU ORGANIZATION24-6-2024


Goodmorning!I am a mechanical engineer who loves mathematics and work after
my graduate thesis in mechanical engineering with higher mathematics and
excellent knowledge of FORTRAN on  a PhD research on the exact medical
image analysis for every type of medical images per pixel for the therapy
of every kind of traumas and diseases of the human neural system and I want
to work with the compiler of Fortran.I have the prosthesis and I will do it
to inform you for every important result having to do with the potential of
the language. Can I download it for free?

SIGNATURE OF MY MESSAGE,
KOSTAS APOSTOLOS KYRIAKOPOULOS,MECHANICAL ENGINEER,GRADUATE DIPLOMA
OWNER,FIRST WITH GRADE OF DIPLOMA 8.13,UNIVERSITY OF THESSALY,MEMBER OF THE
GREEK CHAMBER OF ENGINEERS,PHD RESEARCH IN BIOMEDICAL ENGINEERING FOR THE
THERAPY OF ALL KIND OF DISEASES AND TRAUMAS OF THE HUMAN NEURAL
SYSTEM,IEEE,UNIVERSITY OF PELOPONNESUS  WITH CONTRIBUTION IN THE
IMPROVEMENT OF THE QUALITY OF LIFE OF ATHLETES OF BASKETBALL ON WHEELCHAIR
IN THE INTERNATIONAL CONFERENCE OF THE SCHOOL OF SPORTS MANAGEMENT OF THE
UNIVERSITY OF PELOPONNESUS .I HAVE ATTENDED THE UNIVERSITY OF THE
SOCIETY,THE SERIES OF LECTURE OF JEAN MONNET IN THE SCHOOL OF POLITICAL
SCIENCE AND INTERNATIONAL RELATIONS OF THE UNIVERSITY OF PELOPONNESUS.
MY ENGINEERING OFFICE ADDRESS;OMIRON 12 AND VARVOGLI
STREET-ENTRANCE,TRIPOLIS,GREECE,my mob.phone number:6989561101,MY EMAIL
ADDRESS:kostaskakour...@gmail.com


Re: Fw: Required Help/Guidance

2024-06-23 Thread Gilles Gouaillardet
According to Albert Einstein "Insanity is doing the same thing over and 
over again and expecting different results "



Your phishing attempts did not work so far, go find an other playground.

On 6/24/2024 3:22 PM, sunderchand wrote:

REMINDER 21