Skip to content

Commit aa21320

Browse files
committed
2026.9.21.1: the borrowed __CYGWIN__ is withdrawn, by measurement
`presents = "posix"` on Windows realises as a Cygwin-flavoured target. The previous release LEFT `__CYGWIN__`/`__CYGWIN32__` defined, so that portable third-party code needing to know the OBJECT FORMAT would keep a name for "PE format with a POSIX-presenting C environment", and it wrote its own condition for reversal: a trade-off for the 30-member measurement to settle, flipping if defining them produced more failures than it fixed. IT PRODUCED FOUR AND FIXED NONE. Across 60 member-target combinations, archive, sqlite3, mimalloc and c-ares each stopped at `#include <windows.h>`, reached through a guard of the shape `#if defined(_WIN32) || defined(__CYGWIN__)`. Nothing in the same run failed for want of the macro. Upstream says what it means by the name. mimalloc puts it in the guard's own comment --- `we use windows locks on cygwin, but otherwise treat it at unix` --- and sqlite3 lists it in the `SQLITE_OS_WIN` detection set before including `windows.h`. A BORROWED NAME MEANS WHAT THE LENDER'S HISTORY MADE IT MEAN, not what the borrower intended by it. The object-format question keeps no macro at all: a package asks `cfg(os = "windows")`, which needs none. If a third party is ever found that can only ask in the preprocessor, mcpp defines a name of its own. WHAT CARRIES THE CHANGE IS NOT THE TWO `-U` TOKENS. It is the two entries added to `expectUndefined`: `cenv_probe::verify` compares the realised configuration's predefines against those lists and refuses on a mismatch, so a `-U` that failed to take effect is a verification failure rather than a silent one. Measured directly with the pinned clang, in the order mcpp emits them: echo | clang -dM -E -x c - -U__CYGWIN__ -U__CYGWIN32__ \ --target=x86_64-pc-cygwin -U__CYGWIN__ -U__CYGWIN32__ -> __unix__ defined, __CYGWIN__ absent, _WIN32 absent The unit test and e2e 741 now assert the opposite side, and both record that this module has held both answers and what flipped it. The pair appears twice on a `.S` command line and once on `.c`/`.cpp`, because `cEnvTokens` reaches asmflags directly and `-D`/`-U`/`-I`-shaped tokens also arrive through the channel that carries defines into assembly; `-U X` twice is `-U X`, and the probe is the judge, so no count is asserted. Also in this release, as documents rather than engine changes: * `.agents/docs/2026-09-21-openkal-ecosystem-completion-and-acceptance.md` --- the nine items this wave did not implement, each with its criterion, its owner and what blocks it; why `lsp-mcpp-private` is the acceptance vehicle (its platform surface is six constants, none of them a POSIX facility, and it makes no direct POSIX call); and a cross-repository verification protocol: an engine PR is built by the ecosystem through `MCPP_SOURCE_REF` and both sides must be green BEFORE it merges. That protocol exists because this very change needed a second release --- a reading the thirty member graphs could have produced before the first one.
1 parent 9e115f1 commit aa21320

10 files changed

Lines changed: 669 additions & 88 deletions

File tree

.agents/docs/2026-09-21-openkal-ecosystem-completion-and-acceptance.md

Lines changed: 470 additions & 0 deletions
Large diffs are not rendered by default.

.agents/docs/README.md

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ superseded_by: 2026-09-07-....md # when status is superseded
1818
---
1919
```
2020

21-
302 records.
21+
303 records.
2222

2323
## By subject
2424

@@ -52,6 +52,7 @@ Records that declare one. Everything else is listed by date below.
5252

5353
### plan
5454

55+
- [openkal 生态:完整性收尾与验收方案](2026-09-21-openkal-ecosystem-completion-and-acceptance.md) — active
5556
- [C 环境生态方案:执行计划](2026-09-20-ecosystem-execution-plan.md) — active
5657

5758
### plugins
@@ -93,6 +94,7 @@ Records that declare one. Everything else is listed by date below.
9394

9495
### 2026-09
9596

97+
- [openkal 生态:完整性收尾与验收方案](2026-09-21-openkal-ecosystem-completion-and-acceptance.md) — active
9698
- [本轮生态级自审](2026-09-20-wave-self-review.md) — active
9799
- [openkal 生态:能力的时刻模型,以及 C 环境方案空间的划分](2026-09-20-openkal-c-environment-ecosystem-design.md) — active
98100
- [#674 设计方案评审:`-include unistd.h` 在 Windows + `presents = "posix"` 上的可行性](2026-09-20-issue-674-design-review.md) — active

CHANGELOG.md

Lines changed: 38 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,43 @@
55

66
## [Unreleased]
77

8+
## [2026.9.21.1] - 2026-09-21
9+
10+
### 撤掉借来的 `__CYGWIN__`,由一次测量裁决
11+
12+
`presents = "posix"` 在 Windows 上实现成 Cygwin 形状的目标。上一版**保留**
13+
`__CYGWIN__`/`__CYGWIN32__` 定义,理由是:需要知道**目标文件格式**的第三方可移植代码,
14+
没有别的名字能指代「PE 格式 + 呈现 POSIX 的 C 环境」。那一版同时写下了自己的翻转条件
15+
——**留给 30 成员测量裁决;若定义它带来的失败比修好的多,结论就翻过来。**
16+
17+
测量在 2026-09-20 给出读数,60 个「成员 × 目标」组合:**保留它代价是四个成员**——
18+
`archive`、`sqlite3`、`mimalloc`、`c-ares`,各自停在 `#include <windows.h>`,都经由形如
19+
`#if defined(_WIN32) || defined(__CYGWIN__)` 的守卫到达。**同一轮里没有任何一项因为缺少
20+
这个宏而失败。** 四比零。
21+
22+
上游自己说明了这个名字的含义。mimalloc 把话写在守卫的注释里:
23+
`we use windows locks on cygwin, but otherwise treat it at unix`;sqlite3 把它列进
24+
`SQLITE_OS_WIN` 的检测集合,随后 `#include "windows.h"`。**它们用这个名字表达的是
25+
「Win32 可用」,不是「目标文件格式是 PE」。一个借来的名字,语义由借出方的历史决定,
26+
不由借用方的意图决定。**
27+
28+
于是「目标文件格式」这一维**不保留任何宏**:包问 `cfg(os = "windows")`,那不需要宏。
29+
若某天确实发现只能在预处理期问这件事的第三方代码,答案是 mcpp 定义一个自己的名字。
30+
31+
承重的不是那两个 `-U` token,是 `expectUndefined` 里新增的两项:探针把实现出的配置的
32+
预定义与它比对,**一个没生效的 `-U` 是一次校验失败,不是一次沉默**。
33+
34+
实测(钉住的 clang,按 mcpp 实际发出的 token 顺序):
35+
36+
```
37+
echo | clang -dM -E -x c - -U__CYGWIN__ -U__CYGWIN32__ \
38+
--target=x86_64-pc-cygwin -U__CYGWIN__ -U__CYGWIN32__
39+
-> __unix__ 定义;__CYGWIN__ 消失;_WIN32 仍不存在
40+
```
41+
42+
单测与 e2e 741 都改成断言相反的一侧,注释里记着这个模块两种答案都持有过、以及是什么
43+
把它翻过来的。
44+
845
## [2026.9.20.1] - 2026-09-20
946

1047
### 校验探针量的是构建宿主,而不是它要核对的那个目标
@@ -100,7 +137,7 @@ requires-interfaces = ["openkal.fs", "openkal.net"]
100137
`refusal.cppm` 能发出的令牌与表里的行,并要求简体中文镜像携带同一个集合。
101138
两个方向各去掉一条都会红。
102139

103-
⚠️ 这张表的**列头**是 `| \`reason\` | |`——第一格里一个反引号名字,形状与下面每一行
140+
这张表的**列头**是 `| \`reason\` | |`——第一格里一个反引号名字,形状与下面每一行
104141
完全相同。按「行首反引号名字」匹配会把 `reason` 当成一个令牌。行与列头的区别在**第二格
105142
非空**,所以判据按性质挑对象,不按语法挑。
106143

docs/22-target-side.md

