From: SF/projects/mingw n. l. <min...@li...> - 2012-01-16 18:14:06
|
Patches item #3474504, was opened at 2012-01-16 10:14 Message generated for change (Tracker Item Submitted) made by venix1 You can respond by visiting: https://sourceforge.net/tracker/?func=detail&atid=302435&aid=3474504&group_id=2435 Please note that this message will contain a full copy of the comment thread, including the initial issue submission, for this request, not just the latest update. Category: runtime Group: None Status: Open Resolution: None Priority: 5 Private: No Submitted By: Daniel Green (venix1) Assigned to: Nobody/Anonymous (nobody) Summary: Removed invalid MSVCRT correction of 'l' modifer. Initial Comment: mingwex/stdio/pformat.c treats 'l' as long double under the guise of MSVCRT compatibility. I feel this is incorrect for the following reasons: 1. MSVCRT treats long double as double. So __pformat should not need to treat 'l' as long double. 2. __pformat is used for C99 compatibility within MinGW. Supporting MSVCRT conventions should be avoided. 3. The snippet below produces incorrect output when using __pformat via -D__USE_MINGW_ANSI_STDIO. /* MSVCRT: gcc -o pformat.exe pformat.c Outputs: 12.00000 C99: gcc -o pformat.exe pformat.c -D__USE_MINGW_ANSI_STDIO Outputs: 0.000000 */ #include <stdio.h> main() { double a = 12; printf("%lf", a); } ---------------------------------------------------------------------- You can respond by visiting: https://sourceforge.net/tracker/?func=detail&atid=302435&aid=3474504&group_id=2435 |
From: SF/projects/mingw n. l. <min...@li...> - 2012-01-17 22:13:10
|
Patches item #3474504, was opened at 2012-01-16 10:14 Message generated for change (Comment added) made by venix1 You can respond by visiting: https://sourceforge.net/tracker/?func=detail&atid=302435&aid=3474504&group_id=2435 Please note that this message will contain a full copy of the comment thread, including the initial issue submission, for this request, not just the latest update. Category: runtime Group: None Status: Open Resolution: None Priority: 5 Private: No Submitted By: Daniel Green (venix1) Assigned to: Nobody/Anonymous (nobody) Summary: Removed invalid MSVCRT correction of 'l' modifer. Initial Comment: mingwex/stdio/pformat.c treats 'l' as long double under the guise of MSVCRT compatibility. I feel this is incorrect for the following reasons: 1. MSVCRT treats long double as double. So __pformat should not need to treat 'l' as long double. 2. __pformat is used for C99 compatibility within MinGW. Supporting MSVCRT conventions should be avoided. 3. The snippet below produces incorrect output when using __pformat via -D__USE_MINGW_ANSI_STDIO. /* MSVCRT: gcc -o pformat.exe pformat.c Outputs: 12.00000 C99: gcc -o pformat.exe pformat.c -D__USE_MINGW_ANSI_STDIO Outputs: 0.000000 */ #include <stdio.h> main() { double a = 12; printf("%lf", a); } ---------------------------------------------------------------------- >Comment By: Daniel Green (venix1) Date: 2012-01-17 14:13 Message: To clarify, this patch makes __pformat C99 compliant. According to C99 the 'l' length modifier is to be ignored with floating point types ie: treat them as double. Currently on Windows 'l' is treated as 'L'. Which while legal for MSVCRT since long double is an alias for double. It is illegal with C99 and will result in incorrect output possibly even crash. This patch removes the code that treats 'l' as 'L' From the C99 spec p 276. l (ell) Specifies that a following 'd', 'i', 'o', 'u', 'x', or 'X' conversion specifier applies to a 'long int' or 'unsigned long int' argument; that a following 'n' conversion specifier applies to a pointer to a 'long int' argument; that a following 'c' conversion specifier applies to a 'wint_t' argument; that a following 's' conversion specifier applies to a pointer to a 'wchar_t' argument; or has no effect on a following a, A, e, E, f, F, g, or G conversion specifier. http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1124.pdf ---------------------------------------------------------------------- You can respond by visiting: https://sourceforge.net/tracker/?func=detail&atid=302435&aid=3474504&group_id=2435 |
From: SF/projects/mingw n. l. <min...@li...> - 2012-01-18 13:10:38
|
Patches item #3474504, was opened at 2012-01-16 10:14 Message generated for change (Comment added) made by earnie You can respond by visiting: https://sourceforge.net/tracker/?func=detail&atid=302435&aid=3474504&group_id=2435 Please note that this message will contain a full copy of the comment thread, including the initial issue submission, for this request, not just the latest update. Category: runtime Group: None Status: Open Resolution: None Priority: 5 Private: No Submitted By: Daniel Green (venix1) >Assigned to: Chris Sutcliffe (ir0nh34d) Summary: Removed invalid MSVCRT correction of 'l' modifer. Initial Comment: mingwex/stdio/pformat.c treats 'l' as long double under the guise of MSVCRT compatibility. I feel this is incorrect for the following reasons: 1. MSVCRT treats long double as double. So __pformat should not need to treat 'l' as long double. 2. __pformat is used for C99 compatibility within MinGW. Supporting MSVCRT conventions should be avoided. 3. The snippet below produces incorrect output when using __pformat via -D__USE_MINGW_ANSI_STDIO. /* MSVCRT: gcc -o pformat.exe pformat.c Outputs: 12.00000 C99: gcc -o pformat.exe pformat.c -D__USE_MINGW_ANSI_STDIO Outputs: 0.000000 */ #include <stdio.h> main() { double a = 12; printf("%lf", a); } ---------------------------------------------------------------------- >Comment By: Earnie Boyd (earnie) Date: 2012-01-18 05:10 Message: FYI, > C99: gcc -o pformat.exe pformat.c -D__USE_MINGW_ANSI_STDIO This needs a -std=c99 if C99 compliance is what you want. The result is still the same though and I agree it is broken. ---------------------------------------------------------------------- Comment By: Daniel Green (venix1) Date: 2012-01-17 14:13 Message: To clarify, this patch makes __pformat C99 compliant. According to C99 the 'l' length modifier is to be ignored with floating point types ie: treat them as double. Currently on Windows 'l' is treated as 'L'. Which while legal for MSVCRT since long double is an alias for double. It is illegal with C99 and will result in incorrect output possibly even crash. This patch removes the code that treats 'l' as 'L' From the C99 spec p 276. l (ell) Specifies that a following 'd', 'i', 'o', 'u', 'x', or 'X' conversion specifier applies to a 'long int' or 'unsigned long int' argument; that a following 'n' conversion specifier applies to a pointer to a 'long int' argument; that a following 'c' conversion specifier applies to a 'wint_t' argument; that a following 's' conversion specifier applies to a pointer to a 'wchar_t' argument; or has no effect on a following a, A, e, E, f, F, g, or G conversion specifier. http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1124.pdf ---------------------------------------------------------------------- You can respond by visiting: https://sourceforge.net/tracker/?func=detail&atid=302435&aid=3474504&group_id=2435 |
From: SF/projects/mingw n. l. <min...@li...> - 2012-08-06 14:49:23
|
Patches item #3474504, was opened at 2012-01-16 10:14 Message generated for change (Settings changed) made by earnie You can respond by visiting: https://sourceforge.net/tracker/?func=detail&atid=302435&aid=3474504&group_id=2435 Please note that this message will contain a full copy of the comment thread, including the initial issue submission, for this request, not just the latest update. Category: MinGW runtime Group: None Status: Open Resolution: None Priority: 5 Private: No Submitted By: Daniel Green (venix1) >Assigned to: Earnie Boyd (earnie) Summary: Removed invalid MSVCRT correction of 'l' modifer. Initial Comment: mingwex/stdio/pformat.c treats 'l' as long double under the guise of MSVCRT compatibility. I feel this is incorrect for the following reasons: 1. MSVCRT treats long double as double. So __pformat should not need to treat 'l' as long double. 2. __pformat is used for C99 compatibility within MinGW. Supporting MSVCRT conventions should be avoided. 3. The snippet below produces incorrect output when using __pformat via -D__USE_MINGW_ANSI_STDIO. /* MSVCRT: gcc -o pformat.exe pformat.c Outputs: 12.00000 C99: gcc -o pformat.exe pformat.c -D__USE_MINGW_ANSI_STDIO Outputs: 0.000000 */ #include <stdio.h> main() { double a = 12; printf("%lf", a); } ---------------------------------------------------------------------- Comment By: Earnie Boyd (earnie) Date: 2012-01-18 05:10 Message: FYI, > C99: gcc -o pformat.exe pformat.c -D__USE_MINGW_ANSI_STDIO This needs a -std=c99 if C99 compliance is what you want. The result is still the same though and I agree it is broken. ---------------------------------------------------------------------- Comment By: Daniel Green (venix1) Date: 2012-01-17 14:13 Message: To clarify, this patch makes __pformat C99 compliant. According to C99 the 'l' length modifier is to be ignored with floating point types ie: treat them as double. Currently on Windows 'l' is treated as 'L'. Which while legal for MSVCRT since long double is an alias for double. It is illegal with C99 and will result in incorrect output possibly even crash. This patch removes the code that treats 'l' as 'L' From the C99 spec p 276. l (ell) Specifies that a following 'd', 'i', 'o', 'u', 'x', or 'X' conversion specifier applies to a 'long int' or 'unsigned long int' argument; that a following 'n' conversion specifier applies to a pointer to a 'long int' argument; that a following 'c' conversion specifier applies to a 'wint_t' argument; that a following 's' conversion specifier applies to a pointer to a 'wchar_t' argument; or has no effect on a following a, A, e, E, f, F, g, or G conversion specifier. http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1124.pdf ---------------------------------------------------------------------- You can respond by visiting: https://sourceforge.net/tracker/?func=detail&atid=302435&aid=3474504&group_id=2435 |