!standard 3.8(3) 19-01-10 AI12-0213-1/02 !standard 3.8(7) !standard 3.8(8) !standard 13.5.1(2) !class Amendment 16-12-28 !status work item 16-12-28 !status received 16-10-06 !priority Very_Low !difficulty Easy !subject Unify record syntax !summary *** Missing. !problem Ada's record_type_definition and record_representation_clause are unique to the language in that it is the only kind of type definition to feature an enclosed list of components, and being that it is not a program unit or a named construct such as a loop it was classically not considered relevant to allow an identfier with its enclosing "end." However, many Ada users can attest to having records with upwards of 15 or more components complete with comments and whitespace leaving the enclosing "end record" to be below the page of start of the type declaration - meaning some benefit would arise from being able to label the "end record" with the type identifier. !proposal We propose introducing an "end record identifier" syntax for record definitions (and thusly representation clauses) so that their syntax more closely matches program units such as subprogram_declarations and package_declarations. See the code segments below for an overview of the proposed change: type Rec_B is record A : Boolean; B : Boolean; end record Rec_B; for Rec_B use record A at 0 range 0 .. 0; B at 0 range 1 .. 1; end record Rec_B; As an alternative to: type Rec_B is record A : Boolean; B : Boolean; end record; for Rec_B use record A at 0 range 0 .. 0; B at 0 range 1 .. 1; end record; Syntax Here is what the BNF would look like for the proposed changes: record_definition ::= record component_list end record_terminator | null record record_terminator ::= record [record_identifier] record_representation_clause ::= for first_subtype_local_name use record [mod_clause] {component_clause} end record_representation_terminator; record_representation_terminator ::= record [first_subtype_local_name] !wording Replace 3.8(3) record_definition ::= record component_list end record_terminator | null record Add after 3.8(3) record_terminator ::= record [record_identifier] Add after 3.8(7) The optional record_identifier within a given record_definition's record_termintor must match the name of its enclosing type_declaration. Replace 3.8(28) type Complex is record Re : Real := 0.0; Im : Real := 0.0; end record Complex; Replace 13.5.1(2) record_representation_clause ::= for first_subtype_local_name use record [mod_clause] {component_clause} end record_representation_terminator; Add after 13.5.1(2) record_representation_terminator ::= record [first_subtype_local_name] !ASIS [Not sure. Does ASIS expose the matching name at the end of a construct?? - Editor.] !ACATS test An ACATS B-Test and C-Test are needed to check that the new capabilities are supported. !appendix From: Justin Squirek Sent: Wednesday, October 5, 2016 11:30 AM I was considering amending my previous AI to be several (raise-when syntax and a with-use clause), but after considering feedback I realized that these would not blend well with the Ada language. However, I do think proposing an AI on unifying record type declaration syntax is worthwhile. [This is version /01 of this AI, with a number of missing parts added. - Editor] **************************************************************** From the minutes of the Lexington Meeting (October 2018): Tucker suggests "end record "; as an option, there is no interest in leaving out the record. End by itself is disgusting. Gary suggests that we would allow the name on end of the record representation clause. Tucker argues against that, it doesn't declare anything. Others argue that it could improve readability; it also would be consistent, otherwise you would have to worry about the context of end record. We eventually agree that it makes sense to allow it anywhere end record occurs. The optional identifier has to match appropriately. Randy complains that a record_definition (which is the construct with the end record) does not iteself have an identifier. Rather, it is part of other constructs (record_type_definition, record_extension) which themselves in turn are part of a type_declaration, which is where the defining identifier comes from. So it is not simple to describe the identifier that has to match. It should be possible to describe this (perhaps by saying the "enclosing type_declaration"), we'll leave it to the author to figure that out. **************************************************************** From: Justin Squirek Sent: Thursday, January 10, 2019 10:21 AM Attached is my homework for AI12-0213-1-01, revised as per our discussions. [This is version /02 - Editor.] ****************************************************************