Patchwork [CPP/23827] standard C++ should not have hex float preprocessing tokens

login
register
mail settings
Submitter Ed Smith-Rowland
Date Aug. 28, 2014, 1:25 p.m.
Message ID <53FF2DC0.7050307@verizon.net>
Download mbox | patch
Permalink /patch/383837/
State New
Headers show

Comments

Ed Smith-Rowland - Aug. 28, 2014, 1:25 p.m.
On 08/27/2014 03:40 PM, Jason Merrill wrote:
> OK.
>
> Jason
>
Is this OK for 4.9 also?
It builds and tests clean on x86_64-linux.

Attached slightly modified patch.

Ed
libcpp/

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.


gcc/testsuite/

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.
Marc Glisse - Aug. 28, 2014, 1:41 p.m.
On Thu, 28 Aug 2014, Ed Smith-Rowland wrote:

> Is this OK for 4.9 also?
> It builds and tests clean on x86_64-linux.
>
> Attached slightly modified patch.

In my opinion it is not appropriate for a backport, no. If someone was 
using hex floats with -std=c++98 with 4.9.1, it should still work with 
4.9.2, I only expect to have to fix such things when moving to 5.0.
Jason Merrill - Aug. 28, 2014, 1:47 p.m.
On 08/28/2014 09:41 AM, Marc Glisse wrote:
> In my opinion it is not appropriate for a backport, no. If someone was
> using hex floats with -std=c++98 with 4.9.1, it should still work with
> 4.9.2, I only expect to have to fix such things when moving to 5.0.

Agreed.

Jason
Ed Smith-Rowland - Aug. 28, 2014, 2:26 p.m.
On 08/28/2014 09:47 AM, Jason Merrill wrote:
> On 08/28/2014 09:41 AM, Marc Glisse wrote:
>> In my opinion it is not appropriate for a backport, no. If someone was
>> using hex floats with -std=c++98 with 4.9.1, it should still work with
>> 4.9.2, I only expect to have to fix such things when moving to 5.0.
>
> Agreed.
>
> Jason
>
>
>

OK, I understand.  Makes sense.
It is a capability change not really just a bugfix per se.
On that note is it worth a sentence in Changes?

Ed

Patch

Index: libcpp/init.c
===================================================================
--- libcpp/init.c	(revision 214616)
+++ libcpp/init.c	(working copy)
@@ -98,7 +98,7 @@ 
   /* STDC99   */  { 1,  0,  1,   0,  0,  1,   1,   1,   0,   0,   0,    0,      0 },
   /* STDC11   */  { 1,  0,  1,   0,  1,  1,   1,   1,   1,   0,   0,    0,      0 },
   /* GNUCXX   */  { 0,  1,  1,   0,  0,  0,   1,   1,   0,   0,   0,    0,      0 },
-  /* CXX98    */  { 0,  1,  1,   0,  0,  1,   1,   1,   0,   0,   0,    0,      0 },
+  /* CXX98    */  { 0,  1,  0,   0,  0,  1,   1,   1,   0,   0,   0,    0,      0 },
   /* GNUCXX11 */  { 1,  1,  1,   0,  1,  0,   1,   1,   1,   1,   1,    0,      0 },
   /* CXX11    */  { 1,  1,  1,   0,  1,  1,   1,   1,   1,   1,   1,    0,      0 },
   /* GNUCXX1Y */  { 1,  1,  1,   0,  1,  0,   1,   1,   1,   1,   1,    1,      1 },
Index: libcpp/expr.c
===================================================================
--- libcpp/expr.c	(revision 214616)
+++ libcpp/expr.c	(working copy)
@@ -540,9 +540,16 @@ 
 	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: gcc/testsuite/g++.dg/cpp/pr23827_cxx11.C
===================================================================
--- gcc/testsuite/g++.dg/cpp/pr23827_cxx11.C	(revision 0)
+++ gcc/testsuite/g++.dg/cpp/pr23827_cxx11.C	(working copy)
@@ -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.
+}
Index: gcc/testsuite/g++.dg/cpp/pr23827_cxx98.C
===================================================================
--- gcc/testsuite/g++.dg/cpp/pr23827_cxx98.C	(revision 0)
+++ gcc/testsuite/g++.dg/cpp/pr23827_cxx98.C	(working copy)
@@ -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.
+}
Index: gcc/testsuite/g++.dg/cpp/pr23827_cxx98_neg.C
===================================================================
--- gcc/testsuite/g++.dg/cpp/pr23827_cxx98_neg.C	(revision 0)
+++ gcc/testsuite/g++.dg/cpp/pr23827_cxx98_neg.C	(working copy)
@@ -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" }
Index: gcc/testsuite/gcc.dg/cpp/pr23827_c90.c
===================================================================
--- gcc/testsuite/gcc.dg/cpp/pr23827_c90.c	(revision 0)
+++ gcc/testsuite/gcc.dg/cpp/pr23827_c90.c	(working copy)
@@ -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.  */
+}
Index: gcc/testsuite/gcc.dg/cpp/pr23827_c90_neg.c
===================================================================
--- gcc/testsuite/gcc.dg/cpp/pr23827_c90_neg.c	(revision 0)
+++ gcc/testsuite/gcc.dg/cpp/pr23827_c90_neg.c	(working copy)
@@ -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" }  */
Index: gcc/testsuite/gcc.dg/cpp/pr23827_c99.c
===================================================================
--- gcc/testsuite/gcc.dg/cpp/pr23827_c99.c	(revision 0)
+++ gcc/testsuite/gcc.dg/cpp/pr23827_c99.c	(working copy)
@@ -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.  */
+}