WG21 Brno: with C++26 done, the committee turns to undefined behavior
C++26 is done. It shipped reflection, contracts, a hardened standard library, and import std. WG21 met in Brno, Czechia from June 8 to 13, 2026, the first meeting since C++26 was finalized at Croydon in March, and the question hanging over it was simple: what now?
Herb Sutter’s Brno trip report answers it clearly. The committee has turned, with unusual focus, to one target: undefined behavior. Brno was not a reflection meeting or a big-new-feature meeting. It was the opening move of what is shaping up to be C++29, the safety release.
The meeting by the numbers
About 200 people (55% on-site at Mendel University, 45% online), 28 nations, 22 active subgroups across 11 parallel tracks, over six days, with 25 first-time guests. The next meeting is in Buzios, Brazil, in November 2026.
The headline: write down all the UB
The structural move of the meeting was P3596R3, “Undefined Behavior and IFNDR Annexes”. It adds two new annexes that catalogue, in one place, every case of undefined behavior and every “ill-formed, no diagnostic required” (IFNDR) corner in the standard. You cannot systematically eliminate what you have not first enumerated.
Paired with it: P3100, “A framework for systematically addressing undefined behaviour in the C++ Standard.” The plan, per Sutter, is a series of summer and fall telecons doing a line-by-line review of that catalogue, targeting C++29. This is the committee committing to grind down UB case by case, in public, on a schedule.
For a language whose detractors reduce it to “undefined behavior everywhere,” this is the most direct possible answer: name every instance, then close them. The safety state-of-the-union from May laid out the regulatory pressure (CISA, the EU CRA) behind this; Brno is the committee answering it with process, not slogans.
Profiles keep marching
The other half of the safety story is profiles, opt-in bundles of restrictions a compiler enforces. Brno moved several: P4222, “An initialization profile” (Stroustrup), the profile that stamps out uninitialized-read UB; P3984, “A type-safety profile” (Stroustrup); and P3589R2, “C++ Profiles: The Framework” (Dos Reis). SG23 (Safety and Security) is building the formal specification, targeting C++29 or a concurrent white paper.
Contracts grow a feature back
One adoption stands out for anyone following the contracts story: P3097R3, “Contracts for C++: Virtual functions.”
Virtual-function contracts were cut from the C++26 contracts MVP at Hagenberg in early 2025. The interaction with inheritance was not mature enough to ship. P3097R3 brings them back for the next standard, with both base-class and final-overrider assertions evaluated. The MVP shipped; the feature that was deferred is already on its way back.
Quality-of-life, adopted
Brno also cleared a stack of smaller papers that working programmers will feel:
- P2287R6, “Designated-initializers for Base Classes” (Revzin). Designated-init syntax that finally reaches through a base class.
- P3091, “Better Lookups for map, unordered_map, and flat_map”. A
.get(key)that returns anoptional<mapped_type&>instead of forcing an insertion the wayoperator[]does. - P3668R4, “Defaulting Postfix Increment and Decrement Operations”.
=defaultyour postfix++/--to defer to the prefix versions. - P3125R6, “constexpr pointer tagging”. A portable
pointer_tag_pair<Pointer, Tag>for stashing bits in a pointer’s spare low bits. - P3248, “Require
[u]intptr_t”.intptr_tanduintptr_tgo from optional to mandatory.
A closer look at these lands in a companion post this week.
So where was reflection?
Here is the telling part: Sutter’s Brno report does not mention reflection, P2996, or token injection at all.
That is not a snub. It is what shipping looks like. Reflection was the marquee feature of C++26; once a feature is in the standard, the committee’s attention moves to the next frontier, and right now that frontier is safety. The reflection work that remains (token injection and the design space around code generation) continues as study-group work aimed at C++29, exactly as the “reflection is only half” post and the May mailing roundup already documented. It was not a Brno plenary headline.
For the wro.cpp series, that is good news twice over. The reflection you have been reading all month is final, standardized C++26, not a moving target. And the next chapter is still being designed, which means there is time to master the part that already ships.
The bigger picture
C++26 was the features release: reflection, contracts, hardened stdlib. Brno suggests C++29 wants to be the safety release: a full UB catalogue with a schedule to close it, profiles with a target standard, and contracts filling in the pieces the MVP deferred.
This week, three companion posts go deeper: the undefined-behavior catalogue, the quality-of-life adoptions, and the profiles-and-contracts safety track. Reflection did not make the Brno headlines, and that is exactly the sign you want after a feature ships: the committee trusts it enough to look past it.
Sources: Herb Sutter, Brno trip report (June 13, 2026) – primary source for the adoptions and numbers above. Papers referenced: P3596R3 (Undefined Behavior and IFNDR Annexes), P3100 (A framework for systematically addressing undefined behaviour), P4222 (An initialization profile), P3984 (A type-safety profile), P3589R2 (C++ Profiles: The Framework), P3097R3 (Contracts for C++: Virtual functions), P2287R6 (Designated-initializers for Base Classes), P3091 (Better Lookups for map, unordered_map, and flat_map), P3668R4 (Defaulting Postfix Increment and Decrement Operations), P3125R6 (constexpr pointer tagging), P3248 (Require [u]intptr_t). Additional trip reports (Inbal Levi, JeanHeyd Meneide, Barry Revzin) may add detail as they publish.