# dmd.cond

Evaluate compile-time conditionals, such as `static if` `version` and `debug`.

Specification: Conditional Compilation

#### Authors

Walter Bright

#### License

Boost License 1.0

Source: cond.d

Documentation: https://dlang.org/phobos/dmd_cond.html

Coverage: https://codecov.io/gh/dlang/dmd/src/master/src/dmd/cond.d

- `Include`

  #### Declaration

  `enum `Include`: ubyte;`

  - `notComputed`

    #### Declaration

    ``notComputed``

    not computed yet

  - `yes`

    #### Declaration

    ``yes``

    include the conditional code

  - `no`

    #### Declaration

    ``no``

    do not include the conditional code

- `StaticForeach`

  #### Declaration

  `class `StaticForeach`: dmd.rootobject.RootObject;`

  Implements common functionality for StaticForeachDeclaration and StaticForeachStatement This performs the necessary lowerings before dmd.statementsem.makeTupleForeach can be used to expand the corresponding `static foreach` declaration or statement.

  - `aggrfe`

    #### Declaration

    `ForeachStatement `aggrfe`;`

    Not `null` iff the `static foreach` is over an aggregate. In this case, it contains the corresponding ForeachStatement. For StaticForeachDeclaration, the body is `null`.

  - `rangefe`

    #### Declaration

    `ForeachRangeStatement `rangefe`;`

    Not `null` iff the `static foreach` is over a range. Exactly one of the `aggrefe` and ``rangefe`` fields is not `null`. See `aggrfe` field for more details.

  - `needExpansion`

    #### Declaration

    `bool `needExpansion`;`

    `true` if it is necessary to expand a tuple into multiple variables (see lowerNonArrayAggregate).

  - `prepare`

    #### Declaration

    `void `prepare`(Scope* `sc`);`

    Perform `static foreach` lowerings that are necessary in order to finally expand the `static foreach` using `dmd.statementsem.makeTupleForeach`.

  - `ready`

    #### Declaration

    `bool `ready`();`

    #### Return Value

    `true` iff `ready` to call `dmd.statementsem.makeTupleForeach`.

- `DVCondition`

  #### Declaration

  `abstract class `DVCondition`: dmd.cond.Condition;`

- `DebugCondition`

  #### Declaration

  `class `DebugCondition`: dmd.cond.DVCondition;`

  - `addGlobalIdent`

    #### Declaration

    `deprecated static void `addGlobalIdent`(const(char)* `ident`);
    static void `addGlobalIdent`(string `ident`);
    static void `addGlobalIdent`(const(char)[] `ident`);`

    Add an user-supplied identifier to the list of global debug identifiers

    #### Discussion

    Can be called from either the driver or a `debug = Ident;` statement. Unlike version identifier, there isn't any reserved debug identifier so no validation takes place.

    #### Parameters

    `const(char)* `ident`` | identifier to add

  - `this`

    #### Declaration

    `@safe this(const ref Loc `loc`, Module `mod`, uint `level`, Identifier `ident`);`

    Instantiate a new `DebugCondition`

    #### Parameters

    `Module `mod`` | Module this node belongs to
    `uint `level`` | Minimum global `level` this condition needs to pass. Only used if ``ident`` is `null`.
    `Identifier `ident`` | Identifier required for this condition to pass. If `null`, this conditiion will use an integer `level`.
    `Loc `loc`` | Location in the source file

- `VersionCondition`

  #### Declaration

  `class `VersionCondition`: dmd.cond.DVCondition;`

  Node to represent a version condition

  #### Discussion

  A version condition is of the form:

  1. `version (Identifier)`
  In user code. This class also provides means to add version identifier to the list of global (cross module) identifiers.
  - `checkReserved`

    #### Declaration

    `static void `checkReserved`(const ref Loc `loc`, const(char)[] `ident`);`

    Raises an error if a version identifier is reserved.

    #### Discussion

    Called when setting a version identifier, e.g. `-version=identifier` parameter to the compiler or `version = Foo` in user code.

    #### Parameters

    `Loc `loc`` | Where the identifier is set
    `const(char)[] `ident`` | identifier being checked (`ident`[$] must be '\0')

  - `addGlobalIdent`

    #### Declaration

    `deprecated static void `addGlobalIdent`(const(char)* `ident`);
    static void `addGlobalIdent`(string `ident`);
    static void `addGlobalIdent`(const(char)[] `ident`);`

    Add an user-supplied global identifier to the list

    #### Discussion

    Only called from the driver for `-version=Ident` parameters. Will raise an error if the identifier is reserved.

    #### Parameters

    `const(char)* `ident`` | identifier to add

  - `addPredefinedGlobalIdent`

    #### Declaration

    `deprecated static void `addPredefinedGlobalIdent`(const(char)* `ident`);
    static void `addPredefinedGlobalIdent`(string `ident`);
    static void `addPredefinedGlobalIdent`(const(char)[] `ident`);`

    Add any global identifier to the list, without checking if it's predefined

    #### Discussion

    Only called from the driver after platform detection, and internally.

    #### Parameters

    `const(char)* `ident`` | identifier to add (`ident`[$] must be '\0')

  - `this`

    #### Declaration

    `@safe this(const ref Loc `loc`, Module `mod`, uint `level`, Identifier `ident`);`

    Instantiate a new `VersionCondition`

    #### Parameters

    `Module `mod`` | Module this node belongs to
    `uint `level`` | Minimum global `level` this condition needs to pass. Only used if ``ident`` is `null`.
    `Identifier `ident`` | Identifier required for this condition to pass. If `null`, this conditiion will use an integer `level`.
    `Loc `loc`` | Location in the source file

- `StaticIfCondition`

  #### Declaration

  `class `StaticIfCondition`: dmd.cond.Condition;`

- `findCondition`

  #### Declaration

  `pure nothrow @safe bool `findCondition`(Identifiers* `ids`, Identifier `ident`);`

  Find ``ident`` in an array of identifiers.

  #### Parameters

  `Identifiers* `ids`` | array of identifiers
  `Identifier `ident`` | identifier to search for

  #### Return Value

  `true` if found