Follow

Heirloom PL/I Compiler Release Notes

Table of Contents

  1. Overview
  2. How to read these notes
  3. 2026 Releases
  4. 2025 Releases
  5. Related articles

Audience: developers and build engineers using the Heirloom PL/I compiler. This page tracks notable changes to the compiler — newest first — covering the PL/I language, embedded SQL, and embedded CICS support. For what each option does, see the related compiler articles linked at the end.


Overview

This page records notable changes to the Heirloom PL/I compiler, most recent release first. Each entry lists the language, SQL, and CICS behaviors added or fixed in that release, so teams migrating PL/I workloads to Java can see what changed and decide when to move to a newer compiler build.

The compiler is the stage that translates PL/I source into Java; how the migrated application then runs is covered by the runtime documentation. Changes below affect the generated Java and the parser/preprocessor, not deployment.


How to read these notes

  • Releases are listed in reverse-chronological order — the most recent build is at the top.
  • Added covers new PL/I, SQL, or CICS support. Fixed covers corrected code-generation or parsing behavior. Breaking flags a change that may require updates to existing code.
  • Unless an entry is marked Breaking, releases preserve backward compatibility with previously generated code.
  • Version numbers follow a YY.M.D scheme (for example, 26.6.16 was published on June 16, 2026).

2026 Releases

26.8.18 — August 18, 2026

Fixed

  • INITIAL can now be used as an ordinary identifier and as a structure member name; previously such declarations failed to parse.
  • The compiler-generated (synthetic) SQLCA now includes the SQLERRM member, and declares SQLSTATE as CHAR(5) to match DB2. Programs compiled with this version that assign to SQLCA character members require Runtime 26.8.18 or later.

26.8.11 — August 11, 2026

Fixed

  • A cursor OPENed inside a nested procedure with host-variable parameters now compiles correctly; previously the generated Java could reference undefined variables.
  • Macro preprocessing no longer corrupts quoted bare-literal arguments or qualified structure-member references (STRUCT.(MEMBER)) during expansion.
  • EXEC SQL statements using XMLPARSE(DOCUMENT :hostvar) now bind the host variable correctly, instead of failing at run time with SQLCODE -312.
  • Adjustable array extents are now evaluated when their block is entered rather than from the bound variable's initial value, preventing a spurious SUBSCRIPTRANGE condition when the array is created.
  • A labeled DO group used as the THEN or ELSE branch of an IF statement keeps its label, fixing an "undefined label" compile error.
  • The PL/I date/time built-in family (SECSTODATE, DAYSTODATE, and related built-ins) is now recognized by the compiler, fixing a build break in programs that use them. This fix requires Runtime 26.8.11 or later.

26.7.28 — July 27, 2026

Fixed

  • EXEC CICS GET CONTAINER now honors its SET and FLENGTH options — the container pointer and returned length are set as requested, instead of the options being dropped and the statement failing. This feature requires Runtime 26.7.28 or later.
  • A RETURN that carries a statement label is now handled correctly when it is the target of a GOTO, so the branch resolves to the right point.
  • STRING(array(*)) used as a pseudovariable now assigns to the whole array in one operation instead of element by element, producing correct results.
  • The FLOOR, CEIL, and ABS built-ins now return values whose types match the runtime for DECIMAL and PICTURE arguments, and MOD applied to a PICTURE value returns an integer so surrounding integer arithmetic works.

26.7.21 — July 20, 2026

Fixed

  • A subprogram invoked with CALL now maintains its own SQLCA, so its SQL status codes are isolated from the caller's instead of overwriting or leaking into them.
  • A function declared with RETURNS that also modifies a scalar argument now passes that argument by reference, so the caller observes the updated value.
  • Subtracting an integer from a PICTURE value now promotes its operands the same way addition does, producing correct arithmetic results.
  • Overlay views declared with BASED(ADDR(...)) over a scalar or pointer — including BIN FIXED pointer-number views and CHARACTER views over binary scalars — now read and write the underlying storage correctly; an unsupported use falls back to the previous behavior with a warning.

26.7.14 — July 10, 2026

Fixed

  • Two-dimensional CHARACTER and PICTURE arrays are now generated through the multi-dimensional array bounds constructor, producing correct element storage and bounds.
  • A forward GOTO that branches into a sibling block is now lowered into that block correctly, instead of emitting a dangling labeled break that failed to compile.
  • A non-local GOTO no longer leaves unreachable throw/return statements after it that could cause the generated Java to fail compilation.
  • DEFINED overlays now re-establish their binding to the base storage on a name collision and for scalar and PICTURE bases, so the overlay continues to alias the intended variable.

26.7.7 — July 6, 2026

Fixed

  • Local variables of a RECURSIVE procedure that are shared with its nested procedures are now preserved across recursive calls, instead of being reset on each level of recursion.

26.6.30 — June 30, 2026

Added

  • GOTO/LABEL statements are now lowered to structured Java control flow (labeled break/continue) instead of a runtime jump engine, including GOTOs that appear inside ON-condition handler units.

