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 > +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. > + 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. > --- 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