From 0838a65e0d05f6d0739e7edb728167449bdca4b9 Mon Sep 17 00:00:00 2001 From: Michael Forster Date: Fri, 5 Jun 2020 12:32:23 +0200 Subject: [PATCH] Test C++ out-of-line operator functions Add a test to verify that C++ out-of-line operator functions are imported correctly. Includes fixes for armv7 and arm64. This is part of addressing SR-12748. --- .../Cxx/operators/Inputs/module.modulemap | 4 ++++ .../Inputs/non-member-out-of-line.cpp | 5 ++++ .../operators/Inputs/non-member-out-of-line.h | 10 ++++++++ .../non-member-out-of-line-irgen.swift | 8 +++++++ .../non-member-out-of-line-silgen.swift | 10 ++++++++ .../operators/non-member-out-of-line.swift | 23 +++++++++++++++++++ 6 files changed, 60 insertions(+) create mode 100644 test/Interop/Cxx/operators/Inputs/non-member-out-of-line.cpp create mode 100644 test/Interop/Cxx/operators/Inputs/non-member-out-of-line.h create mode 100644 test/Interop/Cxx/operators/non-member-out-of-line-irgen.swift create mode 100644 test/Interop/Cxx/operators/non-member-out-of-line-silgen.swift create mode 100644 test/Interop/Cxx/operators/non-member-out-of-line.swift diff --git a/test/Interop/Cxx/operators/Inputs/module.modulemap b/test/Interop/Cxx/operators/Inputs/module.modulemap index 3fad5697d2a02..2cc3fa14cd834 100644 --- a/test/Interop/Cxx/operators/Inputs/module.modulemap +++ b/test/Interop/Cxx/operators/Inputs/module.modulemap @@ -1,3 +1,7 @@ module NonMemberInline { header "non-member-inline.h" } + +module NonMemberOutOfLine { + header "non-member-out-of-line.h" +} diff --git a/test/Interop/Cxx/operators/Inputs/non-member-out-of-line.cpp b/test/Interop/Cxx/operators/Inputs/non-member-out-of-line.cpp new file mode 100644 index 0000000000000..d6bccca7e7be0 --- /dev/null +++ b/test/Interop/Cxx/operators/Inputs/non-member-out-of-line.cpp @@ -0,0 +1,5 @@ +#include "non-member-out-of-line.h" + +IntBox operator+(IntBox lhs, IntBox rhs) { + return IntBox{.value = lhs.value + rhs.value}; +} diff --git a/test/Interop/Cxx/operators/Inputs/non-member-out-of-line.h b/test/Interop/Cxx/operators/Inputs/non-member-out-of-line.h new file mode 100644 index 0000000000000..a0466d812d8c5 --- /dev/null +++ b/test/Interop/Cxx/operators/Inputs/non-member-out-of-line.h @@ -0,0 +1,10 @@ +#ifndef TEST_INTEROP_CXX_OPERATORS_INPUTS_NON_MEMBER_OUT_OF_LINE_H +#define TEST_INTEROP_CXX_OPERATORS_INPUTS_NON_MEMBER_OUT_OF_LINE_H + +struct IntBox { + int value; +}; + +IntBox operator+(IntBox lhs, IntBox rhs); + +#endif diff --git a/test/Interop/Cxx/operators/non-member-out-of-line-irgen.swift b/test/Interop/Cxx/operators/non-member-out-of-line-irgen.swift new file mode 100644 index 0000000000000..456520b248e0a --- /dev/null +++ b/test/Interop/Cxx/operators/non-member-out-of-line-irgen.swift @@ -0,0 +1,8 @@ +// RUN: %target-swift-emit-ir %s -I %S/Inputs -enable-cxx-interop | %FileCheck %s + +import NonMemberOutOfLine + +public func add(_ lhs: IntBox, _ rhs: IntBox) -> IntBox { lhs + rhs } + +// CHECK: call {{i32|i64}} [[NAME:@(_Zpl6IntBoxS_|"\?\?H@YA\?AUIntBox@@U0@0@Z")]]({{i32|\[1 x i32\]|i64}} %{{[0-9]+}}, {{i32|\[1 x i32\]|i64}} %{{[0-9]+}}) +// CHECK: declare {{(dso_local )?}}{{i32|i64}} [[NAME]]({{i32|\[1 x i32\]|i64}}, {{i32|\[1 x i32\]|i64}}) diff --git a/test/Interop/Cxx/operators/non-member-out-of-line-silgen.swift b/test/Interop/Cxx/operators/non-member-out-of-line-silgen.swift new file mode 100644 index 0000000000000..302efa7cf8a1d --- /dev/null +++ b/test/Interop/Cxx/operators/non-member-out-of-line-silgen.swift @@ -0,0 +1,10 @@ +// RUN: %target-swift-emit-sil %s -I %S/Inputs -enable-cxx-interop | %FileCheck %s + +import NonMemberOutOfLine + +public func add(_ lhs: IntBox, _ rhs: IntBox) -> IntBox { lhs + rhs } + +// CHECK: [[COUNTER:%.*]] = function_ref [[NAME:@(_Zpl6IntBoxS_|\?\?H@YA\?AUIntBox@@U0@0@Z)]] : $@convention(c) (IntBox, IntBox) -> IntBox +// CHECK: apply [[COUNTER]](%0, %1) : $@convention(c) (IntBox, IntBox) -> IntBox + +// CHECK: sil [serializable] [clang "+"] [[NAME]] : $@convention(c) (IntBox, IntBox) -> IntBox diff --git a/test/Interop/Cxx/operators/non-member-out-of-line.swift b/test/Interop/Cxx/operators/non-member-out-of-line.swift new file mode 100644 index 0000000000000..55a4fc8506650 --- /dev/null +++ b/test/Interop/Cxx/operators/non-member-out-of-line.swift @@ -0,0 +1,23 @@ +// RUN: %empty-directory(%t) +// RUN: %target-clang -c %S/Inputs/non-member-out-of-line.cpp -I %S/Inputs -o %t/non-member-out-of-line.o -std=c++17 +// RUN: %target-build-swift %s -I %S/Inputs -o %t/non-member-out-of-line %t/non-member-out-of-line.o -Xfrontend -enable-cxx-interop +// RUN: %target-codesign %t/non-member-out-of-line +// RUN: %target-run %t/non-member-out-of-line +// +// REQUIRES: executable_test + +import NonMemberOutOfLine +import StdlibUnittest + +var OperatorsTestSuite = TestSuite("Operators") + +OperatorsTestSuite.test("plus") { + let lhs = IntBox(value: 42) + let rhs = IntBox(value: 23) + + let result = lhs + rhs + + expectEqual(65, result.value) +} + +runAllTests()