Re: [patch, Fortran] Enable -fwrapv for -std=legacy

2023-03-11 Thread Thomas Koenig via Fortran

Hi Richard,


Since this appeared only in gcc13, I see no need for a backport.
I will also document this in the changes file.

The „problem“


It's a real problem, I am afraid...


is latent forever, I’m not sure it’s good to amend the kitchen-sink >std=legacy 
option with -fwrapv since that has quite some negative
effects on optimization.


So, what are the options?

Do nothing, and get silent bad results. I do not think we can do this,
there is too much code out there.  Just look at Numerical Recipes, which
has this kind of random number generator.

Apply the patch (with spelling fixes).  This has the drawback that
you outlined, potential impact on optimization.

Put a warning in the release notes.  This will not help in general
because 99.99% of users will not read it.

Revert the patch exposing the problem.  No.  That would pessimize
everything.

Put the optimization behind a special flag.  That also makes no sense,
-fwrapv does the job.

Would it be possible to add a warning?  Anything of the sort

a = b + c * a

where b and c are larger than (in this case) 16 bits could be flagged.

Other options?

Best regards

Thomas


[PATCH, pushed] Fortran: fix bounds check for copying of class expressions [PR106945]

2023-03-11 Thread Harald Anlauf via Fortran
Dear all,

I've committed the attached patch to mainline as obvious after
regtesting on x86_64-pc-linux-gnu.

https://gcc.gnu.org/g:2cf5f485e0351bb1faf46196a99e524688f3966e

commit r13-6605-g2cf5f485e0351bb1faf46196a99e524688f3966e
Author: Harald Anlauf 
Date:   Sat Mar 11 15:37:37 2023 +0100

Fortran: fix bounds check for copying of class expressions [PR106945]

In the bounds check for copying of class expressions, the number of elements
determined from a descriptor, returned as type gfc_array_index_type (i.e. a
signed type), should be converted to the type of the passed element count,
which is of type size_type_node (i.e. unsigned), for use in comparisons.

gcc/fortran/ChangeLog:

PR fortran/106945
* trans-expr.cc (gfc_copy_class_to_class): Convert element counts in
bounds check to common type for comparison.

gcc/testsuite/ChangeLog:

PR fortran/106945
* gfortran.dg/pr106945.f90: New test.


The PR is marked as a 10/11/12/13 regression, and given its simplicity,
it should qualify for backports.

Thanks,
Harald

From 2cf5f485e0351bb1faf46196a99e524688f3966e Mon Sep 17 00:00:00 2001
From: Harald Anlauf 
Date: Sat, 11 Mar 2023 15:37:37 +0100
Subject: [PATCH] Fortran: fix bounds check for copying of class expressions
 [PR106945]

In the bounds check for copying of class expressions, the number of elements
determined from a descriptor, returned as type gfc_array_index_type (i.e. a
signed type), should be converted to the type of the passed element count,
which is of type size_type_node (i.e. unsigned), for use in comparisons.

gcc/fortran/ChangeLog:

	PR fortran/106945
	* trans-expr.cc (gfc_copy_class_to_class): Convert element counts in
	bounds check to common type for comparison.

gcc/testsuite/ChangeLog:

	PR fortran/106945
	* gfortran.dg/pr106945.f90: New test.
---
 gcc/fortran/trans-expr.cc  |  1 +
 gcc/testsuite/gfortran.dg/pr106945.f90 | 11 +++
 2 files changed, 12 insertions(+)
 create mode 100644 gcc/testsuite/gfortran.dg/pr106945.f90

diff --git a/gcc/fortran/trans-expr.cc b/gcc/fortran/trans-expr.cc
index 045c8b00b90..dcd39f46776 100644
--- a/gcc/fortran/trans-expr.cc
+++ b/gcc/fortran/trans-expr.cc
@@ -1531,6 +1531,7 @@ gfc_copy_class_to_class (tree from, tree to, tree nelems, bool unlimited)
 	name = (const char *)(DECL_NAME (to)->identifier.id.str);

 	  from_len = gfc_conv_descriptor_size (from_data, 1);
+	  from_len = fold_convert (TREE_TYPE (orig_nelems), from_len);
 	  tmp = fold_build2_loc (input_location, NE_EXPR,
   logical_type_node, from_len, orig_nelems);
 	  msg = xasprintf ("Array bound mismatch for dimension %d "
diff --git a/gcc/testsuite/gfortran.dg/pr106945.f90 b/gcc/testsuite/gfortran.dg/pr106945.f90
new file mode 100644
index 000..e760ca7d27f
--- /dev/null
+++ b/gcc/testsuite/gfortran.dg/pr106945.f90
@@ -0,0 +1,11 @@
+! { dg-do compile }
+! { dg-options "-fcoarray=single -fcheck=bounds -ftrapv" }
+! PR fortran/106945
+! Contributed by G. Steinmetz
+
+module m
+  implicit none
+  type t
+ class(*), allocatable :: a[:]
+  end type
+end
--
2.35.3