PR cpp/23827 - standard C++ should not have hex float preprocessor
authorEdward Smith-Rowland <3dw4rd@verizon.net>
Thu, 28 Aug 2014 02:38:24 +0000 (02:38 +0000)
committerEdward Smith-Rowland <emsr@gcc.gnu.org>
Thu, 28 Aug 2014 02:38:24 +0000 (02:38 +0000)
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
gcc/testsuite/g++.dg/cpp/pr23827_cxx11.C [new file with mode: 0644]
gcc/testsuite/g++.dg/cpp/pr23827_cxx98.C [new file with mode: 0644]
gcc/testsuite/g++.dg/cpp/pr23827_cxx98_neg.C [new file with mode: 0644]
gcc/testsuite/gcc.dg/cpp/pr23827_c90.c [new file with mode: 0644]
gcc/testsuite/gcc.dg/cpp/pr23827_c90_neg.c [new file with mode: 0644]
gcc/testsuite/gcc.dg/cpp/pr23827_c99.c [new file with mode: 0644]
libcpp/ChangeLog
libcpp/expr.c
libcpp/init.c

index 4b5def9c633e53e65507124aad822362450bc55a..43e950d5453b7857e637183a40bbe9ba74e02b9a 100644 (file)
@@ -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  <paolo.carlini@oracle.com>
 
        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 (file)
index 0000000..c1862ce
--- /dev/null
@@ -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 (file)
index 0000000..cd4ee22
--- /dev/null
@@ -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 (file)
index 0000000..39d9fe4
--- /dev/null
@@ -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 (file)
index 0000000..e7ddc76
--- /dev/null
@@ -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 (file)
index 0000000..020697c
--- /dev/null
@@ -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 (file)
index 0000000..4671c2a
--- /dev/null
@@ -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.  */
+}
index 1b4e31d6be20918761bed284d4d2dd023ada340c..7f88f7aa4057d23a00658592a7529c79369fce60 100644 (file)
@@ -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;
index 07f1b2fb419aec7b44825f6ba4c0626856bf97cc..519bb878b6fae233d25995ef0a692c6e2fd59366 100644 (file)
@@ -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)
        {
index 0d2f73718bec0ed0d36cfc786567a8557893abe4..7aace802682187da5065832850c28ba8b5d112ce 100644 (file)
@@ -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 },