Fixed

  • A label that acts as both a GOTO branch target and a fall-through resume point is now lowered correctly.
  • Sub-programs without OPTIONS(MAIN) are transpiled as instance classes regardless of the --strategy setting, with correct static/instance handling for nested classes.
  • DEFINED array overlays are preserved when the underlying array is hoisted, so the overlay still aliases the base storage.
  • SQL: CALL statements now honor the configured parameter direction for OUT parameters that use indicator variables.

26.6.23 — June 23, 2026

Fixed

  • Scalar parameters that a procedure modifies are now passed by reference, so updates made inside the procedure are reflected in the caller.
  • Anonymous-union (filler) containers referenced across nested procedures are now hoisted to class level, so they resolve correctly across procedure boundaries.

26.6.16 — June 16, 2026

Fixed

  • The EQUAL option on EXEC CICS READ FILE is now honored instead of being silently dropped.
  • Alternate ENTRY points now execute their body against the populated instance, and entry overrides are matched by signature.

26.6.9 — June 9, 2026

Fixed

  • HBOUND now resolves correctly for nested structure-array shorthand, and built-in name casing is preserved in subscripts.
  • SQL: multi-row INSERT of a structure-array member is handled, and DECLARE GLOBAL TEMPORARY TABLE now executes.
  • Equality comparisons between short and integer values are now evaluated by value.

26.4.28 — April 28, 2026

Fixed

  • Integer-returning built-ins used in IF conditions now receive proper boolean coercion.
  • Empty string literals are preserved during preprocessor macro concatenation and variable substitution.
  • The "Unresolved symbol" message for implicitly declared variables is downgraded from an error to a single deduplicated warning.
  • SQL column names that are reserved words (such as ORDER) are now read correctly.

26.4.22 — April 22, 2026

Fixed

  • Entry-variable parameters are handled correctly in IF conditions and expression-context calls.
  • Double-quoted SQL identifiers are now escaped correctly in generated Java string literals.
  • The group constructor runs unconditionally for LIKE-d classes, even when no helper is present.
  • Entry references are distinguished from entry calls correctly (parenthesis-aware), including when CICS is enabled.

26.4.21 — April 21, 2026

Fixed

  • Scope parent chain and method resolution corrected for same-named nested procedures.
  • External ENTRY variable references in expressions are handled correctly.

26.4.7 — April 7, 2026

Added

  • QUOTE() preprocessor built-in function.

Fixed

  • Preprocessor macro string concatenation no longer produces corrupted output.
  • Duplicate variable declarations and parent/child scope violations are prevented.
  • ENDFILE condition-handler registration no longer triggers a null-pointer error, and parameterless external procedures invoke correctly under the instance strategy.

26.3.24 — March 24, 2026

Fixed

  • DIM() and ANY() built-ins work with array-member shorthand and multi-dimensional arrays using asterisk notation.
  • MAP keyword can be used as a procedure label.

26.3.17 — March 17, 2026

Fixed

  • Integer-returning built-ins in DO WHILE conditions are converted to boolean.
  • ERROR keyword can be used as a procedure name.
  • Improved collision detection and inner-class handling for ordinal interfaces.

26.3.10 — March 10, 2026

Fixed

  • Resolved a range of SQL and type-system issues, including parenthesized-expression Boolean returns, arithmetic operators (-, *, /) in UPDATE SET clauses, LIKE-aware structure references, host-variable and INDICATOR support, and parameter-count validation.
  • Array handling: nested-array dimension markers, array bounds resolved from constant values, and SQL duration and TIME support.

26.3.3 — March 3, 2026

Fixed

  • Restored IF-THEN-DO grammar to prevent incorrect list generation in conditional blocks.
  • Structure members declared with LIKE now generate proper runtime offset calculation.
  • BIT(1) function returns convert correctly to Boolean.

26.2.24 — February 24, 2026

Added

  • BETWEEN built-in function for range checking.
  • Support for STATIC NONASSIGNABLE attributes.

Fixed

  • CICS command parsing, automatic RESP/RESP2 variable declaration, and storage-annotation generation.
  • Array-parameter handling in CALL statements and star assignments.
  • SUBSTR with a qualified locator on the left side generates the correct based call.
  • Qualified-locator assignment to nested structures uses the correct assignment method.

26.2.10 — February 10, 2026

Fixed

  • INLIST, ALL, and ANY built-ins now return Boolean instead of Integer.
  • DIMACROSS semantics corrected: the root is a single instance and child fields are arrays, per the IBM PL/I specification.

26.2.5 — February 5, 2026

Fixed

  • Restored correct structure-to-integer assignment for the non-wildcard case (regression from 26.2.3).
  • ALLOCATE ... SET now generates separate instantiation and pointer-assignment statements.

26.2.3 — February 3, 2026

Fixed

  • Fixed an off-by-one error that caused SUBSCRIPTRANGE errors when initializing structure arrays with (*) wildcard syntax; wildcard assignments now generate a correct bulk-assignment call.

