{
 "number": 36235,
 "repo": "bitcoin/bitcoin",
 "url": "https://github.com/bitcoin/bitcoin/pull/36235",
 "title": "ci, iwyu: fail job on compiler errors instead of silently logging them",
 "author": "David-Uka",
 "author_association": "FIRST_TIME_CONTRIBUTOR",
 "created_at": "2026-09-13T00:58:59Z",
 "updated_at": "2026-09-15T10:21:21Z",
 "age_days": 4,
 "draft": false,
 "labels": [],
 "milestone": null,
 "base": "master",
 "head_sha": "676a83f935ca0d9fc4d31e6a88ae1cb087102b66",
 "head_ref": "ci-iwyu-fail-on-compiler-errors",
 "head_repo": "David-Uka/bitcoin",
 "head_history": [],
 "additions": 12,
 "deletions": 0,
 "changed_files": 1,
 "commit_count": 1,
 "size_bucket": "S",
 "mergeable_state": "unknown",
 "bot": {
  "drahtbot": {
   "present": true,
   "reviews": {
    "concept_ack": [
     {
      "login": "hebasto",
      "url": "https://github.com/bitcoin/bitcoin/pull/36235#pullrequestreview-5190319025"
     }
    ]
   },
   "conflicts": []
  }
 },
 "acks_parsed": {
  "hebasto": {
   "kind": "concept_ack",
   "hash": null,
   "t": "2026-09-13T09:31:11Z",
   "stale": false
  }
 },
 "acks_tally": {
  "ack": 0,
  "stale_ack": 0,
  "concept_ack": 1,
  "approach_ack": 0,
  "nack": 0,
  "concept_nack": 0,
  "approach_nack": 0
 },
 "reviews": {
  "approved": 0,
  "changes_requested": 0,
  "distinct_reviewers": [
   "hebasto"
  ]
 },
 "signals": {
  "needs_rebase": false,
  "ci_failed": false,
  "mergeable_state": "unknown",
  "last_author_activity": "2026-09-13T00:55:53Z",
  "last_reviewer_activity": "2026-09-13T09:31:11Z",
  "last_reviewer": "hebasto",
  "author_silent_days": 4,
  "waiting_on_author_days": 4,
  "days_since_update": 2
 },
 "refs": {
  "mentioned": [
   35361,
   35468,
   36228
  ],
  "depends_on": [
   35468
  ],
  "fixes": [
   35361
  ],
  "linked_issues": [
   {
    "number": 35361,
    "type": "issue",
    "state": "closed",
    "merged": false,
    "merged_at": null,
    "title": "ci: spurious output / errors in IWYU job"
   }
  ],
  "references": [
   {
    "number": 35468,
    "type": "pull",
    "state": "closed",
    "merged": true,
    "merged_at": "2026-09-09",
    "title": "ci, iwyu: Request IPC file generation explicitly"
   },
   {
    "number": 35361,
    "type": "issue",
    "state": "closed",
    "merged": false,
    "merged_at": null,
    "title": "ci: spurious output / errors in IWYU job"
   },
   {
    "number": 36228,
    "type": "pull",
    "state": "closed",
    "merged": true,
    "merged_at": "2026-09-12",
    "title": "ci, iwyu: generate embedded ASMap header explicitly"
   }
  ],
  "conflicts": []
 },
 "stack": {
  "shares_commits_with": [],
  "based_on": [],
  "base_for": []
 },
 "review_paths": [],
 "body": "Follow-up to #35468 and #36228, which fixed the `fatal error: '\u2026' file not found` messages reported in #35361 by generating the required headers before IWYU runs.\n\nThose errors were only ever printed to the raw CI logs and never failed the job, because `iwyu_tool.py`'s non-zero exit is swallowed by `|| true`. That is how they went unnoticed for so long.\n\nIWYU cannot analyse a file that fails to compile, so this turns such compiler errors into a real CI failure: after capturing IWYU output, the job fails if it contains a clang `fatal error:` line and prints the offending file, pointing at the `GOAL` header targets in `ci/test/00_setup_env_native_iwyu.sh`. The check lives in `run_iwyu()` so it covers both the enforced and non-enforced passes, since the errors originally reported came from files in the non-enforced pass.\n\nThis locks in the recent header-generation fixes and guards against regressions such as a new capnp-generated header or a renamed target.\n\nI confirmed the current master `iwyu` job log is free of `fatal error:` lines, so this does not turn CI red today.\n\nCloses #35361.",
 "commits": [
  {
   "sha": "676a83f935ca0d9fc4d31e6a88ae1cb087102b66",
   "date": "2026-09-13T00:55:53Z",
   "message": "ci, iwyu: fail job on compiler errors instead of silently logging them\n\niwyu_tool.py's non-zero exit is swallowed by \"|| true\", so a compiler\n\"fatal error:\" (for example a generated header that was not built before\nIWYU ran) only ends up in the raw CI logs and never fails the job. This\nis how the errors reported in #35361 went unnoticed.\n\nIWYU cannot analyse a file that fails to compile, so fail the job when its\noutput contains a \"fatal error:\" line, in both the enforced and\nnon-enforced passes. This locks in the header-generation fixes from\n#35468 and #36228 and guards against regressions such as a new\ncapnp-generated header or a renamed target."
  }
 ],
 "timeline": [
  {
   "t": "2026-09-13T09:31:11Z",
   "kind": "review",
   "who": "hebasto",
   "assoc": "MEMBER",
   "state": "COMMENTED",
   "commit": "676a83f935ca0d9fc4d31e6a88ae1cb087102b66",
   "text": "Concept ACK.\n\ncc @maflcko"
  }
 ],
 "labels_log": [],
 "state_log": [],
 "text_chars": 1851,
 "text_tokens_estimate": 462,
 "changed_paths": [
  "ci/test/03_test_script.sh"
 ],
 "files": [
  {
   "path": "ci/test/03_test_script.sh",
   "add": 12,
   "del": 0
  }
 ],
 "test_lines": 12,
 "git": {
  "head": "676a83f935ca0d9fc4d31e6a88ae1cb087102b66",
  "head_matches_backup": true,
  "base": "17817818da3cb67c95320b7a5d4d69bd649c1fbf",
  "commits": [
   {
    "sha": "676a83f935",
    "subject": "ci, iwyu: fail job on compiler errors instead of silently logging them",
    "files": 1,
    "add": 12,
    "del": 0
   }
  ],
  "patch_truncated": false
 },
 "input_hash": "571c11f846e7770c",
 "extracted_at": "2026-09-17T16:15:31+00:00"
}