From 7c05e50c733d217f7f1da1f5173584fbc5032d2e Mon Sep 17 00:00:00 2001 From: Edward Smith-Rowland <3dw4rd@verizon.net> Date: Thu, 28 Aug 2014 02:38:24 +0000 Subject: [PATCH] PR cpp/23827 - standard C++ should not have hex float preprocessor libcpp/ 2014-08-27 Edward Smith-Rowland <3dw4rd@verizon.net> PR cpp/23827 - standard C++ should not have hex float preprocessor tokens * libcpp/init.c (lang_flags): Change CXX98 flag for extended numbers from 1 to 0. * libcpp/expr.c (cpp_classify_number): Weite error message for improper use of hex floating literal. gcc/testsuite/ 2014-08-27 Edward Smith-Rowland <3dw4rd@verizon.net> PR cpp/23827 - standard C++ should not have hex float preprocessor tokens * g++.dg/cpp/pr23827_cxx11.C: New. * g++.dg/cpp/pr23827_cxx98.C: New. * g++.dg/cpp/pr23827_cxx98_neg.C: New. * gcc.dg/cpp/pr23827_c90.c: New. * gcc.dg/cpp/pr23827_c90_neg.c: New. * gcc.dg/cpp/pr23827_c99.c: New. From-SVN: r214616 --- gcc/testsuite/ChangeLog | 11 ++++++++++ gcc/testsuite/g++.dg/cpp/pr23827_cxx11.C | 23 ++++++++++++++++++++ gcc/testsuite/g++.dg/cpp/pr23827_cxx98.C | 23 ++++++++++++++++++++ gcc/testsuite/g++.dg/cpp/pr23827_cxx98_neg.C | 4 ++++ gcc/testsuite/gcc.dg/cpp/pr23827_c90.c | 23 ++++++++++++++++++++ gcc/testsuite/gcc.dg/cpp/pr23827_c90_neg.c | 4 ++++ gcc/testsuite/gcc.dg/cpp/pr23827_c99.c | 23 ++++++++++++++++++++ libcpp/ChangeLog | 9 ++++++++ libcpp/expr.c | 13 ++++++++--- libcpp/init.c | 2 +- 10 files changed, 131 insertions(+), 4 deletions(-) create mode 100644 gcc/testsuite/g++.dg/cpp/pr23827_cxx11.C create mode 100644 gcc/testsuite/g++.dg/cpp/pr23827_cxx98.C create mode 100644 gcc/testsuite/g++.dg/cpp/pr23827_cxx98_neg.C create mode 100644 gcc/testsuite/gcc.dg/cpp/pr23827_c90.c create mode 100644 gcc/testsuite/gcc.dg/cpp/pr23827_c90_neg.c create mode 100644 gcc/testsuite/gcc.dg/cpp/pr23827_c99.c diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 4b5def9c633e..43e950d5453b 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,14 @@ +2014-08-28 Edward Smith-Rowland <3dw4rd@verizon.net> + + PR cpp/23827 - standard C++ should not have hex float preprocessor + tokens + * g++.dg/cpp/pr23827_cxx11.C: New. + * g++.dg/cpp/pr23827_cxx98.C: New. + * g++.dg/cpp/pr23827_cxx98_neg.C: New. + * gcc.dg/cpp/pr23827_c90.c: New. + * gcc.dg/cpp/pr23827_c90_neg.c: New. + * gcc.dg/cpp/pr23827_c99.c: New. + 2014-08-27 Paolo Carlini PR c++/52892 diff --git a/gcc/testsuite/g++.dg/cpp/pr23827_cxx11.C b/gcc/testsuite/g++.dg/cpp/pr23827_cxx11.C new file mode 100644 index 000000000000..c1862ceda2f9 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp/pr23827_cxx11.C @@ -0,0 +1,23 @@ +// { dg-do run { target c++11 } } +// { dg-options "-pedantic-errors" } + +#define f ( +#define l ) +#define str(x) #x +#define xstr(x) str(x) + +// C90 and C++98: "0x1p+( 0x1p+)" +// C99 and C++11: "0x1p+f 0x1p+l" +const char *s = xstr(0x1p+f 0x1p+l); + +extern "C" void abort (void); +extern "C" int strcmp (const char *, const char *); + +int +main() +{ + if (strcmp (s, "0x1p+( 0x1p+)")) + return 0; // Correct C99 and C++11 behavior. + else + abort (); // Correct C90 and C++ behavior. +} diff --git a/gcc/testsuite/g++.dg/cpp/pr23827_cxx98.C b/gcc/testsuite/g++.dg/cpp/pr23827_cxx98.C new file mode 100644 index 000000000000..cd4ee22e5042 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp/pr23827_cxx98.C @@ -0,0 +1,23 @@ +// { dg-do run { target c++98_only } } +// { dg-options "-ansi -pedantic-errors" } + +#define f ( +#define l ) +#define str(x) #x +#define xstr(x) str(x) + +// C90 and C++98: "0x1p+( 0x1p+)" +// C99 and C++11: "0x1p+f 0x1p+l" +const char *s = xstr(0x1p+f 0x1p+l); + +extern "C" void abort (void); +extern "C" int strcmp (const char *, const char *); + +int +main() +{ + if (strcmp (s, "0x1p+( 0x1p+)")) + abort (); // Correct C99 and C++11 behavior. + else + return 0; // Correct C90 and C++ behavior. +} diff --git a/gcc/testsuite/g++.dg/cpp/pr23827_cxx98_neg.C b/gcc/testsuite/g++.dg/cpp/pr23827_cxx98_neg.C new file mode 100644 index 000000000000..39d9fe4d1e02 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp/pr23827_cxx98_neg.C @@ -0,0 +1,4 @@ +// { dg-do compile { target c++98_only } } +/* { dg-options "-ansi -pedantic-errors" } */ + +double x = 0x3.1415babep0; // { dg-error "use of C..11 hexadecimal floating constant" } diff --git a/gcc/testsuite/gcc.dg/cpp/pr23827_c90.c b/gcc/testsuite/gcc.dg/cpp/pr23827_c90.c new file mode 100644 index 000000000000..e7ddc765ac5e --- /dev/null +++ b/gcc/testsuite/gcc.dg/cpp/pr23827_c90.c @@ -0,0 +1,23 @@ +/* { dg-do run } */ +/* { dg-options "-std=c90 -pedantic-errors" } */ + +#define f ( +#define l ) +#define str(x) #x +#define xstr(x) str(x) + +/* C90 and C++98: "0x1p+( 0x1p+)" */ +/* C99 and C++11: "0x1p+f 0x1p+l" */ +const char *s = xstr(0x1p+f 0x1p+l); + +void abort (void); +int strcmp (const char *, const char *); + +int +main() +{ + if (strcmp (s, "0x1p+( 0x1p+)")) + abort (); /* Correct C99 and C++11 behavior. */ + else + return 0; /* Correct C90 and C++ behavior. */ +} diff --git a/gcc/testsuite/gcc.dg/cpp/pr23827_c90_neg.c b/gcc/testsuite/gcc.dg/cpp/pr23827_c90_neg.c new file mode 100644 index 000000000000..020697cdd354 --- /dev/null +++ b/gcc/testsuite/gcc.dg/cpp/pr23827_c90_neg.c @@ -0,0 +1,4 @@ +/* { dg-do compile } */ +/* { dg-options "-std=c90 -pedantic-errors" } */ + +double x = 0x3.1415babep0; /* { dg-error "use of C99 hexadecimal floating constant" } */ diff --git a/gcc/testsuite/gcc.dg/cpp/pr23827_c99.c b/gcc/testsuite/gcc.dg/cpp/pr23827_c99.c new file mode 100644 index 000000000000..4671c2ac7126 --- /dev/null +++ b/gcc/testsuite/gcc.dg/cpp/pr23827_c99.c @@ -0,0 +1,23 @@ +/* { dg-do run { target c++11 } } */ +/* { dg-options "-pedantic-errors" } */ + +#define f ( +#define l ) +#define str(x) #x +#define xstr(x) str(x) + +/* C90 and C++98: "0x1p+( 0x1p+)" */ +/* C99 and C++11: "0x1p+f 0x1p+l" */ +const char *s = xstr(0x1p+f 0x1p+l); + +void abort (void); +int strcmp (const char *, const char *); + +int +main() +{ + if (strcmp (s, "0x1p+( 0x1p+)")) + return 0; /* Correct C99 and C++11 behavior. */ + else + abort (); /* Correct C90 and C++ behavior. */ +} diff --git a/libcpp/ChangeLog b/libcpp/ChangeLog index 1b4e31d6be20..7f88f7aa4057 100644 --- a/libcpp/ChangeLog +++ b/libcpp/ChangeLog @@ -1,3 +1,12 @@ +2014-08-28 Edward Smith-Rowland <3dw4rd@verizon.net> + + PR cpp/23827 - standard C++ should not have hex float preprocessor + tokens + * libcpp/init.c (lang_flags): Change CXX98 flag for extended numbers + from 1 to 0. + * libcpp/expr.c (cpp_classify_number): Weite error message for improper + use of hex floating literal. + 2014-08-23 Edward Smith-Rowland <3dw4rd@verizon.net> * include/cpplib.h (enum c_lang): Add CLK_GNUCXX1Z, CLK_CXX1Z; diff --git a/libcpp/expr.c b/libcpp/expr.c index 07f1b2fb419a..519bb878b6fa 100644 --- a/libcpp/expr.c +++ b/libcpp/expr.c @@ -540,9 +540,16 @@ cpp_classify_number (cpp_reader *pfile, const cpp_token *token, SYNTAX_ERROR_AT (virtual_location, "no digits in hexadecimal floating constant"); - if (radix == 16 && CPP_PEDANTIC (pfile) && !CPP_OPTION (pfile, c99)) - cpp_error_with_line (pfile, CPP_DL_PEDWARN, virtual_location, 0, - "use of C99 hexadecimal floating constant"); + if (radix == 16 && CPP_PEDANTIC (pfile) + && !CPP_OPTION (pfile, extended_numbers)) + { + if (CPP_OPTION (pfile, cplusplus)) + cpp_error_with_line (pfile, CPP_DL_PEDWARN, virtual_location, 0, + "use of C++11 hexadecimal floating constant"); + else + cpp_error_with_line (pfile, CPP_DL_PEDWARN, virtual_location, 0, + "use of C99 hexadecimal floating constant"); + } if (float_flag == AFTER_EXPON) { diff --git a/libcpp/init.c b/libcpp/init.c index 0d2f73718bec..7aace8026821 100644 --- a/libcpp/init.c +++ b/libcpp/init.c @@ -103,7 +103,7 @@ static const struct lang_flags lang_defaults[] = /* STDC99 */ { 1, 0, 1, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 1 }, /* STDC11 */ { 1, 0, 1, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1 }, /* GNUCXX */ { 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0 }, - /* CXX98 */ { 0, 1, 1, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 1 }, + /* CXX98 */ { 0, 1, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 1 }, /* GNUCXX11 */ { 1, 1, 1, 0, 1, 0, 1, 1, 1, 1, 1, 0, 0, 0 }, /* CXX11 */ { 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1 }, /* GNUCXX14 */ { 1, 1, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 0 }, -- 2.39.2