[[C++ PATCH]] Implement C++2a P0330R2 - Literal Suffixes for ptrdiff_t and size_t

Tam S. B. cpplearner@outlook.com
Thu Feb 4 11:31:21 GMT 2021


`__cpp_size_t_suffix` is defined as 202006L, but the draft standard says 202011L: http://eel.is/c++draft/cpp.predefined#tab:cpp.predefined.ft-row-48

________________________________________
From: Gcc-patches <gcc-patches-bounces@gcc.gnu.org> on behalf of Ed Smith-Rowland via Gcc-patches <gcc-patches@gcc.gnu.org>
Sent: Tuesday, February 2, 2021 6:19
To: Jason Merrill; Jakub Jelinek
Cc: gcc-patches; nathan@acm.org; Joseph S. Myers
Subject: Re: [[C++ PATCH]] Implement C++2a P0330R2 - Literal Suffixes for ptrdiff_t and size_t

On 2/2/21 12:12 AM, Jason Merrill wrote:
> On 2/1/21 9:15 PM, Ed Smith-Rowland wrote:
>> On 2/1/21 2:23 PM, Jakub Jelinek wrote:
>>> On Mon, Feb 01, 2021 at 01:46:13PM -0500, Ed Smith-Rowland wrote:
>>>> @@ -0,0 +1,8 @@
>>>> +// { dg-do compile { target c++23 } }
>>>> +
>>>> +#include <cstddef>
>>>> +#include <type_traits>
>>>> +
>>>> +static_assert(std::is_same_v<decltype(123zu), std::size_t>);
>>>> +static_assert(std::is_same_v<decltype(456z), std::ptrdiff_t>);
>>> Shouldn't this be std::make_signed<std::size_t>::type instead of
>>> std::ptrdiff_t
>> Yes it should. The paper goes on about ptrdiff_t but at the very end
>> they punt on that in favor of what you have.
>>>
>>>> +std::ptrdiff_t pd1 = 1234z; // { dg-warning "use of C\+\+23
>>>> ptrdiff_t integer constant" "" { target c++20_down } }
>>>> +std::ptrdiff_t PD1 = 5678Z; // { dg-warning "use of C\+\+23
>>>> ptrdiff_t integer constant" "" { target c++20_down } }
>>> Ditto here.
>> Agree.
>>>
>>>> +      const char *message = (result & CPP_N_UNSIGNED) ==
>>>> CPP_N_UNSIGNED
>>>> +                ? N_("use of C++23 size_t integer constant")
>>>> +                : N_("use of C++23 ptrdiff_t integer constant");
>>> And here too (perhaps %<make_signed<size_t>::type%> )?
>>> And maybe %<size_t%> too.
>> Agree.
>>>
>>>> --- a/libcpp/include/cpplib.h
>>>> +++ b/libcpp/include/cpplib.h
>>>> @@ -500,6 +500,9 @@ struct cpp_options
>>>>     /* Nonzero means tokenize C++20 module directives.  */
>>>>     unsigned char module_directives;
>>>> +  /* Nonzero for C++23 ptrdiff_t and size_t literals.  */
>>> And drop "ptrdiff_t and " here?
>>>
>>>> +#define CPP_N_SIZE_T    0x2000000 /* C++23 size_t or ptrdiff_t
>>>> literal  */
>>> And " or ptrdiff_t" here?
>>>
>>> While ptrdiff_t will usually be the same type, seems there is e.g.:
>>> config/darwin.h:#define SIZE_TYPE "long unsigned int"
>>> config/darwin.h:#define PTRDIFF_TYPE "int"
>>> config/i386/djgpp.h:#define SIZE_TYPE "long unsigned int"
>>> config/i386/djgpp.h:#define PTRDIFF_TYPE "int"
>>> config/m32c/m32c.h:#define PTRDIFF_TYPE (TARGET_A16 ? "int" : "long
>>> int")
>>> config/m32c/m32c.h:#define SIZE_TYPE "unsigned int"
>>> config/rs6000/rs6000.h:#define PTRDIFF_TYPE "int"
>>> config/rs6000/rs6000.h:#define SIZE_TYPE "long unsigned int"
>>> config/s390/linux.h:#define SIZE_TYPE "long unsigned int"
>>> config/s390/linux.h:#define PTRDIFF_TYPE (TARGET_64BIT ? "long int"
>>> : "int")
>>> config/visium/visium.h:#define SIZE_TYPE "unsigned int"
>>> config/visium/visium.h:#define PTRDIFF_TYPE "long int"
>>> config/vms/vms.h:#define SIZE_TYPE  "unsigned int"
>>> config/vms/vms.h:#define PTRDIFF_TYPE (flag_vms_pointer_size ==
>>> VMS_POINTER_SIZE_NONE ? \
>>> config/vms/vms.h-                      "int" : "long long int")
>>> so quite a few differences.
>>>
>>>     Jakub
>>
>> Here is my last patch with all the concerns addressed.
>>
>> I am not smart enough to get the dg-warning regex in
>> Wsize_t-literals.C to work. If someone could carry this over the
>> finish line that would be great. Or give me pointers. I can't any more.
>
> Your regex will work fine if you wrap it in {} instead of "", e.g.
>
> { dg-warning {use of C\+\+23 .size_t. integer constant} }
>
> Jason
>
Thank you Jason,

So here is the latest in testing.

Ed




More information about the Gcc-patches mailing list