Lines changed: 26 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -377,7 +377,7 @@ that names no C library:
377377
| Linux | `posix` / `arch-default` | the default triple already satisfies it |
378378
| macOS | `posix` / `arch-default` | one token, `-D__unix__` — Apple's clang predefines `__APPLE__`/`__MACH__` on its default triple, never `__unix__` |
379379
| freestanding | `posix` / `arch-default` | the same one token, `-D__unix__`, for the same reason: nothing here defines it either |
380-
| Windows | `posix` / `arch-default` | Cygwin-flavoured: `--target=x86_64-pc-cygwin` on the compile line only; `__CYGWIN__`/`__CYGWIN32__` are left defined (see the note below); `data-model` becomes LP64 as a consequence of the triple, not a separate flag |
380+
| Windows | `posix` / `arch-default` | Cygwin-flavoured: `--target=x86_64-pc-cygwin` on the compile line only; `__CYGWIN__`/`__CYGWIN32__` are undefined on top of it (see the note below); `data-model` becomes LP64 as a consequence of the triple, not a separate flag |
381381
| any | `builtins = "iso"` | turns off code-generation idioms that assume a platform C library — `-fno-builtin-memset_pattern16` on Apple targets is the one this survey measured; see `src/toolchain/cenv.cppm` for what else was checked and found not to apply |
382382
| anything else | | refused, naming the target, the request and what is missing — never a silent downgrade |
383383

@@ -418,20 +418,31 @@ preprocessor sees and how wide `long` is. Realisation therefore touches only
418418
the **compile** line; the **link** line keeps the triple the graph resolved,
419419
because nothing about the object format changed.
420420

421-
**`__CYGWIN__`/`__CYGWIN32__` are left defined — a revision from the
422-
openkal-musl spike, not the design's original claim.** Undefining them was
423-
tried first, on the reasoning that a real Cygwin userland is not in the
424-
graph. Portable third-party code that needs to know the **object format**
425-
not the C environment, not the platform API — has no name for "PE format
426-
with a POSIX-presenting C environment" other than `__CYGWIN__`, and such code
427-
cannot be patched the way this ecosystem's own packages can. `presents =
428-
"posix"` answers one question, which environment-identity macros source
429-
sees; it does not get to answer a different one, what object format this is,
430-
by deleting the only macro that names it. This is a **trade-off for the
431-
30-member measurement to settle, not a settled fact**: a library reaching for
432-
`__CYGWIN__` may also reach for a real Cygwin interface (`sys/cygwin.h`,
433-
`cygwin_conv_path`) that does not exist here, and if defining it produces
434-
more new failures than it fixes, the answer flips.
421+
**`__CYGWIN__`/`__CYGWIN32__` are undefined, and a measurement decided it
422+
(2026.9.21.1).** This page has carried both answers. A middle revision left
423+
them defined, so that portable third-party code needing to know the **object
424+
format** — not the C environment, not the platform API — would keep a name
425+
for "PE format with a POSIX-presenting C environment". That revision wrote
426+
its own condition for reversal: a trade-off for the 30-member measurement to
427+
settle, flipping if defining them produced more failures than it fixed.
428+
429+
It produced four and fixed none. Across 60 member-target combinations,
430+
`archive`, `sqlite3`, `mimalloc` and `c-ares` each stopped at
431+
`#include <windows.h>`, reached through a guard of the shape
432+
`#if defined(_WIN32) || defined(__CYGWIN__)`. Nothing in the same run failed
433+
for want of the macro.
434+
435+
**A borrowed name means what the lender's history made it mean.** Upstream
436+
uses this one to say *Win32 is available*, not *the object format is PE*
437+
mimalloc states it in the guard itself (`we use windows locks on cygwin, but
438+
otherwise treat it at unix`), and sqlite3 lists it in the `SQLITE_OS_WIN`
439+
detection set before including `windows.h`. The intent behind borrowing it
440+
does not travel with it.
441+
442+
The object-format question therefore keeps **no macro at all**. A package
443+
asks `cfg(os = "windows")`, which needs none. Should a third party ever be
444+
found that can only ask in the preprocessor, the answer is a name mcpp
445+
defines itself, not one it borrows.
435446

