This is the mail archive of the fortran@gcc.gnu.org mailing list for the GNU Fortran project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: [PATCH, Fortran, pr78672, ctp1, v1] Gfortran test suite failures with a sanitized compiler


On 12/09/2016 08:49 AM, Andre Vehreschild wrote:
Hi Steve,

Oh I was totally oblivious that this is C++. It comes naturally to me. So I did not get what the problem could be. What to do about it? Are there defines that hide this?

- Andre

Am 9. Dezember 2016 17:29:16 MEZ, schrieb Steve Kargl <sgk@troutmask.apl.washington.edu>:
On Fri, Dec 09, 2016 at 11:23:02AM +0100, Andre Vehreschild wrote:
Hi Jerry,

For those of us who don't always get it, can you explain this line:

-  /* There's no ABS for HOST_WIDE_INT, so here we go. It also
takes care
-     of the asymmetric range of the integer type.  */
-  n = (unsigned HOST_WIDE_INT) (m < 0 ? -m : m);
+  n = wi::abs (wrhs).to_shwi ();                <======

I am not sure, what you expect here. Do you desire me to add a
comment to the
code or tell my intentions why I think the new line is idem-potent to
the old
one?


I think the issue here is that some who contribute to gfortran have
ZERO knowledge of C++.  The line you remove is quite clear.  The new
line is quite opaque.  As more C++ creeps into the Fortran FE, it is
likely that some may stop contributing.


The issue for me has less to do with C++ syntax and more to do with not knowing the classes available. Zooming out on the subject chunk of code:

static int
gfc_conv_cst_int_power (gfc_se * se, tree lhs, tree rhs)
{
  tree cond;
  tree tmp;
  tree type;
  tree vartmp[POWI_TABLE_SIZE];
  HOST_WIDE_INT m;
  unsigned HOST_WIDE_INT n;
  int sgn;
  wide_int wrhs = rhs;

  /* If exponent is too large, we won't expand it anyway, so don't bother
     with large integer values.  */
  if (!wi::fits_shwi_p (wrhs))
    return 0;

  m = wrhs.to_shwi ();
  /* There's no ABS for HOST_WIDE_INT, so here we go. It also takes care
     of the asymmetric range of the integer type.  */
  n = (unsigned HOST_WIDE_INT) (m < 0 ? -m : m);

We see wide_int. I was not right away familiar with where that was defined and whether it is a class or not. The :: tells me wi is a class. Then I see we have another snippet of C++ already there on trunk. So then I have to wonder where is this class defined and how do I find documentation for its methods. Then I have to either ignore it and trust it is right or spend a lot of time digging around to find the documentation. I can sort of infer it from the abbreviated function names, but really don't know it from rote.

Although C++ has its good qualities, one of the downsides is it introduces you to so much abstraction and hidden layers of functions that you are forced to find an editor or IDE with a class browser so you can find and look at the definitions. I find it ironic that the very intended concept of hiding the details actually leads to obfuscation, the unintended result, simplification leading to complexity. (As opposed to C which I can hold a small book in my hand, or a pdf file that contains all I need to know.)

And all of the above I say regarding what we do to flip a bit in an integer and cast it to a different size. ( and to stop the sanitizer from complaining )

I am forced to wonder why we are doing this exercise. Was this a false positive from the sanitizer? I am not asking you to change it. If this is the best way one can find, then it is what it is.

Jerry





Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]