[[Property:modification_date|Mon, 10 Sep 2018 10:49:19 GMT]]
[[Property:publication_date|Mon, 10 Sep 2018 10:32:05 GMT]]
[[Property:uuid|81E6A18A-C7D8-4F80-8D08-8B2C0B6350C8]]
[[Property:weight|0]]
[[Property:title|Language and Capabilities]]
The sections '''Language''' and '''Capability''' list closely-related options that work together. The values in the section '''Language''' specify what rules or semantics the compiler should apply when compiling and running code. If not specified, the value of the corresponding option from the section '''Capability''' is used. A selected value in the section '''Language''' should be compatible with the value in the section '''Capability'''. In other words, the values listed in '''Capability''' tell what source code is capable of, whereas the values in '''Language''' tell what is used when compiling for a specific target.

The values in the section '''Language''' are used only when the corresponding target is compiled as a root one. Otherwise, they are ignored. The values in the section '''Capability''' are used to verify that current project settings allow for using a particular library (or classes of the project itself). For example, the [https://www.eiffel.org/doc/uuid/a03568e8-eb79-70d7-04a3-6fd3ed7ac2b3 void-safe] library ''[https://www.eiffel.org/doc/uuid/0153c1de-bf88-fa0d-52a5-e50ffcc4e8c8 Base]'' can be used in a non-void-safe project, because project settings are compatible with capabilities of the library. On the other hand, the library ''[https://www.eiffel.org/doc/uuid/AAF0CEF9-7268-492F-9119-872164995898 Thread]'' cannot be used in a [https://www.eiffel.org/doc/uuid/5FE312E0-0AC6-465C-AD3B-D5D73AAE566F SCOOP] project, because the library is not SCOOP-capable.

Capabilities are supported for the following settings, listed together with compatibility order, where ''X < Y''  means ''X'' is compatible with ''Y'':

# CAT-call detection: None < Transitional < Complete.
# Concurrency: Thread < None < SCOOP.
# Void safety: None < Conformance < Initialization < Transitional < Complete.

In addition to the restriction on the compilation setting specified in the section '''Language''', a project or a library with a higher level of capabilities cannot rely on a library with a lower level.