> 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 260627) +++ test/Headers/float.c (working copy) @@ -3,9 +3,15 @@ // RUN: %clang_cc1 -fsyntax-only -verify -std=c11 -ffreestanding %s // expected-no-diagnostics -/* Basic conformance checks against the N1570 draft of C11 Std. */ +/* Basic floating point conformance checks against: + - N1570 draft of C11 Std. + - N1256 draft of C11 Std. + - http://port70.net/~nsz/c/c89/c89-draft.html draft of C89/C90 Std. +*/ /* - 5.2.4.2.2p11, pp. 30 + C11, 5.2.4.2.2p11, pp. 30 + C99, 5.2.4.2.2p9, pp. 25 + C89, 2.2.4.2 */ #include <float.h> @@ -68,10 +74,16 @@ #endif -#ifndef DECIMAL_DIG - #error "Mandatory macro DECIMAL_DIG is missing." -#elif DECIMAL_DIG < 10 - #error "Mandatory macro DECIMAL_DIG is invalid." +#if __STDC_VERSION__ >= 199901L || !defined(__STRICT_ANSI__) + #ifndef DECIMAL_DIG + #error "Mandatory macro DECIMAL_DIG is missing." + #elif DECIMAL_DIG < 10 + #error "Mandatory macro DECIMAL_DIG is invalid." + #endif +#else + #ifdef DECIMAL_DIG + #error "Macro DECIMAL_DIG should not be defined." + #endif #endif @@ -182,7 +194,9 @@ _Static_assert(LDBL_DECIMAL_DIG == __LDBL_DECIMAL_DIG__, ""); #endif +#if __STDC_VERSION__ >= 199901L || !defined(__STRICT_ANSI__) _Static_assert(DECIMAL_DIG == __DECIMAL_DIG__, ""); +#endif _Static_assert(FLT_DIG == __FLT_DIG__, ""); _Static_assert(DBL_DIG == __DBL_DIG__, "");
Index: lib/Headers/float.h =================================================================== --- lib/Headers/float.h (revision 260627) +++ lib/Headers/float.h (working copy) @@ -39,7 +39,9 @@ # undef FLT_MANT_DIG # undef DBL_MANT_DIG # undef LDBL_MANT_DIG -# undef DECIMAL_DIG +# if __STDC_VERSION__ >= 199901L || !defined(__STRICT_ANSI__) +# undef DECIMAL_DIG +# endif # undef FLT_DIG # undef DBL_DIG # undef LDBL_DIG @@ -84,7 +86,9 @@ #define DBL_MANT_DIG __DBL_MANT_DIG__ #define LDBL_MANT_DIG __LDBL_MANT_DIG__ -#define DECIMAL_DIG __DECIMAL_DIG__ +#if __STDC_VERSION__ >= 199901L || !defined(__STRICT_ANSI__) +# define DECIMAL_DIG __DECIMAL_DIG__ +#endif #define FLT_DIG __FLT_DIG__ #define DBL_DIG __DBL_DIG__
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits