Hubert,

Thanks for the code review. Over the weekend I'll try to learn a bit
more about using Phabricator, but for now I'll reply here, and attach
a new patch.

a) *_MANT_DIG < 1 --> *_MANT_DIG < 2
That is a stricter check and I agree with your rationale. Done.

b) _MIN_EXP --> FLT_MIN_EXP
Done.

c) Remove _MIN_EXP and _MIN_10_EXP FLT,DBL,LDBL comparisons
Yes, as you and Richard pointed out the added mantissa bits can
compensate for the lack of increase of the exponent.
Already fixed in http://reviews.llvm.org/rL260639.

d) *_MAX_EXP and *_MIN_EXP 2,-2 --> 1,-1
Done.

Richard, will do re: single patch for multiple files. Also, can you
close the bug report? Even if more tests for float.h get
added/changed, the original problem has been solved.

JT


On Thu, Feb 11, 2016 at 8:38 PM, Hubert Tong
<hubert.reinterpretc...@gmail.com> wrote:
> Hi Jorge,
>
> I responded to the initial commit with some comments here:
> http://reviews.llvm.org/rL260577
>
> -- HT
>
> On Thu, Feb 11, 2016 at 7:53 PM, Jorge Teixeira <j.lopes.teixe...@gmail.com>
> wrote:
>>
>> > You'll also need to change <float.h> to only provide DECIMAL_DIG in C99
>> > onwards.
>> Done!
>>
>> > All of our -std versions are that standard plus applicable Defect
>> > Reports. So -std=c89 includes TC1 and TC2, but not Amendment 1 (we
>> > have -std=c94 for that, but the only difference from our C89 mode is
>> > the addition of digraphs).
>> I'll try to find the c89 TC2 and check if anything changed regarding
>> these macros (unlikely).
>>
>> > __STRICT_ANSI__ is defined if Clang has not been asked to provide
>> > extensions (either GNU extensions, perhaps via a flag like -std=gnu99,
>> > or MS extensions), and is used by C library headers to determine that
>> > they should provide a strictly-conforming set of declarations without
>> > extensions.
>> Ok, so if !defined(__STRICT__ANSI__) clang should always expose "as
>> much as possible", including stuff from later versions of the Std.
>> and/or eventual extensions, just as it now on float.h and float.c,
>> right?
>>
>> > Testing __STDC_VERSION__ for C94 makes sense if you're trying to
>> > detect whether Amendment 1 features should be provided.
>> Since this will affect only digraphs, I guess there is no need (for
>> float.h, float.c).
>>
>> >> 3) Lastly, can you expand (...)
>> >
>> > No, it does not mean that.
>> >
>> > For PPC64, long double is (sometimes) modeled as a pair of doubles.
>> > Under that model, the smallest normalized value for long double is
>> > actually larger than the smallest normalized value for double
>> > (remember that for a normalized value with exponent E, all numbers of
>> > the form 1.XXXXX * 2^E, with the right number of mantissa digits, are
>> > exactly representable, so increasing the number of mantissa bits
>> > without changing the number of exponent bits increases the magnitude
>> > of the smallest normalized positive number).
>> >
>> > The set of values of long double in this model *is* a superset of the
>> > set of values of double.
>> >
>> I see now, and removed the bogus tests. The patch should now test
>> cleanly unless something needs DECIMAL_DIG but did not set the
>> appropriate std. level, or defined __STRICT__ANSI__.
>>
>> Thanks for the learning experience,
>>
>> JT
>>
>>
>>
>> >> From /test/Preprocessor/init.cpp:
>> >> // PPC64:#define __DBL_MIN_EXP__ (-1021)
>> >> // PPC64:#define __FLT_MIN_EXP__ (-125)
>> >> // PPC64:#define __LDBL_MIN_EXP__ (-968)
>> >>
>> >> This issue happened before
>> >> (https://lists.gnu.org/archive/html/bug-gnulib/2011-08/msg00262.html,
>> >> http://www.openwall.com/lists/musl/2013/11/15/1), but all it means is
>> >> that ppc64 is not compliant with C without soft-float. The test is
>> >> valid and should stay, and if someone tries to compile for ppc64 in
>> >> c89, c99 or c11 modes, clang should 1) use soft float (bad idea), 2)
>> >> issue a diagnostic saying that that arch cannot meet the desired C
>> >> standard without a big performance penalty - the diag should be
>> >> suppressible with some special cmd line argument.
>> >> Thus, I added the tests back and the FAIL for PPC64 for the time
>> >> being, with a comment. If you know of a way to skip only the specific
>> >> *_MIN_EXP and *_MIN_10_EXP tests, please add it, because there might
>> >> be more similar cases in the future.
>> >>
>> >> JT
>> >>
>> >> On Thu, Feb 11, 2016 at 3:04 PM, Richard Smith <rich...@metafoo.co.uk>
>> >> wrote:
>> >>> Thanks, I modified the test to also test C89 and C99 modes and
>> >>> committed this as r260577.
>> >>>
>> >>> On Thu, Feb 11, 2016 at 11:29 AM, Jorge Teixeira
>> >>> <j.lopes.teixe...@gmail.com> wrote:
>> >>>> Here is a revised test, which I renamed to c11-5_2_4_2_2p11.c instead
>> >>>> of float.c because I am only checking a subset of what the standard
>> >>>> mandates for float.h, and because there were similar precedents, like
>> >>>> test/Preprocessor/c99-*.c. Feel free to override, though.
>> >>>
>> >>> test/Preprocessor/c99-* are an aberration. The goal would be that this
>> >>> test grows to cover all of the parts of float.h that we define, so
>> >>> float.c seems like the appropriate name for it.
>> >>>
>> >>>> The first part checks for basic compliance with the referred C11
>> >>>> paragraph, the second for internal consistency between the
>> >>>> underscored
>> >>>> and exposed versions of the macros.
>> >>>> No attempt was made to support C99 or C89.
>> >>>>
>> >>>> I am not very clear on the proper use of the whole lit.py / RUN
>> >>>> framework, so someone should really confirm if what I wrote is
>> >>>> correct. The goal was to test both hosted and freestanding
>> >>>> implementations with C11, and expect no diagnostics from either.
>> >>>
>> >>> We generally avoid testing hosted mode, because we don't want the
>> >>> success of our tests to depend on the libc installed on the host
>> >>> system.
>> >>>
>> >>>> Thanks for the help,
>> >>>>
>> >>>> JT
>> >>>>
>> >>>> On Tue, Feb 9, 2016 at 5:56 PM, Richard Smith <rich...@metafoo.co.uk>
>> >>>> wrote:
>> >>>>> On Tue, Feb 9, 2016 at 2:43 PM, Jorge Teixeira
>> >>>>> <j.lopes.teixe...@gmail.com> wrote:
>> >>>>>> Richard,
>> >>>>>>
>> >>>>>> Can you be more specific?
>> >>>>>>
>> >>>>>> I assume you mean something like my newly attached .h file that
>> >>>>>> tests
>> >>>>>> very basic implementation compliance (i.e., it's required, but not
>> >>>>>> sufficient), but I would need a bit more guidance about the
>> >>>>>> structure
>> >>>>>> of the file, how to perform the tests, and where to exactly place
>> >>>>>> and
>> >>>>>> name the file within test/Headers.
>> >>>>>>
>> >>>>>> I some sort of template exists, or if someone else takes point and
>> >>>>>> makes it, I can "port" the attached p11 test cases. I am unsure of
>> >>>>>> how
>> >>>>>> to perform a more normative compliance - for example, to assert
>> >>>>>> that
>> >>>>>> LDBL_DECIMAL_DIG is 21 on x86-64 and that indeed those many digits
>> >>>>>> are
>> >>>>>> guaranteed to be correct, etc. This is probably not possible / does
>> >>>>>> not make sense.
>> >>>>>
>> >>>>> That looks like a decent basic test for this. The test should be
>> >>>>> named
>> >>>>> something like test/Headers/float.c, and needs to contain a "RUN:"
>> >>>>> line so that the test runner infrastructure knows how to run it. You
>> >>>>> can look at test/Header/limits.cpp for an example of how this works.
>> >>>>>
>> >>>>> We already have platform-specific tests that __LDBL_DECIMAL_DIG__ is
>> >>>>> the right value, so you could test the values are correct by
>> >>>>> checking
>> >>>>> that LDBL_DECIMAL_DIG == __LDBL_DECIMAL_DIG__.
>> >>>>>
>> >>>>>> JT
>> >>>>>>
>> >>>>>> On Tue, Feb 9, 2016 at 3:58 PM, Richard Smith
>> >>>>>> <rich...@metafoo.co.uk> wrote:
>> >>>>>>> Patch looks good. Please also add a testcase to test/Headers.
>> >>>>>>>
>> >>>>>>> On Tue, Feb 9, 2016 at 12:08 PM, Hubert Tong via cfe-commits
>> >>>>>>> <cfe-commits@lists.llvm.org> wrote:
>> >>>>>>>> I see no immediate issue with this patch, but I am not one of the
>> >>>>>>>> usual
>> >>>>>>>> reviewers for this part of the code base.
>> >>>>>>>>
>> >>>>>>>> -- HT
>> >>>>>>>>
>> >>>>>>>>
>> >>>>>>>> On Tue, Feb 9, 2016 at 2:56 PM, Jorge Teixeira
>> >>>>>>>> <j.lopes.teixe...@gmail.com>
>> >>>>>>>> wrote:
>> >>>>>>>>>
>> >>>>>>>>> Thanks Hubert. Somehow I omitted that prefix when typing the
>> >>>>>>>>> macros,
>> >>>>>>>>> and I did not noticed it when I was testing because on my arch
>> >>>>>>>>> DECIMAL_DIG is defined to be the LDBL version...
>> >>>>>>>>>
>> >>>>>>>>> Updated patch is attached.
>> >>>>>>>>>
>> >>>>>>>>> JT
>> >>>>>>>>>
>> >>>>>>>>> On Tue, Feb 9, 2016 at 1:41 PM, Hubert Tong
>> >>>>>>>>> <hubert.reinterpretc...@gmail.com> wrote:
>> >>>>>>>>> > There is a __LDBL_DECIMAL_DIG__ predefined macro.
>> >>>>>>>>> > __DECIMAL_DIG__ will
>> >>>>>>>>> > not
>> >>>>>>>>> > always be the same as __LDBL_DECIMAL_DIG__.
>> >>>>>>>>> >
>> >>>>>>>>> > -- HT
>> >>>>>>>>> >
>> >>>>>>>>> > On Mon, Feb 8, 2016 at 11:26 PM, Jorge Teixeira via
>> >>>>>>>>> > cfe-commits
>> >>>>>>>>> > <cfe-commits@lists.llvm.org> wrote:
>> >>>>>>>>> >>
>> >>>>>>>>> >> Hi, I filed the bug
>> >>>>>>>>> >> (https://llvm.org/bugs/show_bug.cgi?id=26283) some
>> >>>>>>>>> >> time ago and nobody picked it up, so here is a trivial patch
>> >>>>>>>>> >> exposing
>> >>>>>>>>> >> the missing macros, that to the best of my ability were
>> >>>>>>>>> >> already
>> >>>>>>>>> >> present as the internal underscored versions.
>> >>>>>>>>> >>
>> >>>>>>>>> >> Perhaps a more general bug about C11 floating point (lack of)
>> >>>>>>>>> >> conformance should be filed, so that some form of unit
>> >>>>>>>>> >> test/macro
>> >>>>>>>>> >> validation could be worked on, but this patch does scratch my
>> >>>>>>>>> >> current
>> >>>>>>>>> >> itch.
>> >>>>>>>>> >>
>> >>>>>>>>> >> Successfully tested on x86-64 Xubuntu 14.04 with clang 3.8
>> >>>>>>>>> >> from the
>> >>>>>>>>> >> ppa, patched with the attached diff.
>> >>>>>>>>> >>
>> >>>>>>>>> >> First contribution, so feel free to suggest improvements or
>> >>>>>>>>> >> point to
>> >>>>>>>>> >> more detailed step-by-step instructions/guidelines.
>> >>>>>>>>> >>
>> >>>>>>>>> >> Cheers,
>> >>>>>>>>> >>
>> >>>>>>>>> >> JT
>> >>>>>>>>> >>
>> >>>>>>>>> >> _______________________________________________
>> >>>>>>>>> >> cfe-commits mailing list
>> >>>>>>>>> >> cfe-commits@lists.llvm.org
>> >>>>>>>>> >> http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
>> >>>>>>>>> >>
>> >>>>>>>>> >
>> >>>>>>>>
>> >>>>>>>>
>> >>>>>>>>
>> >>>>>>>> _______________________________________________
>> >>>>>>>> cfe-commits mailing list
>> >>>>>>>> cfe-commits@lists.llvm.org
>> >>>>>>>> http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
>> >>>>>>>>
>
>
Index: test/Headers/float.c
===================================================================
--- test/Headers/float.c	(revision 260651)
+++ test/Headers/float.c	(working copy)
@@ -24,17 +24,17 @@
 
 #ifndef FLT_MANT_DIG
     #error "Mandatory macro FLT_MANT_DIG is missing."
-#elif   FLT_MANT_DIG < 1
+#elif   FLT_MANT_DIG < 2
     #error "Mandatory macro FLT_MANT_DIG is invalid."
 #endif
 #ifndef DBL_MANT_DIG
     #error "Mandatory macro DBL_MANT_DIG is missing."
-#elif   DBL_MANT_DIG < 1
+#elif   DBL_MANT_DIG < 2
     #error "Mandatory macro DBL_MANT_DIG is invalid."
 #endif
 #ifndef LDBL_MANT_DIG
     #error "Mandatory macro LDBL_MANT_DIG is missing."
-#elif   LDBL_MANT_DIG < 1
+#elif   LDBL_MANT_DIG < 2
     #error "Mandatory macro LDBL_MANT_DIG is invalid."
 #endif
 #if ((FLT_MANT_DIG > DBL_MANT_DIG) || (DBL_MANT_DIG > LDBL_MANT_DIG))
@@ -108,18 +108,18 @@
 
 
 #ifndef FLT_MIN_EXP
-    #error "Mandatory macro _MIN_EXP is missing."
-#elif   FLT_MIN_EXP > -2
-    #error "Mandatory macro _MIN_EXP is invalid."
+    #error "Mandatory macro FLT_MIN_EXP is missing."
+#elif   FLT_MIN_EXP > -1
+    #error "Mandatory macro FLT_MIN_EXP is invalid."
 #endif
 #ifndef DBL_MIN_EXP
     #error "Mandatory macro DBL_MIN_EXP is missing."
-#elif   DBL_MIN_EXP > -2
+#elif   DBL_MIN_EXP > -1
     #error "Mandatory macro DBL_MIN_EXP is invalid."
 #endif
 #ifndef LDBL_MIN_EXP
     #error "Mandatory macro LDBL_MIN_EXP is missing."
-#elif   LDBL_MIN_EXP > -2
+#elif   LDBL_MIN_EXP > -1
     #error "Mandatory macro LDBL_MIN_EXP is invalid."
 #endif
 
@@ -143,17 +143,17 @@
 
 #ifndef FLT_MAX_EXP
     #error "Mandatory macro FLT_MAX_EXP is missing."
-#elif   FLT_MAX_EXP < 2
+#elif   FLT_MAX_EXP < 1
     #error "Mandatory macro FLT_MAX_EXP is invalid."
 #endif
 #ifndef DBL_MAX_EXP
     #error "Mandatory macro DBL_MAX_EXP is missing."
-#elif   DBL_MAX_EXP < 2
+#elif   DBL_MAX_EXP < 1
     #error "Mandatory macro DBL_MAX_EXP is invalid."
 #endif
 #ifndef LDBL_MAX_EXP
     #error "Mandatory macro LDBL_MAX_EXP is missing."
-#elif   LDBL_MAX_EXP < 2
+#elif   LDBL_MAX_EXP < 1
     #error "Mandatory macro LDBL_MAX_EXP is invalid."
 #endif
 #if ((FLT_MAX_EXP > DBL_MAX_EXP) || (DBL_MAX_EXP > LDBL_MAX_EXP))
_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to