This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.
Index Nav: | [Date Index] [Subject Index] [Author Index] [Thread Index] | |
---|---|---|
Message Nav: | [Date Prev] [Date Next] | [Thread Prev] [Thread Next] |
Other format: | [Raw text] |
This patch provides the initial implementation of attribute Update. This construct is intended for formal verification proofs. The syntax of the attribute is as follows: X'Update ( RECORD_COMPONENT_ASSOCIATION_LIST ) X'Update ( ARRAY_COMPONENT_ASSOCIATION {, ARRAY_COMPONENT_ASSOCIATION} ) X'Update ( MULTIDIMENSIONAL_ARRAY_COMPONENT_ASSOCIATION {, MULTIDIMENSIONAL_ARRAY_COMPONENT_ASSOCIATION} ) MULTIDIMENSIONAL_ARRAY_COMPONENT_ASSOCIATION ::= INDEX_EXPRESSION_LIST_LIST => EXPRESSION INDEX_EXPRESSION_LIST_LIST ::= INDEX_EXPRESSION_LIST { | INDEX_EXPRESSION_LIST} INDEX_EXPRESSION_LIST ::= (EXPRESSION {, EXPRESSION} ) The brief semantics of this attribute are as follows: The prefix of attribute Update must be a non-limited object of a record or array type. The type of the attribute is that of its prefix. The evaluation of attribute Update begins with the creation of an anonymous object of type T which is initialized to the value of the prefix. Next, components of the object are updated to new values as specified by the corresponding association_list. The attribute reference then denotes the constant view of this updated object. A record update may not modify discriminants and it is not allowed to mention components more than once. An array update modifies specified elements in the same order of their appearance in the corresponding association_list. The use of "others" in the association_lists is not allowed. ------------ -- Source -- ------------ -- main.adb with Ada.Text_IO; use Ada.Text_IO; procedure Main is type Rec is record Comp_1 : Natural; Comp_2 : Natural; end record; procedure Output_Rec (Obj : Rec) is begin Put_Line ("Comp_1:" & Obj.Comp_1'Img); Put_Line ("Comp_2:" & Obj.Comp_2'Img); end Output_Rec; Base_Obj : constant Rec := (1, 2); Obj : constant Rec := Base_Obj'Update (Comp_2 => 3); begin Output_Rec (Base_Obj); Output_Rec (Obj); end Main; ---------------------------- -- Compilation and output -- ---------------------------- $ gnatmake -q -gnatd.V main.adb $ ./main Comp_1: 1 Comp_2: 2 Comp_1: 1 Comp_2: 3 Tested on x86_64-pc-linux-gnu, committed on trunk 2012-12-05 Hristian Kirtchev <kirtchev@adacore.com> * exp_attr.adb (Expand_N_Attribute_Reference): Add processing for attribute Update. (Expand_Update_Attribute): New routine. * par-ch4.adb (P_Name): The sole expression of attribute Update is an aggregate, parse it accordingly. * sem_attr.adb (Analyze_Attribute): Verify the legality of attribute Update. (Eval_Attribute): Attribute Update does not need evaluation because it is never static. * snames.ads-tmpl: Add Name_Update to the list of special names recognized by the compiler. Add an Attribute_Id for Update.
Attachment:
difs
Description: Text document
Index Nav: | [Date Index] [Subject Index] [Author Index] [Thread Index] | |
---|---|---|
Message Nav: | [Date Prev] [Date Next] | [Thread Prev] [Thread Next] |