26.1.20 — January 20, 2026

Added

  • IF statements can test empty string literals in boolean contexts.
  • PUT LIST without an expression no longer causes a parse error.
  • ORDINAL declarations with an ordinal attribute.

Fixed

  • Multiple LIKE-resolution improvements for nested structures and scoped variables.
  • The DECIMAL built-in inherits precision and scale from the target type.
  • ON-statement variables are hoisted to class level for handler-method access.
  • CICS ASSIGN now parses USERID.

26.1.13 — January 13, 2026

Added

  • ORDINAL type declarations with ordinal attributes.

Fixed

  • Entry-call return types are cast correctly in DO WHILE/UNTIL conditions.
  • Reserved keywords are handled when entry variables appear in CALL statements.
  • PARENT fields are renamed to avoid Java naming collisions.
  • Dynamic dimension expressions are supported in ALLOCATE.

2025 Releases

25.12.23 — December 23, 2025

Added

  • EXEC CICS READ FILE now supports the INTO parameter.

25.12.9 — December 9, 2025

Added

  • Picture-variable assignments are generated through the variable's set method, preserving BASED relationships.
  • MEMCONVERT built-in for EBCDIC/ASCII character-set conversion.

25.12.2 — December 2, 2025

Added

  • RESP/RESP2 parameter handling added to CICS statements.
  • The STRING built-in with a star subscript now defers to the runtime.

25.11.25 — November 25, 2025

Fixed

  • CICS START supports the RESP2 attribute.
  • CICS READQ TS no longer requires the LENGTH parameter to be returned.
  • LOOP keyword is accepted as a DO-loop label.

25.11.18 — November 18, 2025

Added

  • SQL RANK() OVER window function.
  • SQL TRUNCATE statement.
  • SQL UPDATE with a table alias and complex IN expressions.
  • Comprehensive CICS DFHRESP response-code support.
  • RESP/RESP2 on CICS SYNCPOINT, plus the NOSUSPEND option in the CICS grammar.
  • Structure parameters with differing aliases in procedure calls.

Fixed

  • Variable-name extraction from built-in expressions in the CICS READQ TS LENGTH parameter.
  • BIN FIXED type support in GET EDIT.

25.11.4 — November 4, 2025

Fixed

  • Improved BASED pointer handling, including preserving the BASED relation in READ FILE SET(pointer) statements.
  • VARYING/VARYINGZ attribute detection and CHAR size preservation in ALIAS declarations.

25.10.28 — October 28, 2025

Added

  • ALLOCATE statement with SET clauses, and flexible ordering of FILE and SET clauses in LOCATE.
  • RELEASE and ENTRY statement support.
  • %PROCESS directive and abbreviated OPTIONS keyword.
  • STG() built-in optimization, plus enhanced ALL built-in and array-comparison support.
  • Structure-to-structure assignment via qualified locators.
  • WRITE, PRINT, EQ, LE, and NE usable as labels or declaration names.

Fixed

  • SQL host-variable extraction from UNION ALL WHERE clauses, and corrected SQLCA/SQLWARN field declarations.
  • Same-named structures across inner procedure scopes, and Integer-to-BigDecimal conversion for internal procedure calls.
  • Correct output for Picture-by-Double multiplication, plus a preprocessor parsing fix.

25.10.21 — October 21, 2025

Breaking: Main-procedure instance methods include their parameters again (reverting an earlier change). Main methods now receive parameters both as method arguments and as class-level fields. If you have overridden main-procedure methods, update those signatures to include the parameter list so they match the newly generated code.

Fixed

  • VARYING/VARYINGZ attributes are detected regardless of their position in an attribute list.
  • CHAR size is preserved when resolving ALIAS type declarations.

25.10.14 — October 14, 2025

Added

  • Extended SQL OPTIMIZE FOR clause support in multiple positions — after FOR FETCH ONLY, WITH UR, and other isolation clauses — in line with the DB2 SQL specification.

25.10.7 — October 7, 2025

Added

  • EQ, LE, and NE usable as declaration names.
  • CASE expressions in SQL INSERT ... SELECT statements.

Fixed

  • Array size resolved from identifier initial values.
  • Corrected a nested-array loop boundary (< to <=).

25.9.30 — September 30, 2025

Fixed

  • Nested-array asterisk-assignment loop conditions corrected.
  • Cascading IF statements in SELECT break analysis are handled correctly.

25.9.23 — September 23, 2025

Added

  • Picture format support for PUT/GET statements.
  • Declarations with non-data attributes following the ENTRY attribute.
  • ENTRY parameter calls in DO WHILE statements, plus deferred-execution entry semantics.

Fixed

  • BASED declaration scope management in block statements.
  • Java code generation when an existing source file is empty or contains no types.

Was this article helpful?
0 out of 0 found this helpful
Have more questions? Submit a request

0 Comments

Article is closed for comments.
Powered by Zendesk