1"use strict";(self.webpackChunkada_lang_io=self.webpackChunkada_lang_io||[]).push([["4628"],{45121(e,s,i){i.r(s),i.d(s,{metadata:()=>a,default:()=>m,frontMatter:()=>d,contentTitle:()=>h,toc:()=>p,assets:()=>x});var a=JSON.parse('{"id":"arm/AA-E/AA-E.2","title":"E.2. Categorization of Library Units","description":"This Reference Manual output has not been verified,","source":"@site/docs/arm/AA-E/AA-E.2.mdx","sourceDirName":"arm/AA-E","slug":"/arm/AA-E/AA-E.2","permalink":"/docs/arm/AA-E/AA-E.2","draft":false,"unlisted":false,"tags":[],"version":"current","sidebarPosition":173,"frontMatter":{"sidebar_position":173},"sidebar":"referenceManualSidebar","previous":{"title":"E.1. Partitions","permalink":"/docs/arm/AA-E/AA-E.1"},"next":{"title":"E.3. Consistency of a Distributed System","permalink":"/docs/arm/AA-E/AA-E.3"}}'),r=i(74848),t=i(28453),n=i(98113),l=i(60271);i(9011);var o=i(48554),c=i(94029);let d={sidebar_position:173},h="E.2. Categorization of Library Units",x={},p=[{value:"Wording Changes from Ada 95",id:"wording-changes-from-ada-95",level:4},{value:"Wording Changes from Ada 2005",id:"wording-changes-from-ada-2005",level:4},{value:"Wording Changes from Ada 2012",id:"wording-changes-from-ada-2012",level:4},{value:"E.2.1 Shared Passive Library Units",id:"e21--shared-passive-library-units",level:2},{value:"Language Design Principles",id:"language-design-principles",level:4},{value:"Legality Rules",id:"legality-rules",level:4},{value:"Static Semantics",id:"static-semantics",level:4},{value:"Post-Compilation Rules",id:"post-compilation-rules",level:4},{value:"Wording Changes from Ada 95",id:"wording-changes-from-ada-95-1",level:4},{value:"Extensions to Ada 2005",id:"extensions-to-ada-2005",level:4},{value:"Incompatibilities With Ada 2012",id:"incompatibilities-with-ada-2012",level:4},{value:"Wording Changes from Ada 2012",id:"wording-changes-from-ada-2012-1",level:4},{value:"E.2.2 Remote Types Library Units",id:"e22--remote-types-library-units",level:2},{value:"Language Design Principles",id:"language-design-principles-1",level:4},{value:"Legality Rules",id:"legality-rules-1",level:4},{value:"Erroneous Execution",id:"erroneous-execution",level:4},{value:"Incompatibilities With Ada 95",id:"incompatibilities-with-ada-95",level:4},{value:"Extensions to Ada 95",id:"extensions-to-ada-95",level:4},{value:"Wording Changes from Ada 95",id:"wording-changes-from-ada-95-2",level:4},{value:"Incompatibilities With Ada 2005",id:"incompatibilities-with-ada-2005",level:4},{value:"Extensions to Ada 2005",id:"extensions-to-ada-2005-1",level:4},{value:"Wording Changes from Ada 2012",id:"wording-changes-from-ada-2012-2",level:4},{value:"E.2.3 Remote Call Interface Library Units",id:"e23--remote-call-interface-library-units",level:2},{value:"Language Design Principles",id:"language-design-principles-2",level:4},{value:"Legality Rules",id:"legality-rules-2",level:4},{value:"Post-Compilation Rules",id:"post-compilation-rules-1",level:4},{value:"Implementation Requirements",id:"implementation-requirements",level:4},{value:"Implementation Permissions",id:"implementation-permissions",level:4},{value:"Incompatibilities With Ada 95",id:"incompatibilities-with-ada-95-1",level:4},{value:"Wording Changes from Ada 95",id:"wording-changes-from-ada-95-3",level:4},{value:"Incompatibilities With Ada 2005",id:"incompatibilities-with-ada-2005-1",level:4},{value:"Extensions to Ada 2005",id:"extensions-to-ada-2005-2",level:4},{value:"Inconsistencies With Ada 2012",id:"inconsistencies-with-ada-2012",level:4},{value:"Incompatibilities With Ada 2012",id:"incompatibilities-with-ada-2012-1",level:4},{value:"Wording Changes from Ada 2012",id:"wording-changes-from-ada-2012-3",level:4}];function j(e){let s={a:"a",admonition:"admonition",h1:"h1",h2:"h2",h4:"h4",header:"header",p:"p",...(0,t.R)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(s.header,{children:(0,r.jsx)(s.h1,{id:"e2-categorization-of-library-units",children:"E.2. Categorization of Library Units"})}),"\n",(0,r.jsx)(s.admonition,{type:"danger",children:(0,r.jsxs)(s.p,{children:["This Reference Manual output has not been verified,\nand may contain omissions or errors.\nReport any problems on the ",(0,r.jsx)(s.a,{href:"https://github.com/ada-lang-io/ada-lang-io/issues/20",children:"tracking issue"})]})}),"\n","\n",(0,r.jsx)(o.A,{children:"1"}),"\n",(0,r.jsxs)("p",{children:["[Library units can be categorized according to the role they play in a distributed program. Certain restrictions are associated with each category to ensure that the semantics of a distributed program remain close to the semantics for a nondistributed program.]",(0,r.jsx)("br",{})]}),"\n",(0,r.jsx)(o.A,{children:"2/3"}),"\n",(0,r.jsx)(c.A,{items:["AI05-0243-1","AI12-0417-1"]}),"\n",(0,r.jsxs)("p",{children:["A ",(0,r.jsx)("i",{children:"categorization aspect"})," restricts the declarations, child units, or semantic dependences of the library unit to which it applies. A ",(0,r.jsx)("i",{children:"categorized library unit"})," is a library unit that has a categorization aspect that is True.",(0,r.jsx)("br",{})]}),"\n",(0,r.jsx)(o.A,{children:"3/3"}),"\n",(0,r.jsx)(c.A,{items:["AI05-0243-1","AI12-0417-1"]}),"\n",(0,r.jsxs)("p",{children:["The aspects Shared","_","Passive, Remote","_","Types, and Remote","_","Call","_","Interface are categorization aspects. In addition, for the purposes of this Annex, the aspect Pure (see ",(0,r.jsx)("a",{href:"/docs/arm/AA-10/AA-10.2#Subclause_10.2.1",children:"10.2.1"}),") is considered a categorization aspect.",(0,r.jsx)("br",{})]}),"\n",(0,r.jsx)(o.A,{children:"4/3"}),"\n",(0,r.jsx)(c.A,{items:["AI95-00048-01","AI05-0243-1"]}),"\n",(0,r.jsxs)("p",{children:["{",(0,r.jsx)("i",{children:"8652/0078"}),"}"," [ A library package or generic library package is called a ",(0,r.jsx)("i",{children:"shared passive"})," library unit if the Shared","_","Passive aspect of the unit is True. A library package or generic library package is called a ",(0,r.jsx)("i",{children:"remote types"})," library unit if the Remote","_","Types aspect of the unit is True. A library unit is called a ",(0,r.jsx)("i",{children:"remote call interface"})," if the Remote","_","Call","_","Interface aspect of the unit is True.] A ",(0,r.jsx)("i",{children:"normal library unit"})," is one for which no categorization aspect is True. ",(0,r.jsx)("br",{})]}),"\n",(0,r.jsxs)(l.A,{children:[(0,r.jsx)(o.A,{children:"4.a/3"}),(0,r.jsx)(c.A,{items:["AI05-0243-1","AI05-0299-1"]}),(0,r.jsx)(n.A,{type:"aarm",aarm:"proof",children:(0,r.jsxs)(s.p,{children:[(0,r.jsx)("b",{}),"These terms (other than \u201Cnormal library unit\u201D) are really defined in the following subclauses. ",(0,r.jsx)("br",{})]})})]}),"\n",(0,r.jsxs)(l.A,{children:[(0,r.jsx)(o.A,{children:"4.a.1/1"}),(0,r.jsx)(c.A,{items:["AI95-00048-01"]}),(0,r.jsx)(n.A,{type:"aarm",aarm:"ramification",children:(0,r.jsxs)(s.p,{children:[(0,r.jsx)("b",{}),"{",(0,r.jsx)("i",{children:"8652/0078"}),"}"," A library subprogram can be a remote call interface, but it cannot be a remote types or shared passive library unit. ",(0,r.jsx)("br",{})]})})]}),"\n",(0,r.jsx)(o.A,{children:"5/3"}),"\n",(0,r.jsx)(c.A,{items:["AI05-0206-1","AI05-0243-1","AI05-0269-1","AI05-0299-1"]}),"\n",(0,r.jsxs)("p",{children:["[The various categories of library units and the associated restrictions are described
1in this and the following subclauses. The categories are related hierarchically in that the library units of one category can depend semantically only on library units of that category or an earlier one in the hierarchy, except that the body of a remote types or remote call interface library unit is unrestricted, the declaration of a remote types or remote call interface library unit may depend on preelaborated normal library units that are mentioned only in private with clauses, and all categories can depend on limited views.",(0,r.jsx)("br",{})]}),"\n",(0,r.jsx)(o.A,{children:"6/3"}),"\n",(0,r.jsx)(c.A,{items:["AI05-0243-1","AI05-0269-1"]}),"\n",(0,r.jsxs)("p",{children:["The overall hierarchy (including declared pure) is as follows, with a lower-numbered category being \u201Cearlier in the hierarchy\u201D in the sense of the previous paragraph: ",(0,r.jsx)("br",{})]}),"\n",(0,r.jsx)(o.A,{children:"6.1/3"}),"\n",(0,r.jsxs)("dt",{children:[(0,r.jsx)("br",{}),"1."]}),"\n",(0,r.jsxs)("dl",{children:[(0,r.jsxs)("dd",{children:["Declared Pure",(0,r.jsx)("br",{})]}),(0,r.jsx)(o.A,{children:"6.2/3"}),(0,r.jsxs)("dt",{children:[(0,r.jsx)("br",{}),"2."]}),(0,r.jsxs)("dd",{children:["Shared Passive",(0,r.jsx)("br",{})]}),(0,r.jsx)(o.A,{children:"6.3/3"}),(0,r.jsxs)("dt",{children:[(0,r.jsx)("br",{}),"3."]}),(0,r.jsxs)("dd",{children:["Remote Types",(0,r.jsx)("br",{})]}),(0,r.jsx)(o.A,{children:"6.4/3"}),(0,r.jsxs)("dt",{children:[(0,r.jsx)("br",{}),"4."]}),(0,r.jsxs)("dd",{children:["Remote Call Interface",(0,r.jsx)("br",{})]}),(0,r.jsx)(o.A,{children:"6.5/3"}),(0,r.jsxs)("dt",{children:[(0,r.jsx)("br",{}),"5."]}),(0,r.jsxs)("dd",{children:["Normal (no restrictions) ",(0,r.jsx)("br",{})]})]}),"\n",(0,r.jsxs)("p",{children:[(0,r.jsx)("i",{children:"Paragraphs 7 through 11 were deleted."})," ",(0,r.jsx)("br",{})]}),"\n",(0,r.jsx)(o.A,{children:"12"}),"\n",(0,r.jsxs)("p",{children:["Declared pure and shared passive library units are preelaborated. The declaration of a remote types or remote call interface library unit is required to be preelaborable. ]",(0,r.jsx)("br",{})]}),"\n",(0,r.jsxs)("p",{children:[(0,r.jsx)("i",{children:"Paragraph 13 and 14 were deleted."})," ",(0,r.jsx)("br",{})]}),"\n",(0,r.jsx)(l.A,{children:(0,r.jsx)(s.h4,{id:"wording-changes-from-ada-95",children:"Wording Changes from Ada 95"})}),"\n",(0,r.jsxs)(l.A,{children:[(0,r.jsx)(o.A,{children:"14.a/2"}),(0,r.jsx)(c.A,{items:["AI95-00048-01"]}),(0,r.jsx)(n.A,{type:"aarm",aarm:"note",children:(0,r.jsxs)(s.p,{children:["{",(0,r.jsx)("i",{children:"8652/0078"}),"}"," ",(0,r.jsx)("b",{children:"Corrigendum:"})," Clarified that a library subprogram can be a remote call interface unit.",(0,r.jsx)("br",{})]})})]}),"\n",(0,r.jsxs)(l.A,{children:[(0,r.jsx)(o.A,{children:"14.b/2"}),(0,r.jsx)(c.A,{items:["AI95-00208-01"]}),(0,r.jsx)(n.A,{type:"aarm",aarm:"note",children:(0,r.jsxs)(s.p,{children:["{",(0,r.jsx)("i",{children:"8652/0079"}),"}"," ",(0,r.jsx)("b",{children:"Corrigendum:"})," Removed the requirement that types be represented the same in all partitions, because it prevents the definition of heterogeneous distributed systems and goes much further than required. ",(0,r.jsx)("br",{})]})})]}),"\n",(0,r.jsx)(l.A,{children:(0,r.jsx)(s.h4,{id:"wording-changes-from-ada-2005",children:"Wording Changes from Ada 2005"})}),"\n",(0,r.jsxs)(l.A,{children:[(0,r.jsx)(o.A,{children:"14.c/3"}),(0,r.jsx)(c.A,{items:["AI05-0206-1","AI05-0299-1"]}),(0,r.jsx)(n.A,{type:"aarm",aarm:"note",children:(0,r.jsxs)(s.p,{children:["We now allow private withs of preelaborated units in Remote Types and Remote Call Interface units; this is documented as an extension in the subclauses where this is defined normatively.",(0,r.jsx)("br",{})]})})]}),"\n",(0,r.jsxs)(l.A,{children:[(0,r.jsx)(o.A,{children:"14.d/3"}),(0,r.jsx)(c.A,{items:["AI05-0243-1","AI05-0299-1"]}),(0,r.jsx)(n.A,{type:"aarm",aarm:"note",children:(0,r.jsxs)(s.p,{children:["We have introduced categorization aspects; these are documented as extensions in the subclauses where they actually are defined. ",(0,r.jsx)("br",{})]})})]}),"\n",(0,r.jsx)(l.A,{children:(0,r.jsx)(s.h4,{id:"wording-changes-from-ada-2012",children:"Wording Changes from Ada 2012"})}),"\n",(0,r.jsxs)(l.A,{children:[(0,r.jsx)(o.A,{children:"14.e/5"}),(0,r.jsx)(c.A,{items:["AI12-0417-1"]}),(0,r.jsx)(n.A,{type:"aarm",aarm:"note",children:(0,r.jsxs)(s.p,{children:["Categorization pragmas are now obsolescent. ",(0,r.jsx)("br",{})]})})]}),"\n",(0,r.jsx)("a",{id:"Subclause_E.2.1"}),"\n",(0,r.jsx)(s.h2,{id:"e21--shared-passive-library-units",children:"E.2.1 Shared Passive Library Units"}),"\n",(0,r.jsx)(o.A,{children:"1_E.2.1"}),"\n",(0,r.jsxs)("p",{children:["[A shared passive library unit is used for managing global data shared between active partitions. The restrictions on shared passive library units prevent the data or tasks of one active partition from being accessible to another active partition through references implicit in objects declared in the shared passive library unit.] ",(0,r.jsx)("br",{})]}),"\n",(0,r.jsx)(s.h4,{id:"language-design-principles",children:"Language Design Principles"}),"\n",(0,r.jsxs)(l.A,{children:[(0,r.jsx)(o.A,{children:"1.a_E.2.1"}),(0,r.jsx)(n.A,{type:"aarm",aarm:"note",children:(0,r.jsxs)(s.p,{children:["The restrictions governing a shared passive library unit are designed to ensure that objects and subprograms declared in the package can be used safely from multiple active partitions, even though the active partitions live in different address spaces, and have separate run-time systems. ",(0,r.jsx)("br",{})]})})]}),"\n",(0,r.jsxs)("p",{children:[(0,r.jsxs)("i",{children:["Paragraphs 2 and 3 were moved to ",(0,r.jsx)("a",{href:"/docs/arm/AA-J/",children:"Annex J"}),", \u201C",(0,r.jsx)("a",{href:"/docs/arm/AA-J/",children:"Obsolescent Features"}),"\u201D."]})," ",(0,r.jsx)("br",{})]}),"\n",(0,r.jsx)(s.h4,{id:"legality-rules",children:"Legality Rules"}),"\n",(0,r.jsx)(o.A,{children:"4/5_E.2.1"}),"\n",(0,r.jsx)(c.A,{items:["AI05-0243-1","AI12-0417-1"]}),"\n",(0,r.jsxs)("p",{children:["When the library unit aspect (see ",(0,r.jsx)("a",{href:"/docs/arm/AA-13/AA-13.1#Subclause_13.1.1",children:"13.1.1"}),") Shared","_","Passive of a library unit is True, the library unit is a ",(0,r.jsx)("i",{children:"shared passive library unit"}),". The following restrictions apply to such a library unit:",(0,r.jsx)("br",{})]}),"\n",(0,r.jsxs)(l.A,{children:[(0,r.jsx)(o.A,{children:"4.a/3_E.2.1"}),(0,r.jsx)(n.A,{type:"aarm",aarm:"note",children:(0,r.jsxs)(s.p,{children:[(0,r.jsx)("b",{children:"Aspect Description for "}),(0,r.jsxs)("b",{children:["Shared","_","Passive: "]}),"A given package is used to represent shared memory in a distributed system.",(0,r.jsx)("br",{})]})})]}),"\n",(0,r.jsx)(o.A,{children:"5_E.2.1"}),"\n",(0,r.jsx)("ul",{children:(0,r.jsxs)("li",{children:["[it shall be preelaborable (see ",(0,r.jsx)("a",{href:"/docs/arm/AA-10/AA-10.2#Subclause_10.2.1",children:"10.2.1"}),");] ",(0,r.jsx)("br",{})]})}),"\n",(0,r.jsxs)(l.A,{children:[(0,r.jsx)(o.A,{children:"5.a_E.2.1"}),(0,r.jsx)(n.A,{type:"aarm",aarm:"ramification",children:(0,r.jsxs)(s.p,{children:[(0,r.jsx)("b",{}),"It cannot contain library-level declarations of protected objects with entries, nor of task objects. Task objects are disallowed because passive partitions don't have any threads of control of their own, nor any run-time system of their own. Protected objects with entries are disallowed because an entry queue contains references to calling tasks, and that would require in effect a pointer from a passive partition back to a task in some active partition. ",(0,r.jsx)("br",{})]})})]}),"\n",(0,r.jsx)(o.A,{children:"6/3_E.2.1"}),"\n",(0,r.jsx)(c.A,{items:["AI05-0243-1"]}),"\n",(0,r.jsx)("ul",{children:(0,r.jsxs)("li",{children:["it shall depend semantically only upon declared pure or shared passive ",(0,r.jsx)("code",{children:(0,r.jsx)("a",{href:"/docs/arm/AA-10/AA-10.1#S0287",children:"library_item"})}),"s; ",(0,r.jsx)("br",{})]})}),"\n",(0,r.jsxs)(l.A,{children:[(0,r.jsx)(o.A,{children:"6.a_E.2.1"}),(0,r.jsx)(n.A,{type:"aarm",aarm:"reason",children:(0,r.jsxs)(s.p,{children:[(0,r.jsx)("b",{}),"Shared passive packages cannot depend semantically upon remote types packages because the values of an access type declared in a remote types package refer to the local heap of the active partition including the remote types package. ",(0,r.jsx)("br",{})]})})]}),"\n",(0,r.jsxs)(l.A,{children:[(0,r.jsx)(o.A,{children:"6.b/3_E.2.1"}),(0,r.jsx)(c.A,{items:["AI05-0243-1"]}),(0,r.jsx)(n.A,{type:"aarm",aarm:"ramification",children:(0,r.jsxs)(s.p,{children:[(0,r.jsx)("b",{}),"We say ",(0,r.jsx)("code",{children:(0,r.jsx)("a",{href:"/docs/arm/AA-10/AA-10.1#S0287",children:"library_item"})})," here, so that limited views are allowed; those are not library units, but they are ",(0,r.jsx)("code",{children:(0,r.jsx)("a",{href:"/docs/arm/AA-10/AA-10.1#S0287",children:"library_item"})}),". ",(0,r.jsx)("br",{})]})})]}),"\n",(0,r.jsx)(o.A,{children:"7/5_E.2.1"}),"\n",(0,r.jsx)(c.A,{items:["AI95-00003-01","AI12-0038-1","AI12-0320-1"]}),"\n",(0,r.jsxs)("ul",{children:[(0,r.jsxs)("li",{children:["{",(0,r.jsx)("i",{children:"8652/0080"}),"}"," it shall not contain a library-level declaration:",(0,r.jsx)("br",{})]}),(0,r.jsx)(o.A,{children:"7.1/5_E.2.1"}),(0,r.jsx)(c.A,{items:["AI12-0320-1"]}),(0,r.jsxs)("li",{children:["of an access type that designates a class-wide t
1ype; ",(0,r.jsx)("br",{})]})]}),"\n",(0,r.jsxs)(l.A,{children:[(0,r.jsx)(o.A,{children:"7.a_E.2.1"}),(0,r.jsx)(n.A,{type:"aarm",aarm:"reason",children:(0,r.jsxs)(s.p,{children:[(0,r.jsx)("b",{}),"These kinds of access types are disallowed because the object designated by an access value of such a type could contain an implicit reference back to the active partition on whose behalf the designated object was created. ",(0,r.jsx)("br",{})]})})]}),"\n",(0,r.jsx)(o.A,{children:"7.2/5_E.2.1"}),"\n",(0,r.jsx)(c.A,{items:["AI12-0320-1"]}),"\n",(0,r.jsxs)("ul",{children:[(0,r.jsxs)("li",{children:["of a type with a part that is of a task type;",(0,r.jsx)("br",{})]}),(0,r.jsx)(o.A,{children:"7.3/5_E.2.1"}),(0,r.jsx)(c.A,{items:["AI12-0320-1"]}),(0,r.jsxs)("li",{children:["of a type with a part that is of a protected type with ",(0,r.jsx)("code",{children:(0,r.jsx)("a",{href:"/docs/arm/AA-9/AA-9.5#S0257",children:"entry_declaration"})}),"s; or",(0,r.jsx)("br",{})]}),(0,r.jsx)(o.A,{children:"7.4/5_E.2.1"}),(0,r.jsx)(c.A,{items:["AI12-0038-1","AI12-0320-1"]}),(0,r.jsxs)("li",{children:["that contains a name that denotes a type declared within a declared-pure package, if that type has a part that is of an access type; for the purposes of this rule, the parts considered include those of the full views of any private types or private extensions.",(0,r.jsx)("br",{})]})]}),"\n",(0,r.jsxs)(l.A,{children:[(0,r.jsx)(o.A,{children:"7.b/4_E.2.1"}),(0,r.jsx)(n.A,{type:"aarm",aarm:"reason",children:(0,r.jsxs)(s.p,{children:[(0,r.jsx)("b",{}),"This rule breaks privacy by looking into the full views of private types. Avoiding privacy breakage here would have required disallowing the use in a shared passive package of any private type declared in a declared-pure package, which would have been severely incompatible. ",(0,r.jsx)("br",{})]})})]}),"\n",(0,r.jsx)(o.A,{children:"8_E.2.1"}),"\n",(0,r.jsxs)("p",{children:["Notwithstanding the definition of accessibility given in ",(0,r.jsx)("a",{href:"/docs/arm/AA-3/AA-3.10#Subclause_3.10.2",children:"3.10.2"}),", the declaration of a library unit P1 is not accessible from within the declarative region of a shared passive library unit P2, unless the shared passive library unit P2 depends semantically on P1. ",(0,r.jsx)("br",{})]}),"\n",(0,r.jsxs)(l.A,{children:[(0,r.jsx)(o.A,{children:"8.a_E.2.1"}),(0,r.jsx)(n.A,{type:"aarm",aarm:"discussion",children:(0,r.jsxs)(s.p,{children:[(0,r.jsx)("b",{}),"We considered a more complex rule, but dropped it. This is the simplest rule that recognizes that a shared passive package may outlive some other library package, unless it depends semantically on that package. In a nondistributed program, all library packages are presumed to have the same lifetime.",(0,r.jsx)("br",{})]})})]}),"\n",(0,r.jsxs)(l.A,{children:[(0,r.jsx)(o.A,{children:"8.b/5_E.2.1"}),(0,r.jsx)(c.A,{items:["AI12-0417-1"]}),(0,r.jsx)(n.A,{type:"aarm",aarm:"note",children:(0,r.jsxs)(s.p,{children:["Implementations may define additional aspects or pragmas that force two library packages to be in the same partition, or to have the same lifetime, which would allow this rule to be relaxed in the presence of such aspects or pragmas. ",(0,r.jsx)("br",{})]})})]}),"\n",(0,r.jsx)(s.h4,{id:"static-semantics",children:"Static Semantics"}),"\n",(0,r.jsx)(o.A,{children:"9_E.2.1"}),"\n",(0,r.jsxs)("p",{children:["A shared passive library unit is preelaborated.",(0,r.jsx)("br",{})]}),"\n",(0,r.jsx)(s.h4,{id:"post-compilation-rules",children:"Post-Compilation Rules"}),"\n",(0,r.jsx)(o.A,{children:"10_E.2.1"}),"\n",(0,r.jsxs)("p",{children:["A shared passive library unit shall be assigned to at most one partition within a given program.",(0,r.jsx)("br",{})]}),"\n",(0,r.jsx)(o.A,{children:"11_E.2.1"}),"\n",(0,r.jsxs)("p",{children:["Notwithstanding the rule given in ",(0,r.jsx)("a",{href:"/docs/arm/AA-10/AA-10.2",children:"10.2"}),", a compilation unit in a given partition does not ",(0,r.jsx)("i",{children:"need"})," (in the sense of ",(0,r.jsx)("a",{href:"/docs/arm/AA-10/AA-10.2",children:"10.2"}),") the shared passive library units on which it depends semantically to be included in that same partition; they will typically reside in separate passive partitions.",(0,r.jsx)("br",{})]}),"\n",(0,r.jsxs)(l.A,{children:[(0,r.jsx)(o.A,{children:"11.a/5_E.2.1"}),(0,r.jsx)(c.A,{items:["AI12-0359-1"]}),(0,r.jsx)(n.A,{type:"aarm",aarm:"note",children:(0,r.jsxs)(s.p,{children:[(0,r.jsx)("b",{children:"To be honest: "}),"This rule is necessary so that the shared data of a shared passive partition is not duplicated in each partition. It does not imply a particular implementation; in particular, code can be replicated in each active partition. ",(0,r.jsx)("br",{})]})})]}),"\n",(0,r.jsxs)(l.A,{children:[(0,r.jsx)(o.A,{children:"11.b/5_E.2.1"}),(0,r.jsx)(c.A,{items:["AI12-0359-1"]}),(0,r.jsx)(n.A,{type:"aarm",aarm:"implementation-note",children:(0,r.jsxs)(s.p,{children:[(0,r.jsx)("b",{}),"One possible implementation for a shared passive partition is as a shared library that is mapped into the address space of of each active partition. In such case, both the code and the data of the passive partition would be mapped into the active partitions and directly called/accessed from each active partition. For instance, on Microsoft Windows a DLL has the correct semantics.",(0,r.jsx)("br",{})]})})]}),"\n",(0,r.jsxs)(l.A,{children:[(0,r.jsx)(o.A,{children:"11.c/5_E.2.1"}),(0,r.jsx)(n.A,{type:"aarm",aarm:"note",children:(0,r.jsxs)(s.p,{children:["Alternatively, the shared data can be represented as a file or persistent memory, with the shared code being replicated in each active partition. Code replication is an as-if optimization; it should be impossible to tell where the code lives since no elaboration is necessary. ",(0,r.jsx)("br",{})]})})]}),"\n",(0,r.jsx)(l.A,{children:(0,r.jsx)(s.h4,{id:"wording-changes-from-ada-95-1",children:"Wording Changes from Ada 95"})}),"\n",(0,r.jsxs)(l.A,{children:[(0,r.jsx)(o.A,{children:"11.d/2_E.2.1"}),(0,r.jsx)(c.A,{items:["AI95-00003-01"]}),(0,r.jsx)(n.A,{type:"aarm",aarm:"note",children:(0,r.jsxs)(s.p,{children:["{",(0,r.jsx)("i",{children:"8652/0080"}),"}"," ",(0,r.jsx)("b",{children:"Corrigendum:"})," Corrected the wording to allow access types in blocks in shared passive generic packages. ",(0,r.jsx)("br",{})]})})]}),"\n",(0,r.jsx)(l.A,{children:(0,r.jsx)(s.h4,{id:"extensions-to-ada-2005",children:"Extensions to Ada 2005"})}),"\n",(0,r.jsxs)(l.A,{children:[(0,r.jsx)(o.A,{children:"11.e/5_E.2.1"}),(0,r.jsx)(c.A,{items:["AI05-0243-1","AI12-0417-1"]}),(0,r.jsx)(n.A,{type:"aarm",aarm:"note",children:(0,r.jsxs)(s.p,{children:["Shared","_","Passive is now a categorization aspect, so it can be specified by an ",(0,r.jsx)("code",{children:(0,r.jsx)("a",{href:"/docs/arm/AA-13/AA-13.1#S0346",children:"aspect_specification"})})," ",(0,r.jsx)("br",{})]})})]}),"\n",(0,r.jsx)(l.A,{children:(0,r.jsx)(s.h4,{id:"incompatibilities-with-ada-2012",children:"Incompatibilities With Ada 2012"})}),"\n",(0,r.jsxs)(l.A,{children:[(0,r.jsx)(o.A,{children:"11.f/4_E.2.1"}),(0,r.jsx)(c.A,{items:["AI12-0038-1"]}),(0,r.jsx)(n.A,{type:"aarm",aarm:"note",children:(0,r.jsxs)(s.p,{children:[(0,r.jsx)("b",{children:"Corrigendum:"})," Uses of access types declared in declared-pure units are not allowed in library-level shared passive packages. These were allowed by Ada 2005 and Ada 2012, but it is unlikely that they work properly, as active partitions could disappear before the shared-passive partition. As such, the new errors are more likely to catch bugs than to cause them. ",(0,r.jsx)("br",{})]})})]}),"\n",(0,r.jsx)(l.A,{children:(0,r.jsx)(s.h4,{id:"wording-changes-from-ada-2012-1",children:"Wording Changes from Ada 2012"})}),"\n",(0,r.jsxs)(l.A,{children:[(0,r.jsx)(o.A,{children:"11.g/5_E.2.1"}),(0,r.jsx)(c.A,{items:["AI12-0417-1"]}),(0,r.jsx)(n.A,{type:"aarm",aarm:"note",children:(0,r.jsxs)(s.p,{children:["The pragma Shared","_","Passive is now obsolescent. ",(0,r.jsx)("br",{})]})})]}),"\n",(0,r.jsx)("a",{id:"Subclause_E.2.2"}
1),"\n",(0,r.jsx)(s.h2,{id:"e22--remote-types-library-units",children:"E.2.2 Remote Types Library Units"}),"\n",(0,r.jsx)(o.A,{children:"1_E.2.2"}),"\n",(0,r.jsxs)("p",{children:["[A remote types library unit supports the definition of types intended for use in communication between active partitions.] ",(0,r.jsx)("br",{})]}),"\n",(0,r.jsx)(s.h4,{id:"language-design-principles-1",children:"Language Design Principles"}),"\n",(0,r.jsxs)(l.A,{children:[(0,r.jsx)(o.A,{children:"1.a_E.2.2"}),(0,r.jsx)(n.A,{type:"aarm",aarm:"note",children:(0,r.jsxs)(s.p,{children:["The restrictions governing a remote types package are similar to those for a declared pure package. However, the restrictions are relaxed deliberately to allow such a package to contain declarations that violate the stateless property of pure packages, though it is presumed that any state-dependent properties are essentially invisible outside the package. ",(0,r.jsx)("br",{})]})})]}),"\n",(0,r.jsxs)("p",{children:[(0,r.jsxs)("i",{children:["Paragraphs 2 and 3 were moved to ",(0,r.jsx)("a",{href:"/docs/arm/AA-J/",children:"Annex J"}),", \u201C",(0,r.jsx)("a",{href:"/docs/arm/AA-J/",children:"Obsolescent Features"}),"\u201D."]})," ",(0,r.jsx)("br",{})]}),"\n",(0,r.jsx)(s.h4,{id:"legality-rules-1",children:"Legality Rules"}),"\n",(0,r.jsx)(o.A,{children:"4/5_E.2.2"}),"\n",(0,r.jsx)(c.A,{items:["AI05-0243-1","AI12-0417-1"]}),"\n",(0,r.jsxs)("p",{children:["When the library unit aspect (see ",(0,r.jsx)("a",{href:"/docs/arm/AA-13/AA-13.1#Subclause_13.1.1",children:"13.1.1"}),") Remote","_","Types of a library unit is True, the library unit is a ",(0,r.jsx)("i",{children:"remote types library unit"}),". The following restrictions apply to such a library unit:",(0,r.jsx)("br",{})]}),"\n",(0,r.jsxs)(l.A,{children:[(0,r.jsx)(o.A,{children:"4.a/3_E.2.2"}),(0,r.jsx)(n.A,{type:"aarm",aarm:"note",children:(0,r.jsxs)(s.p,{children:[(0,r.jsx)("b",{children:"Aspect Description for "}),(0,r.jsxs)("b",{children:["Remote","_","Types: "]}),"Types in a given package may be used in remote procedure calls.",(0,r.jsx)("br",{})]})})]}),"\n",(0,r.jsx)(o.A,{children:"5_E.2.2"}),"\n",(0,r.jsxs)("ul",{children:[(0,r.jsxs)("li",{children:["[it shall be preelaborable;]",(0,r.jsx)("br",{})]}),(0,r.jsx)(o.A,{children:"6/3_E.2.2"}),(0,r.jsx)(c.A,{items:["AI05-0206-1","AI05-0243-1"]}),(0,r.jsxs)("li",{children:["it shall depend semantically only on declared pure ",(0,r.jsx)("code",{children:(0,r.jsx)("a",{href:"/docs/arm/AA-10/AA-10.1#S0287",children:"library_item"})}),"s, shared passive library units, other remote types library units, or preelaborated normal library units that are mentioned only in private with clauses;",(0,r.jsx)("br",{})]})]}),"\n",(0,r.jsxs)(l.A,{children:[(0,r.jsx)(o.A,{children:"6.a/3_E.2.2"}),(0,r.jsx)(c.A,{items:["AI05-0243-1"]}),(0,r.jsx)(n.A,{type:"aarm",aarm:"ramification",children:(0,r.jsxs)(s.p,{children:[(0,r.jsx)("b",{}),"We say declared pure ",(0,r.jsx)("code",{children:(0,r.jsx)("a",{href:"/docs/arm/AA-10/AA-10.1#S0287",children:"library_item"})})," here, so that (all) limited views are allowed; those are not library units, but they are declared pure ",(0,r.jsx)("code",{children:(0,r.jsx)("a",{href:"/docs/arm/AA-10/AA-10.1#S0287",children:"library_item"})}),"s. ",(0,r.jsx)("br",{})]})})]}),"\n",(0,r.jsx)(o.A,{children:"7_E.2.2"}),"\n",(0,r.jsx)("ul",{children:(0,r.jsxs)("li",{children:["it shall not contain the declaration of any variable within the visible part of the library unit; ",(0,r.jsx)("br",{})]})}),"\n",(0,r.jsxs)(l.A,{children:[(0,r.jsx)(o.A,{children:"7.a_E.2.2"}),(0,r.jsx)(n.A,{type:"aarm",aarm:"reason",children:(0,r.jsxs)(s.p,{children:[(0,r.jsx)("b",{}),"This is essentially a \u201Cmethodological\u201D restriction. A separate copy of a remote types package is included in each partition that references it, just like a normal package. Nevertheless, a remote types package is thought of as an \u201Cessentially pure\u201D package for defining types to be used for interpartition communication, and it could be misleading to declare visible objects when no remote data access is actually being provided. ",(0,r.jsx)("br",{})]})})]}),"\n",(0,r.jsx)(o.A,{children:"8/2_E.2.2"}),"\n",(0,r.jsx)(c.A,{items:["AI95-00240-01","AI95-00366-01"]}),"\n",(0,r.jsx)("ul",{children:(0,r.jsxs)("li",{children:["the full view of each type declared in the visible part of the library unit that has any available stream attributes shall support external streaming (see ",(0,r.jsx)("a",{href:"/docs/arm/AA-13/AA-13.13#Subclause_13.13.2",children:"13.13.2"}),"). ",(0,r.jsx)("br",{})]})}),"\n",(0,r.jsxs)(l.A,{children:[(0,r.jsx)(o.A,{children:"8.a_E.2.2"}),(0,r.jsx)(n.A,{type:"aarm",aarm:"reason",children:(0,r.jsxs)(s.p,{children:[(0,r.jsx)("b",{}),"This is to prevent the use of the predefined Read and Write attributes of an access type as part of the Read and Write attributes of a visible type. ",(0,r.jsx)("br",{})]})})]}),"\n",(0,r.jsxs)(l.A,{children:[(0,r.jsx)(o.A,{children:"8.b/2_E.2.2"}),(0,r.jsx)(c.A,{items:["AI95-00366-01"]}),(0,r.jsx)(n.A,{type:"aarm",aarm:"ramification",children:(0,r.jsxs)(s.p,{children:[(0,r.jsx)("b",{}),"Types that do not have available stream attributes are excluded from this rule; that means that attributes do not need to be specified for most limited types. It is only necessary to specify attributes for nonlimited types that have a part that is of any access type, and for extensions of limited types with available stream attributes where the ",(0,r.jsx)("code",{children:(0,r.jsx)("a",{href:"/docs/arm/AA-3/AA-3.9#S0075",children:"record_extension_part"})})," includes a subcomponent of an access type, where the access type does not have specified attributes. ",(0,r.jsx)("br",{})]})})]}),"\n",(0,r.jsx)(o.A,{children:"9/3_E.2.2"}),"\n",(0,r.jsx)(c.A,{items:["AI95-00164-01","AI05-0060-1"]}),"\n",(0,r.jsxs)("p",{children:["{",(0,r.jsx)("i",{children:"8652/0082"}),"}"," A named access type declared in the visible part of a remote types or remote call interface library unit is called a ",(0,r.jsx)("i",{children:"remote access type"}),". Such a type shall be:",(0,r.jsx)("br",{})]}),"\n",(0,r.jsx)(o.A,{children:"9.1/1_E.2.2"}),"\n",(0,r.jsx)(c.A,{items:["AI95-00164-01"]}),"\n",(0,r.jsxs)("ul",{children:[(0,r.jsxs)("li",{children:["{",(0,r.jsx)("i",{children:"8652/0082"}),"}"," an access-to-subprogram type, or",(0,r.jsx)("br",{})]}),(0,r.jsx)(o.A,{children:"9.2/3_E.2.2"}),(0,r.jsx)(c.A,{items:["AI95-00164-01","AI05-0060-1"]}),(0,r.jsxs)("li",{children:["{",(0,r.jsx)("i",{children:"8652/0082"}),"}"," a general access type that designates a class-wide limited private type, a class-wide limited interface type, or a class-wide private extension all of whose ancestors are either private extensions, limited interface types, or limited private types. ",(0,r.jsx)("br",{})]})]}),"\n",(0,r.jsx)(o.A,{children:"9.3/1_E.2.2"}),"\n",(0,r.jsx)(c.A,{items:["AI95-00004-01"]}),"\n",(0,r.jsxs)("p",{children:["{",(0,r.jsx)("i",{children:"8652/0081"}),"}"," A type that is derived from a remote access type is also a remote access type.",(0,r.jsx)("br",{})]}),"\n",(0,r.jsx)(o.A,{children:"9.4/5_E.2.2"}),"\n",(0,r.jsx)(c.A,{items:["AI12-0283-1"]}),"\n",(0,r.jsxs)("p",{children:["A remote access-to-subprogram type shall not be nonblocking (see ",(0,r.jsx)("a",{href:"/docs/arm/AA-9/AA-9.5",children:"9.5"}),").",(0,r.jsx)("br",{})]}),"\n",(0,r.jsxs)(l.A,{children:[(0,r.jsx)(o.A,{children:"9.a/5_E.2.2"}),(0,r.jsx)(n.A,{type:"aarm",aarm:"reason",children:(0,r.jsxs)(s.p,{children:[(0,r.jsx)("b",{}),"All calls on remote subprograms are considered potentially blocking, so they cannot statically be allowed in nonblocking code. ",(0,r.jsx)("br",{})]})})]}),"\n",(0,r.jsxs)(l.A,{children:[(0,r.jsx)(o.A,{children:"9.b/5_E.2.2"}),(0,r.jsx)(n.A,{type:"aarm",aarm:"ramification",children:(0,r.jsxs)(s.p,{children:[(0,r.jsx)("b",{}),"The type declaration of a remote type is illegal if the Nonblocking aspect is True, either implicitly by inheritance or by explicit specification. ",(0,r.jsx)("br",{})]})})]}),"\n",(0,r.jsx)(o.A,{children:"10_E.2.2"}),"\n",(0,r.jsxs)("p",{children:["The following restrictions apply to the use of a remote access-to-subprogram type: ",(0,r.jsx)("br",{})]}),"\n",(0,r.jsx)(o.A,{children:"11/2_E.2.2"}),"\n",(0,r.jsx)(c.A,{items:["AI95-00431-01"]}),"\n",(0,r.jsxs)("ul",{children:[(0,r.jsxs)("li",{children:["A value of a remote access-to-subprogram type shall be converted only to or from another (subtype-conformant) remote access-to-subprogram type;",(0,r.jsx)("br",{})]}),(0,r.jsx)(o.A,{children:"12_E.2.2"}),(0,r.jsxs)("li",{children:["The ",(0,r.jsx)("code",{children:(0,r.jsx)("a",{href:"/docs/arm/AA-4/AA-4.1#S0093",children:"prefix"})})," of an Access ",(0,r.jsx)("code",{children:(0,r.jsx)("a",{href:"/docs/arm/AA-4/AA-4.1#S0100",children:"attribute_reference"})})," that yields a value of a remote access-to-subprogram type shall statically denote a (subtype-conformant) remote subprogram. ",(0,r.jsx)("br",{})]})]}),"\n",(0,r.jsx)(o.A,{children:"13_E.2.2"}),"\n",(0,r.jsxs)("p",{children:["The following restrictions apply to the use of a remote access-to-class-wide t
1ype: ",(0,r.jsx)("br",{})]}),"\n",(0,r.jsx)(o.A,{children:"14/3_E.2.2"}),"\n",(0,r.jsx)(c.A,{items:["AI95-00047-01","AI95-00240-01","AI95-00366-01","AI05-0060-1","AI05-0101-1"]}),"\n",(0,r.jsxs)("ul",{children:[(0,r.jsxs)("li",{children:["{",(0,r.jsx)("i",{children:"8652/0083"}),"}"," The primitive subprograms of the corresponding specific type shall only have access parameters if they are controlling formal parameters. The primitive functions of the corresponding specific type shall only have an access result if it is a controlling access result. Each noncontrolling formal parameter and noncontrolling result type shall support external streaming (see ",(0,r.jsx)("a",{href:"/docs/arm/AA-13/AA-13.13#Subclause_13.13.2",children:"13.13.2"}),");",(0,r.jsx)("br",{})]}),(0,r.jsx)(o.A,{children:"14.1/3_E.2.2"}),(0,r.jsx)(c.A,{items:["AI05-0060-1","AI05-0215-1","AI05-0269-1"]}),(0,r.jsxs)("li",{children:["The corresponding specific type shall not have a primitive procedure with the Synchronization aspect specified unless the ",(0,r.jsx)("code",{children:(0,r.jsx)("a",{href:"/docs/arm/AA-9/AA-9.5#S0256",children:"synchronization_kind"})})," is Optional (see ",(0,r.jsx)("a",{href:"/docs/arm/AA-9/AA-9.5",children:"9.5"}),");",(0,r.jsx)("br",{})]}),(0,r.jsx)(o.A,{children:"15_E.2.2"}),(0,r.jsxs)("li",{children:["A value of a remote access-to-class-wide type shall be explicitly converted only to another remote access-to-class-wide type;",(0,r.jsx)("br",{})]}),(0,r.jsx)(o.A,{children:"16/4_E.2.2"}),(0,r.jsx)(c.A,{items:["AI12-0034-1"]}),(0,r.jsxs)("li",{children:["A value of a remote access-to-class-wide type shall be dereferenced (or implicitly converted to an anonymous access type) only as part of a dispatching call to a primitive operation of the designated type where the value designates a controlling operand of the call (see ",(0,r.jsx)("a",{href:"/docs/arm/AA-E/AA-E.4",children:"E.4"}),", \u201C",(0,r.jsx)("a",{href:"/docs/arm/AA-E/AA-E.4",children:"Remote Subprogram Calls"}),"\u201D); ",(0,r.jsx)("br",{})]})]}),"\n",(0,r.jsxs)(l.A,{children:[(0,r.jsx)(o.A,{children:"16.a/4_E.2.2"}),(0,r.jsx)(c.A,{items:["AI12-0034-1"]}),(0,r.jsx)(n.A,{type:"aarm",aarm:"ramification",children:(0,r.jsxs)(s.p,{children:[(0,r.jsx)("b",{}),"Stream attributes of the designated type are not primitive operations of the designated type, and thus remote calls to them are prohibited by this rule. This is good, as the access parameter of a stream attribute does not have external streaming, and thus cannot be a parameter of a remote call. ",(0,r.jsx)("br",{})]})})]}),"\n",(0,r.jsx)(o.A,{children:"16.1/3_E.2.2"}),"\n",(0,r.jsx)(c.A,{items:["AI05-0101-1"]}),"\n",(0,r.jsxs)("ul",{children:[(0,r.jsxs)("li",{children:["A controlling access result value for a primitive function with any controlling operands of the corresponding specific type shall either be explicitly converted to a remote access-to-class-wide type or be part of a dispatching call where the value designates a controlling operand of the call;",(0,r.jsx)("br",{})]}),(0,r.jsx)(o.A,{children:"17/4_E.2.2"}),(0,r.jsx)(c.A,{items:["AI95-00366-01","AI12-0085-1"]}),(0,r.jsxs)("li",{children:["The Storage","_","Pool attribute is not defined for a remote access-to-class-wide type; the expected type for an ",(0,r.jsx)("code",{children:(0,r.jsx)("a",{href:"/docs/arm/AA-4/AA-4.8#S0164",children:"allocator"})})," shall not be a remote access-to-class-wide type. A remote access-to-class-wide type shall not be an actual parameter for a generic formal access type. The Storage","_","Size attribute of a remote access-to-class-wide type yields 0. The Storage","_","Pool and Storage","_","Size aspects shall not be specified for a remote access-to-class-wide type. ",(0,r.jsx)("br",{})]})]}),"\n",(0,r.jsxs)(l.A,{children:[(0,r.jsx)(o.A,{children:"17.a/3_E.2.2"}),(0,r.jsx)(c.A,{items:["AI05-0005-1"]}),(0,r.jsx)(n.A,{type:"aarm",aarm:"reason",children:(0,r.jsxs)(s.p,{children:[(0,r.jsx)("b",{}),"All of these restrictions are because there is no storage pool associated with a remote access-to-class-wide type. The Storage","_","Size is defined to be 0 so that there is no conflict with the rules for pure units. ",(0,r.jsx)("br",{})]})})]}),"\n",(0,r.jsxs)(l.A,{children:[(0,r.jsx)(o.A,{children:"17.b/4_E.2.2"}),(0,r.jsx)(c.A,{items:["AI12-0085-1"]}),(0,r.jsx)(n.A,{type:"aarm",aarm:"ramification",children:(0,r.jsxs)(s.p,{children:[(0,r.jsx)("b",{}),"The prohibition against specifying the Storage","_","Size aspect for an access-to-class-wide t
1ype applies to any method of doing that, including via either an ",(0,r.jsx)("code",{children:(0,r.jsx)("a",{href:"/docs/arm/AA-13/AA-13.1#S0346",children:"aspect_specification"})})," or an ",(0,r.jsx)("code",{children:(0,r.jsx)("a",{href:"/docs/arm/AA-13/AA-13.3#S0349",children:"attribute_definition_clause"})}),". ",(0,r.jsx)("br",{})]})})]}),"\n",(0,r.jsx)(s.h4,{id:"erroneous-execution",children:"Erroneous Execution"}),"\n",(0,r.jsx)(o.A,{children:"17.1/4_E.2.2"}),"\n",(0,r.jsx)(c.A,{items:["AI12-0076-1"]}),"\n",(0,r.jsxs)("p",{children:["Execution is erroneous if some operation (other than the initialization or finalization of the object) modifies the value of a constant object declared in the visible part of a remote types package.",(0,r.jsx)("br",{})]}),"\n",(0,r.jsxs)(l.A,{children:[(0,r.jsx)(o.A,{children:"17.c/4_E.2.2"}),(0,r.jsx)(c.A,{items:["AI12-0005-1"]}),(0,r.jsx)(n.A,{type:"aarm",aarm:"discussion",children:(0,r.jsxs)(s.p,{children:[(0,r.jsx)("b",{}),"This could be accomplished via a self-referencing pointer or via squirrelling away a writable pointer to a controlled object. ",(0,r.jsx)("br",{})]})})]}),"\n",(0,r.jsxs)(l.A,{children:[(0,r.jsx)(o.A,{children:"18/5_E.2.2"}),(0,r.jsx)(c.A,{items:["AI12-0442-1"]}),(0,r.jsx)(n.A,{type:"aarm",aarm:"note",children:(0,r.jsxs)(s.p,{children:["NOTE 1 A remote types library unit is not necessarily pure, and the types it defines can include levels of indirection implemented by using access types. User-specified Read and Write attributes (see ",(0,r.jsx)("a",{href:"/docs/arm/AA-13/AA-13.13#Subclause_13.13.2",children:"13.13.2"}),") provide for sending values of such a type between active partitions, with Write marshalling the representation, and Read unmarshalling any levels of indirection.",(0,r.jsx)("br",{})]})})]}),"\n",(0,r.jsxs)(l.A,{children:[(0,r.jsx)(o.A,{children:"19/3_E.2.2"}),(0,r.jsx)(c.A,{items:["AI05-0060-1"]}),(0,r.jsx)(n.A,{type:"aarm",aarm:"note",children:(0,r.jsxs)(s.p,{children:["NOTE 2 The value of a remote access-to-class-wide limited interface can designate an object of a nonlimited type derived from the interface.",(0,r.jsx)("br",{})]})})]}),"\n",(0,r.jsxs)(l.A,{children:[(0,r.jsx)(o.A,{children:"20/5_E.2.2"}),(0,r.jsx)(c.A,{items:["AI05-0060-1","AI12-0440-1"]}),(0,r.jsx)(n.A,{type:"aarm",aarm:"note",children:(0,r.jsxs)(s.p,{children:["NOTE 3 A remote access type can designate a class-wide synchronized, protected, or task interface type. ",(0,r.jsx)("br",{})]})})]}),"\n",(0,r.jsxs)(l.A,{children:[(0,r.jsx)(o.A,{children:"20.a/3_E.2.2"}),(0,r.jsx)(n.A,{type:"aarm",aarm:"proof",children:(0,r.jsxs)(s.p,{children:[(0,r.jsx)("b",{}),"Synchronized, protected, and task interfaces are all considered limited interfaces, see ",(0,r.jsx)("a",{href:"/docs/arm/AA-3/AA-3.9#Subclause_3.9.4",children:"3.9.4"}),". ",(0,r.jsx)("br",{})]})})]}),"\n",(0,r.jsx)(l.A,{children:(0,r.jsx)(s.h4,{id:"incompatibilities-with-ada-95",children:"Incompatibilities With Ada 95"})}),"\n",(0,r.jsxs)(l.A,{children:[(0,r.jsx)(o.A,{children:"20.b/3_E.2.2"}),(0,r.jsx)(c.A,{items:["AI95-00240-01","AI05-0248-1"]}),(0,r.jsx)(n.A,{type:"aarm",aarm:"correction",children:(0,r.jsxs)(s.p,{children:[(0,r.jsx)("b",{children:"Amendment "})," The wording was changed from \u201Cuser-specified\u201D to \u201Cavailable\u201D read and write attributes. (This was then further changed, see below.) This means that an access type with the attributes specified in the private part would originally have been sufficient to allow the access type to be used in a remote type, but that is no longer allowed. Similarly, the attributes of a remote type that has access components have to be specified in the visible part. These changes were made so that the rules were consistent with the rules introduced for the Corrigendum for stream attributes; moreover, legality should not depend on the contents of the private part. ",(0,r.jsx)("br",{})]})})]}),"\n",(0,r.jsx)(l.A,{children:(0,r.jsx)(s.h4,{id:"extensions-to-ada-95",children:"Extensions to Ada 95"})}),"\n",(0,r.jsxs)(l.A,{children:[(0,r.jsx)(o.A,{children:"20.c/3_E.2.2"}),(0,r.jsx)(c.A,{items:["AI95-00366-01","AI05-0005-1"]}),(0,r.jsx)(n.A,{type:"aarm",aarm:"note",children:(0,r.jsxs)(s.p,{children:["Remote types that cannot be streamed (that is, have no available stream attributes) do not require the specification of stream attributes. This is necessary so that most extensions of Limited","_","Controlled do not need stream attributes defined (otherwise there would be a significant incompatibility, as Limited","_","Controlled would need stream attributes, and then all extensions of it also would need stream attributes). ",(0,r.jsx)("br",{})]})})]}),"\n",(0,r.jsx)(l.A,{children:(0,r.jsx)(s.h4,{id:"wording-changes-from-ada-95-2",children:"Wording Changes from Ada 95"})}),"\n",(0,r.jsxs)(l.A,{children:[(0,r.jsx)(o.A,{children:"20.d/2_E.2.2"}),(0,r.jsx)(c.A,{items:["AI95-00004-01"]}),(0,r.jsx)(n.A,{type:"aarm",aarm:"note",children:(0,r.jsxs)(s.p,{children:["{",(0,r.jsx)("i",{children:"8652/0081"}),"}"," ",(0,r.jsx)("b",{children:"Corrigendum:"})," Added missing wording so that a type derived from a remote access type is also a remote access type.",(0,r.jsx)("br",{})]})})]}),"\n",(0,r.jsxs)(l.A,{children:[(0,r.jsx)(o.A,{children:"20.e/2_E.2.2"}),(0,r.jsx)(c.A,{items:["AI95-00047-01"]}),(0,r.jsx)(n.A,{type:"aarm",aarm:"note",children:(0,r.jsxs)(s.p,{children:["{",(0,r.jsx)("i",{children:"8652/0083"}),"}"," ",(0,r.jsx)("b",{children:"Corrigendum:"})," Clarified that user-defined Read and Write attributes are required for the primitive subprograms corresponding to a remote access-to-class-wide t
1ype.",(0,r.jsx)("br",{})]})})]}),"\n",(0,r.jsxs)(l.A,{children:[(0,r.jsx)(o.A,{children:"20.f/2_E.2.2"}),(0,r.jsx)(c.A,{items:["AI95-00164-01"]}),(0,r.jsx)(n.A,{type:"aarm",aarm:"note",children:(0,r.jsxs)(s.p,{children:["{",(0,r.jsx)("i",{children:"8652/0082"}),"}"," ",(0,r.jsx)("b",{children:"Corrigendum:"})," Added missing wording so that a remote access type can designate an appropriate private extension.",(0,r.jsx)("br",{})]})})]}),"\n",(0,r.jsxs)(l.A,{children:[(0,r.jsx)(o.A,{children:"20.g/2_E.2.2"}),(0,r.jsx)(c.A,{items:["AI95-00366-01"]}),(0,r.jsx)(n.A,{type:"aarm",aarm:"note",children:(0,r.jsxs)(s.p,{children:["Changed the wording to use the newly defined term ",(0,r.jsx)("i",{children:"type that supports external streaming"}),", so that various issues with access types in pure units and implicitly declared attributes for type extensions are properly handled.",(0,r.jsx)("br",{})]})})]}),"\n",(0,r.jsxs)(l.A,{children:[(0,r.jsx)(o.A,{children:"20.h/2_E.2.2"}),(0,r.jsx)(c.A,{items:["AI95-00366-01"]}),(0,r.jsx)(n.A,{type:"aarm",aarm:"note",children:(0,r.jsxs)(s.p,{children:["Defined Storage","_","Size to be 0 for remote access-to-class-wide types, rather than having it undefined. This eliminates issues with pure units requiring a defined storage size.",(0,r.jsx)("br",{})]})})]}),"\n",(0,r.jsxs)(l.A,{children:[(0,r.jsx)(o.A,{children:"20.i/2_E.2.2"}),(0,r.jsx)(c.A,{items:["AI95-00431-01"]}),(0,r.jsx)(n.A,{type:"aarm",aarm:"note",children:(0,r.jsxs)(s.p,{children:["Corrected the wording so that a value of a local access-to-subprogram type cannot be converted to a remote access-to-subprogram type, as intended (and required by the ACATS). ",(0,r.jsx)("br",{})]})})]}),"\n",(0,r.jsx)(l.A,{children:(0,r.jsx)(s.h4,{id:"incompatibilities-with-ada-2005",children:"Incompatibilities With Ada 2005"})}),"\n",(0,r.jsxs)(l.A,{children:[(0,r.jsx)(o.A,{children:"20.j/5_E.2.2"}),(0,r.jsx)(c.A,{items:["AI05-0101-1","AI12-0005-1"]}),(0,r.jsx)(n.A,{type:"aarm",aarm:"correction",children:(0,r.jsxs)(s.p,{children:[(0,r.jsx)("b",{})," Added rules about the returning of remote access-to-class-wide types; this had been missed in the past. While programs that returned unstreamable types from RCI functions were legal, it is not clear what they could have done (as the results could not be marshalled). Similarly, RCI functions that return remote controlling access types could try to save those values, but it is unlikely that a compiler would know how to do that usefully. Thus, it seems unlikely that any real programs will be impacted by these changes. ",(0,r.jsx)("br",{})]})})]}),"\n",(0,r.jsx)(l.A,{children:(0,r.jsx)(s.h4,{id:"extensions-to-ada-2005-1",children:"Extensions to Ada 2005"})}),"\n",(0,r.jsxs)(l.A,{children:[(0,r.jsx)(o.A,{children:"20.k/3_E.2.2"}),(0,r.jsx)(c.A,{items:["AI05-0060-1"]}),(0,r.jsx)(n.A,{type:"aarm",aarm:"correction",children:(0,r.jsxs)(s.p,{children:[(0,r.jsx)("b",{})," Clarified that anonymous access types are never remote access types (and can be used in remote types units subject to the normal restrictions). Added wording to allow limited class-wide interfaces to be designated by remote access types.",(0,r.jsx)("br",{})]})})]}),"\n",(0,r.jsxs)(l.A,{children:[(0,r.jsx)(o.A,{children:"20.l/3_E.2.2"}),(0,r.jsx)(c.A,{items:["AI05-0206-1"]}),(0,r.jsx)(n.A,{type:"aarm",aarm:"note",children:(0,r.jsxs)(s.p,{children:["Added wording to allow private withs of preelaborated normal units in the specification of a remote types unit.",(0,r.jsx)("br",{})]})})]}),"\n",(0,r.jsxs)(l.A,{children:[(0,r.jsx)(o.A,{children:"20.m/5_E.2.2"}),(0,r.jsx)(c.A,{items:["AI05-0243-1","AI12-0417-1"]}),(0,r.jsx)(n.A,{type:"aarm",aarm:"note",children:(0,r.jsxs)(s.p,{children:["Remote","_","Types is now a categorization aspect, so it can be specified by an ",(0,r.jsx)("code",{children:(0,r.jsx)("a",{href:"/docs/arm/AA-13/AA-13.1#S0346",children:"aspect_specification"})})," ",(0,r.jsx)("br",{})]})})]}),"\n",(0,r.jsx)(l.A,{children:(0,r.jsx)(s.h4,{id:"wording-changes-from-ada-2012-2",children:"Wording Changes from Ada 2012"})}),"\n",(0,r.jsxs)(l.A,{children:[(0,r.jsx)(o.A,{children:"20.n/4_E.2.2"}),(0,r.jsx)(c.A,{items:["AI12-0034-1"]}),(0,r.jsx)(n.A,{type:"aarm",aarm:"note",children:(0,r.jsxs)(s.p,{children:[(0,r.jsx)("b",{children:"Corrigendum:"})," Clarified that dispatching remote stream attribute calls are prohibited. We don't document this as an incompatibility, as the stream parameter cannot be marshalled for a remote call (it doesn't have external streaming), so it's impossible that any working program depends on this functionality.",(0,r.jsx)("br",{})]})})]}),"\n",(0,r.jsxs)(l.A,{children:[(0,r.jsx)(o.A,{children:"20.o/4_E.2.2"}),(0,r.jsx)(c.A,{items:["AI12-0076-1"]}),(0,r.jsx)(n.A,{type:"aarm",aarm:"note",children:(0,r.jsxs)(s.p,{children:[(0,r.jsx)("b",{children:"Corrigendum:"})," Explicitly stated that modifying a visible constant in a remote types package is erroneous. We don't document this as inconsistent as implementations certainly can still do whatever they were previously doing (no change is required); moreover, this case (and many more) were erroneous in Ada 2005 and before, so we're just restoring the previous semantics.",(0,r.jsx)("br",{})]})})]}),"\n",(0,r.jsxs)(l.A,{children:[(0,r.jsx)(o.A,{children:"20.p/4_E.2.2"}),(0,r.jsx)(c.A,{items:["AI12-0085-1"]}),(0,r.jsx)(n.A,{type:"aarm",aarm:"note",children:(0,r.jsxs)(s.p,{children:[(0,r.jsx)("b",{children:"Corrigendum:"})," Clarified that specifying the Storage","_","Pool or Storage","_","Size aspect for an access-to-class-wide t
1ype is not allowed. The intent is clear, and no implementation has ever allowed specifying the aspects (the attributes already cannot be specified), so we don't document this as an incompatibility.",(0,r.jsx)("br",{})]})})]}),"\n",(0,r.jsxs)(l.A,{children:[(0,r.jsx)(o.A,{children:"20.q/5_E.2.2"}),(0,r.jsx)(c.A,{items:["AI12-0283-1"]}),(0,r.jsx)(n.A,{type:"aarm",aarm:"note",children:(0,r.jsxs)(s.p,{children:["Added a rule to ensure that potentially blocking remote calls are not considered nonblocking.",(0,r.jsx)("br",{})]})})]}),"\n",(0,r.jsxs)(l.A,{children:[(0,r.jsx)(o.A,{children:"20.r/5_E.2.2"}),(0,r.jsx)(c.A,{items:["AI12-0417-1"]}),(0,r.jsx)(n.A,{type:"aarm",aarm:"note",children:(0,r.jsxs)(s.p,{children:["The pragma Remote","_","Types is now obsolescent.",(0,r.jsx)("br",{})]})})]}),"\n",(0,r.jsx)("a",{id:"Subclause_E.2.3"}),"\n",(0,r.jsx)(s.h2,{id:"e23--remote-call-interface-library-units",children:"E.2.3 Remote Call Interface Library Units"}),"\n",(0,r.jsx)(o.A,{children:"1_E.2.3"}),"\n",(0,r.jsxs)("p",{children:["[A remote call interface library unit can be used as an interface for remote procedure calls (RPCs) (or remote function calls) between active partitions.] ",(0,r.jsx)("br",{})]}),"\n",(0,r.jsx)(s.h4,{id:"language-design-principles-2",children:"Language Design Principles"}),"\n",(0,r.jsxs)(l.A,{children:[(0,r.jsx)(o.A,{children:"1.a_E.2.3"}),(0,r.jsx)(n.A,{type:"aarm",aarm:"note",children:(0,r.jsxs)(s.p,{children:["The restrictions governing a remote call interface library unit are intended to ensure that the values of the actual parameters in a remote call can be meaningfully sent between two active partitions. ",(0,r.jsx)("br",{})]})})]}),"\n",(0,r.jsxs)("p",{children:[(0,r.jsxs)("i",{children:["Paragraphs 2 through 6 were moved to ",(0,r.jsx)("a",{href:"/docs/arm/AA-J/",children:"Annex J"}),", \u201C",(0,r.jsx)("a",{href:"/docs/arm/AA-J/",children:"Obsolescent Features"}),"\u201D."]})," ",(0,r.jsx)("br",{})]}),"\n",(0,r.jsx)(s.h4,{id:"legality-rules-2",children:"Legality Rules"}),"\n",(0,r.jsx)(o.A,{children:"7/5_E.2.3"}),"\n",(0,r.jsx)(c.A,{items:["AI95-00048-01","AI05-0243-1","AI12-0417-1"]}),"\n",(0,r.jsxs)("p",{children:["{",(0,r.jsx)("i",{children:"8652/0078"}),"}"," When the library unit aspect (see ",(0,r.jsx)("a",{href:"/docs/arm/AA-13/AA-13.1#Subclause_13.1.1",children:"13.1.1"}),") Remote","_","Call","_","Interface of a library unit is True, the library unit is a ",(0,r.jsx)("i",{children:"remote call interface (RCI)"}),". A subprogram declared in the visible part of such a library unit, or declared by such a library unit, is called a ",(0,r.jsx)("i",{children:"remote subprogram"}),".",(0,r.jsx)("br",{})]}),"\n",(0,r.jsxs)(l.A,{children:[(0,r.jsx)(o.A,{children:"7.a/3_E.2.3"}),(0,r.jsx)(n.A,{type:"aarm",aarm:"note",children:(0,r.jsxs)(s.p,{children:[(0,r.jsx)("b",{children:"Aspect Description for "}),(0,r.jsxs)("b",{children:["Remote","_","Call","_","Interface: "]}),"Subprograms in a given package may be used in remote procedure calls.",(0,r.jsx)("br",{})]})})]}),"\n",(0,r.jsx)(o.A,{children:"8/3_E.2.3"}),"\n",(0,r.jsx)(c.A,{items:["AI05-0206-1","AI05-0243-1"]}),"\n",(0,r.jsxs)("p",{children:["The declaration of an RCI library unit shall be preelaborable (see ",(0,r.jsx)("a",{href:"/docs/arm/AA-10/AA-10.2#Subclause_10.2.1",children:"10.2.1"}),"), and shall depend semantically only upon declared pure ",(0,r.jsx)("code",{children:(0,r.jsx)("a",{href:"/docs/arm/AA-10/AA-10.1#S0287",children:"library_item"})}),"s, shared passive library units, remote types library units, other remote call interface library units, or preelaborated normal library units that are mentioned only in private with clauses.",(0,r.jsx)("br",{})]}),"\n",(0,r.jsxs)(l.A,{children:[(0,r.jsx)(o.A,{children:"8.a/3_E.2.3"}),(0,r.jsx)(c.A,{items:["AI05-0243-1"]}),(0,r.jsx)(n.A,{type:"aarm",aarm:"ramification",children:(0,r.jsxs)(s.p,{children:[(0,r.jsx)("b",{}),"We say declared pure ",(0,r.jsx)("code",{children:(0,r.jsx)("a",{href:"/docs/arm/AA-10/AA-10.1#S0287",children:"library_item"})})," here, so that (all) limited views are allowed; those are not library units, but they are declared pure ",(0,r.jsx)("code",{children:(0,r.jsx)("a",{href:"/docs/arm/AA-10/AA-10.1#S0287",children:"library_item"})}),"s. ",(0,r.jsx)("br",{})]})})]}),"\n",(0,r.jsx)(o.A,{children:"9/1_E.2.3"}),"\n",(0,r.jsx)(c.A,{items:["AI95-00048-01"]}),"\n",(0,r.jsxs)("p",{children:["{",(0,r.jsx)("i",{children:"8652/0078"}),"}"," In addition, the following restrictions apply to an RCI library unit: ",(0,r.jsx)("br",{})]}),"\n",(0,r.jsx)(o.A,{children:"10/1_E.2.3"}),"\n",(0,r.jsx)(c.A,{items:["AI95-00048-01"]}),"\n",(0,r.jsx)("ul",{children:(0,r.jsxs)("li",{children:["{",(0,r.jsx)("i",{children:"8652/0078"}),"}"," its visible part shall not contain the declaration of a variable; ",(0,r.jsx)("br",{})]})}),"\n",(0,r.jsxs)(l.A,{children:[(0,r.jsx)(o.A,{children:"10.a/1_E.2.3"}),(0,r.jsx)(c.A,{items:["AI95-00048-01"]}),(0,r.jsx)(n.A,{type:"aarm",aarm:"reason",children:(0,r.jsxs)(s.p,{children:[(0,r.jsx)("b",{}),"{",(0,r.jsx)("i",{children:"8652/0078"}),"}"," Remote call interface units do not provide remote data access. A shared passive package has to be used for that. ",(0,r.jsx)("br",{})]})})]}),"\n",(0,r.jsx)(o.A,{children:"11/1_E.2.3"}),"\n",(0,r.jsx)(c.A,{items:["AI95-00048-01"]}),"\n",(0,r.jsx)("ul",{children:(0,r.jsxs)("li",{children:["{",(0,r.jsx)("i",{children:"8652/0078"}),"}"," its visible part shall not contain the declaration of a limited type; ",(0,r.jsx)("br",{})]})}),"\n",(0,r.jsxs)(l.A,{children:[(0,r.jsx)(o.A,{children:"11.a/2_E.2.3"}),(0,r.jsx)(c.A,{items:["AI95-00240-01","AI95-00366-01"]}),(0,r.jsx)(n.A,{type:"aarm",aarm:"reason",children:(0,r.jsxs)(s.p,{children:[(0,r.jsx)("b",{}),"We disallow the declaration of task and protected types, since calling an entry or a protected subprogram implicitly passes an object of a limited type (the target task or protected object). We disallow other limited types since we require that such types have available Read and Write attributes, but we certainly don't want the Read and Write attributes themselves to involve remote calls (thereby defeating their purpose of marshalling the value for remote calls). ",(0,r.jsx)("br",{})]})})]}),"\n",(0,r.jsx)(o.A,{children:"12/1_E.2.3"}),"\n",(0,r.jsx)(c.A,{items:["AI95-00048-01"]}),"\n",(0,r.jsx)("ul",{children:(0,r.jsxs)("li",{children:["{",(0,r.jsx)("i",{children:"8652/0078"}),"}"," its visible part shall not contain a nested ",(0,r.jsx)("code",{children:(0,r.jsx)("a",{href:"/docs/arm/AA-12/AA-12.1#S0310",children:"generic_declaration"})}),"; ",(0,r.jsx)("br",{})]})}),"\n",(0,r.jsxs)(l.A,{children:[(0,r.jsx)(o.A,{children:"12.a_E.2.3"}),(0,r.jsx)(n.A,{type:"aarm",aarm:"reason",children:(0,r.jsxs)(s.p,{children:[(0,r.jsx)("b",{}),"This is disallowed because the body of the nested generic would presumably have access to data inside the body of the RCI package, and if instantiated in a different partition, remote data access might result, which is not supported. ",(0,r.jsx)("br",{})]})})]}),"\n",(0,r.jsx)(o.A,{children:"13/3_E.2.3"}),"\n",(0,r.jsx)(c.A,{items:["AI95-00048-01","AI05-0229-1"]}),"\n",(0,r.jsxs)("ul",{children:[(0,r.jsxs)("li",{children:["{",(0,r.jsx)("i",{children:"8652/0078"}),"}"," it shall not be, nor shall its visible part contain, the declaration of a subprogram for which aspect Inline is True;",(0,r.jsx)("br",{})]}),(0,r.jsx)(o.A,{children:"13.1/5_E.2.3"}),(0,r.jsx)(c.A,{items:["AI12-0283-1"]}),(0,r.jsxs)("li",{children:["it shall not be, nor shall its visible part contain, the declaration of a subprogram that is nonblocking (see ",(0,r.jsx)("a",{href:"/docs/arm/AA-9/AA-9.5",children:"9.5"}),");",(0,r.jsx)("br",{})]})]}),"\n",(0,r.jsxs)(l.A,{children:[(0,r.jsx)(o.A,{children:"13.a/5_E.2.3"}),(0,r.jsx)(n.A,{type:"aarm",aarm:"reason",children:(0,r.jsxs)(s.p,{children:[(0,r.jsx)("b",{}),"All such subprograms are remote subprograms, and all calls on remote subprograms are considered potentially blocking, so they cannot statically be allowed in nonblocking code. ",(0,r.jsx)("br",{})]})})]}),"\n",(0,r.jsxs)(l.A,{children:[(0,r.jsx)(o.A,{children:"13.b/5_E.2.3"}),(0,r.jsx)(n.A,{type:"aarm",aarm:"ramification",children:(0,r.jsxs)(s.p,{children:[(0,r.jsx)("b",{}),"The type declaration of a remote subprogram is illegal if the Nonblocking aspect is True, either implicitly by inheritance or by explicit specification. ",(0,r.jsx)("br",{})]})})]}),"\n",(0,r.jsx)(o.A,{children:"14/3_E.2.3"}),"\n",(0,r.jsx)(c.A,{items:["AI95-00048-01","AI95-00240-01","AI95-00366-01","AI05-0101-1"]}),"\n",(0,r.jsx)("ul",{children:(0,r.jsxs)("li",{children:["{",(0,r.jsx)("i",{children:"8652/0078"}),"}"," it shall not be, nor shall its visible part contain, a subprogram (or access-to-subprogram) declaration whose profile has a parameter or result of a type that does not support external streaming (see ",(0,r.jsx)("a",{href:"/docs/arm/AA-13/AA-13.13#Subclause_13.13.2",children:"13.13.2"}),");",(0,r.jsx)("br",{})]})}),"\n",(0,r.jsxs)(l.A,{children:[(0,r.jsx)(o.A,{children:"14.a/3_E.2.3"}),(0,r.jsx)(c.A,{items:["AI05-0101-1"]}),(0,r.jsx)(n.A,{type:"aarm",aarm:"ramification",children:(0,r.jsxs)(s.p,{children:[(0,r.jsx)("b",{}),"No anonymous access types support external streaming, so they are never allowed as parameters or results of RCI subprograms. ",(0,r.jsx)("br",{})]})})]}),"\n",(0,r.jsx)(o.A,{children:"15_E.2.3"}),"\n",(0,r.jsx)("ul",{children:(0,r.jsxs)("li",{children:["any public child of the library unit shall be a remote call interface library unit. ",(0,r.jsx)("br",{})]})}),"\n",(0,r.jsxs)(l.A,{children:[(0,r.jsx)(o.A,{children:"15.a/5_E.2.3"}),(0,r.jsx)(c.A,{items:["AI12-0417-1"]}),(0,r.jsx)(n.A,{type:"aarm",aarm:"reason",children:(0,r.jsxs)(s.p,{children:[(0,r.jsx)("b",{}),"No restrictions apply to the private part of an RCI package, and since a public child can \u201Csee\u201D the private part of its parent, such a child must itself have a Remote","_","Call","_","Interface aspect, and be assigned to the same partition (see below). ",(0,r.jsx)("br",{})]})})]}),"\n",(0,r.jsxs)(l.A,{children:[(0,r.jsx)(o.A,{children:"15.b/5_E.2.3"}),(0,r.jsx)(c.A,{items:["AI12-0417-1"]}),(0,r.jsx)(n.A,{type:"aarm",aarm:"discussion",children:(0,r.jsxs)(s.p,{children:[(0,r.jsx)("b",{}),"We considered making the public child of an RCI package implicitly RCI, but it seemed better to require an explicit aspect to avoid any confusion.",(0,r.jsx)("br",{})]})})]}),"\n",(0,r.jsxs)(l.A,{children:[(0,r.jsx)(o.A,{children:"15.c_E.2.3"}),(0,r.jsx)(n.A,{type:"aarm",aarm:"note",children:(0,r.jsxs)(s.p,{children:["Note that there is no need for a private child to be an RCI package, since it can only be seen from the body of its parent or its siblings, all of which are required to be in the same active partition. ",(0,r.jsx)("br",{})]})})]}),"\n",(0,r.jsx)(o.A,{children:"15.1/5_E.2.3"}),"\n",(0,r.jsx)(c.A,{items:["AI12-0002-1"]}),"\n",(0,r.jsxs)("p",{children:["Specification of a stream-oriented attribute is illegal in the specification of a remote call interface library unit. In addition to the places where Legality Rules normally apply (see ",(0,r.jsx)("a",{href:"/docs/arm/AA-12/AA-12.3",children:"12.3"}),"), this rule applies also in the private part of an instance of a generic unit.",(0,r.jsx)("br",{})]}),"\n",(0,r.jsxs)(l.A,{children:[(0,r.jsx)(o.A,{children:"15.d/5_E.2.3"}),(0,r.jsx)(n.A,{type:"aarm",aarm:"ramification",children:(0,r.jsxs)(s.p,{children:[(0,r.jsx)("b",{}),"This applies whether the stream-oriented attribute is specified with an ",(0,r.jsx)("code",{children:(0,r.jsx)("a",{href:"/docs/arm/AA-13/AA-13.3#S0349",children:"attribute_definition_clause"})})," or with an ",(0,r.jsx)("code",{children:(0,r.jsx)("a",{href:"/docs/arm/AA-13/AA-13.1#S0346",children:"aspect_specification"})}),". ",(0,r.jsx)("br",{})]})})]}),"\n",(0,r.jsxs)(l.A,{children:[(0,r.jsx)(o.A,{children:"15.e/5_E.2.3"}),(0,r.jsx)(n.A,{type:"aarm",aarm:"reason",children:(0,r.jsxs)(s.p,{children:[(0,r.jsx)("b",{}),"Stream-oriented attributes are intended to be used locally (to marshall values), while subprograms in a remote call interface are intended to be used remotely. We resolve the conflict by banning the local use routines. The type should be included in a remote types package and imported into the remote call interface package. ",(0,r.jsx)("br",{})]})})]}),"\n",(0,r.jsx)(o.A,{children:"16/5_E.2.3"}),"\n",(0,r.jsx)(c.A,{items:["AI05-0229-1","AI12-0417-1"]}),"\n",(0,r.jsxs)("p",{children:["All","_","Calls","_","Remote is a library unit aspect. If the All","_","Calls","_","Remote aspect of a library unit is True, the library unit shall be a remote call interface.",(0,r.jsx)("br",{})]}),"\n",(0,r.jsxs)(l.A,{children:[(0,r.jsx)(o.A,{children:"16.a/4_E.2.3"}),(0,r.jsx)(n.A,{type:"aarm",aarm:"note",children:(0,r.jsxs)(s.p,{children:[(0,r.jsx)("b",{children:"Aspect Description for "}),(0,r.jsxs)("b",{children:["All","_","Calls","_","Remote: "]}),"All indirect or dispatching remote subprogram calls, and all direct remote subprogram calls, should use the Partition Communication Subsystem.",(0,r.jsx)("br",{})]})})]}),"\n",(0,r.jsx)(s.h4,{id:"post-compilation-rules-1",children:"Post-Compilation Rules"}),"\n",(0,r.jsx)(o.A,{children:"17_E.2.3"}),"\n",(0,r.jsxs)("p",{children:["A remote call interface library unit shall be assigned to at most one partition of a given program. A remote call interface library unit whose parent is also an RCI library unit shall be assigned only to the same partition as its parent. ",(0,r.jsx)("br",{})]}),"\n",(0,r.jsxs)(l.A,{children:[(0,r.jsx)(o.A,{children:"17.a/1_E.2.3"}),(0,r.jsx)(c.A,{items:["AI95-00048-01"]}),(0,r.jsx)(n.A,{type:"aarm",aarm:"implementation-note",children:(0,r.jsxs)(s.p,{children:[(0,r.jsx)("b",{}),"{",(0,r.jsx)("i",{children:"8652/0078"}),"}"," The declaration of an RCI unit, with a calling-stub body, is automatically included in all active partitions with compilation units that depend on it. However the whole RCI library unit, including its (non-stub) body, will only be in one of the active partitions. ",(0,r.jsx)("br",{})]})})]}),"\n",(0,r.jsx)(o.A,{children:"18_E.2.3"}),"\n",(0,r.jsxs)("p",{children:["Notwithstanding the rule given in ",(0,r.jsx)("a",{href:"/docs/arm/AA-10/AA-10.2",children:"10.2"}),", a compilation unit in a given partition that semantically depends on the declaration of an RCI library unit, ",(0,r.jsx)("i",{children:"needs"})," (in the sense of ",(0,r.jsx)("a",{href:"/docs/arm/AA-10/AA-10.2",children:"10.2"}),") only the declaration of the RCI library unit, not the body, to be included in that same partition. [Therefore, the body of an RCI library unit is included only in the partition to which the RCI library unit is explicitly assigned.]",(0,r.jsx)("br",{})]}),"\n",(0,r.jsx)(s.h4,{id:"implementation-requirements",children:"Implementation Requirements"}),"\n",(0,r.jsx)(o.A,{children:"19/4_E.2.3"}),"\n",(0,r.jsx)(c.A,{items:["AI95-00048-01","AI05-0229-1","AI12-0031-1"]}),"\n",(0,r.jsxs)("p",{children:["{",(0,r.jsx)("i",{children:"8652/0078"}),"}"," If aspect All","_","Calls","_","Remote is True for a given RCI library unit, then the implementation shall route any of the following calls through the Partition Communication Subsystem (PCS); see ",(0,r.jsx)("a",{href:"/docs/arm/AA-E/AA-E.5",children:"E.5"}),": ",(0,r.jsx)("br",{})]}),"\n",(0,r.jsx)(o.A,{children:"19.1/4_E.2.3"}),"\n",(0,r.jsx)(c.A,{items:["AI12-0031-1"]}),"\n",(0,r.jsxs)("ul",{children:[(0,r.jsxs)("li",{children:["A direct call to a subprogram of the RCI unit from outside the declarative region of the unit;",(0,r.jsx)("br",{})]}),(0,r.jsx)(o.A,{children:"19.2/4_E.2.3"}),(0,r.jsx)(c.A,{items:["AI12-0031-1"]}),(0,r.jsxs)("li",{children:["An indirect call through a remote access-to-subprogram value that designates a subprogram of the RCI unit;",(0,r.jsx)("br",{})]}),(0,r.jsx)(o.A,{children:"19.3/4_E.2.3"}),(0,r.jsx)(c.A,{items:["AI12-0031-1"]}),(0,r.jsxs)("li",{children:["A dispatching call with a controlling operand designated by a remote access-to-class-wide value whose tag identifies a type declared in the RCI unit. ",(0,r.jsx)("br",{})]})]}),"\n",(0,r.jsxs)(l.A,{children:[(0,r.jsx)(o.A,{children:"19.a/5_E.2.3"}),(0,r.jsx)(c.A,{items:["AI95-00048-01","AI05-0229-1","AI12-0005-1","AI12-0031-1"]}),(0,r.jsx)(n.A,{type:"aarm",aarm:"discussion",children:(0,r.j
1sxs)(s.p,{children:[(0,r.jsx)("b",{}),"{",(0,r.jsx)("i",{children:"8652/0078"}),"}"," When this aspect is False (or not used), it is presumed that most implementations will not make calls through the PCS if the call originates in the same partition as that of the RCI unit. When this aspect is True, all indirect or dispatching remote subprogram calls to the RCI unit, and all direct calls from outside the subsystem rooted at the RCI unit, are treated like calls from outside the partition, ensuring that the PCS is involved in all such calls (for debugging, redundancy, etc.). ",(0,r.jsx)("br",{})]})})]}),"\n",(0,r.jsxs)(l.A,{children:[(0,r.jsx)(o.A,{children:"19.b/5_E.2.3"}),(0,r.jsx)(c.A,{items:["AI12-0005-1","AI12-0031-1"]}),(0,r.jsx)(n.A,{type:"aarm",aarm:"reason",children:(0,r.jsxs)(s.p,{children:[(0,r.jsx)("b",{}),"There is no point in forcing local direct calls (including calls from children) to go through the PCS, since on the target system these calls are always local, and all the units are in the same active partition. ",(0,r.jsx)("br",{})]})})]}),"\n",(0,r.jsx)(s.h4,{id:"implementation-permissions",children:"Implementation Permissions"}),"\n",(0,r.jsx)(o.A,{children:"20/5_E.2.3"}),"\n",(0,r.jsx)(c.A,{items:["AI05-0243-1","AI12-0417-1","AI12-0444-1"]}),"\n",(0,r.jsxs)("p",{children:["An implementation may omit support for the Remote","_","Call","_","Interface aspect or the All","_","Calls","_","Remote aspect. [Explicit message-based communication between active partitions can be supported as an alternative to RPC.] ",(0,r.jsx)("br",{})]}),"\n",(0,r.jsxs)(l.A,{children:[(0,r.jsx)(o.A,{children:"20.a/5_E.2.3"}),(0,r.jsx)(c.A,{items:["AI12-0417-1"]}),(0,r.jsx)(n.A,{type:"aarm",aarm:"ramification",children:(0,r.jsxs)(s.p,{children:[(0,r.jsx)("b",{}),"Of course, it is pointless to support the All","_","Calls","_","Remote aspect if the Remote","_","Call","_","Interface aspect (or some approximate equivalent) is not supported. ",(0,r.jsx)("br",{})]})})]}),"\n",(0,r.jsx)(l.A,{children:(0,r.jsx)(s.h4,{id:"incompatibilities-with-ada-95-1",children:"Incompatibilities With Ada 95"})}),"\n",(0,r.jsxs)(l.A,{children:[(0,r.jsx)(o.A,{children:"20.b/3_E.2.3"}),(0,r.jsx)(c.A,{items:["AI95-00240-01","AI05-0248-1"]}),(0,r.jsx)(n.A,{type:"aarm",aarm:"correction",children:(0,r.jsxs)(s.p,{children:[(0,r.jsx)("b",{children:"Amendment "})," The wording was changed from \u201Cuser-specified\u201D to \u201Cavailable\u201D read and write attributes. (This was then further changed, see below.) This means that a type with the attributes specified in the private part would originally have been allowed as a formal parameter of an RCI subprogram, but that is no longer allowed. This change was made so that the rules were consistent with the rules introduced for the Corrigendum for stream attributes; moreover, legality should not depend on the contents of the private part. ",(0,r.jsx)("br",{})]})})]}),"\n",(0,r.jsx)(l.A,{children:(0,r.jsx)(s.h4,{id:"wording-changes-from-ada-95-3",children:"Wording Changes from Ada 95"})}),"\n",(0,r.jsxs)(l.A,{children:[(0,r.jsx)(o.A,{children:"20.c/2_E.2.3"}),(0,r.jsx)(c.A,{items:["AI95-00048-01"]}),(0,r.jsx)(n.A,{type:"aarm",aarm:"note",children:(0,r.jsxs)(s.p,{children:["{",(0,r.jsx)("i",{children:"8652/0078"}),"}"," ",(0,r.jsx)("b",{children:"Corrigendum:"})," Changed the wording to allow a library subprogram to be a remote call interface unit.",(0,r.jsx)("br",{})]})})]}),"\n",(0,r.jsxs)(l.A,{children:[(0,r.jsx)(o.A,{children:"20.d/2_E.2.3"}),(0,r.jsx)(c.A,{items:["AI95-00366-01"]}),(0,r.jsx)(n.A,{type:"aarm",aarm:"note",children:(0,r.jsxs)(s.p,{children:["Changed the wording to use the newly defined term ",(0,r.jsx)("i",{children:"type that supports external streaming"}),", so that various issues with access types in pure units and implicitly declared attributes for type extensions are properly handled. ",(0,r.jsx)("br",{})]})})]}),"\n",(0,r.jsx)(l.A,{children:(0,r.jsx)(s.h4,{id:"incompatibilities-with-ada-2005-1",children:"Incompatibilities With Ada 2005"})}),"\n",(0,r.jsxs)(l.A,{children:[(0,r.jsx)(o.A,{children:"20.e/3_E.2.3"}),(0,r.jsx)(c.A,{items:["AI05-0101-1"]}),(0,r.jsx)(n.A,{type:"aarm",aarm:"correction",children:(0,r.jsxs)(s.p,{children:[(0,r.jsx)("b",{})," Added a rule to ensure that function results are streamable; this was missing in previous versions of Ada. While programs that returned unstreamable types from RCI functions were legal, it is not clear what they could have done (as the results could not be marshalled). Thus, it seems unlikely that any real programs will be impacted by this change. ",(0,r.jsx)("br",{})]})})]}),"\n",(0,r.jsx)(l.A,{children:(0,r.jsx)(s.h4,{id:"extensions-to-ada-2005-2",children:"Extensions to Ada 2005"})}),"\n",(0,r.jsxs)(l.A,{children:[(0,r.jsx)(o.A,{children:"20.f/3_E.2.3"}),(0,r.jsx)(c.A,{items:["AI05-0206-1"]}),(0,r.jsx)(n.A,{type:"aarm",aarm:"note",children:(0,r.jsxs)(s.p,{children:["Added wording to allow private withs of preelaborated normal units in the specification of a remote call interface unit.",(0,r.jsx)("br",{})]})})]}),"\n",(0,r.jsxs)(l.A,{children:[(0,r.jsx)(o.A,{children:"20.g/5_E.2.3"}),(0,r.jsx)(c.A,{items:["AI05-0229-1","AI12-0417-1"]}),(0,r.jsx)(n.A,{type:"aarm",aarm:"note",children:(0,r.jsxs)(s.p,{children:["All","_","Calls","_","Remote is now a representation aspect, so it can be specified by an ",(0,r.jsx)("code",{children:(0,r.jsx)("a",{href:"/docs/arm/AA-13/AA-13.1#S0346",children:"aspect_specification"})}),(0,r.jsx)("br",{})]})})]}),"\n",(0,r.jsxs)(l.A,{children:[(0,r.jsx)(o.A,{children:"20.h/5_E.2.3"}),(0,r.jsx)(c.A,{items:["AI05-0243-1","AI12-0417-1"]}),(0,r.jsx)(n.A,{type:"aarm",aarm:"note",children:(0,r.jsxs)(s.p,{children:["Remote","_","Call","_","Interface is now a categorization aspect, so it can be specified by an ",(0,r.jsx)("code",{children:(0,r.jsx)("a",{href:"/docs/arm/AA-13/AA-13.1#S0346",children:"aspect_specification"})})," ",(0,r.jsx)("br",{})]})})]}),"\n",(0,r.jsx)(l.A,{children:(0,r.jsx)(s.h4,{id:"inconsistencies-with-ada-2012",children:"Inconsistencies With Ada 2012"})}),"\n",(0,r.jsxs)(l.A,{children:[(0,r.jsx)(o.A,{children:"20.i/4_E.2.3"}),(0,r.jsx)(c.A,{items:["AI12-0031-1"]}),(0,r.jsx)(n.A,{type:"aarm",aarm:"note",children:(0,r.jsxs)(s.p,{children:[(0,r.jsx)("b",{children:"Corrigendum:"})," Redefined when indirect and dispatching remote calls have to be remote for a unit for which the aspect All","_","Calls","_","Remote is True. With the new rules, a local target called indirectly or via dispatching will be routed through the PCS, while that was not necessarily true in earlier Ada. If a program depended on local targets not being routed through the PCS even when All","_","Calls","_","Remote is used, then it might behave differently or fail in Ada 2012 as corrected with this refinement. This is highly unlikely as the PCS is going to be able to communicate with any partition of the program, including the local partition. ",(0,r.jsx)("br",{})]})})]}),"\n",(0,r.jsx)(l.A,{children:(0,r.jsx)(s.h4,{id:"incompatibilities-with-ada-2012-1",children:"Incompatibilities With Ada 2012"})}),"\n",(0,r.jsxs)(l.A,{children:[(0,r.jsx)(o.A,{children:"20.j/5_E.2.3"}),(0,r.jsx)(c.A,{items:["AI12-0002-1"]}),(0,r.jsx)(n.A,{type:"aarm",aarm:"correction",children:(0,r.jsxs)(s.p,{children:[(0,r.jsx)("b",{})," Specifying user-defined stream-oriented attributes is now illegal in an RCI unit. If a program contains such attributes, they and their associated type will need to be moved to a remote types package (which is then imported into the RCI unit). ",(0,r.jsx)("br",{})]})})]}),"\n",(0,r.jsx)(l.A,{children:(0,r.jsx)(s.h4,{id:"wording-changes-from-ada-2012-3",children:"Wording Changes from Ada 2012"})}),"\n",(0,r.jsxs)(l.A,{children:[(0,r.jsx)(o.A,{children:"20.k/5_E.2.3"}),(0,r.jsx)(c.A,{items:["AI12-0283-1"]}),(0,r.jsx)(n.A,{type:"aarm",aarm:"note",children:(0,r.jsxs)(s.p,{children:["Added a rule to ensure that potentially blocking remote calls are not considered nonblocking.",(0,r.jsx)("br",{})]})})]}),"\n",(0,r.jsxs)(l.A,{children:[(0,r.jsx)(o.A,{children:"20.l/5_E.2.3"}),(0,r.jsx)(c.A,{items:["AI12-0417-1"]}),(0,r.jsx)(n.A,{type:"aarm",aarm:"note",children:(0,r.jsxs)(s.p,{children:["The pragmas Remote","_","Call","_","Interface and All","_","Calls","_","Remote are now obsolescent. ",(0,r.jsx)("br",{})]})})]})]})}function m(e={}){let{wrapper:s}={...(0,t.R)(),...e.components};return s?(0,r.jsx)(s,{...e,children:(0,r.jsx)(j,{...e})}):j(e)}}}]);
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.