Patchwork [wwwdocs] C++14 support for binary literals says Noinstead of Yes

login
register
mail settings
Submitter Jakub Jelinek
Date April 27, 2013, 6:59 a.m.
Message ID <20130427065931.GW28963@tucnak.redhat.com>
Download mbox | patch
Permalink /patch/240089/
State New
Headers show

Comments

Jakub Jelinek - April 27, 2013, 6:59 a.m.
On Sat, Apr 27, 2013 at 01:03:17AM -0400, Ed Smith-Rowland wrote:
> In htdocs/projects/cxx1y.html it says no for support of binary
> literals.  I think that's a Yes actually.
> 
> Here is a little patchlet.
> 
> Am I missing something?

Given
./xg++ -B ./ a.C -std=c++1y -pedantic-errors -S
a.C:1:9: error: binary constants are a GCC extension
 int i = 0b110101;
         ^

I'd say the fact that it is available as a GNU extension isn't sufficient to
mark this as supported.  I think you need something like (untested so far
except for make check-g++ RUNTESTFLAGS=*binary_const*):

2013-04-27  Jakub Jelinek  <jakub@redhat.com>

	N3472 binary constants
	* include/cpplib.h (struct cpp_options): Fix a typo in user_literals
	field comment.  Add binary_constants field.
	* init.c (struct lang_flags): Add binary_constants field.
	(lang_defaults): Add bin_cst column to the table.
	(cpp_set_lang): Initialize CPP_OPTION (pfile, binary_constants).
	* expr.c (cpp_classify_number): Talk about C++11 instead of C++0x
	in diagnostics.  Accept binary constants if
	CPP_OPTION (pfile, binary_constants) even when pedantic.  Adjust
	pedwarn message.

	* g++.dg/cpp/limits.C: Adjust warning wording.
	* g++.dg/system-binary-constants-1.C: Likewise.
	* g++.dg/cpp1y/system-binary-constants-1.C: New test.



	Jakub
Ed Smith-Rowland - April 28, 2013, 3:16 p.m.
On 04/27/2013 02:59 AM, Jakub Jelinek wrote:
> On Sat, Apr 27, 2013 at 01:03:17AM -0400, Ed Smith-Rowland wrote:
>> In htdocs/projects/cxx1y.html it says no for support of binary
>> literals.  I think that's a Yes actually.
>>
>> Here is a little patchlet.
>>
>> Am I missing something?
So yes... ;-)  I had tested on g++-4.1 and I guess pedantic let that go 
through back then. I swear -pedantic gave nothing...  Oh well.

I like the patch.  It compiled and tested clean on x86_64-linux.

I'm working on a little proposal to add std::bin manipulator and related 
stuff in analogy to std::hex, etc. to the library.  i think you should 
be able to write and extract binary literals.

