Skip to content

Regression: #[\NoDiscard] builtin attribute class missing on 8.4 profile (re-#16826, Zend/zend_attributes.c) #16977

Closed

Description

@PurHur

Category

language · php-src-strict · PHP 8.4 built-in attributes

Problem

#16826 was closed but NoDiscard is still not registered as an internal attribute class on PHP_COMPILER_PROFILE=8.4. User code #[NoDiscard] function f(): int cannot compile; class_exists('NoDiscard') is false.

Repro Zend 8.4 VM 8.4 profile (2026-07-06)
class_exists('NoDiscard') true (internal) false ❌
#[NoDiscard] function f(): int { return 1; } compiles + warns on ignored return builtin class missing ❌

php-src reference

PHP implementation target

  • lib/CompilerVersion.php / builtin attribute registration — register internal NoDiscard on 8.4 forward profile (mirror Override, SensitiveParameter)
  • VM: emit E_WARNING when return value of #[NoDiscard] call is discarded (php-src-strict)

Repro

./script/docker-exec.sh -- bash -lc 'source script/php-env.sh && PHP_COMPILER_PROFILE=8.4 php bin/vm.php test/repro/maintainer_gap_nodiscard_attribute_class.php'
# fail: NoDiscard builtin attribute class missing on PHP_COMPILER_PROFILE=8.4

Done when

  • class_exists('NoDiscard') true; ReflectionClass::isInternal() true on 8.4 profile
  • #[NoDiscard] on functions/methods compiles; discarded return triggers Zend-matching warning
  • Compliance guard under test/compliance/cases/language/attributes/
  • php-src-strict

Activity

  1. added
    enhancementNew feature or request
    phase-4:stdlibPhase 4 – stdlib for web apps
    area:vmVirtual machine
    implementation-readySpec complete: repro, php-src ref, done-when — safe for workers to claim
    on Jul 6, 2026
  2. PurHur commented on Jul 6, 2026

    @PurHur
    OwnerAuthor

    claim: cursor-agent-lane-a — starting this run

  3. PurHur commented on Jul 6, 2026

    @PurHur
    OwnerAuthor

    claim released: maintainer_gap_nodiscard_attribute_class.php green on master with PHP_COMPILER_PROFILE=8.4 (class_exists + #[NoDiscard] compile). Pivoting to get_defined_functions exclude_disabled forward-profile regression.

  4. PurHur commented on Jul 6, 2026

    @PurHur
    OwnerAuthor

    claim: cursor-agent-lane-c — starting this run

  5. PurHur commented on Jul 6, 2026

    @PurHur
    OwnerAuthor

    claim released: repro green on master with PHP_COMPILER_PROFILE=8.4 — pivoting to #10775 array_reduce inline literal.

  6. PurHur commented on Jul 6, 2026

    @PurHur
    OwnerAuthor

    claim: cursor-agent-lane-c — phantom gate fix (advertises*AttributeClass must not inherit harness PHP_COMPILER_PROFILE=8.4)

  7. added a commit that references this issue on Jul 6, 2026
    cdf9f58
  8. PurHur commented on Jul 6, 2026

    @PurHur
    OwnerAuthor

    Merged via #17017

    Fix: Forward-profile builtin attribute classes (NoDiscard, Override, EnumCases, DelayedTargetValidation, CompileTime) now use advertisesForwardProfile84BuiltinAttributeClass() — enabled on stable 8.4.0+ or explicit PHP_COMPILER_PROFILE opt-in, withheld on 8.4.0-dev reference when profile is unset (even if harness exports 8.4 globally).

    Verification:

    • env -u PHP_COMPILER_PROFILE php bin/vm.php test/repro/maintainer_gap_nodiscard_registration.php → ok
    • PHP_COMPILER_PROFILE=8.4 php bin/vm.php test/repro/maintainer_gap_nodiscard_attribute_class.php → 1
    • vendor/bin/phpunit test/unit/BuiltinAttributePhantomTest.php → OK
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    area:vmVirtual machineenhancementNew feature or requestimplementation-readySpec complete: repro, php-src ref, done-when — safe for workers to claimphase-2:languagePhase 2 – language featuresphase-4:stdlibPhase 4 – stdlib for web appsstdlib

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions