access.carbon 47 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003
  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/int.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/class/access.carbon
  10. // TIP: To dump output, run:
  11. // TIP: bazel run //toolchain/testing:file_test -- --dump_output --file_tests=toolchain/check/testdata/interop/cpp/class/access.carbon
  12. // ============================================================================
  13. // Public non-function member
  14. // ============================================================================
  15. // --- non_function_member_public.h
  16. struct S {
  17. int instance_data;
  18. static int static_data;
  19. };
  20. // --- import_non_function_member_public.carbon
  21. library "[[@TEST_NAME]]";
  22. import Cpp library "non_function_member_public.h";
  23. fn F(s: Cpp.S) {
  24. //@dump-sem-ir-begin
  25. let instance_data: i32 = s.instance_data;
  26. let static_data: i32 = Cpp.S.static_data;
  27. //@dump-sem-ir-end
  28. }
  29. // --- import_non_function_member_public_extend.carbon
  30. library "[[@TEST_NAME]]";
  31. import Cpp library "non_function_member_public.h";
  32. class Derived {
  33. extend base: Cpp.S;
  34. }
  35. fn F(d: Derived) {
  36. //@dump-sem-ir-begin
  37. let instance_data: i32 = d.instance_data;
  38. let static_data: i32 = Derived.static_data;
  39. //@dump-sem-ir-end
  40. }
  41. // ============================================================================
  42. // Protected non-function member
  43. // ============================================================================
  44. // --- non_function_member_protected.h
  45. class C {
  46. protected:
  47. int instance_data;
  48. static int static_data;
  49. };
  50. // --- fail_import_non_function_member_protected.carbon
  51. library "[[@TEST_NAME]]";
  52. import Cpp library "non_function_member_protected.h";
  53. fn F(c: Cpp.C) {
  54. // CHECK:STDERR: fail_import_non_function_member_protected.carbon:[[@LINE+8]]:28: error: cannot access protected member `instance_data` of type `Cpp.C` [ClassInvalidMemberAccess]
  55. // CHECK:STDERR: let instance_data: i32 = c.instance_data;
  56. // CHECK:STDERR: ^~~~~~~~~~~~~~~
  57. // CHECK:STDERR: fail_import_non_function_member_protected.carbon:[[@LINE-6]]:10: in file included here [InCppInclude]
  58. // CHECK:STDERR: ./non_function_member_protected.h:2:7: note: declared here [ClassMemberDeclaration]
  59. // CHECK:STDERR: class C {
  60. // CHECK:STDERR: ^
  61. // CHECK:STDERR:
  62. let instance_data: i32 = c.instance_data;
  63. // CHECK:STDERR: fail_import_non_function_member_protected.carbon:[[@LINE+7]]:26: error: cannot access protected member `static_data` of type `Cpp.C` [ClassInvalidMemberAccess]
  64. // CHECK:STDERR: let static_data: i32 = Cpp.C.static_data;
  65. // CHECK:STDERR: ^~~~~~~~~~~~~~~~~
  66. // CHECK:STDERR: fail_import_non_function_member_protected.carbon:[[@LINE+4]]:26: note: declared here [ClassMemberDeclaration]
  67. // CHECK:STDERR: let static_data: i32 = Cpp.C.static_data;
  68. // CHECK:STDERR: ^~~~~~~~~~~~~~~~~
  69. // CHECK:STDERR:
  70. let static_data: i32 = Cpp.C.static_data;
  71. }
  72. // --- fail_import_non_function_member_protected_extend.carbon
  73. library "[[@TEST_NAME]]";
  74. import Cpp library "non_function_member_protected.h";
  75. class Derived {
  76. extend base: Cpp.C;
  77. }
  78. fn F(d: Derived) {
  79. // CHECK:STDERR: fail_import_non_function_member_protected_extend.carbon:[[@LINE+8]]:28: error: cannot access protected member `instance_data` of type `Derived` [ClassInvalidMemberAccess]
  80. // CHECK:STDERR: let instance_data: i32 = d.instance_data;
  81. // CHECK:STDERR: ^~~~~~~~~~~~~~~
  82. // CHECK:STDERR: fail_import_non_function_member_protected_extend.carbon:[[@LINE-10]]:10: in file included here [InCppInclude]
  83. // CHECK:STDERR: ./non_function_member_protected.h:2:7: note: declared here [ClassMemberDeclaration]
  84. // CHECK:STDERR: class C {
  85. // CHECK:STDERR: ^
  86. // CHECK:STDERR:
  87. let instance_data: i32 = d.instance_data;
  88. // CHECK:STDERR: fail_import_non_function_member_protected_extend.carbon:[[@LINE+7]]:26: error: cannot access protected member `static_data` of type `Derived` [ClassInvalidMemberAccess]
  89. // CHECK:STDERR: let static_data: i32 = Derived.static_data;
  90. // CHECK:STDERR: ^~~~~~~~~~~~~~~~~~~
  91. // CHECK:STDERR: fail_import_non_function_member_protected_extend.carbon:[[@LINE+4]]:26: note: declared here [ClassMemberDeclaration]
  92. // CHECK:STDERR: let static_data: i32 = Derived.static_data;
  93. // CHECK:STDERR: ^~~~~~~~~~~~~~~~~~~
  94. // CHECK:STDERR:
  95. let static_data: i32 = Derived.static_data;
  96. }
  97. // --- import_non_function_member_protected_extend_call_in_member.carbon
  98. library "[[@TEST_NAME]]";
  99. import Cpp library "non_function_member_protected.h";
  100. class Derived {
  101. extend base: Cpp.C;
  102. fn F[self: Self]() {
  103. //@dump-sem-ir-begin
  104. let instance_data: i32 = self.instance_data;
  105. let unqualified_static_data: i32 = static_data;
  106. let derived_static_data: i32 = Derived.static_data;
  107. let base_static_data: i32 = Cpp.C.static_data;
  108. //@dump-sem-ir-end
  109. }
  110. }
  111. // ============================================================================
  112. // Private non-function member
  113. // ============================================================================
  114. // --- non_function_member_private.h
  115. class C {
  116. int instance_data;
  117. static int static_data;
  118. };
  119. // --- fail_import_non_function_member_private.carbon
  120. library "[[@TEST_NAME]]";
  121. import Cpp library "non_function_member_private.h";
  122. fn F(c: Cpp.C) {
  123. // CHECK:STDERR: fail_import_non_function_member_private.carbon:[[@LINE+8]]:28: error: cannot access private member `instance_data` of type `Cpp.C` [ClassInvalidMemberAccess]
  124. // CHECK:STDERR: let instance_data: i32 = c.instance_data;
  125. // CHECK:STDERR: ^~~~~~~~~~~~~~~
  126. // CHECK:STDERR: fail_import_non_function_member_private.carbon:[[@LINE-6]]:10: in file included here [InCppInclude]
  127. // CHECK:STDERR: ./non_function_member_private.h:2:7: note: declared here [ClassMemberDeclaration]
  128. // CHECK:STDERR: class C {
  129. // CHECK:STDERR: ^
  130. // CHECK:STDERR:
  131. let instance_data: i32 = c.instance_data;
  132. // CHECK:STDERR: fail_import_non_function_member_private.carbon:[[@LINE+7]]:26: error: cannot access private member `static_data` of type `Cpp.C` [ClassInvalidMemberAccess]
  133. // CHECK:STDERR: let static_data: i32 = Cpp.C.static_data;
  134. // CHECK:STDERR: ^~~~~~~~~~~~~~~~~
  135. // CHECK:STDERR: fail_import_non_function_member_private.carbon:[[@LINE+4]]:26: note: declared here [ClassMemberDeclaration]
  136. // CHECK:STDERR: let static_data: i32 = Cpp.C.static_data;
  137. // CHECK:STDERR: ^~~~~~~~~~~~~~~~~
  138. // CHECK:STDERR:
  139. let static_data: i32 = Cpp.C.static_data;
  140. }
  141. // --- fail_import_non_function_member_private_extend.carbon
  142. library "[[@TEST_NAME]]";
  143. import Cpp library "non_function_member_private.h";
  144. class Derived {
  145. extend base: Cpp.C;
  146. fn F[self: Self]() {
  147. // CHECK:STDERR: fail_import_non_function_member_private_extend.carbon:[[@LINE+8]]:30: error: cannot access private member `instance_data` of type `Cpp.C` [ClassInvalidMemberAccess]
  148. // CHECK:STDERR: let instance_data: i32 = self.instance_data;
  149. // CHECK:STDERR: ^~~~~~~~~~~~~~~~~~
  150. // CHECK:STDERR: fail_import_non_function_member_private_extend.carbon:[[@LINE-8]]:10: in file included here [InCppInclude]
  151. // CHECK:STDERR: ./non_function_member_private.h:2:7: note: declared here [ClassMemberDeclaration]
  152. // CHECK:STDERR: class C {
  153. // CHECK:STDERR: ^
  154. // CHECK:STDERR:
  155. let instance_data: i32 = self.instance_data;
  156. }
  157. }
  158. fn F(d: Derived) {
  159. // CHECK:STDERR: fail_import_non_function_member_private_extend.carbon:[[@LINE+8]]:28: error: cannot access private member `instance_data` of type `Cpp.C` [ClassInvalidMemberAccess]
  160. // CHECK:STDERR: let instance_data: i32 = d.instance_data;
  161. // CHECK:STDERR: ^~~~~~~~~~~~~~~
  162. // CHECK:STDERR: fail_import_non_function_member_private_extend.carbon:[[@LINE-21]]:10: in file included here [InCppInclude]
  163. // CHECK:STDERR: ./non_function_member_private.h:2:7: note: declared here [ClassMemberDeclaration]
  164. // CHECK:STDERR: class C {
  165. // CHECK:STDERR: ^
  166. // CHECK:STDERR:
  167. let instance_data: i32 = d.instance_data;
  168. // CHECK:STDERR: fail_import_non_function_member_private_extend.carbon:[[@LINE+7]]:34: error: cannot access private member `static_data` of type `Cpp.C` [ClassInvalidMemberAccess]
  169. // CHECK:STDERR: let derived_static_data: i32 = Derived.static_data;
  170. // CHECK:STDERR: ^~~~~~~~~~~~~~~~~~~
  171. // CHECK:STDERR: fail_import_non_function_member_private_extend.carbon:[[@LINE+4]]:34: note: declared here [ClassMemberDeclaration]
  172. // CHECK:STDERR: let derived_static_data: i32 = Derived.static_data;
  173. // CHECK:STDERR: ^~~~~~~~~~~~~~~~~~~
  174. // CHECK:STDERR:
  175. let derived_static_data: i32 = Derived.static_data;
  176. // CHECK:STDERR: fail_import_non_function_member_private_extend.carbon:[[@LINE+7]]:31: error: cannot access private member `static_data` of type `Cpp.C` [ClassInvalidMemberAccess]
  177. // CHECK:STDERR: let base_static_data: i32 = Cpp.C.static_data;
  178. // CHECK:STDERR: ^~~~~~~~~~~~~~~~~
  179. // CHECK:STDERR: fail_import_non_function_member_private_extend.carbon:[[@LINE-4]]:34: note: declared here [ClassMemberDeclaration]
  180. // CHECK:STDERR: let derived_static_data: i32 = Derived.static_data;
  181. // CHECK:STDERR: ^~~~~~~~~~~~~~~~~~~
  182. // CHECK:STDERR:
  183. let base_static_data: i32 = Cpp.C.static_data;
  184. }
  185. // --- todo_fail_import_non_function_member_private_extend_static_within_member_function.carbon
  186. library "[[@TEST_NAME]]";
  187. import Cpp library "non_function_member_private.h";
  188. class Derived {
  189. extend base: Cpp.C;
  190. fn F() {
  191. // TODO: `C.static_data` is private, so this should fail.
  192. let unqualified_static_data: i32 = static_data;
  193. }
  194. }
  195. // ============================================================================
  196. // Public function member
  197. // ============================================================================
  198. // --- function_member_public.h
  199. struct S {
  200. auto instance_fn() -> void;
  201. static auto static_fn() -> void;
  202. };
  203. // --- import_function_member_public.carbon
  204. library "[[@TEST_NAME]]";
  205. import Cpp library "function_member_public.h";
  206. fn F(s: Cpp.S*) {
  207. //@dump-sem-ir-begin
  208. s->instance_fn();
  209. Cpp.S.static_fn();
  210. //@dump-sem-ir-end
  211. }
  212. // ============================================================================
  213. // Protected function member
  214. // ============================================================================
  215. // --- function_member_protected.h
  216. class C {
  217. protected:
  218. auto instance_fn() -> void;
  219. static auto static_fn() -> void;
  220. };
  221. // --- fail_import_function_member_protected.carbon
  222. library "[[@TEST_NAME]]";
  223. import Cpp library "function_member_protected.h";
  224. fn F(c: Cpp.C*) {
  225. // CHECK:STDERR: fail_import_function_member_protected.carbon:[[@LINE+5]]:3: error: cannot access protected member `instance_fn` of type `Cpp.C` [ClassInvalidMemberAccess]
  226. // CHECK:STDERR: c->instance_fn();
  227. // CHECK:STDERR: ^~~~~~~~~~~~~~
  228. // CHECK:STDERR: fail_import_function_member_protected.carbon: note: declared here [ClassMemberDeclaration]
  229. // CHECK:STDERR:
  230. c->instance_fn();
  231. // CHECK:STDERR: fail_import_function_member_protected.carbon:[[@LINE+5]]:3: error: cannot access protected member `static_fn` of type `Cpp.C` [ClassInvalidMemberAccess]
  232. // CHECK:STDERR: Cpp.C.static_fn();
  233. // CHECK:STDERR: ^~~~~~~~~~~~~~~
  234. // CHECK:STDERR: fail_import_function_member_protected.carbon: note: declared here [ClassMemberDeclaration]
  235. // CHECK:STDERR:
  236. Cpp.C.static_fn();
  237. }
  238. // --- fail_todo_import_function_member_protected_extend_call_instance_in_member.carbon
  239. library "[[@TEST_NAME]]";
  240. import Cpp library "function_member_protected.h";
  241. class Derived {
  242. extend base: Cpp.C;
  243. fn F[self: Self]() {
  244. //@dump-sem-ir-begin
  245. // TODO: It should be possible to call protected methods in the base class.
  246. // CHECK:STDERR: fail_todo_import_function_member_protected_extend_call_instance_in_member.carbon:[[@LINE+4]]:5: error: call argument of type `Derived` is not supported [CppCallArgTypeNotSupported]
  247. // CHECK:STDERR: self.instance_fn();
  248. // CHECK:STDERR: ^~~~
  249. // CHECK:STDERR:
  250. self.instance_fn();
  251. //@dump-sem-ir-end
  252. }
  253. }
  254. // --- import_function_member_protected_extend_call_static_in_member.carbon
  255. library "[[@TEST_NAME]]";
  256. import Cpp library "function_member_protected.h";
  257. class Derived {
  258. extend base: Cpp.C;
  259. fn F[self: Self]() {
  260. //@dump-sem-ir-begin
  261. static_fn();
  262. Derived.static_fn();
  263. Cpp.C.static_fn();
  264. //@dump-sem-ir-end
  265. }
  266. }
  267. // ============================================================================
  268. // Private function member
  269. // ============================================================================
  270. // --- function_member_private.h
  271. class C {
  272. private:
  273. auto instance_fn() -> void;
  274. static auto static_fn() -> void;
  275. };
  276. // --- fail_import_function_member_private.carbon
  277. library "[[@TEST_NAME]]";
  278. import Cpp library "function_member_private.h";
  279. class Derived {
  280. extend base: Cpp.C;
  281. fn F[self: Self]() {
  282. // CHECK:STDERR: fail_import_function_member_private.carbon:[[@LINE+5]]:5: error: cannot access private member `instance_fn` of type `Cpp.C` [ClassInvalidMemberAccess]
  283. // CHECK:STDERR: self.instance_fn();
  284. // CHECK:STDERR: ^~~~~~~~~~~~~~~~
  285. // CHECK:STDERR: fail_import_function_member_private.carbon: note: declared here [ClassMemberDeclaration]
  286. // CHECK:STDERR:
  287. self.instance_fn();
  288. // CHECK:STDERR: fail_import_function_member_private.carbon:[[@LINE+5]]:5: error: cannot access private member `static_fn` of type `Cpp.C` [ClassInvalidMemberAccess]
  289. // CHECK:STDERR: static_fn();
  290. // CHECK:STDERR: ^~~~~~~~~~~
  291. // CHECK:STDERR: fail_import_function_member_private.carbon: note: declared here [ClassMemberDeclaration]
  292. // CHECK:STDERR:
  293. static_fn();
  294. // CHECK:STDERR: fail_import_function_member_private.carbon:[[@LINE+5]]:5: error: cannot access private member `static_fn` of type `Cpp.C` [ClassInvalidMemberAccess]
  295. // CHECK:STDERR: Derived.static_fn();
  296. // CHECK:STDERR: ^~~~~~~~~~~~~~~~~
  297. // CHECK:STDERR: fail_import_function_member_private.carbon: note: declared here [ClassMemberDeclaration]
  298. // CHECK:STDERR:
  299. Derived.static_fn();
  300. // CHECK:STDERR: fail_import_function_member_private.carbon:[[@LINE+5]]:5: error: cannot access private member `static_fn` of type `Cpp.C` [ClassInvalidMemberAccess]
  301. // CHECK:STDERR: Cpp.C.static_fn();
  302. // CHECK:STDERR: ^~~~~~~~~~~~~~~
  303. // CHECK:STDERR: fail_import_function_member_private.carbon: note: declared here [ClassMemberDeclaration]
  304. // CHECK:STDERR:
  305. Cpp.C.static_fn();
  306. }
  307. }
  308. fn F(c: Cpp.C*) {
  309. // CHECK:STDERR: fail_import_function_member_private.carbon:[[@LINE+5]]:3: error: cannot access private member `instance_fn` of type `Cpp.C` [ClassInvalidMemberAccess]
  310. // CHECK:STDERR: c->instance_fn();
  311. // CHECK:STDERR: ^~~~~~~~~~~~~~
  312. // CHECK:STDERR: fail_import_function_member_private.carbon: note: declared here [ClassMemberDeclaration]
  313. // CHECK:STDERR:
  314. c->instance_fn();
  315. // CHECK:STDERR: fail_import_function_member_private.carbon:[[@LINE+5]]:3: error: cannot access private member `static_fn` of type `Cpp.C` [ClassInvalidMemberAccess]
  316. // CHECK:STDERR: Derived.static_fn();
  317. // CHECK:STDERR: ^~~~~~~~~~~~~~~~~
  318. // CHECK:STDERR: fail_import_function_member_private.carbon: note: declared here [ClassMemberDeclaration]
  319. // CHECK:STDERR:
  320. Derived.static_fn();
  321. // CHECK:STDERR: fail_import_function_member_private.carbon:[[@LINE+5]]:3: error: cannot access private member `static_fn` of type `Cpp.C` [ClassInvalidMemberAccess]
  322. // CHECK:STDERR: Cpp.C.static_fn();
  323. // CHECK:STDERR: ^~~~~~~~~~~~~~~
  324. // CHECK:STDERR: fail_import_function_member_private.carbon: note: declared here [ClassMemberDeclaration]
  325. // CHECK:STDERR:
  326. Cpp.C.static_fn();
  327. }
  328. // ============================================================================
  329. // Overload set
  330. // ============================================================================
  331. // --- overload_set.h
  332. class C {
  333. public:
  334. C();
  335. static auto foo() -> void;
  336. protected:
  337. C(int);
  338. static auto foo(int a) -> void;
  339. private:
  340. C(int, int);
  341. static auto foo(int a, int b) -> void;
  342. };
  343. // --- import_overload_set_public.carbon
  344. library "[[@TEST_NAME]]";
  345. import Cpp library "overload_set.h";
  346. fn F() {
  347. //@dump-sem-ir-begin
  348. Cpp.C.C();
  349. Cpp.C.foo();
  350. //@dump-sem-ir-end
  351. }
  352. // --- fail_import_overload_set_protected.carbon
  353. library "[[@TEST_NAME]]";
  354. import Cpp library "overload_set.h";
  355. fn F() {
  356. // CHECK:STDERR: fail_import_overload_set_protected.carbon:[[@LINE+5]]:3: error: cannot access protected member `C` of type `Cpp.C` [ClassInvalidMemberAccess]
  357. // CHECK:STDERR: Cpp.C.C(1 as i32);
  358. // CHECK:STDERR: ^~~~~~~~~~~~~~~~~
  359. // CHECK:STDERR: fail_import_overload_set_protected.carbon: note: declared here [ClassMemberDeclaration]
  360. // CHECK:STDERR:
  361. Cpp.C.C(1 as i32);
  362. // CHECK:STDERR: fail_import_overload_set_protected.carbon:[[@LINE+5]]:3: error: cannot access protected member `foo` of type `Cpp.C` [ClassInvalidMemberAccess]
  363. // CHECK:STDERR: Cpp.C.foo(1 as i32);
  364. // CHECK:STDERR: ^~~~~~~~~~~~~~~~~~~
  365. // CHECK:STDERR: fail_import_overload_set_protected.carbon: note: declared here [ClassMemberDeclaration]
  366. // CHECK:STDERR:
  367. Cpp.C.foo(1 as i32);
  368. }
  369. // --- import_overload_set_protected_base.carbon
  370. library "[[@TEST_NAME]]";
  371. import Cpp library "overload_set.h";
  372. class D {
  373. extend base: Cpp.C;
  374. fn MakePublic() -> D {
  375. return {.base = C()};
  376. }
  377. fn MakeProtected() -> D {
  378. return {.base = C(1 as i32)};
  379. }
  380. fn CallPublic() {
  381. foo();
  382. }
  383. fn CallProtected() {
  384. foo(1 as i32);
  385. }
  386. }
  387. // --- fail_import_overload_set_private.carbon
  388. library "[[@TEST_NAME]]";
  389. import Cpp library "overload_set.h";
  390. fn F() {
  391. // CHECK:STDERR: fail_import_overload_set_private.carbon:[[@LINE+5]]:3: error: cannot access private member `C` of type `Cpp.C` [ClassInvalidMemberAccess]
  392. // CHECK:STDERR: Cpp.C.C(1 as i32, 2 as i32);
  393. // CHECK:STDERR: ^~~~~~~~~~~~~~~~~~~~~~~~~~~
  394. // CHECK:STDERR: fail_import_overload_set_private.carbon: note: declared here [ClassMemberDeclaration]
  395. // CHECK:STDERR:
  396. Cpp.C.C(1 as i32, 2 as i32);
  397. // CHECK:STDERR: fail_import_overload_set_private.carbon:[[@LINE+5]]:3: error: cannot access private member `foo` of type `Cpp.C` [ClassInvalidMemberAccess]
  398. // CHECK:STDERR: Cpp.C.foo(1 as i32, 2 as i32);
  399. // CHECK:STDERR: ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  400. // CHECK:STDERR: fail_import_overload_set_private.carbon: note: declared here [ClassMemberDeclaration]
  401. // CHECK:STDERR:
  402. Cpp.C.foo(1 as i32, 2 as i32);
  403. }
  404. // --- fail_import_overload_set_private_base.carbon
  405. library "[[@TEST_NAME]]";
  406. import Cpp library "overload_set.h";
  407. class D {
  408. extend base: Cpp.C;
  409. fn MakePrivate() -> D {
  410. // CHECK:STDERR: fail_import_overload_set_private_base.carbon:[[@LINE+5]]:21: error: cannot access private member `C` of type `Cpp.C` [ClassInvalidMemberAccess]
  411. // CHECK:STDERR: return {.base = C(1 as i32, 2 as i32)};
  412. // CHECK:STDERR: ^~~~~~~~~~~~~~~~~~~~~
  413. // CHECK:STDERR: fail_import_overload_set_private_base.carbon: note: declared here [ClassMemberDeclaration]
  414. // CHECK:STDERR:
  415. return {.base = C(1 as i32, 2 as i32)};
  416. }
  417. fn CallPrivate() {
  418. // CHECK:STDERR: fail_import_overload_set_private_base.carbon:[[@LINE+5]]:5: error: cannot access private member `foo` of type `Cpp.C` [ClassInvalidMemberAccess]
  419. // CHECK:STDERR: foo(1 as i32, 2 as i32);
  420. // CHECK:STDERR: ^~~~~~~~~~~~~~~~~~~~~~~
  421. // CHECK:STDERR: fail_import_overload_set_private_base.carbon: note: declared here [ClassMemberDeclaration]
  422. // CHECK:STDERR:
  423. foo(1 as i32, 2 as i32);
  424. }
  425. }
  426. // ============================================================================
  427. // Base class
  428. // ============================================================================
  429. // --- base_class.h
  430. struct Base {
  431. static auto foo() -> void;
  432. };
  433. class DerivedPublic : public Base {};
  434. class DerivedProtected : protected Base {};
  435. class DerivedPrivate : private Base {};
  436. // --- import_base_class_public.carbon
  437. library "[[@TEST_NAME]]";
  438. import Cpp library "base_class.h";
  439. fn F() {
  440. //@dump-sem-ir-begin
  441. Cpp.DerivedPublic.foo();
  442. //@dump-sem-ir-end
  443. }
  444. // --- fail_import_base_class_protected.carbon
  445. library "[[@TEST_NAME]]";
  446. import Cpp library "base_class.h";
  447. fn F() {
  448. // CHECK:STDERR: fail_import_base_class_protected.carbon:[[@LINE+5]]:3: error: cannot access protected member `foo` of type `Cpp.DerivedProtected` [ClassInvalidMemberAccess]
  449. // CHECK:STDERR: Cpp.DerivedProtected.foo();
  450. // CHECK:STDERR: ^~~~~~~~~~~~~~~~~~~~~~~~
  451. // CHECK:STDERR: fail_import_base_class_protected.carbon: note: declared here [ClassMemberDeclaration]
  452. // CHECK:STDERR:
  453. Cpp.DerivedProtected.foo();
  454. }
  455. // --- use_base_class_protected_from_derived.carbon
  456. library "[[@TEST_NAME]]";
  457. import Cpp library "base_class.h";
  458. class Derived {
  459. extend base: Cpp.DerivedProtected;
  460. fn F() {
  461. // OK, we can access a protected member of our base class.
  462. Cpp.DerivedProtected.foo();
  463. }
  464. }
  465. // --- fail_import_base_class_private.carbon
  466. library "[[@TEST_NAME]]";
  467. import Cpp library "base_class.h";
  468. fn F() {
  469. // CHECK:STDERR: fail_import_base_class_private.carbon:[[@LINE+5]]:3: error: cannot access private member `foo` of type `Cpp.DerivedPrivate` [ClassInvalidMemberAccess]
  470. // CHECK:STDERR: Cpp.DerivedPrivate.foo();
  471. // CHECK:STDERR: ^~~~~~~~~~~~~~~~~~~~~~
  472. // CHECK:STDERR: fail_import_base_class_private.carbon: note: declared here [ClassMemberDeclaration]
  473. // CHECK:STDERR:
  474. Cpp.DerivedPrivate.foo();
  475. }
  476. // CHECK:STDOUT: --- import_non_function_member_public.carbon
  477. // CHECK:STDOUT:
  478. // CHECK:STDOUT: constants {
  479. // CHECK:STDOUT: %S: type = class_type @S [concrete]
  480. // CHECK:STDOUT: %int_32: Core.IntLiteral = int_value 32 [concrete]
  481. // CHECK:STDOUT: %i32: type = class_type @Int, @Int(%int_32) [concrete]
  482. // CHECK:STDOUT: %S.elem: type = unbound_element_type %S, %i32 [concrete]
  483. // CHECK:STDOUT: %pattern_type.7ce: type = pattern_type %i32 [concrete]
  484. // CHECK:STDOUT: }
  485. // CHECK:STDOUT:
  486. // CHECK:STDOUT: imports {
  487. // CHECK:STDOUT: %Cpp: <namespace> = namespace file.%Cpp.import_cpp, [concrete] {
  488. // CHECK:STDOUT: .S = %S.decl
  489. // CHECK:STDOUT: import Cpp//...
  490. // CHECK:STDOUT: }
  491. // CHECK:STDOUT: %S.decl: type = class_decl @S [concrete = constants.%S] {} {}
  492. // CHECK:STDOUT: %static_data.var: ref %i32 = var %static_data.var_patt
  493. // CHECK:STDOUT: }
  494. // CHECK:STDOUT:
  495. // CHECK:STDOUT: fn @F(%s.param: %S) {
  496. // CHECK:STDOUT: !entry:
  497. // CHECK:STDOUT: name_binding_decl {
  498. // CHECK:STDOUT: %instance_data.patt: %pattern_type.7ce = binding_pattern instance_data [concrete]
  499. // CHECK:STDOUT: }
  500. // CHECK:STDOUT: %s.ref: %S = name_ref s, %s
  501. // CHECK:STDOUT: %instance_data.ref: %S.elem = name_ref instance_data, @S.%.1 [concrete = @S.%.1]
  502. // CHECK:STDOUT: %.loc8_29.1: ref %i32 = class_element_access %s.ref, element0
  503. // CHECK:STDOUT: %.loc8_29.2: %i32 = bind_value %.loc8_29.1
  504. // CHECK:STDOUT: %.loc8_22: type = splice_block %i32.loc8 [concrete = constants.%i32] {
  505. // CHECK:STDOUT: %int_32.loc8: Core.IntLiteral = int_value 32 [concrete = constants.%int_32]
  506. // CHECK:STDOUT: %i32.loc8: type = class_type @Int, @Int(constants.%int_32) [concrete = constants.%i32]
  507. // CHECK:STDOUT: }
  508. // CHECK:STDOUT: %instance_data: %i32 = bind_name instance_data, %.loc8_29.2
  509. // CHECK:STDOUT: name_binding_decl {
  510. // CHECK:STDOUT: %static_data.patt: %pattern_type.7ce = binding_pattern static_data [concrete]
  511. // CHECK:STDOUT: }
  512. // CHECK:STDOUT: %Cpp.ref.loc9: <namespace> = name_ref Cpp, imports.%Cpp [concrete = imports.%Cpp]
  513. // CHECK:STDOUT: %S.ref.loc9: type = name_ref S, imports.%S.decl [concrete = constants.%S]
  514. // CHECK:STDOUT: <elided>
  515. // CHECK:STDOUT: %static_data.ref: ref %i32 = name_ref static_data, imports.%static_data.var
  516. // CHECK:STDOUT: %.loc9_20: type = splice_block %i32.loc9 [concrete = constants.%i32] {
  517. // CHECK:STDOUT: %int_32.loc9: Core.IntLiteral = int_value 32 [concrete = constants.%int_32]
  518. // CHECK:STDOUT: %i32.loc9: type = class_type @Int, @Int(constants.%int_32) [concrete = constants.%i32]
  519. // CHECK:STDOUT: }
  520. // CHECK:STDOUT: %.loc9_31: %i32 = bind_value %static_data.ref
  521. // CHECK:STDOUT: %static_data: %i32 = bind_name static_data, %.loc9_31
  522. // CHECK:STDOUT: <elided>
  523. // CHECK:STDOUT: }
  524. // CHECK:STDOUT:
  525. // CHECK:STDOUT: --- import_non_function_member_public_extend.carbon
  526. // CHECK:STDOUT:
  527. // CHECK:STDOUT: constants {
  528. // CHECK:STDOUT: %Derived: type = class_type @Derived [concrete]
  529. // CHECK:STDOUT: %S: type = class_type @S [concrete]
  530. // CHECK:STDOUT: %int_32: Core.IntLiteral = int_value 32 [concrete]
  531. // CHECK:STDOUT: %i32: type = class_type @Int, @Int(%int_32) [concrete]
  532. // CHECK:STDOUT: %S.elem: type = unbound_element_type %S, %i32 [concrete]
  533. // CHECK:STDOUT: %pattern_type.7ce: type = pattern_type %i32 [concrete]
  534. // CHECK:STDOUT: }
  535. // CHECK:STDOUT:
  536. // CHECK:STDOUT: imports {
  537. // CHECK:STDOUT: %static_data.var: ref %i32 = var %static_data.var_patt
  538. // CHECK:STDOUT: }
  539. // CHECK:STDOUT:
  540. // CHECK:STDOUT: fn @F(%d.param: %Derived) {
  541. // CHECK:STDOUT: !entry:
  542. // CHECK:STDOUT: name_binding_decl {
  543. // CHECK:STDOUT: %instance_data.patt: %pattern_type.7ce = binding_pattern instance_data [concrete]
  544. // CHECK:STDOUT: }
  545. // CHECK:STDOUT: %d.ref: %Derived = name_ref d, %d
  546. // CHECK:STDOUT: %instance_data.ref: %S.elem = name_ref instance_data, @S.%.1 [concrete = @S.%.1]
  547. // CHECK:STDOUT: %.loc12_29.1: ref %S = class_element_access %d.ref, element0
  548. // CHECK:STDOUT: %.loc12_29.2: ref %S = converted %d.ref, %.loc12_29.1
  549. // CHECK:STDOUT: %.loc12_29.3: ref %i32 = class_element_access %.loc12_29.2, element0
  550. // CHECK:STDOUT: %.loc12_22: type = splice_block %i32.loc12 [concrete = constants.%i32] {
  551. // CHECK:STDOUT: %int_32.loc12: Core.IntLiteral = int_value 32 [concrete = constants.%int_32]
  552. // CHECK:STDOUT: %i32.loc12: type = class_type @Int, @Int(constants.%int_32) [concrete = constants.%i32]
  553. // CHECK:STDOUT: }
  554. // CHECK:STDOUT: %.loc12_29.4: %i32 = bind_value %.loc12_29.3
  555. // CHECK:STDOUT: %instance_data: %i32 = bind_name instance_data, %.loc12_29.4
  556. // CHECK:STDOUT: name_binding_decl {
  557. // CHECK:STDOUT: %static_data.patt: %pattern_type.7ce = binding_pattern static_data [concrete]
  558. // CHECK:STDOUT: }
  559. // CHECK:STDOUT: %Derived.ref.loc13: type = name_ref Derived, file.%Derived.decl [concrete = constants.%Derived]
  560. // CHECK:STDOUT: <elided>
  561. // CHECK:STDOUT: %static_data.ref: ref %i32 = name_ref static_data, imports.%static_data.var
  562. // CHECK:STDOUT: %.loc13_20: type = splice_block %i32.loc13 [concrete = constants.%i32] {
  563. // CHECK:STDOUT: %int_32.loc13: Core.IntLiteral = int_value 32 [concrete = constants.%int_32]
  564. // CHECK:STDOUT: %i32.loc13: type = class_type @Int, @Int(constants.%int_32) [concrete = constants.%i32]
  565. // CHECK:STDOUT: }
  566. // CHECK:STDOUT: %.loc13_33: %i32 = bind_value %static_data.ref
  567. // CHECK:STDOUT: %static_data: %i32 = bind_name static_data, %.loc13_33
  568. // CHECK:STDOUT: <elided>
  569. // CHECK:STDOUT: }
  570. // CHECK:STDOUT:
  571. // CHECK:STDOUT: --- import_non_function_member_protected_extend_call_in_member.carbon
  572. // CHECK:STDOUT:
  573. // CHECK:STDOUT: constants {
  574. // CHECK:STDOUT: %Derived: type = class_type @Derived [concrete]
  575. // CHECK:STDOUT: %C: type = class_type @C [concrete]
  576. // CHECK:STDOUT: %int_32: Core.IntLiteral = int_value 32 [concrete]
  577. // CHECK:STDOUT: %i32: type = class_type @Int, @Int(%int_32) [concrete]
  578. // CHECK:STDOUT: %C.elem: type = unbound_element_type %C, %i32 [concrete]
  579. // CHECK:STDOUT: %pattern_type.7ce: type = pattern_type %i32 [concrete]
  580. // CHECK:STDOUT: }
  581. // CHECK:STDOUT:
  582. // CHECK:STDOUT: imports {
  583. // CHECK:STDOUT: %Cpp: <namespace> = namespace file.%Cpp.import_cpp, [concrete] {
  584. // CHECK:STDOUT: .C = %C.decl
  585. // CHECK:STDOUT: import Cpp//...
  586. // CHECK:STDOUT: }
  587. // CHECK:STDOUT: %C.decl: type = class_decl @C [concrete = constants.%C] {} {}
  588. // CHECK:STDOUT: %static_data.var: ref %i32 = var %static_data.var_patt
  589. // CHECK:STDOUT: }
  590. // CHECK:STDOUT:
  591. // CHECK:STDOUT: class @Derived {
  592. // CHECK:STDOUT: <elided>
  593. // CHECK:STDOUT: complete_type_witness = %complete_type
  594. // CHECK:STDOUT:
  595. // CHECK:STDOUT: !members:
  596. // CHECK:STDOUT: .Self = constants.%Derived
  597. // CHECK:STDOUT: .Cpp = <poisoned>
  598. // CHECK:STDOUT: .base = %.loc7
  599. // CHECK:STDOUT: .F = %Derived.F.decl
  600. // CHECK:STDOUT: .instance_data = <poisoned>
  601. // CHECK:STDOUT: .static_data = <poisoned>
  602. // CHECK:STDOUT: .Derived = <poisoned>
  603. // CHECK:STDOUT: extend %C.ref
  604. // CHECK:STDOUT: }
  605. // CHECK:STDOUT:
  606. // CHECK:STDOUT: fn @Derived.F(%self.param: %Derived) {
  607. // CHECK:STDOUT: !entry:
  608. // CHECK:STDOUT: name_binding_decl {
  609. // CHECK:STDOUT: %instance_data.patt: %pattern_type.7ce = binding_pattern instance_data [concrete]
  610. // CHECK:STDOUT: }
  611. // CHECK:STDOUT: %self.ref: %Derived = name_ref self, %self
  612. // CHECK:STDOUT: %instance_data.ref: %C.elem = name_ref instance_data, @C.%.1 [concrete = @C.%.1]
  613. // CHECK:STDOUT: %.loc10_34.1: ref %C = class_element_access %self.ref, element0
  614. // CHECK:STDOUT: %.loc10_34.2: ref %C = converted %self.ref, %.loc10_34.1
  615. // CHECK:STDOUT: %.loc10_34.3: ref %i32 = class_element_access %.loc10_34.2, element0
  616. // CHECK:STDOUT: %.loc10_24: type = splice_block %i32.loc10 [concrete = constants.%i32] {
  617. // CHECK:STDOUT: %int_32.loc10: Core.IntLiteral = int_value 32 [concrete = constants.%int_32]
  618. // CHECK:STDOUT: %i32.loc10: type = class_type @Int, @Int(constants.%int_32) [concrete = constants.%i32]
  619. // CHECK:STDOUT: }
  620. // CHECK:STDOUT: %.loc10_34.4: %i32 = bind_value %.loc10_34.3
  621. // CHECK:STDOUT: %instance_data: %i32 = bind_name instance_data, %.loc10_34.4
  622. // CHECK:STDOUT: name_binding_decl {
  623. // CHECK:STDOUT: %unqualified_static_data.patt: %pattern_type.7ce = binding_pattern unqualified_static_data [concrete]
  624. // CHECK:STDOUT: }
  625. // CHECK:STDOUT: <elided>
  626. // CHECK:STDOUT: %static_data.ref.loc11: ref %i32 = name_ref static_data, imports.%static_data.var
  627. // CHECK:STDOUT: %.loc11_34: type = splice_block %i32.loc11 [concrete = constants.%i32] {
  628. // CHECK:STDOUT: %int_32.loc11: Core.IntLiteral = int_value 32 [concrete = constants.%int_32]
  629. // CHECK:STDOUT: %i32.loc11: type = class_type @Int, @Int(constants.%int_32) [concrete = constants.%i32]
  630. // CHECK:STDOUT: }
  631. // CHECK:STDOUT: %.loc11_40: %i32 = bind_value %static_data.ref.loc11
  632. // CHECK:STDOUT: %unqualified_static_data: %i32 = bind_name unqualified_static_data, %.loc11_40
  633. // CHECK:STDOUT: name_binding_decl {
  634. // CHECK:STDOUT: %derived_static_data.patt: %pattern_type.7ce = binding_pattern derived_static_data [concrete]
  635. // CHECK:STDOUT: }
  636. // CHECK:STDOUT: %Derived.ref: type = name_ref Derived, file.%Derived.decl [concrete = constants.%Derived]
  637. // CHECK:STDOUT: %static_data.ref.loc12: ref %i32 = name_ref static_data, imports.%static_data.var
  638. // CHECK:STDOUT: %.loc12_30: type = splice_block %i32.loc12 [concrete = constants.%i32] {
  639. // CHECK:STDOUT: %int_32.loc12: Core.IntLiteral = int_value 32 [concrete = constants.%int_32]
  640. // CHECK:STDOUT: %i32.loc12: type = class_type @Int, @Int(constants.%int_32) [concrete = constants.%i32]
  641. // CHECK:STDOUT: }
  642. // CHECK:STDOUT: %.loc12_43: %i32 = bind_value %static_data.ref.loc12
  643. // CHECK:STDOUT: %derived_static_data: %i32 = bind_name derived_static_data, %.loc12_43
  644. // CHECK:STDOUT: name_binding_decl {
  645. // CHECK:STDOUT: %base_static_data.patt: %pattern_type.7ce = binding_pattern base_static_data [concrete]
  646. // CHECK:STDOUT: }
  647. // CHECK:STDOUT: %Cpp.ref: <namespace> = name_ref Cpp, imports.%Cpp [concrete = imports.%Cpp]
  648. // CHECK:STDOUT: %C.ref: type = name_ref C, imports.%C.decl [concrete = constants.%C]
  649. // CHECK:STDOUT: %static_data.ref.loc13: ref %i32 = name_ref static_data, imports.%static_data.var
  650. // CHECK:STDOUT: %.loc13_27: type = splice_block %i32.loc13 [concrete = constants.%i32] {
  651. // CHECK:STDOUT: %int_32.loc13: Core.IntLiteral = int_value 32 [concrete = constants.%int_32]
  652. // CHECK:STDOUT: %i32.loc13: type = class_type @Int, @Int(constants.%int_32) [concrete = constants.%i32]
  653. // CHECK:STDOUT: }
  654. // CHECK:STDOUT: %.loc13_38: %i32 = bind_value %static_data.ref.loc13
  655. // CHECK:STDOUT: %base_static_data: %i32 = bind_name base_static_data, %.loc13_38
  656. // CHECK:STDOUT: <elided>
  657. // CHECK:STDOUT: }
  658. // CHECK:STDOUT:
  659. // CHECK:STDOUT: --- import_function_member_public.carbon
  660. // CHECK:STDOUT:
  661. // CHECK:STDOUT: constants {
  662. // CHECK:STDOUT: %S: type = class_type @S [concrete]
  663. // CHECK:STDOUT: %ptr.5c7: type = ptr_type %S [concrete]
  664. // CHECK:STDOUT: %empty_tuple.type: type = tuple_type () [concrete]
  665. // CHECK:STDOUT: %S.instance_fn.cpp_overload_set.type: type = cpp_overload_set_type @S.instance_fn.cpp_overload_set [concrete]
  666. // CHECK:STDOUT: %S.instance_fn.cpp_overload_set.value: %S.instance_fn.cpp_overload_set.type = cpp_overload_set_value @S.instance_fn.cpp_overload_set [concrete]
  667. // CHECK:STDOUT: %S.instance_fn.type: type = fn_type @S.instance_fn [concrete]
  668. // CHECK:STDOUT: %S.instance_fn: %S.instance_fn.type = struct_value () [concrete]
  669. // CHECK:STDOUT: %S.static_fn.cpp_overload_set.type: type = cpp_overload_set_type @S.static_fn.cpp_overload_set [concrete]
  670. // CHECK:STDOUT: %S.static_fn.cpp_overload_set.value: %S.static_fn.cpp_overload_set.type = cpp_overload_set_value @S.static_fn.cpp_overload_set [concrete]
  671. // CHECK:STDOUT: %S.static_fn.type: type = fn_type @S.static_fn [concrete]
  672. // CHECK:STDOUT: %S.static_fn: %S.static_fn.type = struct_value () [concrete]
  673. // CHECK:STDOUT: }
  674. // CHECK:STDOUT:
  675. // CHECK:STDOUT: imports {
  676. // CHECK:STDOUT: %Cpp: <namespace> = namespace file.%Cpp.import_cpp, [concrete] {
  677. // CHECK:STDOUT: .S = %S.decl
  678. // CHECK:STDOUT: import Cpp//...
  679. // CHECK:STDOUT: }
  680. // CHECK:STDOUT: %S.decl: type = class_decl @S [concrete = constants.%S] {} {}
  681. // CHECK:STDOUT: %S.instance_fn.cpp_overload_set.value: %S.instance_fn.cpp_overload_set.type = cpp_overload_set_value @S.instance_fn.cpp_overload_set [concrete = constants.%S.instance_fn.cpp_overload_set.value]
  682. // CHECK:STDOUT: %S.instance_fn.decl: %S.instance_fn.type = fn_decl @S.instance_fn [concrete = constants.%S.instance_fn] {
  683. // CHECK:STDOUT: <elided>
  684. // CHECK:STDOUT: } {
  685. // CHECK:STDOUT: <elided>
  686. // CHECK:STDOUT: }
  687. // CHECK:STDOUT: %S.static_fn.cpp_overload_set.value: %S.static_fn.cpp_overload_set.type = cpp_overload_set_value @S.static_fn.cpp_overload_set [concrete = constants.%S.static_fn.cpp_overload_set.value]
  688. // CHECK:STDOUT: %S.static_fn.decl: %S.static_fn.type = fn_decl @S.static_fn [concrete = constants.%S.static_fn] {} {}
  689. // CHECK:STDOUT: }
  690. // CHECK:STDOUT:
  691. // CHECK:STDOUT: fn @F(%s.param: %ptr.5c7) {
  692. // CHECK:STDOUT: !entry:
  693. // CHECK:STDOUT: %s.ref: %ptr.5c7 = name_ref s, %s
  694. // CHECK:STDOUT: %.loc8: ref %S = deref %s.ref
  695. // CHECK:STDOUT: %instance_fn.ref: %S.instance_fn.cpp_overload_set.type = name_ref instance_fn, imports.%S.instance_fn.cpp_overload_set.value [concrete = constants.%S.instance_fn.cpp_overload_set.value]
  696. // CHECK:STDOUT: %bound_method: <bound method> = bound_method %.loc8, %instance_fn.ref
  697. // CHECK:STDOUT: %addr: %ptr.5c7 = addr_of %.loc8
  698. // CHECK:STDOUT: %S.instance_fn.call: init %empty_tuple.type = call imports.%S.instance_fn.decl(%addr)
  699. // CHECK:STDOUT: %Cpp.ref.loc9: <namespace> = name_ref Cpp, imports.%Cpp [concrete = imports.%Cpp]
  700. // CHECK:STDOUT: %S.ref.loc9: type = name_ref S, imports.%S.decl [concrete = constants.%S]
  701. // CHECK:STDOUT: %static_fn.ref: %S.static_fn.cpp_overload_set.type = name_ref static_fn, imports.%S.static_fn.cpp_overload_set.value [concrete = constants.%S.static_fn.cpp_overload_set.value]
  702. // CHECK:STDOUT: %S.static_fn.call: init %empty_tuple.type = call imports.%S.static_fn.decl()
  703. // CHECK:STDOUT: <elided>
  704. // CHECK:STDOUT: }
  705. // CHECK:STDOUT:
  706. // CHECK:STDOUT: --- fail_todo_import_function_member_protected_extend_call_instance_in_member.carbon
  707. // CHECK:STDOUT:
  708. // CHECK:STDOUT: constants {
  709. // CHECK:STDOUT: %Derived: type = class_type @Derived [concrete]
  710. // CHECK:STDOUT: %C.instance_fn.cpp_overload_set.type: type = cpp_overload_set_type @C.instance_fn.cpp_overload_set [concrete]
  711. // CHECK:STDOUT: %C.instance_fn.cpp_overload_set.value: %C.instance_fn.cpp_overload_set.type = cpp_overload_set_value @C.instance_fn.cpp_overload_set [concrete]
  712. // CHECK:STDOUT: }
  713. // CHECK:STDOUT:
  714. // CHECK:STDOUT: imports {
  715. // CHECK:STDOUT: %C.instance_fn.cpp_overload_set.value: %C.instance_fn.cpp_overload_set.type = cpp_overload_set_value @C.instance_fn.cpp_overload_set [concrete = constants.%C.instance_fn.cpp_overload_set.value]
  716. // CHECK:STDOUT: }
  717. // CHECK:STDOUT:
  718. // CHECK:STDOUT: class @Derived {
  719. // CHECK:STDOUT: <elided>
  720. // CHECK:STDOUT: complete_type_witness = %complete_type
  721. // CHECK:STDOUT:
  722. // CHECK:STDOUT: !members:
  723. // CHECK:STDOUT: .Self = constants.%Derived
  724. // CHECK:STDOUT: .Cpp = <poisoned>
  725. // CHECK:STDOUT: .base = %.loc7
  726. // CHECK:STDOUT: .F = %Derived.F.decl
  727. // CHECK:STDOUT: .instance_fn = <poisoned>
  728. // CHECK:STDOUT: extend %C.ref
  729. // CHECK:STDOUT: }
  730. // CHECK:STDOUT:
  731. // CHECK:STDOUT: fn @Derived.F(%self.param: %Derived) {
  732. // CHECK:STDOUT: !entry:
  733. // CHECK:STDOUT: %self.ref: %Derived = name_ref self, %self
  734. // CHECK:STDOUT: %instance_fn.ref: %C.instance_fn.cpp_overload_set.type = name_ref instance_fn, imports.%C.instance_fn.cpp_overload_set.value [concrete = constants.%C.instance_fn.cpp_overload_set.value]
  735. // CHECK:STDOUT: %bound_method: <bound method> = bound_method %self.ref, %instance_fn.ref
  736. // CHECK:STDOUT: <elided>
  737. // CHECK:STDOUT: }
  738. // CHECK:STDOUT:
  739. // CHECK:STDOUT: --- import_function_member_protected_extend_call_static_in_member.carbon
  740. // CHECK:STDOUT:
  741. // CHECK:STDOUT: constants {
  742. // CHECK:STDOUT: %Derived: type = class_type @Derived [concrete]
  743. // CHECK:STDOUT: %C: type = class_type @C [concrete]
  744. // CHECK:STDOUT: %empty_tuple.type: type = tuple_type () [concrete]
  745. // CHECK:STDOUT: %C.static_fn.cpp_overload_set.type: type = cpp_overload_set_type @C.static_fn.cpp_overload_set [concrete]
  746. // CHECK:STDOUT: %C.static_fn.cpp_overload_set.value: %C.static_fn.cpp_overload_set.type = cpp_overload_set_value @C.static_fn.cpp_overload_set [concrete]
  747. // CHECK:STDOUT: %C.static_fn.type: type = fn_type @C.static_fn [concrete]
  748. // CHECK:STDOUT: %C.static_fn: %C.static_fn.type = struct_value () [concrete]
  749. // CHECK:STDOUT: }
  750. // CHECK:STDOUT:
  751. // CHECK:STDOUT: imports {
  752. // CHECK:STDOUT: %Cpp: <namespace> = namespace file.%Cpp.import_cpp, [concrete] {
  753. // CHECK:STDOUT: .C = %C.decl
  754. // CHECK:STDOUT: import Cpp//...
  755. // CHECK:STDOUT: }
  756. // CHECK:STDOUT: %C.decl: type = class_decl @C [concrete = constants.%C] {} {}
  757. // CHECK:STDOUT: %C.static_fn.cpp_overload_set.value: %C.static_fn.cpp_overload_set.type = cpp_overload_set_value @C.static_fn.cpp_overload_set [concrete = constants.%C.static_fn.cpp_overload_set.value]
  758. // CHECK:STDOUT: %C.static_fn.decl: %C.static_fn.type = fn_decl @C.static_fn [concrete = constants.%C.static_fn] {} {}
  759. // CHECK:STDOUT: }
  760. // CHECK:STDOUT:
  761. // CHECK:STDOUT: class @Derived {
  762. // CHECK:STDOUT: <elided>
  763. // CHECK:STDOUT: complete_type_witness = %complete_type
  764. // CHECK:STDOUT:
  765. // CHECK:STDOUT: !members:
  766. // CHECK:STDOUT: .Self = constants.%Derived
  767. // CHECK:STDOUT: .Cpp = <poisoned>
  768. // CHECK:STDOUT: .base = %.loc7
  769. // CHECK:STDOUT: .F = %Derived.F.decl
  770. // CHECK:STDOUT: .static_fn = <poisoned>
  771. // CHECK:STDOUT: .Derived = <poisoned>
  772. // CHECK:STDOUT: extend %C.ref
  773. // CHECK:STDOUT: }
  774. // CHECK:STDOUT:
  775. // CHECK:STDOUT: fn @Derived.F(%self.param: %Derived) {
  776. // CHECK:STDOUT: !entry:
  777. // CHECK:STDOUT: %static_fn.ref.loc10: %C.static_fn.cpp_overload_set.type = name_ref static_fn, imports.%C.static_fn.cpp_overload_set.value [concrete = constants.%C.static_fn.cpp_overload_set.value]
  778. // CHECK:STDOUT: %C.static_fn.call.loc10: init %empty_tuple.type = call imports.%C.static_fn.decl()
  779. // CHECK:STDOUT: %Derived.ref: type = name_ref Derived, file.%Derived.decl [concrete = constants.%Derived]
  780. // CHECK:STDOUT: %static_fn.ref.loc11: %C.static_fn.cpp_overload_set.type = name_ref static_fn, imports.%C.static_fn.cpp_overload_set.value [concrete = constants.%C.static_fn.cpp_overload_set.value]
  781. // CHECK:STDOUT: %C.static_fn.call.loc11: init %empty_tuple.type = call imports.%C.static_fn.decl()
  782. // CHECK:STDOUT: %Cpp.ref: <namespace> = name_ref Cpp, imports.%Cpp [concrete = imports.%Cpp]
  783. // CHECK:STDOUT: %C.ref: type = name_ref C, imports.%C.decl [concrete = constants.%C]
  784. // CHECK:STDOUT: %static_fn.ref.loc12: %C.static_fn.cpp_overload_set.type = name_ref static_fn, imports.%C.static_fn.cpp_overload_set.value [concrete = constants.%C.static_fn.cpp_overload_set.value]
  785. // CHECK:STDOUT: %C.static_fn.call.loc12: init %empty_tuple.type = call imports.%C.static_fn.decl()
  786. // CHECK:STDOUT: <elided>
  787. // CHECK:STDOUT: }
  788. // CHECK:STDOUT:
  789. // CHECK:STDOUT: --- import_overload_set_public.carbon
  790. // CHECK:STDOUT:
  791. // CHECK:STDOUT: constants {
  792. // CHECK:STDOUT: %empty_tuple.type: type = tuple_type () [concrete]
  793. // CHECK:STDOUT: %C: type = class_type @C [concrete]
  794. // CHECK:STDOUT: %C.C.cpp_overload_set.type: type = cpp_overload_set_type @C.C.cpp_overload_set [concrete]
  795. // CHECK:STDOUT: %C.C.cpp_overload_set.value: %C.C.cpp_overload_set.type = cpp_overload_set_value @C.C.cpp_overload_set [concrete]
  796. // CHECK:STDOUT: %ptr.d9e: type = ptr_type %C [concrete]
  797. // CHECK:STDOUT: %C__carbon_thunk.type: type = fn_type @C__carbon_thunk [concrete]
  798. // CHECK:STDOUT: %C__carbon_thunk: %C__carbon_thunk.type = struct_value () [concrete]
  799. // CHECK:STDOUT: %C.foo.cpp_overload_set.type: type = cpp_overload_set_type @C.foo.cpp_overload_set [concrete]
  800. // CHECK:STDOUT: %C.foo.cpp_overload_set.value: %C.foo.cpp_overload_set.type = cpp_overload_set_value @C.foo.cpp_overload_set [concrete]
  801. // CHECK:STDOUT: %C.foo.type: type = fn_type @C.foo [concrete]
  802. // CHECK:STDOUT: %C.foo: %C.foo.type = struct_value () [concrete]
  803. // CHECK:STDOUT: %type_where: type = facet_type <type where .Self impls <CanDestroy>> [concrete]
  804. // CHECK:STDOUT: %facet_value: %type_where = facet_value %C, () [concrete]
  805. // CHECK:STDOUT: %DestroyT.binding.as_type.as.Destroy.impl.Op.type.b92: type = fn_type @DestroyT.binding.as_type.as.Destroy.impl.Op, @DestroyT.binding.as_type.as.Destroy.impl(%facet_value) [concrete]
  806. // CHECK:STDOUT: %DestroyT.binding.as_type.as.Destroy.impl.Op.841: %DestroyT.binding.as_type.as.Destroy.impl.Op.type.b92 = struct_value () [concrete]
  807. // CHECK:STDOUT: }
  808. // CHECK:STDOUT:
  809. // CHECK:STDOUT: imports {
  810. // CHECK:STDOUT: %Cpp: <namespace> = namespace file.%Cpp.import_cpp, [concrete] {
  811. // CHECK:STDOUT: .C = %C.decl
  812. // CHECK:STDOUT: import Cpp//...
  813. // CHECK:STDOUT: }
  814. // CHECK:STDOUT: %C.decl: type = class_decl @C [concrete = constants.%C] {} {}
  815. // CHECK:STDOUT: %C.C.cpp_overload_set.value: %C.C.cpp_overload_set.type = cpp_overload_set_value @C.C.cpp_overload_set [concrete = constants.%C.C.cpp_overload_set.value]
  816. // CHECK:STDOUT: %C__carbon_thunk.decl: %C__carbon_thunk.type = fn_decl @C__carbon_thunk [concrete = constants.%C__carbon_thunk] {
  817. // CHECK:STDOUT: <elided>
  818. // CHECK:STDOUT: } {
  819. // CHECK:STDOUT: <elided>
  820. // CHECK:STDOUT: }
  821. // CHECK:STDOUT: %C.foo.cpp_overload_set.value: %C.foo.cpp_overload_set.type = cpp_overload_set_value @C.foo.cpp_overload_set [concrete = constants.%C.foo.cpp_overload_set.value]
  822. // CHECK:STDOUT: %C.foo.decl: %C.foo.type = fn_decl @C.foo [concrete = constants.%C.foo] {} {}
  823. // CHECK:STDOUT: }
  824. // CHECK:STDOUT:
  825. // CHECK:STDOUT: fn @F() {
  826. // CHECK:STDOUT: !entry:
  827. // CHECK:STDOUT: %Cpp.ref.loc8: <namespace> = name_ref Cpp, imports.%Cpp [concrete = imports.%Cpp]
  828. // CHECK:STDOUT: %C.ref.loc8_6: type = name_ref C, imports.%C.decl [concrete = constants.%C]
  829. // CHECK:STDOUT: %C.ref.loc8_8: %C.C.cpp_overload_set.type = name_ref C, imports.%C.C.cpp_overload_set.value [concrete = constants.%C.C.cpp_overload_set.value]
  830. // CHECK:STDOUT: %.loc8_11.1: ref %C = temporary_storage
  831. // CHECK:STDOUT: %addr.loc8_11.1: %ptr.d9e = addr_of %.loc8_11.1
  832. // CHECK:STDOUT: %C__carbon_thunk.call: init %empty_tuple.type = call imports.%C__carbon_thunk.decl(%addr.loc8_11.1)
  833. // CHECK:STDOUT: %.loc8_11.2: init %C = in_place_init %C__carbon_thunk.call, %.loc8_11.1
  834. // CHECK:STDOUT: %.loc8_11.3: ref %C = temporary %.loc8_11.1, %.loc8_11.2
  835. // CHECK:STDOUT: %Cpp.ref.loc9: <namespace> = name_ref Cpp, imports.%Cpp [concrete = imports.%Cpp]
  836. // CHECK:STDOUT: %C.ref.loc9: type = name_ref C, imports.%C.decl [concrete = constants.%C]
  837. // CHECK:STDOUT: %foo.ref: %C.foo.cpp_overload_set.type = name_ref foo, imports.%C.foo.cpp_overload_set.value [concrete = constants.%C.foo.cpp_overload_set.value]
  838. // CHECK:STDOUT: %C.foo.call: init %empty_tuple.type = call imports.%C.foo.decl()
  839. // CHECK:STDOUT: %DestroyT.binding.as_type.as.Destroy.impl.Op.bound: <bound method> = bound_method %.loc8_11.3, constants.%DestroyT.binding.as_type.as.Destroy.impl.Op.841
  840. // CHECK:STDOUT: <elided>
  841. // CHECK:STDOUT: %bound_method: <bound method> = bound_method %.loc8_11.3, %DestroyT.binding.as_type.as.Destroy.impl.Op.specific_fn
  842. // CHECK:STDOUT: %addr.loc8_11.2: %ptr.d9e = addr_of %.loc8_11.3
  843. // CHECK:STDOUT: %DestroyT.binding.as_type.as.Destroy.impl.Op.call: init %empty_tuple.type = call %bound_method(%addr.loc8_11.2)
  844. // CHECK:STDOUT: <elided>
  845. // CHECK:STDOUT: }
  846. // CHECK:STDOUT:
  847. // CHECK:STDOUT: --- import_base_class_public.carbon
  848. // CHECK:STDOUT:
  849. // CHECK:STDOUT: constants {
  850. // CHECK:STDOUT: %empty_tuple.type: type = tuple_type () [concrete]
  851. // CHECK:STDOUT: %DerivedPublic: type = class_type @DerivedPublic [concrete]
  852. // CHECK:STDOUT: %DerivedPublic.foo.cpp_overload_set.type: type = cpp_overload_set_type @DerivedPublic.foo.cpp_overload_set [concrete]
  853. // CHECK:STDOUT: %DerivedPublic.foo.cpp_overload_set.value: %DerivedPublic.foo.cpp_overload_set.type = cpp_overload_set_value @DerivedPublic.foo.cpp_overload_set [concrete]
  854. // CHECK:STDOUT: %Base.foo.type: type = fn_type @Base.foo [concrete]
  855. // CHECK:STDOUT: %Base.foo: %Base.foo.type = struct_value () [concrete]
  856. // CHECK:STDOUT: }
  857. // CHECK:STDOUT:
  858. // CHECK:STDOUT: imports {
  859. // CHECK:STDOUT: %Cpp: <namespace> = namespace file.%Cpp.import_cpp, [concrete] {
  860. // CHECK:STDOUT: .DerivedPublic = %DerivedPublic.decl
  861. // CHECK:STDOUT: import Cpp//...
  862. // CHECK:STDOUT: }
  863. // CHECK:STDOUT: %DerivedPublic.decl: type = class_decl @DerivedPublic [concrete = constants.%DerivedPublic] {} {}
  864. // CHECK:STDOUT: %DerivedPublic.foo.cpp_overload_set.value: %DerivedPublic.foo.cpp_overload_set.type = cpp_overload_set_value @DerivedPublic.foo.cpp_overload_set [concrete = constants.%DerivedPublic.foo.cpp_overload_set.value]
  865. // CHECK:STDOUT: %Base.foo.decl: %Base.foo.type = fn_decl @Base.foo [concrete = constants.%Base.foo] {} {}
  866. // CHECK:STDOUT: }
  867. // CHECK:STDOUT:
  868. // CHECK:STDOUT: fn @F() {
  869. // CHECK:STDOUT: !entry:
  870. // CHECK:STDOUT: %Cpp.ref: <namespace> = name_ref Cpp, imports.%Cpp [concrete = imports.%Cpp]
  871. // CHECK:STDOUT: %DerivedPublic.ref: type = name_ref DerivedPublic, imports.%DerivedPublic.decl [concrete = constants.%DerivedPublic]
  872. // CHECK:STDOUT: %foo.ref: %DerivedPublic.foo.cpp_overload_set.type = name_ref foo, imports.%DerivedPublic.foo.cpp_overload_set.value [concrete = constants.%DerivedPublic.foo.cpp_overload_set.value]
  873. // CHECK:STDOUT: %Base.foo.call: init %empty_tuple.type = call imports.%Base.foo.decl()
  874. // CHECK:STDOUT: <elided>
  875. // CHECK:STDOUT: }
  876. // CHECK:STDOUT: