View source code
Display the source code in core/attribute.d from which this page was generated on github.
Report a bug
If you spot a problem with this page, click here to create a Bugzilla issue.
Improve this page
Quickly fork, edit online, and submit a pull request for this page. Requires a signed-in GitHub account. This works well for small changes. If you'd like to make larger changes you may want to consider using local clone.

Struct core.attribute.gnuAbiTag

Use this attribute to declare an ABI tag on a C++ symbol.

struct gnuAbiTag ;

ABI tag is an attribute introduced by the GNU C++ compiler. It modifies the mangled name of the symbol to incorporate the tag name, in order to distinguish from an earlier version with a different ABI.

This is a special compiler recognized attribute, it has a few requirements, which all will be enforced by the compiler:

  • There can only be one such attribute per symbol.
  • The attribute can only be attached to an extern(C++) symbol (struct, class, enum, function, and their templated counterparts).
  • The attribute cannot be applied to C++ namespaces. This is to prevent confusion with the C++ semantic, which allows it to be applied to namespaces.
  • The string arguments must only contain valid characters for C++ name mangling which currently include alphanumerics and the underscore character.

This UDA is not transitive, and inner scope do not inherit outer scopes' ABI tag. See examples below for how to translate a C++ declaration to D. Also note that entries in this UDA will be automatically sorted alphabetically, hence gnuAbiTag("c", "b", "a") will appear as @gnuAbiTag("a", "b", "c").

See Also

Itanium ABI spec GCC attributes documentation.

Examples

// ---- foo.cpp
struct [[gnu::abi_tag ("tag1", "tag2")]] Tagged1_2
{
    struct [[gnu::abi_tag ("tag3")]] Tagged3
    {
        [[gnu::abi_tag ("tag4")]]
        int Tagged4 () { return 42; }
    }
}
Tagged1_2 inst1;
// ---- foo.d
@gnuAbiTag("tag1", "tag2") struct Tagged1_2
{
    // Notice the repetition
    @gnuAbiTag("tag1", "tag2", "tag3") struct Tagged3
    {
        @gnuAbiTag("tag1", "tag2", "tag3", "tag4") int Tagged4 ();
    }
}
extern __gshared Tagged1_2 inst1;

Authors

Jacob Carlborg

License

Boost License 1.0