File: small-structs-pass-return-direct-in-cxx-execution.cpp

package info (click to toggle)
swiftlang 6.0.3-2
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 2,519,992 kB
  • sloc: cpp: 9,107,863; ansic: 2,040,022; asm: 1,135,751; python: 296,500; objc: 82,456; f90: 60,502; lisp: 34,951; pascal: 19,946; sh: 18,133; perl: 7,482; ml: 4,937; javascript: 4,117; makefile: 3,840; awk: 3,535; xml: 914; fortran: 619; cs: 573; ruby: 573
file content (64 lines) | stat: -rw-r--r-- 2,788 bytes parent folder | download
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
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
// RUN: %empty-directory(%t)

// RUN: %target-swift-frontend %S/small-structs-pass-return-direct-in-cxx.swift -typecheck -module-name Structs -clang-header-expose-decls=all-public -emit-clang-header-path %t/structs.h

// RUN: %target-interop-build-clangxx -c %s -I %t -o %t/swift-structs-execution.o -Wno-incompatible-pointer-types
// RUN: %target-interop-build-swift %S/small-structs-pass-return-direct-in-cxx.swift -o %t/swift-structs-execution -Xlinker %t/swift-structs-execution.o -module-name Structs -Xfrontend -entry-point-function-name -Xfrontend swiftMain

// RUN: %target-codesign %t/swift-structs-execution
// RUN: %target-run %t/swift-structs-execution | %FileCheck %s

// REQUIRES: executable_test

#include <assert.h>
#include "structs.h"

int main() {
  using namespace Structs;

  static_assert(sizeof(StructOneI64) == 8, "");
  static_assert(sizeof(StructTwoI32) == 8, "");
  static_assert(sizeof(StructOneI16AndOneStruct) == 12, "");
  static_assert(sizeof(StructU16AndPointer) == (sizeof(void *) * 2), "");
  static_assert(sizeof(StructDoubleAndFloat) == 16, "");

  StructOneI64 structOneI64 = returnNewStructOneI64();
  printStructOneI64(structOneI64);
// CHECK:      StructOneI64.x = 42

  printStructOneI64(passThroughStructOneI64(structOneI64));
// CHECK-NEXT: StructOneI64.x = 42

  printStructTwoI32(passThroughStructTwoI32(1, returnNewStructTwoI32(5), 4));
// CHECK-NEXT: StructTwoI32.x = 6, y = 14

  printStructStructTwoI32_and_OneI16AndOneStruct(
    returnNewStructTwoI32(7), returnNewStructOneI16AndOneStruct());
// CHECK-NEXT: StructTwoI32.x = 7, y = 14
// CHECK-NEXT: StructOneI16AndOneStruct.x = 255, y.x = 5, y.y = 72

  char c = 'A';
  auto structU16AndPointer = returnNewStructU16AndPointer(&c);
  assert(getStructU16AndPointer_x(structU16AndPointer) == 55);
  assert(getStructU16AndPointer_y(structU16AndPointer) == &c);

  double doubleValue = 1.25;
  float floatValue = -5.0f;
  auto structDoubleAndFloat = returnNewStructDoubleAndFloat(floatValue, doubleValue);
  assert(getStructDoubleAndFloat_x(structDoubleAndFloat) == doubleValue);
  assert(getStructDoubleAndFloat_y(structDoubleAndFloat) == floatValue);

  // s = StructOneI16AndOneStruct(x: 0xFF, y: StructTwoI32(x: 5, y: 72))
  auto s = returnNewStructOneI16AndOneStruct();
  // s2 = StructTwoI32(x: 10, y: 20)
  auto s2 = returnNewStructTwoI32(10);
  inoutStructOneI16AndOneStruct(s, s2);
  printStructStructTwoI32_and_OneI16AndOneStruct(s2, s);
// CHECK-NEXT: StructTwoI32.x = 10, y = 20
// CHECK-NEXT: StructOneI16AndOneStruct.x = 205, y.x = 10, y.y = 20

  inoutStructDoubleAndFloat(structDoubleAndFloat);
  assert(getStructDoubleAndFloat_x(structDoubleAndFloat) == doubleValue * floatValue);
  assert(getStructDoubleAndFloat_y(structDoubleAndFloat) == floatValue / 10);
  return 0;
}