436447
**A `kernel-abi` provider's own units are INFERRED onto the platform boundary
437448
— it never has to say so (mcpp 2026.9.18+, a mid-PR revision from the

docs/zh/22-target-side.md

Lines changed: 20 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -309,7 +309,7 @@ libunwind 的 `assembly.h`,正是按这个宏来选寄存器保存集的)。mcpp
309309
| Linux | `posix` / `arch-default` | 默认三元组已经满足 |
310310
| macOS | `posix` / `arch-default` | 一个令牌,`-D__unix__`——Apple 的 clang 默认三元组预定义的是 `__APPLE__`/`__MACH__`,从来不是 `__unix__` |
311311
| 裸机(freestanding) | `posix` / `arch-default` | 同样一个令牌,`-D__unix__`,原因相同:这里同样没有任何东西定义它 |
312-
| Windows | `posix` / `arch-default` | 采用 Cygwin 式语义:仅在编译行加 `--target=x86_64-pc-cygwin`;`__CYGWIN__`/`__CYGWIN32__` 保持定义(见下方说明);`data-model` 变为 LP64 是三元组切换的结果,不是另一个开关 |
312+
| Windows | `posix` / `arch-default` | 采用 Cygwin 式语义:仅在编译行加 `--target=x86_64-pc-cygwin`;在其之上再加 `-U__CYGWIN__ -U__CYGWIN32__`(见下方说明);`data-model` 变为 LP64 是三元组切换的结果,不是另一个开关 |
313313
| 任意目标 | `builtins = "iso"` | 关闭代码生成阶段假定平台 C 库在场的惯用法识别——本轮实测到的唯一一例是 Apple 目标上的 `-fno-builtin-memset_pattern16`;`src/toolchain/cenv.cppm` 记录了还核实过哪些、结论是不适用 |
314314
| 其余情况 | | 明确拒绝,点名目标、请求与缺什么——不静默降级 |
315315

@@ -337,15 +337,25 @@ Windows 一行是旗舰情形:`x86_64-w64-windows-gnu` 与 `x86_64-pc-cygwin`
337337
同样的 PE 格式、同样的 Win64 调用约定、同样的 SEH——差别只在预处理器看到什么、`long` 有多宽。
338338
因此实现只触及**编译**行;**链接**行保持图解析出的三元组,因为目标文件格式没有变化。
339339

340-
**`__CYGWIN__`/`__CYGWIN32__` 保持定义——这是 openkal-musl 尖峰实验带来的修订,不是设计
341-
最初的陈述。** 最初试过取消定义它们,理由是图里没有真正的 Cygwin 用户态。第三方可移植
342-
代码里,需要知道**目标文件格式**——不是 C 环境,也不是平台 API——的那部分,没有别的名字
343-
能指代「PE 格式加呈现 POSIX 的 C 环境」这个组合,只有 `__CYGWIN__`;这样的代码不像本生态
344-
自己的包那样可以打补丁。`presents = "posix"` 回答的是一个问题——源码看到哪些环境身份宏;
345-
它不能顺带删掉唯一能回答另一个问题——这是什么目标文件格式——的宏。这是一项**留给 30 个
346-
成员那轮实测去判定的权衡,不是已经定论的事实**:一个库伸手去够 `__CYGWIN__`,也可能伸手
347-
去够一个这里并不存在的真正 Cygwin 接口(`sys/cygwin.h``cygwin_conv_path`)——如果定义它
348-
带来的新失败比修好的还多,结论就会翻过来。
340+
**`__CYGWIN__`/`__CYGWIN32__` 取消定义,而这是一次实测裁决的(2026.9.21.1)。** 本页
341+
两种答案都写过。中间一版保持它们定义,为的是让需要知道**目标文件格式**——不是 C 环境,
342+
也不是平台 API——的第三方可移植代码,留住「PE 格式加呈现 POSIX 的 C 环境」这个组合的名字。
343+
那一版自己写下了翻转条件:留给 30 个成员那轮实测判定的权衡,若定义它带来的失败比修好的多,
344+
结论就翻过来。
345+
346+
它带来四个,修好零个。60 个「成员 × 目标」组合里,`archive``sqlite3``mimalloc`
347+
`c-ares` 各自停在 `#include <windows.h>`,经由形如
348+
`#if defined(_WIN32) || defined(__CYGWIN__)` 的守卫到达。同一轮里没有任何一项因为**缺少**
349+
这个宏而失败。
350+
351+
**一个借来的名字,它的语义由借出方的历史决定。** 上游用它表达的是「**Win32 可用**」,
352+
不是「目标文件格式是 PE」——mimalloc 把这句话写在守卫自己的注释里(`we use windows locks
353+
on cygwin, but otherwise treat it at unix`),sqlite3 把它列进 `SQLITE_OS_WIN` 的检测集合
354+
随后 `#include "windows.h"`。借用时的意图不会跟着名字一起走。
355+
356+
于是「目标文件格式」这个问题**不保留任何宏**。包问 `cfg(os = "windows")`,那不需要宏。
357+
若某天确实发现只能在预处理期问这件事的第三方代码,答案是 mcpp 定义一个**自己的**名字,
358+
而不是继续借别人的。
349359

