mirror of
https://github.com/carbon-language/carbon-lang.git
synced 2026-09-24 22:02:23 +01:00
The FunctionDecl created for calling the Carbon thunk now takes a `self` parameter for non-static methods, and the C++ thunk now passes an extra argument for that `self` parameter when needed. The CXXMethodDecl thunk created for calling methods now sets the storage class appropriate depending on whether the method is static or not. To reduce the number of parameters being passed around to thunk-building functions, added a `FunctionInfo` struct and pass that around instead.
114 lines
3.2 KiB
Plaintext
114 lines
3.2 KiB
Plaintext
// Part of the Carbon Language project, under the Apache License v2.0 with LLVM
|
|
// Exceptions. See /LICENSE for license information.
|
|
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
|
|
//
|
|
// INCLUDE-FILE: toolchain/testing/testdata/min_prelude/int.carbon
|
|
//
|
|
// AUTOUPDATE
|
|
// TIP: To test this file alone, run:
|
|
// TIP: bazel test //toolchain/testing:file_test --test_arg=--file_tests=toolchain/check/testdata/interop/cpp/function/export/function.carbon
|
|
// TIP: To dump output, run:
|
|
// TIP: bazel run //toolchain/testing:file_test -- --dump_output --file_tests=toolchain/check/testdata/interop/cpp/function/export/function.carbon
|
|
|
|
// --- other.carbon
|
|
|
|
package Other;
|
|
fn F1() {}
|
|
fn F2() -> i32 { return 0; }
|
|
fn F3(_: i32) {}
|
|
|
|
fn HasGenericArg(T:! type, a: T) { a; }
|
|
fn HasDeducedArg[T:! type](a: T) { a; }
|
|
|
|
class C {
|
|
fn Method[self: Self]() { self; }
|
|
}
|
|
|
|
// --- function.carbon
|
|
|
|
library "[[@TEST_NAME]]";
|
|
|
|
import Other;
|
|
import Cpp inline '''
|
|
void G() {
|
|
Carbon::Other::F1();
|
|
}
|
|
''';
|
|
|
|
// --- return_int.carbon
|
|
|
|
library "[[@TEST_NAME]]";
|
|
|
|
import Other;
|
|
import Cpp inline '''
|
|
int G() {
|
|
return Carbon::Other::F2();
|
|
}
|
|
''';
|
|
|
|
// --- args.carbon
|
|
|
|
library "[[@TEST_NAME]]";
|
|
|
|
import Other;
|
|
import Cpp inline '''
|
|
void G() {
|
|
Carbon::Other::F3(123);
|
|
}
|
|
''';
|
|
|
|
// --- fail_todo_generic.carbon
|
|
|
|
library "[[@TEST_NAME]]";
|
|
|
|
// CHECK:STDERR: fail_todo_generic.carbon:[[@LINE+5]]:1: in import [InImport]
|
|
// CHECK:STDERR: other.carbon:7:1: error: semantics TODO: `unsupported: C++ calling a Carbon function with generic parameters` [SemanticsTodo]
|
|
// CHECK:STDERR: fn HasGenericArg(T:! type, a: T) { a; }
|
|
// CHECK:STDERR: ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
// CHECK:STDERR:
|
|
import Other;
|
|
import Cpp inline '''
|
|
void G() {
|
|
// CHECK:STDERR: fail_todo_generic.carbon:[[@LINE+8]]:18: error: no member named 'HasGenericArg' in namespace 'Carbon::Other' [CppInteropParseError]
|
|
// CHECK:STDERR: 20 | Carbon::Other::HasGenericArg<int>(123);
|
|
// CHECK:STDERR: | ^~~~~~~~~~~~~
|
|
// CHECK:STDERR:
|
|
// CHECK:STDERR: fail_todo_generic.carbon:[[@LINE+4]]:35: error: expected '(' for function-style cast or type construction [CppInteropParseError]
|
|
// CHECK:STDERR: 20 | Carbon::Other::HasGenericArg<int>(123);
|
|
// CHECK:STDERR: | ~~~^
|
|
// CHECK:STDERR:
|
|
Carbon::Other::HasGenericArg<int>(123);
|
|
}
|
|
''';
|
|
|
|
// --- fail_todo_deduced.carbon
|
|
|
|
library "[[@TEST_NAME]]";
|
|
|
|
// CHECK:STDERR: fail_todo_deduced.carbon:[[@LINE+5]]:1: in import [InImport]
|
|
// CHECK:STDERR: other.carbon:8:1: error: semantics TODO: `unsupported: C++ calling a Carbon function with generic parameters` [SemanticsTodo]
|
|
// CHECK:STDERR: fn HasDeducedArg[T:! type](a: T) { a; }
|
|
// CHECK:STDERR: ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
// CHECK:STDERR:
|
|
import Other;
|
|
import Cpp inline '''
|
|
void G() {
|
|
// CHECK:STDERR: fail_todo_deduced.carbon:[[@LINE+4]]:18: error: no member named 'HasDeducedArg' in namespace 'Carbon::Other' [CppInteropParseError]
|
|
// CHECK:STDERR: 16 | Carbon::Other::HasDeducedArg(123);
|
|
// CHECK:STDERR: | ^~~~~~~~~~~~~
|
|
// CHECK:STDERR:
|
|
Carbon::Other::HasDeducedArg(123);
|
|
}
|
|
''';
|
|
|
|
// --- method.carbon
|
|
|
|
library "[[@TEST_NAME]]";
|
|
|
|
import Other;
|
|
import Cpp inline '''
|
|
void G() {
|
|
Carbon::Other::C().Method();
|
|
}
|
|
''';
|