File: fvisibility_dll.d

package info (click to toggle)
ldc 1%3A1.30.0-1
  • links: PTS, VCS
  • area: main
  • in suites: bookworm
  • size: 59,248 kB
  • sloc: cpp: 61,598; ansic: 14,545; sh: 1,014; makefile: 972; asm: 510; objc: 135; exp: 48; python: 12
file content (42 lines) | stat: -rw-r--r-- 1,296 bytes parent folder | download | duplicates (2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
// Tests that -fvisibility=public for Windows targets exports defined symbols
// (dllexport) without explicit `export` visibility, and that linking an app
// against such a DLL via import library works as expected.

// REQUIRES: Windows

// generate DLL and import lib (public visibility by default)
// RUN: %ldc %S/inputs/fvisibility_dll_lib.d -betterC -shared -of=%t_lib.dll

// compile, link and run the app; `-dllimport=all` for dllimporting data symbols
// RUN: %ldc %s -I%S/inputs -betterC -dllimport=all %t_lib.lib -of=%t.exe
// RUN: %t.exe

import fvisibility_dll_lib;

// test manual 'relocation' of references to dllimported globals in static data initializers:
__gshared int* dllimportRef = &dllGlobal;
__gshared void* castDllimportRef = &dllGlobal;
immutable void*[2] arrayOfRefs = [ null, cast(immutable) &dllGlobal ];

struct MyStruct
{
    int* dllimportRef = &dllGlobal; // init symbol references dllimported global
}

extern(C) void main()
{
    assert(dllGlobal == 123);

    const x = dllSum(1, 2);
    assert(x == 3);

    dllWeakFoo();

    scope c = new MyClass;
    assert(c.myInt == 456);

    assert(dllimportRef == &dllGlobal);
    assert(castDllimportRef == &dllGlobal);
    assert(arrayOfRefs[1] == &dllGlobal);
    assert(MyStruct.init.dllimportRef == &dllGlobal);
}