# dmd.aggregate

Defines a `Dsymbol` representing an `aggregate`, which is a `struct`, `union` or `class`.

Specification: Structs, Unions, Class.

#### Authors

Walter Bright

#### License

Boost License 1.0

Source: aggregate.d

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

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

- `ClassKind`

  #### Declaration

  `enum `ClassKind`: ubyte;`

  The `ClassKind` enum is used in AggregateDeclaration AST nodes to specify the linkage type of the struct/class/interface or if it is an anonymous class. If the class is anonymous it is also considered to be a D class.

  - `d`

    #### Declaration

    ``d``

    the aggregate is a `d`(efault) class

  - `cpp`

    #### Declaration

    ``cpp``

    the aggregate is a C++ struct/class/interface

  - `objc`

    #### Declaration

    ``objc``

    the aggregate is an Objective-C class/interface

  - `c`

    #### Declaration

    ``c``

    the aggregate is a C struct

- `toChars`

  #### Declaration

  `const(char)* `toChars`(ClassKind `c`);`

  Give a nice string for a class kind for error messages

  #### Parameters

  `ClassKind `c`` | class kind

  #### Return Value

  0-terminated string for ``c``

- `MangleOverride`

  #### Declaration

  `struct `MangleOverride`;`

  If an aggregate has a pargma(mangle, ...) this holds the information to mangle.

