Skip to content

Commit 1324fad

Browse files
authored
C++ Interop: Add basic tests for void* conversion (#6315)
Part of #6280.
1 parent fd3b0b0 commit 1324fad

File tree

1 file changed

+228
-0
lines changed

1 file changed

+228
-0
lines changed
Lines changed: 228 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,228 @@
1+
// Part of the Carbon Language project, under the Apache License v2.0 with LLVM
2+
// Exceptions. See /LICENSE for license information.
3+
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
4+
//
5+
// INCLUDE-FILE: toolchain/testing/testdata/min_prelude/full.carbon
6+
//
7+
// AUTOUPDATE
8+
// TIP: To test this file alone, run:
9+
// TIP: bazel test //toolchain/testing:file_test --test_arg=--file_tests=toolchain/check/testdata/interop/cpp/void_pointer.carbon
10+
// TIP: To dump output, run:
11+
// TIP: bazel run //toolchain/testing:file_test -- --dump_output --file_tests=toolchain/check/testdata/interop/cpp/void_pointer.carbon
12+
13+
// --- fail_todo_implicit_as_from_cpp_class_pointer_to_void_pointer.carbon
14+
15+
library "[[@TEST_NAME]]";
16+
17+
import Cpp inline '''
18+
struct S {};
19+
''';
20+
21+
fn F(input: Cpp.S*) {
22+
//@dump-sem-ir-begin
23+
// CHECK:STDERR: fail_todo_implicit_as_from_cpp_class_pointer_to_void_pointer.carbon:[[@LINE+7]]:22: error: cannot implicitly convert expression of type `Cpp.S*` to `Cpp.void*` [ConversionFailure]
24+
// CHECK:STDERR: let p: Cpp.void* = input;
25+
// CHECK:STDERR: ^~~~~
26+
// CHECK:STDERR: fail_todo_implicit_as_from_cpp_class_pointer_to_void_pointer.carbon:[[@LINE+4]]:22: note: type `Cpp.S*` does not implement interface `Core.ImplicitAs(Cpp.void*)` [MissingImplInMemberAccessNote]
27+
// CHECK:STDERR: let p: Cpp.void* = input;
28+
// CHECK:STDERR: ^~~~~
29+
// CHECK:STDERR:
30+
let p: Cpp.void* = input;
31+
//@dump-sem-ir-end
32+
}
33+
34+
// --- fail_todo_implicit_as_from_carbon_class_pointer_to_void_pointer.carbon
35+
36+
library "[[@TEST_NAME]]";
37+
38+
import Cpp inline "";
39+
40+
class C {}
41+
42+
fn F(input: C*) {
43+
//@dump-sem-ir-begin
44+
// CHECK:STDERR: fail_todo_implicit_as_from_carbon_class_pointer_to_void_pointer.carbon:[[@LINE+7]]:22: error: cannot implicitly convert expression of type `C*` to `Cpp.void*` [ConversionFailure]
45+
// CHECK:STDERR: let p: Cpp.void* = input;
46+
// CHECK:STDERR: ^~~~~
47+
// CHECK:STDERR: fail_todo_implicit_as_from_carbon_class_pointer_to_void_pointer.carbon:[[@LINE+4]]:22: note: type `C*` does not implement interface `Core.ImplicitAs(Cpp.void*)` [MissingImplInMemberAccessNote]
48+
// CHECK:STDERR: let p: Cpp.void* = input;
49+
// CHECK:STDERR: ^~~~~
50+
// CHECK:STDERR:
51+
let p: Cpp.void* = input;
52+
//@dump-sem-ir-end
53+
}
54+
55+
// --- fail_todo_explicit_as_from_void_pointer_to_cpp_class_pointer.carbon
56+
57+
library "[[@TEST_NAME]]";
58+
59+
import Cpp inline '''
60+
struct S {};
61+
''';
62+
63+
fn F(input: Cpp.void*) {
64+
//@dump-sem-ir-begin
65+
// CHECK:STDERR: fail_todo_explicit_as_from_void_pointer_to_cpp_class_pointer.carbon:[[@LINE+7]]:19: error: cannot convert expression of type `Cpp.void*` to `Cpp.S*` with `as` [ConversionFailure]
66+
// CHECK:STDERR: let p: Cpp.S* = input as Cpp.S*;
67+
// CHECK:STDERR: ^~~~~~~~~~~~~~~
68+
// CHECK:STDERR: fail_todo_explicit_as_from_void_pointer_to_cpp_class_pointer.carbon:[[@LINE+4]]:19: note: type `Cpp.void*` does not implement interface `Core.As(Cpp.S*)` [MissingImplInMemberAccessNote]
69+
// CHECK:STDERR: let p: Cpp.S* = input as Cpp.S*;
70+
// CHECK:STDERR: ^~~~~~~~~~~~~~~
71+
// CHECK:STDERR:
72+
let p: Cpp.S* = input as Cpp.S*;
73+
//@dump-sem-ir-end
74+
}
75+
76+
// --- fail_todo_explicit_as_from_void_pointer_to_carbon_class_pointer.carbon
77+
78+
library "[[@TEST_NAME]]";
79+
80+
import Cpp inline "";
81+
82+
class C {}
83+
84+
fn F(input: Cpp.void*) {
85+
//@dump-sem-ir-begin
86+
// CHECK:STDERR: fail_todo_explicit_as_from_void_pointer_to_carbon_class_pointer.carbon:[[@LINE+7]]:15: error: cannot convert expression of type `Cpp.void*` to `C*` with `as` [ConversionFailure]
87+
// CHECK:STDERR: let p: C* = input as C*;
88+
// CHECK:STDERR: ^~~~~~~~~~~
89+
// CHECK:STDERR: fail_todo_explicit_as_from_void_pointer_to_carbon_class_pointer.carbon:[[@LINE+4]]:15: note: type `Cpp.void*` does not implement interface `Core.As(C*)` [MissingImplInMemberAccessNote]
90+
// CHECK:STDERR: let p: C* = input as C*;
91+
// CHECK:STDERR: ^~~~~~~~~~~
92+
// CHECK:STDERR:
93+
let p: C* = input as C*;
94+
//@dump-sem-ir-end
95+
}
96+
97+
// CHECK:STDOUT: --- fail_todo_implicit_as_from_cpp_class_pointer_to_void_pointer.carbon
98+
// CHECK:STDOUT:
99+
// CHECK:STDOUT: constants {
100+
// CHECK:STDOUT: %S: type = class_type @S [concrete]
101+
// CHECK:STDOUT: %ptr.5c7: type = ptr_type %S [concrete]
102+
// CHECK:STDOUT: %ptr.03c: type = ptr_type Cpp.void [concrete]
103+
// CHECK:STDOUT: %pattern_type.1f6: type = pattern_type %ptr.03c [concrete]
104+
// CHECK:STDOUT: }
105+
// CHECK:STDOUT:
106+
// CHECK:STDOUT: imports {
107+
// CHECK:STDOUT: %Cpp: <namespace> = namespace file.%Cpp.import_cpp, [concrete] {
108+
// CHECK:STDOUT: .S = %S.decl
109+
// CHECK:STDOUT: .void = Cpp.void
110+
// CHECK:STDOUT: import Cpp//...
111+
// CHECK:STDOUT: }
112+
// CHECK:STDOUT: %S.decl: type = class_decl @S [concrete = constants.%S] {} {}
113+
// CHECK:STDOUT: }
114+
// CHECK:STDOUT:
115+
// CHECK:STDOUT: fn @F(%input.param: %ptr.5c7) {
116+
// CHECK:STDOUT: !entry:
117+
// CHECK:STDOUT: name_binding_decl {
118+
// CHECK:STDOUT: %p.patt: %pattern_type.1f6 = value_binding_pattern p [concrete]
119+
// CHECK:STDOUT: }
120+
// CHECK:STDOUT: %input.ref: %ptr.5c7 = name_ref input, %input
121+
// CHECK:STDOUT: %.loc17_18: type = splice_block %ptr.loc17 [concrete = constants.%ptr.03c] {
122+
// CHECK:STDOUT: %Cpp.ref.loc17: <namespace> = name_ref Cpp, imports.%Cpp [concrete = imports.%Cpp]
123+
// CHECK:STDOUT: %void.ref: type = name_ref void, Cpp.void [concrete = Cpp.void]
124+
// CHECK:STDOUT: %ptr.loc17: type = ptr_type %void.ref [concrete = constants.%ptr.03c]
125+
// CHECK:STDOUT: }
126+
// CHECK:STDOUT: %.loc17_22: %ptr.03c = converted %input.ref, <error> [concrete = <error>]
127+
// CHECK:STDOUT: %p: %ptr.03c = value_binding p, <error> [concrete = <error>]
128+
// CHECK:STDOUT: <elided>
129+
// CHECK:STDOUT: }
130+
// CHECK:STDOUT:
131+
// CHECK:STDOUT: --- fail_todo_implicit_as_from_carbon_class_pointer_to_void_pointer.carbon
132+
// CHECK:STDOUT:
133+
// CHECK:STDOUT: constants {
134+
// CHECK:STDOUT: %C: type = class_type @C [concrete]
135+
// CHECK:STDOUT: %ptr.019: type = ptr_type %C [concrete]
136+
// CHECK:STDOUT: %ptr.03c: type = ptr_type Cpp.void [concrete]
137+
// CHECK:STDOUT: %pattern_type.1f6: type = pattern_type %ptr.03c [concrete]
138+
// CHECK:STDOUT: }
139+
// CHECK:STDOUT:
140+
// CHECK:STDOUT: imports {
141+
// CHECK:STDOUT: %Cpp: <namespace> = namespace file.%Cpp.import_cpp, [concrete] {
142+
// CHECK:STDOUT: .void = Cpp.void
143+
// CHECK:STDOUT: import Cpp//...
144+
// CHECK:STDOUT: }
145+
// CHECK:STDOUT: }
146+
// CHECK:STDOUT:
147+
// CHECK:STDOUT: fn @F(%input.param: %ptr.019) {
148+
// CHECK:STDOUT: !entry:
149+
// CHECK:STDOUT: name_binding_decl {
150+
// CHECK:STDOUT: %p.patt: %pattern_type.1f6 = value_binding_pattern p [concrete]
151+
// CHECK:STDOUT: }
152+
// CHECK:STDOUT: %input.ref: %ptr.019 = name_ref input, %input
153+
// CHECK:STDOUT: %.loc17_18: type = splice_block %ptr.loc17 [concrete = constants.%ptr.03c] {
154+
// CHECK:STDOUT: %Cpp.ref: <namespace> = name_ref Cpp, imports.%Cpp [concrete = imports.%Cpp]
155+
// CHECK:STDOUT: %void.ref: type = name_ref void, Cpp.void [concrete = Cpp.void]
156+
// CHECK:STDOUT: %ptr.loc17: type = ptr_type %void.ref [concrete = constants.%ptr.03c]
157+
// CHECK:STDOUT: }
158+
// CHECK:STDOUT: %.loc17_22: %ptr.03c = converted %input.ref, <error> [concrete = <error>]
159+
// CHECK:STDOUT: %p: %ptr.03c = value_binding p, <error> [concrete = <error>]
160+
// CHECK:STDOUT: <elided>
161+
// CHECK:STDOUT: }
162+
// CHECK:STDOUT:
163+
// CHECK:STDOUT: --- fail_todo_explicit_as_from_void_pointer_to_cpp_class_pointer.carbon
164+
// CHECK:STDOUT:
165+
// CHECK:STDOUT: constants {
166+
// CHECK:STDOUT: %ptr.03c: type = ptr_type Cpp.void [concrete]
167+
// CHECK:STDOUT: %S: type = class_type @S [concrete]
168+
// CHECK:STDOUT: %ptr.5c7: type = ptr_type %S [concrete]
169+
// CHECK:STDOUT: %pattern_type.259: type = pattern_type %ptr.5c7 [concrete]
170+
// CHECK:STDOUT: }
171+
// CHECK:STDOUT:
172+
// CHECK:STDOUT: imports {
173+
// CHECK:STDOUT: %Cpp: <namespace> = namespace file.%Cpp.import_cpp, [concrete] {
174+
// CHECK:STDOUT: .void = Cpp.void
175+
// CHECK:STDOUT: .S = %S.decl
176+
// CHECK:STDOUT: import Cpp//...
177+
// CHECK:STDOUT: }
178+
// CHECK:STDOUT: %S.decl: type = class_decl @S [concrete = constants.%S] {} {}
179+
// CHECK:STDOUT: }
180+
// CHECK:STDOUT:
181+
// CHECK:STDOUT: fn @F(%input.param: %ptr.03c) {
182+
// CHECK:STDOUT: !entry:
183+
// CHECK:STDOUT: name_binding_decl {
184+
// CHECK:STDOUT: %p.patt: %pattern_type.259 = value_binding_pattern p [concrete]
185+
// CHECK:STDOUT: }
186+
// CHECK:STDOUT: %input.ref: %ptr.03c = name_ref input, %input
187+
// CHECK:STDOUT: %Cpp.ref.loc17_28: <namespace> = name_ref Cpp, imports.%Cpp [concrete = imports.%Cpp]
188+
// CHECK:STDOUT: %S.ref.loc17_31: type = name_ref S, imports.%S.decl [concrete = constants.%S]
189+
// CHECK:STDOUT: %ptr.loc17_33: type = ptr_type %S.ref.loc17_31 [concrete = constants.%ptr.5c7]
190+
// CHECK:STDOUT: %.loc17_25: %ptr.5c7 = converted %input.ref, <error> [concrete = <error>]
191+
// CHECK:STDOUT: %.loc17_15: type = splice_block %ptr.loc17_15 [concrete = constants.%ptr.5c7] {
192+
// CHECK:STDOUT: %Cpp.ref.loc17_10: <namespace> = name_ref Cpp, imports.%Cpp [concrete = imports.%Cpp]
193+
// CHECK:STDOUT: %S.ref.loc17_13: type = name_ref S, imports.%S.decl [concrete = constants.%S]
194+
// CHECK:STDOUT: %ptr.loc17_15: type = ptr_type %S.ref.loc17_13 [concrete = constants.%ptr.5c7]
195+
// CHECK:STDOUT: }
196+
// CHECK:STDOUT: %p: %ptr.5c7 = value_binding p, <error> [concrete = <error>]
197+
// CHECK:STDOUT: <elided>
198+
// CHECK:STDOUT: }
199+
// CHECK:STDOUT:
200+
// CHECK:STDOUT: --- fail_todo_explicit_as_from_void_pointer_to_carbon_class_pointer.carbon
201+
// CHECK:STDOUT:
202+
// CHECK:STDOUT: constants {
203+
// CHECK:STDOUT: %C: type = class_type @C [concrete]
204+
// CHECK:STDOUT: %ptr.03c: type = ptr_type Cpp.void [concrete]
205+
// CHECK:STDOUT: %ptr.019: type = ptr_type %C [concrete]
206+
// CHECK:STDOUT: %pattern_type.44a: type = pattern_type %ptr.019 [concrete]
207+
// CHECK:STDOUT: }
208+
// CHECK:STDOUT:
209+
// CHECK:STDOUT: imports {
210+
// CHECK:STDOUT: }
211+
// CHECK:STDOUT:
212+
// CHECK:STDOUT: fn @F(%input.param: %ptr.03c) {
213+
// CHECK:STDOUT: !entry:
214+
// CHECK:STDOUT: name_binding_decl {
215+
// CHECK:STDOUT: %p.patt: %pattern_type.44a = value_binding_pattern p [concrete]
216+
// CHECK:STDOUT: }
217+
// CHECK:STDOUT: %input.ref: %ptr.03c = name_ref input, %input
218+
// CHECK:STDOUT: %C.ref.loc17_24: type = name_ref C, file.%C.decl [concrete = constants.%C]
219+
// CHECK:STDOUT: %ptr.loc17_25: type = ptr_type %C.ref.loc17_24 [concrete = constants.%ptr.019]
220+
// CHECK:STDOUT: %.loc17_21: %ptr.019 = converted %input.ref, <error> [concrete = <error>]
221+
// CHECK:STDOUT: %.loc17_11: type = splice_block %ptr.loc17_11 [concrete = constants.%ptr.019] {
222+
// CHECK:STDOUT: %C.ref.loc17_10: type = name_ref C, file.%C.decl [concrete = constants.%C]
223+
// CHECK:STDOUT: %ptr.loc17_11: type = ptr_type %C.ref.loc17_10 [concrete = constants.%ptr.019]
224+
// CHECK:STDOUT: }
225+
// CHECK:STDOUT: %p: %ptr.019 = value_binding p, <error> [concrete = <error>]
226+
// CHECK:STDOUT: <elided>
227+
// CHECK:STDOUT: }
228+
// CHECK:STDOUT:

0 commit comments

Comments
 (0)