[PATCH, fortran] Interoperability with C int128_t types
FX
fxcoudert@gmail.com
Wed Apr 16 11:00:00 GMT 2008
> OK for mainline?
First, I noticed you haven't CC'ed the gcc-patches list: please do
that when you submit a patch.
Second, you still haven't taken into account the requests in my
previous review, I quote:
>> You also need to add that extension in our texinfo documentation.
This is important: gcc/fortran/gfortran.texi has a section listing
extensions supported by gfortran. You need to add an item for your
extension: it needs not be long, but it needs to be there and clear.
>> Finally, when asking for approval, you should say what testing has
been done and on which target(s).
>> (For example, "bootstrapped and regtested on x86_64-linux").
You still didn't say what amount of testing was done and on which
targets. I'd expect bootstrap and regtesting on at least one target
that has 128-bit integers and one target that doesn't.
Two minor issues:
-- ChangeLog entries are usually not part of the diff, but attached
as is (or pasted in the message); it makes them easier to read.
-- ChangeLog entries for different directories that have their own
ChangeLog (like, gcc/fortran/ and gcc/testsuite/) should be clearly
separated.
Now, I come to the patch itself. I asked you:
>> Also, what happens on platforms that don't have a 128-bit integer type?
>
> On platforms that do not support 128-bit integer, it will behave the same
> as if -std=f2003 is given.
I don't see how that is possible: I would rather guess that it
C_INT128_T will be defined and have the value -2, which is actually
what it ought to be (indicating a lack of support). But my question
was: how does the testcases behave on targets that don't have 128-bit
integer type? I think gfortran.dg/c_kind_int128_test2.f03 would FAIL,
which is not what we want. You should look at
gcc/testsuite/lib/target-supports.exp to see how
check_effective_target_fortran_large_real is defined (and used, for
example, in gfortran.dg/large_real_kind_1.f90) to avoid running tests
on targets that don't support them.
As I said above, you will need to regtest your patch on a platform
that don't have 128-bit integer support (or find someone who can do it
for you), to be sure we don't introduce new failures in the testsuite.
> +static int
> +gnu_only_isocbinding (const char *name)
> +{
> +#define NAMED_INTCST(a,b,c,d) \
> + if (!strcmp (b, name)) \
> + return (d == GFC_STD_GNU);
> +#include "iso-c-binding.def"
> + return 0;
> +}
I don't think we should have string comparisons if we can avoid it.
Also, at some point, we might want to have all the characteristics of
ISO_C_BINDING symbols in a array, so they can be accessed by their
numeric ID, but for now I think we should go with the following:
static int
std_for_isocbinding_symbol (int id)
{
switch (id)
{
#define NAMED_INTCST(a,b,c,d) \
case a: \
return d;
#include "iso-c-binding.def"
#undef NAMED_INTCST
default:
return GFC_STD_F2003;
}
}
and then:
> + if (gfc_notification_std (GFC_STD_GNU) == FAILURE
> + && gnu_only_isocbinding (name))
> + return;
will be changed into:
if (gfc_notify_std (std_for_isocbinding_symbol (s),
"Extension: '%s' symbol in ISO_C_BINDING
intrinsic module at %C",
name) == FAILURE)
return;
(this is untested, but you get the idea). This changes the error
message into actually indicating that this is an extension, giving a
hint to the user on how to allow it if he needs to.
Thanks,
FX
--
FX Coudert
http://www.homepages.ucl.ac.uk/~uccafco/
More information about the Gcc-patches
mailing list