> Given
> ./xg++ -B ./ a.C -std=c++1y -pedantic-errors -S
> a.C:1:9: error: binary constants are a GCC extension
>   int i = 0b110101;
>           ^
>
> I'd say the fact that it is available as a GNU extension isn't sufficient to
> mark this as supported.  I think you need something like (untested so far
> except for make check-g++ RUNTESTFLAGS=*binary_const*):
>
> 2013-04-27  Jakub Jelinek<jakub@redhat.com>
>
> 	N3472 binary constants
> 	* include/cpplib.h (struct cpp_options): Fix a typo in user_literals
> 	field comment.  Add binary_constants field.
> 	* init.c (struct lang_flags): Add binary_constants field.
> 	(lang_defaults): Add bin_cst column to the table.
> 	(cpp_set_lang): Initialize CPP_OPTION (pfile, binary_constants).
> 	* expr.c (cpp_classify_number): Talk about C++11 instead of C++0x
> 	in diagnostics.  Accept binary constants if
> 	CPP_OPTION (pfile, binary_constants) even when pedantic.  Adjust
> 	pedwarn message.
>
> 	* g++.dg/cpp/limits.C: Adjust warning wording.
> 	* g++.dg/system-binary-constants-1.C: Likewise.
> 	* g++.dg/cpp1y/system-binary-constants-1.C: New test.
>
> --- libcpp/include/cpplib.h.jj	2013-04-25 23:47:58.000000000 +0200
> +++ libcpp/include/cpplib.h	2013-04-27 08:31:52.349122712 +0200
> @@ -423,7 +423,7 @@ struct cpp_options
>     /* True for traditional preprocessing.  */
>     unsigned char traditional;
>   
> -  /* Nonzero for C++ 2011 Standard user-defnied literals.  */
> +  /* Nonzero for C++ 2011 Standard user-defined literals.  */
>     unsigned char user_literals;
>   
>     /* Nonzero means warn when a string or character literal is followed by a
> @@ -434,6 +434,9 @@ struct cpp_options
>        literal number suffixes as user-defined literal number suffixes.  */
>     unsigned char ext_numeric_literals;
>   
> +  /* Nonzero for C++ 2014 Standard binary constants.  */
> +  unsigned char binary_constants;
> +
>     /* Holds the name of the target (execution) character set.  */
>     const char *narrow_charset;
>   
> --- libcpp/init.c.jj	2013-04-25 23:47:58.000000000 +0200
> +++ libcpp/init.c	2013-04-27 08:34:54.103120530 +0200
> @@ -83,24 +83,25 @@ struct lang_flags
>     char uliterals;
>     char rliterals;
>     char user_literals;
> +  char binary_constants;
>   };
>   
>   static const struct lang_flags lang_defaults[] =
> -{ /*              c99 c++ xnum xid std  //   digr ulit rlit user_literals */
> -  /* GNUC89   */  { 0,  0,  1,   0,  0,   1,   1,   0,   0,    0 },
> -  /* GNUC99   */  { 1,  0,  1,   0,  0,   1,   1,   1,   1,    0 },
> -  /* GNUC11   */  { 1,  0,  1,   0,  0,   1,   1,   1,   1,    0 },
> -  /* STDC89   */  { 0,  0,  0,   0,  1,   0,   0,   0,   0,    0 },
> -  /* STDC94   */  { 0,  0,  0,   0,  1,   0,   1,   0,   0,    0 },
> -  /* STDC99   */  { 1,  0,  1,   0,  1,   1,   1,   0,   0,    0 },
> -  /* STDC11   */  { 1,  0,  1,   0,  1,   1,   1,   1,   0,    0 },
> -  /* GNUCXX   */  { 0,  1,  1,   0,  0,   1,   1,   0,   0,    0 },
> -  /* CXX98    */  { 0,  1,  1,   0,  1,   1,   1,   0,   0,    0 },
> -  /* GNUCXX11 */  { 1,  1,  1,   0,  0,   1,   1,   1,   1,    1 },
> -  /* CXX11    */  { 1,  1,  1,   0,  1,   1,   1,   1,   1,    1 },
> -  /* GNUCXX1Y */  { 1,  1,  1,   0,  0,   1,   1,   1,   1,    1 },
> -  /* CXX1Y    */  { 1,  1,  1,   0,  1,   1,   1,   1,   1,    1 },
> -  /* ASM      */  { 0,  0,  1,   0,  0,   1,   0,   0,   0,    0 }
> +{ /*              c99 c++ xnum xid std  //   digr ulit rlit udlit bin_cst */
> +  /* GNUC89   */  { 0,  0,  1,   0,  0,   1,   1,   0,   0,   0,    0 },
> +  /* GNUC99   */  { 1,  0,  1,   0,  0,   1,   1,   1,   1,   0,    0 },
> +  /* GNUC11   */  { 1,  0,  1,   0,  0,   1,   1,   1,   1,   0,    0 },
> +  /* STDC89   */  { 0,  0,  0,   0,  1,   0,   0,   0,   0,   0,    0 },
> +  /* STDC94   */  { 0,  0,  0,   0,  1,   0,   1,   0,   0,   0,    0 },
> +  /* STDC99   */  { 1,  0,  1,   0,  1,   1,   1,   0,   0,   0,    0 },
> +  /* STDC11   */  { 1,  0,  1,   0,  1,   1,   1,   1,   0,   0,    0 },
> +  /* GNUCXX   */  { 0,  1,  1,   0,  0,   1,   1,   0,   0,   0,    0 },
> +  /* CXX98    */  { 0,  1,  1,   0,  1,   1,   1,   0,   0,   0,    0 },
> +  /* GNUCXX11 */  { 1,  1,  1,   0,  0,   1,   1,   1,   1,   1,    0 },
> +  /* CXX11    */  { 1,  1,  1,   0,  1,   1,   1,   1,   1,   1,    0 },
> +  /* GNUCXX1Y */  { 1,  1,  1,   0,  0,   1,   1,   1,   1,   1,    1 },
> +  /* CXX1Y    */  { 1,  1,  1,   0,  1,   1,   1,   1,   1,   1,    1 },
> +  /* ASM      */  { 0,  0,  1,   0,  0,   1,   0,   0,   0,   0,    0 }
>     /* xid should be 1 for GNUC99, STDC99, GNUCXX, CXX98, GNUCXX11, CXX11,
>        GNUCXX1Y, and CXX1Y when no longer experimental (when all uses of
>        identifiers in the compiler have been audited for correct handling
> @@ -126,6 +127,7 @@ cpp_set_lang (cpp_reader *pfile, enum c_
>     CPP_OPTION (pfile, uliterals)			 = l->uliterals;
>     CPP_OPTION (pfile, rliterals)			 = l->rliterals;
>     CPP_OPTION (pfile, user_literals)		 = l->user_literals;
> +  CPP_OPTION (pfile, binary_constants)		 = l->binary_constants;
>   }
>   
>   /* Initialize library global state.  */
> --- libcpp/expr.c.jj	2013-01-15 09:04:55.000000000 +0100
> +++ libcpp/expr.c	2013-04-27 08:38:14.453026746 +0200
> @@ -621,7 +621,7 @@ cpp_classify_number (cpp_reader *pfile,
>   	  && CPP_OPTION (pfile, cpp_warn_long_long))
>           {
>             const char *message = CPP_OPTION (pfile, cplusplus)
> -		                ? N_("use of C++0x long long integer constant")
> +				? N_("use of C++11 long long integer constant")
>   		                : N_("use of C99 long long integer constant");
>   
>   	  if (CPP_OPTION (pfile, c99))
> @@ -639,9 +639,14 @@ cpp_classify_number (cpp_reader *pfile,
>     if ((result & CPP_N_IMAGINARY) && CPP_PEDANTIC (pfile))
>       cpp_error_with_line (pfile, CPP_DL_PEDWARN, virtual_location, 0,
>   			 "imaginary constants are a GCC extension");
> -  if (radix == 2 && CPP_PEDANTIC (pfile))
> +  if (radix == 2
> +      && !CPP_OPTION (pfile, binary_constants)
> +      && CPP_PEDANTIC (pfile))
>       cpp_error_with_line (pfile, CPP_DL_PEDWARN, virtual_location, 0,
> -			 "binary constants are a GCC extension");
> +			 CPP_OPTION (pfile, cplusplus)
> +			 ? "binary constants are a C++1y feature "
> +			   "or GCC extension"
> +			 : "binary constants are a GCC extension");
>   
>     if (radix == 10)
>       result |= CPP_N_DECIMAL;
> --- gcc/testsuite/g++.dg/cpp/limits.C.jj	2012-06-06 20:35:54.000000000 +0200
> +++ gcc/testsuite/g++.dg/cpp/limits.C	2013-04-27 08:45:20.036719569 +0200
> @@ -4,13 +4,13 @@
>   #include <limits>
>   
>   // Compiling this with -pedantic was wrongly triggering this error:
> -// libstdc++-v3/include/limits:1269:45: warning : use of C++0x long long integer constant [-Wlong-long]
> +// libstdc++-v3/include/limits:1269:45: warning : use of C++11 long long integer constant [-Wlong-long]
>   //       min() _GLIBCXX_USE_NOEXCEPT { return -__LONG_LONG_MAX__ - 1; }
>   //                                             ^
> -// libstdc++-v3/include/limits:1272:44: warning : use of C++0x long long integer constant [-Wlong-long]
> +// libstdc++-v3/include/limits:1272:44: warning : use of C++11 long long integer constant [-Wlong-long]
>   //       max() _GLIBCXX_USE_NOEXCEPT { return __LONG_LONG_MAX__; }
>   //                                            ^
> -// libstdc++-v3/include/limits:1342:44: warning : use of C++0x long long integer constant [-Wlong-long]
> +// libstdc++-v3/include/limits:1342:44: warning : use of C++11 long long integer constant [-Wlong-long]
>   //       max() _GLIBCXX_USE_NOEXCEPT { return __LONG_LONG_MAX__ * 2ULL + 1
>   //                                            ^
>   
> --- gcc/testsuite/g++.dg/system-binary-constants-1.C.jj	2012-05-17 08:40:34.000000000 +0200
> +++ gcc/testsuite/g++.dg/system-binary-constants-1.C	2013-04-27 08:47:50.600834156 +0200
> @@ -14,5 +14,5 @@ foo (void)
>   					    warning.  */
>     return 23;
>   #endif
> -  return 0b1101; /* { dg-warning "binary constants are a GCC extension" } */
> +  return 0b1101; /* { dg-warning "binary constants are a C..1y feature or GCC extension" } */
>   }
> --- gcc/testsuite/g++.dg/cpp1y/system-binary-constants-1.C.jj	2013-04-27 08:43:44.084238188 +0200
> +++ gcc/testsuite/g++.dg/cpp1y/system-binary-constants-1.C	2013-04-27 08:52:35.687230081 +0200
> @@ -0,0 +1,14 @@
> +// Origin: Dodji Seketeli<dodji@redhat.com>
> +// { dg-options "-std=c++1y -pedantic-errors" }
> +// { dg-do compile }
> +
> +#include "../system-binary-constants-1.h"
> +
> +int
> +foo (void)
> +{
> +#if BINARY_INT_CONSTANT_IN_SYSTEM_HEADER
> +  return 23;
> +#endif
> +  return 0b1101; // { dg-bogus "binary constants are a C..1y feature or GCC extension" }
> +}
>
>
> 	Jakub
>
Jason Merrill - April 28, 2013, 7:07 p.m.
The patch looks good to me.

Jason
Jason Merrill - April 30, 2013, 3:23 p.m.
I've updated the webpage.

Jason
Jakub Jelinek - April 30, 2013, 3:28 p.m.
On Tue, Apr 30, 2013 at 11:23:49AM -0400, Jason Merrill wrote:
> I've updated the webpage.

Perhaps it would be nice if we had some testsuite coverage for it too,
right now unless I'm blind there are exactly 2 testcases, using one 0b...
number in each in g++.dg/.

At least port gcc.dg/binary-constants-*.c to C++ (or move to c-c++-common/)
and perhaps have something where the numbers are used in some C++ only
contexts (templates, constexprs, whatever).

	Jakub

Patch

--- libcpp/include/cpplib.h.jj	2013-04-25 23:47:58.000000000 +0200
+++ libcpp/include/cpplib.h	2013-04-27 08:31:52.349122712 +0200
@@ -423,7 +423,7 @@  struct cpp_options
   /* True for traditional preprocessing.  */
   unsigned char traditional;
 
-  /* Nonzero for C++ 2011 Standard user-defnied literals.  */
+  /* Nonzero for C++ 2011 Standard user-defined literals.  */
   unsigned char user_literals;
 
   /* Nonzero means warn when a string or character literal is followed by a
@@ -434,6 +434,9 @@  struct cpp_options
      literal number suffixes as user-defined literal number suffixes.  */
   unsigned char ext_numeric_literals;
 
+  /* Nonzero for C++ 2014 Standard binary constants.  */
+  unsigned char binary_constants;
+
   /* Holds the name of the target (execution) character set.  */
   const char *narrow_charset;
 
--- libcpp/init.c.jj	2013-04-25 23:47:58.000000000 +0200
+++ libcpp/init.c	2013-04-27 08:34:54.103120530 +0200
@@ -83,24 +83,25 @@  struct lang_flags
   char uliterals;
   char rliterals;
   char user_literals;
+  char binary_constants;
 };
 
 static const struct lang_flags lang_defaults[] =
-{ /*              c99 c++ xnum xid std  //   digr ulit rlit user_literals */
-  /* GNUC89   */  { 0,  0,  1,   0,  0,   1,   1,   0,   0,    0 },
-  /* GNUC99   */  { 1,  0,  1,   0,  0,   1,   1,   1,   1,    0 },
-  /* GNUC11   */  { 1,  0,  1,   0,  0,   1,   1,   1,   1,    0 },
-  /* STDC89   */  { 0,  0,  0,   0,  1,   0,   0,   0,   0,    0 },
-  /* STDC94   */  { 0,  0,  0,   0,  1,   0,   1,   0,   0,    0 },
-  /* STDC99   */  { 1,  0,  1,   0,  1,   1,   1,   0,   0,    0 },
-  /* STDC11   */  { 1,  0,  1,   0,  1,   1,   1,   1,   0,    0 },
-  /* GNUCXX   */  { 0,  1,  1,   0,  0,   1,   1,   0,   0,    0 },
-  /* CXX98    */  { 0,  1,  1,   0,  1,   1,   1,   0,   0,    0 },
-  /* GNUCXX11 */  { 1,  1,  1,   0,  0,   1,   1,   1,   1,    1 },
-  /* CXX11    */  { 1,  1,  1,   0,  1,   1,   1,   1,   1,    1 },
-  /* GNUCXX1Y */  { 1,  1,  1,   0,  0,   1,   1,   1,   1,    1 },
-  /* CXX1Y    */  { 1,  1,  1,   0,  1,   1,   1,   1,   1,    1 },
-  /* ASM      */  { 0,  0,  1,   0,  0,   1,   0,   0,   0,    0 }
+{ /*              c99 c++ xnum xid std  //   digr ulit rlit udlit bin_cst */
+  /* GNUC89   */  { 0,  0,  1,   0,  0,   1,   1,   0,   0,   0,    0 },
+  /* GNUC99   */  { 1,  0,  1,   0,  0,   1,   1,   1,   1,   0,    0 },
+  /* GNUC11   */  { 1,  0,  1,   0,  0,   1,   1,   1,   1,   0,    0 },
+  /* STDC89   */  { 0,  0,  0,   0,  1,   0,   0,   0,   0,   0,    0 },
+  /* STDC94   */  { 0,  0,  0,   0,  1,   0,   1,   0,   0,   0,    0 },
+  /* STDC99   */  { 1,  0,  1,   0,  1,   1,   1,   0,   0,   0,    0 },
+  /* STDC11   */  { 1,  0,  1,   0,  1,   1,   1,   1,   0,   0,    0 },
+  /* GNUCXX   */  { 0,  1,  1,   0,  0,   1,   1,   0,   0,   0,    0 },
+  /* CXX98    */  { 0,  1,  1,   0,  1,   1,   1,   0,   0,   0,    0 },
+  /* GNUCXX11 */  { 1,  1,  1,   0,  0,   1,   1,   1,   1,   1,    0 },
+  /* CXX11    */  { 1,  1,  1,   0,  1,   1,   1,   1,   1,   1,    0 },
+  /* GNUCXX1Y */  { 1,  1,  1,   0,  0,   1,   1,   1,   1,   1,    1 },
+  /* CXX1Y    */  { 1,  1,  1,   0,  1,   1,   1,   1,   1,   1,    1 },
+  /* ASM      */  { 0,  0,  1,   0,  0,   1,   0,   0,   0,   0,    0 }
   /* xid should be 1 for GNUC99, STDC99, GNUCXX, CXX98, GNUCXX11, CXX11,
      GNUCXX1Y, and CXX1Y when no longer experimental (when all uses of
      identifiers in the compiler have been audited for correct handling
@@ -126,6 +127,7 @@  cpp_set_lang (cpp_reader *pfile, enum c_
   CPP_OPTION (pfile, uliterals)			 = l->uliterals;
   CPP_OPTION (pfile, rliterals)			 = l->rliterals;
   CPP_OPTION (pfile, user_literals)		 = l->user_literals;
+  CPP_OPTION (pfile, binary_constants)		 = l->binary_constants;
 }
 
 /* Initialize library global state.  */
--- libcpp/expr.c.jj	2013-01-15 09:04:55.000000000 +0100
+++ libcpp/expr.c	2013-04-27 08:38:14.453026746 +0200
@@ -621,7 +621,7 @@  cpp_classify_number (cpp_reader *pfile,
 	  && CPP_OPTION (pfile, cpp_warn_long_long))
         {
           const char *message = CPP_OPTION (pfile, cplusplus) 
-		                ? N_("use of C++0x long long integer constant")
+				? N_("use of C++11 long long integer constant")
 		                : N_("use of C99 long long integer constant");
 
 	  if (CPP_OPTION (pfile, c99))
@@ -639,9 +639,14 @@  cpp_classify_number (cpp_reader *pfile,
   if ((result & CPP_N_IMAGINARY) && CPP_PEDANTIC (pfile))
     cpp_error_with_line (pfile, CPP_DL_PEDWARN, virtual_location, 0,
 			 "imaginary constants are a GCC extension");
-  if (radix == 2 && CPP_PEDANTIC (pfile))
+  if (radix == 2
+      && !CPP_OPTION (pfile, binary_constants)
+      && CPP_PEDANTIC (pfile))
     cpp_error_with_line (pfile, CPP_DL_PEDWARN, virtual_location, 0,
-			 "binary constants are a GCC extension");
+			 CPP_OPTION (pfile, cplusplus)
+			 ? "binary constants are a C++1y feature "
+			   "or GCC extension"
+			 : "binary constants are a GCC extension");
 
   if (radix == 10)
     result |= CPP_N_DECIMAL;
--- gcc/testsuite/g++.dg/cpp/limits.C.jj	2012-06-06 20:35:54.000000000 +0200
+++ gcc/testsuite/g++.dg/cpp/limits.C	2013-04-27 08:45:20.036719569 +0200
@@ -4,13 +4,13 @@ 
 #include <limits>
 
 // Compiling this with -pedantic was wrongly triggering this error:
-// libstdc++-v3/include/limits:1269:45: warning : use of C++0x long long integer constant [-Wlong-long]
+// libstdc++-v3/include/limits:1269:45: warning : use of C++11 long long integer constant [-Wlong-long]
 //       min() _GLIBCXX_USE_NOEXCEPT { return -__LONG_LONG_MAX__ - 1; }
 //                                             ^
-// libstdc++-v3/include/limits:1272:44: warning : use of C++0x long long integer constant [-Wlong-long]
+// libstdc++-v3/include/limits:1272:44: warning : use of C++11 long long integer constant [-Wlong-long]
 //       max() _GLIBCXX_USE_NOEXCEPT { return __LONG_LONG_MAX__; }
 //                                            ^
-// libstdc++-v3/include/limits:1342:44: warning : use of C++0x long long integer constant [-Wlong-long]
+// libstdc++-v3/include/limits:1342:44: warning : use of C++11 long long integer constant [-Wlong-long]
 //       max() _GLIBCXX_USE_NOEXCEPT { return __LONG_LONG_MAX__ * 2ULL + 1
 //                                            ^
 
--- gcc/testsuite/g++.dg/system-binary-constants-1.C.jj	2012-05-17 08:40:34.000000000 +0200
+++ gcc/testsuite/g++.dg/system-binary-constants-1.C	2013-04-27 08:47:50.600834156 +0200
@@ -14,5 +14,5 @@  foo (void)
 					    warning.  */
   return 23;
 #endif
-  return 0b1101; /* { dg-warning "binary constants are a GCC extension" } */
+  return 0b1101; /* { dg-warning "binary constants are a C..1y feature or GCC extension" } */
 }
--- gcc/testsuite/g++.dg/cpp1y/system-binary-constants-1.C.jj	2013-04-27 08:43:44.084238188 +0200
+++ gcc/testsuite/g++.dg/cpp1y/system-binary-constants-1.C	2013-04-27 08:52:35.687230081 +0200
@@ -0,0 +1,14 @@ 
+// Origin: Dodji Seketeli <dodji@redhat.com>
+// { dg-options "-std=c++1y -pedantic-errors" }
+// { dg-do compile } 
+
+#include "../system-binary-constants-1.h"
+
+int
+foo (void)
+{
+#if BINARY_INT_CONSTANT_IN_SYSTEM_HEADER
+  return 23;
+#endif
+  return 0b1101; // { dg-bogus "binary constants are a C..1y feature or GCC extension" }
+}