350360
**`kernel-abi` 提供者的自身单元被推导落到平台边界上——它不必自己说出来**
351361
(mcpp 2026.9.18+,PR 进行中根据 openkal-musl 尖峰实验做的修订)。提供

mcpp.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
[package]
22
name = "mcpp"
3-
version = "2026.9.20.1"
3+
version = "2026.9.21.1"
44
description = "Modern C++ build & package management tool"
55
license = "Apache-2.0"
66
authors = ["mcpp-community"]

modules/versioning/src/version.cppm

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,6 @@ import std;
3131

3232
export namespace mcpp {
3333

34-
inline constexpr std::string_view MCPP_VERSION = "2026.9.20.1";
34+
inline constexpr std::string_view MCPP_VERSION = "2026.9.21.1";
3535

3636
} // namespace mcpp

src/toolchain/cenv.cppm

Lines changed: 53 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -28,9 +28,9 @@
2828
// freestanding posix / arch-default the same one token, `-D__unix__`, for the
2929
// same reason: nothing here defines it either
3030
// Windows posix / arch-default Cygwin-flavoured: `--target=x86_64-pc-cygwin`,
31-
// `__CYGWIN__`/`__CYGWIN32__` STAY DEFINED (see
32-
// the note below the table — this is a design
33-
// revision, not the original §3.3 text)
31+
// plus `-U__CYGWIN__ -U__CYGWIN32__` (see
32+
// the note below the table — measurement
33+
// returned this to the original §3.3 text)
3434
// * builtins = iso turn off the platform-C-library idioms the
3535
// code generator assumes (§3.2.1) — Apple's
3636
// `memset_pattern16` is the one measured case
@@ -70,24 +70,27 @@
7070
// identity links exactly like one compiled under the MinGW one. Only the
7171
// preprocessor saw a different environment; the linker never has to know.
7272
//
73-
// `__CYGWIN__`/`__CYGWIN32__` ARE NOT REMOVED, AND THE FIRST VERSION OF THIS
74-
// MODULE GOT THAT WRONG. §3.3's original text called for `-U__CYGWIN__
75-
// -U__CYGWIN32__` on the reasoning that a real Cygwin userland is not in the
76-
// graph. A first reading of the openkal-musl spike's libunwind build failure
77-
// blamed a missing `__CYGWIN__` branch in libunwind itself; reading the
78-
// vendored source shows that is wrong — upstream libunwind has no such
79-
// branch, so defining it there would have changed nothing (the actual break
80-
// was a downstream package selecting on `_WIN32` and is being fixed there).
81-
// The reason to keep them defined is narrower and still real: third-party
82-
// portable code that has to know the OBJECT FORMAT — as opposed to which C
83-
// environment or which platform API — has no name for "PE format with a
84-
// POSIX-presenting C environment" other than `__CYGWIN__`, and such code
85-
// cannot be patched the way this ecosystem's own packages can. The cost is
86-
// symmetric: a library that reaches for `__CYGWIN__` may also reach for a
87-
// real Cygwin interface (`sys/cygwin.h`, `cygwin_conv_path`) that does not
88-
// exist here. This is a TRADE-OFF for the 30-member measurement to settle —
89-
// if defining it produces more new failures than it fixes, the answer flips
90-
// — not a fact this module is asserting as closed.
73+
// `__CYGWIN__`/`__CYGWIN32__` ARE REMOVED, AND THIS MODULE HAS HELD BOTH
74+
// ANSWERS. The first version removed them; a second kept them, on the
75+
// argument that third-party code needing to know the OBJECT FORMAT has no
76+
// other name for "PE format with a POSIX-presenting C environment". That
77+
// version wrote the condition for changing its mind: a trade-off "for the
78+
// 30-member measurement to settle — if defining it produces more new
79+
// failures than it fixes, the answer flips".
80+
//
81+
// The measurement settled it (2026-09-20, 60 member-target combinations).
82+
// Keeping them cost four members, each stopping at `#include <windows.h>`
83+
// reached through `#if defined(_WIN32) || defined(__CYGWIN__)`; none failed
84+
// for want of the macro. Four against zero, so the answer flipped.
85+
//
86+
// What the second version got wrong is worth keeping, because it is not
87+
// specific to this macro. The name was borrowed to mean "the object format
88+
// is PE". Upstream uses it to mean "Win32 is available" — mimalloc says so in
89+
// the guard itself, and sqlite3 puts it in the `SQLITE_OS_WIN` detection set.
90+
// A BORROWED NAME MEANS WHAT THE LENDER'S HISTORY MADE IT MEAN, not what the
91+
// borrower intended. The object-format question therefore keeps no macro at
92+
// all: a package asks `cfg(os = "windows")`. If some day a third party can
93+
// only ask it in the preprocessor, mcpp defines a name of its own.
9194
export module mcpp.toolchain.cenv;
9295

