File: array_equals_memcmp_neverinvoke.d

package info (click to toggle)
ldc 1%3A1.40.0-5
  • links: PTS, VCS
  • area: main
  • in suites: sid, trixie
  • size: 63,308 kB
  • sloc: cpp: 85,368; ansic: 21,877; makefile: 1,705; sh: 1,018; asm: 584; objc: 135; exp: 48; python: 12
file content (24 lines) | stat: -rw-r--r-- 738 bytes parent folder | download | duplicates (4)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
// Tests that memcmp array comparisons `call` memcmp instead of `invoke`.

// RUN: %ldc -c -output-ll -of=%t.ll %s && FileCheck %s --check-prefix=LLVM < %t.ll

// When the user defines memcmp, it overrides the prototype defined by LDC.
// The user's prototype does not have the nounwind attribute, and a call to memcmp may become `invoke`.
extern(C) int memcmp(void*, void*, size_t);

void foo();

// Test that memcmp is not `invoked`
// LLVM-LABEL: define{{.*}} @{{.*}}never_invoke
void never_invoke(bool[2] a, bool[2] b)
{
    try
    {
        // LLVM: call i32 @memcmp({{.*}}, {{.*}}, i{{32|64}} 2)
        auto result = a == b;
        foo(); // Compiler has to assume that this may throw
    }
    catch (Exception e)
    {
    }
}