- `AggregateDeclaration`

  #### Declaration

  `abstract class `AggregateDeclaration`: dmd.dsymbol.ScopeDsymbol;`

  Abstract aggregate as a common ancestor for Class- and StructDeclaration.

  - `type`

    #### Declaration

    `Type `type`;`

  - `storage_class`

    #### Declaration

    `StorageClass `storage_class`;`

  - `structsize`

    #### Declaration

    `uint `structsize`;`

    size of struct

  - `alignsize`

    #### Declaration

    `uint `alignsize`;`

    size of struct for alignment purposes

  - `fields`

    #### Declaration

    `VarDeclarations `fields`;`

    VarDeclaration `fields`

  - `deferred`

    #### Declaration

    `Dsymbol `deferred`;`

    any `deferred` semantic2() or semantic3() symbol

  - `classKind`

    #### Declaration

    `ClassKind `classKind`;`

    specifies whether this is a D, C++, Objective-C or anonymous struct/class/interface

  - `cppmangle`

    #### Declaration

    `CPPMANGLE `cppmangle`;`

    Specify whether to mangle the aggregate as a `class` or a `struct` This information is used by the MSVC mangler Only valid for class and struct. TODO: Merge with ClassKind ?

  - `pMangleOverride`

    #### Declaration

    `MangleOverride* `pMangleOverride`;`

    overridden symbol with pragma(mangle, "...") if not `null`

  - `enclosing`

    #### Declaration

    `Dsymbol `enclosing`;`

    !=`null` if is nested pointing to the dsymbol that directly `enclosing` it.

    1. The function that `enclosing` it (nested struct and class)
    2. The class that `enclosing` it (nested class only)
    3. If `enclosing` aggregate is template, its `enclosing` dsymbol.

    #### Discussion

    See AggregateDeclaraton::makeNested for the details.

  - `vthis`

    #### Declaration

    `VarDeclaration `vthis`;`

    'this' parameter if this aggregate is nested

  - `vthis2`

    #### Declaration

    `VarDeclaration `vthis2`;`

    'this' parameter if this aggregate is a template and is nested

  - `invs`

    #### Declaration

    `FuncDeclarations `invs`;`

    Array of invariants

  - `inv`

    #### Declaration

    `FuncDeclaration `inv`;`

    Merged invariant calling all members of invs

  - `ctor`

    #### Declaration

    `Dsymbol `ctor`;`

    CtorDeclaration or TemplateDeclaration

  - `defaultCtor`

    #### Declaration

    `CtorDeclaration `defaultCtor`;`

    default constructor - should have no arguments, because it would be stored in TypeInfo_Class.defaultConstructor

  - `aliasthis`

    #### Declaration

    `AliasThis `aliasthis`;`

    forward unresolved lookups to `aliasthis`

  - `userDtors`

    #### Declaration

    `DtorDeclarations `userDtors`;`

    user-defined destructors (`~this()`) - mixins can yield multiple ones

  - `aggrDtor`

    #### Declaration

    `DtorDeclaration `aggrDtor`;`

    aggregate destructor calling userDtors and fieldDtor (and base class aggregate dtor for C++ classes)

  - `dtor`

    #### Declaration

    `DtorDeclaration `dtor`;`

    the aggregate destructor exposed as `__xdtor` alias

  - `tidtor`

    #### Declaration

    `DtorDeclaration `tidtor`;`

    (same as aggrDtor, except for C++ classes with virtual dtor on Windows)

    #### Discussion

    aggregate destructor used in TypeInfo (must have extern(D) ABI)

  - `fieldDtor`

    #### Declaration

    `DtorDeclaration `fieldDtor`;`

    function destructing (non-inherited) fields

  - `getRTInfo`

    #### Declaration

    `Expression `getRTInfo`;`

    pointer to GC info generated by object.RTInfo(this)

  - `visibility`

    #### Declaration

    `Visibility `visibility`;`

  - `noDefaultCtor`

    #### Declaration

    `bool `noDefaultCtor`;`

    no default construction

  - `disableNew`

    #### Declaration

    `bool `disableNew`;`

    disallow allocations using `new`

  - `sizeok`

    #### Declaration

    `Sizeok `sizeok`;`

    set when structsize contains valid data

  - `newScope`

    #### Declaration

    `Scope* `newScope`(Scope* `sc`);`

    Create a new scope from `sc`. semantic, semantic2 and semantic3 will use this for aggregate members.

  - `nonHiddenFields`

    #### Declaration

    `final size_t `nonHiddenFields`();`

    #### Return Value

    The total number of fields minus the number of hidden fields.

  - `determineSize`

    #### Declaration

    `final bool `determineSize`(const ref Loc `loc`);`

    Collect all instance fields, then determine instance size.

    #### Return Value

    `false` if failed to determine the size.

  - `checkOverlappedFields`

    #### Declaration

    `final bool `checkOverlappedFields`();`

    Calculate field[i].overlapped and overlapUnsafe, and check that all of explicit field initializers have unique memory space on instance.

    #### Return Value

    `true` if any errors happen.

  - `fill`

    #### Declaration

    `final bool `fill`(const ref Loc `loc`, ref Expressions `elements`, bool `ctorinit`);`

    Fill out remainder of `elements`[] with default initializers for fields[].

    #### Parameters

    `Loc `loc`` | location
    `Expressions `elements`` | explicit arguments which given to construct object.
    `bool `ctorinit`` | `true` if the `elements` will be used for default initialization.

    #### Return Value

    `false` if any errors occur. Otherwise, returns `true` and the missing arguments will be pushed in `elements`[].

  - `alignmember`

    #### Declaration

    `static pure nothrow @safe void `alignmember`(structalign_t `alignment`, uint `memalignsize`, uint* `poffset`);`

    Do byte or word `alignment` as necessary. Align sizes of 0, as we may not know array sizes yet.

    #### Parameters

    `structalign_t `alignment`` | struct `alignment` that is in effect
    `uint `memalignsize`` | natural `alignment` of field
    `uint* `poffset`` | pointer to offset to be aligned

  - `placeField`

    #### Declaration

    `static uint `placeField`(uint* `nextoffset`, uint `memsize`, uint `memalignsize`, structalign_t `alignment`, uint* `paggsize`, uint* `paggalignsize`, bool `isunion`);`

    Place a field (mem) into an aggregate (agg), which can be a struct, union or class

    #### Parameters

    `uint* `nextoffset`` | location just past the end of the previous field in the aggregate. Updated to be just past the end of this field to be placed, i.e. the future `nextoffset`
    `uint `memsize`` | size of field
    `uint `memalignsize`` | natural `alignment` of field
    `structalign_t `alignment`` | `alignment` in effect for this field
    `uint* `paggsize`` | size of aggregate (updated)
    `uint* `paggalignsize`` | `alignment` of aggregate (updated)
    `bool `isunion`` | the aggregate is a union

    #### Return Value

    aligned offset to place field at

  - `setDeprecated`

    #### Declaration

    `final void `setDeprecated`();`

    Flag this aggregate as deprecated

  - `isNested`

    #### Declaration

    `final const bool `isNested`();`

    Returns `true` if there's an extra member which is the 'this' pointer to the enclosing context (enclosing aggregate or function)

  - `searchCtor`

    #### Declaration

    `final Dsymbol `searchCtor`();`

    Look for constructor declaration.

  - `sinit`

    #### Declaration

    `void* `sinit`;`

    initializer symbol

- `apply`

  #### Declaration

  `int `apply`(Dsymbol `symbol`, int function(Dsymbol, void*) `fp`, void* `ctx`);`

  Iterate this dsymbol or members of this scoped dsymbol, then call ``fp`` with the found `symbol` and `params`.

  #### Parameters

  `Dsymbol `symbol`` | the dsymbol or parent of members to call `fp` on
  `int function(Dsymbol, void*) `fp`` | function pointer to process the iterated `symbol`. If it returns nonzero, the iteration will be aborted.
  `void* `ctx`` | context parameter passed to `fp`.

  #### Return Value

  nonzero if the iteration is aborted by the return value of `fp`, or 0 if it's completed.