July 29, 2022·6 min read·engineeringcc23standards

WG14 settles major C23 additions before committee draft review

July's WG14 meeting adopts embed, object constexpr, and type inference while leaving some proposals out. The draft minutes show how committee choices and wording repairs prepare the revision for national-body review.

WG14's July meeting had a specific procedural purpose. The committee needed to finish enough work for the editor to revise the C23 draft, arrange editorial review, and send it for committee-draft ballot. The draft minutes, N3044, record David Keaton explaining that this revision needs the review stage because its changes are substantial. C17 had followed a shorter route as a minor revision.

The meeting record places the teleconference on July 18 through 22. The document log lists the draft minutes on July 29. Reading those minutes gives a more precise account than treating the end of the meeting as completion of the standard. Balloting and comment resolution remain work ahead of the committee.

Several decisions affect how C programs express values during translation. Others address the compatibility rules that support communication between separately written code. C's role in interoperation is a large part of why I still care about its development. The July decisions matter because both kinds of change need a sufficiently precise common specification.

Adoption is more specific than a favourable discussion

The minutes distinguish adopted wording from an opinion poll that asks an author to do more work. That distinction appears repeatedly during the week. A proposal can receive support for its direction and still require changes before a vote on inclusion. Reports that collapse these stages risk presenting unfinished text as a committee decision.

Type inference and constexpr object definitions receive adoption votes on Thursday. The minutes associate type inference with N3007 and underspecified declarations with N3006. They record an affirmative choice of auto for the inference keyword, followed by adoption of the feature together with the declaration changes. These are decisions about object definitions, not an announcement of a general new function-template system.

For constexpr, the committee adopts changes from section 7 of N3018 together with N3006, then separately adopts the section concerning structure and union members. That scope is worth naming. The January N2917 proposal covered functions as well as objects, while this July decision explicitly concerns the object-definition proposal. Sharing a keyword does not make these papers interchangeable.

The recorded votes also show that some additions have appreciable dissent or abstention. The principal constexpr vote passes eight to four with three abstentions. That does not weaken the fact that the motion was adopted, but it does prevent an accurate account from describing every major addition as unanimous. The minutes give the actual level of support for the particular question asked.

Binary inclusion survives its optional questions

The committee votes on N3017, the preprocessor embed proposal, in multiple pieces. Sections 7.1 through 7.5 pass twelve to one with three abstentions. Section 7.6 passes separately, as does section 7.7. The separate questions correspond to choices that the paper presents as optional additions around the base facility.

In N3017 itself, the central mechanism is a preprocessing directive that supplies binary resource values as initializer tokens. Optional wording addresses empty-resource detection and parameters for supplying tokens around nonempty resources or replacing empty input. Those are practical cases for an initializer, where a misplaced comma can make otherwise useful data inclusion invalid.

The July votes establish a decision beyond the earlier proposal's open alternatives. They do not mean that every suggestion discussed during the meeting was accepted. An opinion poll about altering another paragraph of the embed wording divides five to five, with seven abstentions, and the minutes mark that change as not done. The adopted text and the rejected modification belong to the same discussion but have different status.

I prefer reports of standards work that keep those distinctions visible. A developer needs to know which interface the editor has authority to integrate. A general impression that the committee liked a feature does not answer that question.

Homework changes the text that receives approval

The nullptr proposal provides an example of revision during the meeting. On Thursday, N3019 receives support for work along its lines, with homework on missing conversion cases. Friday's discussion continues through N3039 and then N3042. The minutes record adoption of N3042 by seventeen votes to one, with three abstentions.

That history explains why the paper number matters when discussing a decision. An example derived from an earlier version may not describe the conversion rules that the committee ultimately adopted. The meeting's approval applies to the revised wording identified in the final motion. It is not blanket approval of everything that appeared under the same proposal title earlier in the week.

Enumeration work follows a similar pattern. N3021 receives a favourable direction poll with editorial homework. Friday's N3030 revision then receives an adoption vote with editorial changes. Improved normal enumeration wording proceeds through N3029, with a specific requested replacement of a word in the text. The minutes preserve both the resulting decision and the qualification attached to it.

Tag compatibility also requires revised wording. The committee discusses N3003, requests work, and later adopts alternative wording from N3037. This is a reminder that a meeting can be consequential through detailed repairs to compatibility rules. A short feature list does not explain how the accepted wording differs from an author's initial version.

Integer types need boundaries around existing interfaces

The _BitInt discussions concern integration with rules and typedefs that programs already use. The committee adopts clarification of integer promotions and increment/decrement behaviour from N2960. Later homework produces N3035 and further votes concerning the standard integer typedefs.

The minutes record unanimous support among voting participants for dropping the requirement that intmax_t and uintmax_t hold every value of a bit-precise integer type. They also record adoption of wording that disallows the typedefs in stdint.h from being defined as bit-precise integer types for C23. Discussion identifies the exclusions as a short-term choice requiring more implementation experience and notes possible observability through _Generic.

These decisions show the integration problem created by extending the integer model. A new type family affects assumptions encoded in existing generic code and library names. Deciding where the new types may appear is part of defining their usability. It is not enough for a compiler to parse a declaration with an arbitrary bit width.

The same meeting adopts bit-precise bit-fields through N2969. That extends where these types can be useful while the typedef decisions limit their interaction with established library contracts. Both decisions belong in an account of the change, because describing only the new syntax would omit the explicit boundaries the committee chose.

Some proposals remain outside the revision

Restartable character conversions do not obtain consensus for inclusion. The minutes describe concerns about multiple-input and multiple-output conversions, freestanding support, and naming prefixes. After revised material is discussed on Friday, the inclusion poll is eight in favour and six against, with nine abstentions. It is marked as having no consensus.

The proposed Unicode length modifiers likewise do not advance into C23 at this meeting. Discussion identifies dependencies on functions not yet voted in and locale issues for C++ compatibility. The direction poll records three in favour, ten against, and nine abstentions. This is stronger evidence about the meeting's outcome than the mere presence of that paper on its agenda.

Modern bit utilities advance with a narrower scope than the full proposal. The committee accepts N3022 without rotate-left, rotate-right, endian-aware, or memory-reversal functions. That qualification is part of the adoption motion. A summary that lists the entire paper's contents as accepted facilities would therefore overstate the result.

National-body review is the next source of corrections

Keaton's opening explanation describes a sequence after the meeting. The editor revises the draft, an editorial committee reviews it, and the document goes out for committee-draft ballot. National bodies then have a route to raise comments on changes that need correction. The minutes also refer to unresolved identifier-extension details as material suitable for a national-body comment.

The minutes remain a draft record, so the procedural qualifications in them deserve the same attention as the votes. The process matters to anyone implementing draft C23 support. July supplies decisions on major additions, but some decisions include editorial repairs and some surrounding questions remain open. A compiler can implement the accepted direction without claiming that every paragraph is final. The next review stage examines how those decisions work together in one draft, including interactions that individual proposal discussions may not have resolved.