The general rule is that HLASM programs which assemble without error should always continue to generate compatible binary code, preferably identical. In this case we failed to spot that people could be using the type attribute to test for a self-defining term and assume that it was positive as a result, because self-defining terms can also be hexadecimal, binary or character, all of which can already have negative values.
We sometimes have to make an exception if a program is in error but HLASM failed to detect it. The only "incompatibility" I am aware of in that category relates to APAR PH30060, which added a missing check to detect when an opcode had been changed to a reserved macro opcode using OPSYN between the time the macro was defined and the macro was executed. This check was done if the opcode was generated by substitution, giving message ASMA001E in that case, but was overlooked if the instruction was changed using OPSYN. The result was likely to be HLASM terminating with ASMA951U because of a bad branch, which is what the APAR fixed, but after fixing it we found that someone had been changing PRINT to ANOP with OPSYN and had been getting away with it because in that case the bad branch happened by chance to cause the operation to be ignored! That was easily solved by defining a dummy PRINT macro instead. We sometimes also make harmless changes which affect the object code (although we try to avoid those if possible). Many years ago, when quadword alignment was introduced, support for 16-byte aligned literals was added as a separate alignment level, so existing programs which happened to have 16-byte literals now had those generated before all 8-byte literals, instead of being included in the 8-byte alignment group. (I would personally have said that should only have been done when 16-byte section alignment was in effect, to avoid unnecessary differences, but that was before my time in HLASM). More recently, we discovered some inconsistencies in how literals got defined. Some references to literals in macros were causing the literal to be defined at the time the macro was defined, even if the relevant statement was never reached when the macro was executed. Also, references to attribute of literals (in particular the length attribute) were causing the literal to be defined even when there was no reference to the literal itself, so it was not needed. These problems were fixed as part of APAR PH43846, which can therefore mean that some unreferenced literals will no longer be generated, but this was considered safe enough because it will never cause generation of additional literals. Jonathan Scott, HLASM IBM Hursley UK
