Table of Contents
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.Dscheme (for example,26.6.16was published on June 16, 2026).
2026 Releases
26.9.1 — September 1, 2026
Fixed
- Scalar
FIXED BINOUTparameters passed by reference now propagate through the generated CICScicsEntryseam. The callee receives a mutablePLIIntegerbox and writes the value back; the call site copies it into the caller's variable. Previously the parameter arrived as an immutableIntegerand an assignedOUTvalue never reached the caller. - Arguments that PL/I treats as dummy arguments — literals, built-in results, call-valued expressions, and
NONASSIGNABLEvariables — are boxed for the seam but never copied back. Arguments toOPTIONS(ASM)externals (such asDSNTIAR),OPTIONS(COBOL)andPLITDLIbridges, and non-integer arguments are never boxed. - A secondary
ENTRYnow always gets its own entry proxy, matched on parameter types and names, instead of silently falling through to the procedure's main entry point when the parameter counts are equal. When the proxy would collide with an existing Java signature, the compiler gives it a distinct name; the change is invisible to external callers. - The parser accepts comma-separated
EXTERNAL OPTIONS(ASM,INTER,RETCODE)option lists; previously everything after the first option was dropped.
Breaking: the generated CICS
cicsEntrysignature for scalarFIXED BINparameters changed fromIntegertoPLIInteger. Re-transpile the whole application with this compiler version (mixed old/new generations fail at compile time), pair it with Runtime 26.8.18 or later, and remove hand-written helper overloads that patched the old seam.
26.8.18 — August 18, 2026
Fixed
-
INITIALcan now be used as an ordinary identifier and as a structure member name; previously such declarations failed to parse. - The compiler-generated (synthetic)
SQLCAnow includes theSQLERRMmember, and declaresSQLSTATEasCHAR(5)to match DB2. Programs compiled with this version that assign toSQLCAcharacter 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 SQLstatements usingXMLPARSE(DOCUMENT :hostvar)now bind the host variable correctly, instead of failing at run time withSQLCODE -312. - Adjustable array extents are now evaluated when their block is entered rather than from the bound variable's initial value, preventing a spurious
SUBSCRIPTRANGEcondition when the array is created. - A labeled
DOgroup used as theTHENorELSEbranch of anIFstatement 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 CONTAINERnow honors itsSETandFLENGTHoptions — 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
RETURNthat carries a statement label is now handled correctly when it is the target of aGOTO, 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, andABSbuilt-ins now return values whose types match the runtime forDECIMALandPICTUREarguments, andMODapplied to aPICTUREvalue returns an integer so surrounding integer arithmetic works.
26.7.21 — July 20, 2026
Fixed
- A subprogram invoked with
CALLnow maintains its ownSQLCA, so its SQL status codes are isolated from the caller's instead of overwriting or leaking into them. - A function declared with
RETURNSthat also modifies a scalar argument now passes that argument by reference, so the caller observes the updated value. - Subtracting an integer from a
PICTUREvalue now promotes its operands the same way addition does, producing correct arithmetic results. - Overlay views declared with
BASED(ADDR(...))over a scalar or pointer — includingBIN FIXEDpointer-number views andCHARACTERviews 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
CHARACTERandPICTUREarrays are now generated through the multi-dimensional array bounds constructor, producing correct element storage and bounds. - A forward
GOTOthat branches into a sibling block is now lowered into that block correctly, instead of emitting a dangling labeledbreakthat failed to compile. - A non-local
GOTOno longer leaves unreachablethrow/returnstatements after it that could cause the generated Java to fail compilation. -
DEFINEDoverlays now re-establish their binding to the base storage on a name collision and for scalar andPICTUREbases, so the overlay continues to alias the intended variable.
26.7.7 — July 6, 2026
Fixed
- Local variables of a
RECURSIVEprocedure 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/LABELstatements are now lowered to structured Java control flow (labeledbreak/continue) instead of a runtime jump engine, includingGOTOs that appear insideON-condition handler units.
Fixed
- A label that acts as both a
GOTObranch target and a fall-through resume point is now lowered correctly. - Sub-programs without
OPTIONS(MAIN)are transpiled as instance classes regardless of the--strategysetting, with correct static/instance handling for nested classes. -
DEFINEDarray overlays are preserved when the underlying array is hoisted, so the overlay still aliases the base storage. - SQL:
CALLstatements now honor the configured parameter direction forOUTparameters 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
EQUALoption onEXEC CICS READ FILEis now honored instead of being silently dropped. - Alternate
ENTRYpoints now execute their body against the populated instance, and entry overrides are matched by signature.
26.6.9 — June 9, 2026
Fixed
-
HBOUNDnow resolves correctly for nested structure-array shorthand, and built-in name casing is preserved in subscripts. - SQL: multi-row
INSERTof a structure-array member is handled, andDECLARE GLOBAL TEMPORARY TABLEnow 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
IFconditions 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
IFconditions 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
ENTRYvariable 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.
-
ENDFILEcondition-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()andANY()built-ins work with array-member shorthand and multi-dimensional arrays using asterisk notation. -
MAPkeyword can be used as a procedure label.
26.3.17 — March 17, 2026
Fixed
- Integer-returning built-ins in
DO WHILEconditions are converted to boolean. -
ERRORkeyword 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 (
-,*,/) inUPDATE SETclauses,LIKE-aware structure references, host-variable andINDICATORsupport, and parameter-count validation. - Array handling: nested-array dimension markers, array bounds resolved from constant values, and SQL duration and
TIMEsupport.
26.3.3 — March 3, 2026
Fixed
- Restored
IF-THEN-DOgrammar to prevent incorrect list generation in conditional blocks. - Structure members declared with
LIKEnow generate proper runtime offset calculation. -
BIT(1)function returns convert correctly to Boolean.
26.2.24 — February 24, 2026
Added
-
BETWEENbuilt-in function for range checking. - Support for
STATIC NONASSIGNABLEattributes.
Fixed
- CICS command parsing, automatic
RESP/RESP2variable declaration, and storage-annotation generation. - Array-parameter handling in
CALLstatements and star assignments. -
SUBSTRwith 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, andANYbuilt-ins now return Boolean instead of Integer. -
DIMACROSSsemantics 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 ... SETnow generates separate instantiation and pointer-assignment statements.
26.2.3 — February 3, 2026
Fixed
- Fixed an off-by-one error that caused
SUBSCRIPTRANGEerrors when initializing structure arrays with(*)wildcard syntax; wildcard assignments now generate a correct bulk-assignment call.
26.1.20 — January 20, 2026
Added
-
IFstatements can test empty string literals in boolean contexts. -
PUT LISTwithout an expression no longer causes a parse error. -
ORDINALdeclarations with an ordinal attribute.
Fixed
- Multiple
LIKE-resolution improvements for nested structures and scoped variables. - The
DECIMALbuilt-in inherits precision and scale from the target type. -
ON-statement variables are hoisted to class level for handler-method access. - CICS
ASSIGNnow parsesUSERID.
26.1.13 — January 13, 2026
Added
-
ORDINALtype declarations with ordinal attributes.
Fixed
- Entry-call return types are cast correctly in
DO WHILE/UNTILconditions. - Reserved keywords are handled when entry variables appear in
CALLstatements. -
PARENTfields 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 FILEnow supports theINTOparameter.
25.12.9 — December 9, 2025
Added
- Picture-variable assignments are generated through the variable's set method, preserving
BASEDrelationships. -
MEMCONVERTbuilt-in for EBCDIC/ASCII character-set conversion.
25.12.2 — December 2, 2025
Added
-
RESP/RESP2parameter handling added to CICS statements. - The
STRINGbuilt-in with a star subscript now defers to the runtime.
25.11.25 — November 25, 2025
Fixed
- CICS
STARTsupports theRESP2attribute. - CICS
READQ TSno longer requires theLENGTHparameter to be returned. -
LOOPkeyword is accepted as aDO-loop label.
25.11.18 — November 18, 2025
Added
- SQL
RANK() OVERwindow function. - SQL
TRUNCATEstatement. - SQL
UPDATEwith a table alias and complexINexpressions. - Comprehensive CICS
DFHRESPresponse-code support. -
RESP/RESP2on CICSSYNCPOINT, plus theNOSUSPENDoption 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 LENGTHparameter. -
BIN FIXEDtype support inGET EDIT.
25.11.4 — November 4, 2025
Fixed
- Improved
BASEDpointer handling, including preserving theBASEDrelation inREAD FILE SET(pointer)statements. -
VARYING/VARYINGZattribute detection andCHARsize preservation inALIASdeclarations.
25.10.28 — October 28, 2025
Added
-
ALLOCATEstatement withSETclauses, and flexible ordering ofFILEandSETclauses inLOCATE. -
RELEASEandENTRYstatement support. -
%PROCESSdirective and abbreviatedOPTIONSkeyword. -
STG()built-in optimization, plus enhancedALLbuilt-in and array-comparison support. - Structure-to-structure assignment via qualified locators.
-
WRITE,PRINT,EQ,LE, andNEusable as labels or declaration names.
Fixed
- SQL host-variable extraction from
UNION ALLWHEREclauses, and correctedSQLCA/SQLWARNfield 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/VARYINGZattributes are detected regardless of their position in an attribute list. -
CHARsize is preserved when resolvingALIAStype declarations.
25.10.14 — October 14, 2025
Added
- Extended SQL
OPTIMIZE FORclause support in multiple positions — afterFOR FETCH ONLY,WITH UR, and other isolation clauses — in line with the DB2 SQL specification.
25.10.7 — October 7, 2025
Added
-
EQ,LE, andNEusable as declaration names. -
CASEexpressions in SQLINSERT ... SELECTstatements.
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
IFstatements inSELECTbreak analysis are handled correctly.
25.9.23 — September 23, 2025
Added
- Picture format support for
PUT/GETstatements. - Declarations with non-data attributes following the
ENTRYattribute. -
ENTRYparameter calls inDO WHILEstatements, plus deferred-execution entry semantics.
Fixed
-
BASEDdeclaration scope management in block statements. - Java code generation when an existing source file is empty or contains no types.
0 Comments