9396
import std;
@@ -286,16 +289,38 @@ inline std::expected<Realisation, std::string> realise(
286289
"on x86_64 only; this arch has no verified "
287290
"substitute triple");
288291
// `--target=x86_64-pc-cygwin`, on the COMPILE line only (module
289-
// header above). `__CYGWIN__`/`__CYGWIN32__` are LEFT AS THE
290-
// TRIPLE SUBSTITUTION DEFINES THEM — not undefined (see the
291-
// module header's note: portable third-party code that needs to
292-
// know the object format has no other name for "PE format,
293-
// POSIX-presenting environment", and this is a trade-off for the
294-
// 30-member measurement, not a settled fact).
292+
// header above), AND `__CYGWIN__`/`__CYGWIN32__` UNDEFINED ON TOP
293+
// OF IT. The triple is what suppresses `_WIN32`, gives `__unix__`
294+
// and gives LP64; the two `-U` tokens remove the one thing the
295+
// triple carries that this environment cannot honour.
296+
//
297+
// THE MEASUREMENT THIS WAS LEFT TO HAS SETTLED IT (2026-09-20, 60
298+
// member-target combinations on the published graph). Defining
299+
// them cost four members --- archive, sqlite3, mimalloc, c-ares
300+
// --- each stopping at `#include <windows.h>` reached through a
301+
// guard of the shape `#if defined(_WIN32) || defined(__CYGWIN__)`.
302+
// Nothing in the same run failed for want of the macro. The
303+
// module header's condition was "if defining it produces more new
304+
// failures than it fixes, the answer flips": four against zero.
305+
//
306+
// Upstream says plainly what it means by the name. mimalloc:
307+
// `// we use windows locks on cygwin, but otherwise treat it at
308+
// unix`. sqlite3 lists it in the `SQLITE_OS_WIN` detection set and
309+
// then includes `windows.h`. The name asserts WIN32 IS AVAILABLE,
310+
// not "the object format is PE" --- a borrowed name means what the
311+
// lender's history made it mean, whatever we intended by it.
312+
//
313+
// The object-format question keeps no macro. A package asks
314+
// `cfg(os = "windows")`, which needs none. Should measurement ever
315+
// show third-party code that can only ask it in the preprocessor,
316+
// the answer is a name mcpp defines itself, not one it borrows.
295317
r.tokens.push_back("--target=x86_64-pc-cygwin");
318+
r.tokens.push_back("-U__CYGWIN__");
319+
r.tokens.push_back("-U__CYGWIN32__");
296320
r.expectDefined.push_back("__unix__");
297-
r.expectDefined.push_back("__CYGWIN__");
298321
r.expectUndefined.push_back("_WIN32");
322+
r.expectUndefined.push_back("__CYGWIN__");
323+
r.expectUndefined.push_back("__CYGWIN32__");
299324
cygwinIdentity = true;
300325
} else if (decl.presents == CAbiPresents::Windows) {
301326
// Already the base triple's own identity — nothing to add.

0 commit comments

Comments
 (0)