N2961
Literal Suffixes for size_t

Published Proposal,

Author:
Latest:
https://thephd.dev/_vendor/future_cxx/papers/C - Literal Suffixes for size_t.html
Paper Source:
github.com/ThePhD/future_cxx
Issue Tracking:
GitHub
Proposal Category:
Feature Request
Target:
C2Y/C3X
Project:
ISO/IEC JTC1/SC22/WG14 9899: Programming Language — C

Abstract

C++ has suffixed literals for size_t and its signed counterpart. This paper gives C the same ability.

1. Changelog

1.1. Revision 0 - April 12th, 2022

2. Design

This is a (minor) compatibility issue with literal suffixes that may be potentially used in shared code in the future. C++ adopted suffixed literals for size_t in [p0330]. The design is as follows:

#include <stddef.h>

size_t ulit_val = 0zu;

The u, as with current literals, can be placed on either the left or the right of the z suffix to make it unsigned. For symmetry with existing suffix literal rules, it also has a signed variant. That type is the "signed integer type of size_t", which normally resolves to ptrdiff_t:

#include <stddef.h>

ptrdiff_t lit_val = 0z;

The signed variant lacks the u as a piece of the z suffix. This also matches the way printf adjusts specific codes to display size_t or ptrdiff_t-sized variables. The design is simple and, thankfully, compatible with C++. It also provides a way to avoid signed comparison warnings in compilers which implement more strict comparisons checks, e.g., when comparing a size_t value against some fixed constant value.

2.1. Even After Compatibility, Do We Really Need This?

Yes. The trip to put this paper into C++ was an extremely long one and came with a ton of reasons. All of it can be seen in [p0330] and 90% of that reasoning applies to C, especially in the face of _Generic.

3. Wording

Wording is relative to [N2731].

3.1. Intent

The goal of this wording is to provide:

3.2. Specification

3.2.1. Add two new grammar productions to §6.4.4.1 Integer constants¸ Syntax, ¶1

6.4.4.1 Integer constants Syntax

integer-suffix:
unsigned-suffix long-suffixopt
unsigned-suffix long-long-suffix
unsigned-suffix size-suffix
long-suffix unsigned-suffixopt
long-long-suffix unsigned-suffixopt
size-suffix unsigned-suffixopt

long-long-suffix: one of
ll LL
size-suffix: one of
z Z

3.2.2. Add two new table rows to §6.4.4.1 Integer constants¸ Semantics, ¶6

Suffix Decimal Constant Octal, Binary, or Hexadecimal Constant
z or Z the corresponding signed integer type of the expression sizeof(0)'s type (6.5.3.4) the corresponding signed integer type of the expression sizeof(0)'s type
Both U or U and z or Z the same type as the expression sizeof(0) the same type as the expression sizeof(0)

Forward references: preprocessing numbers (6.4.8), numeric conversion functions (7.22.1) , The sizeof and _Alignof operators (6.5.3.4) .

References

Informative References

[N2731]
JeanHeyd Meneide; Freek Wiedijk. ISO/IEC 9899 Programming Languages C - Working Draft. October 18th, 2021. URL: http://www.open-std.org/jtc1/sc22/wg14/www/docs/n2731.pdf
[P0330]
JeanHeyd Meneide; Rein Halbersma. Literal Suffixes for ptrdiff_t and size_t. November 4th, 2019. URL: https://wg21.link/p0330