int_conversions.carbon 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264
  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/primitives/int_conversions.carbon
  10. // TIP: To dump output, run:
  11. // TIP: bazel run //toolchain/testing:file_test -- --dump_output --file_tests=toolchain/check/testdata/primitives/int_conversions.carbon
  12. // --- valid.carbon
  13. library "[[@TEST_NAME]]";
  14. fn TestFits() {
  15. var a: i32 = 1;
  16. var unused b: i64 = a;
  17. var w: u32 = 1;
  18. var unused x: u64 = w;
  19. }
  20. // --- fail_narrow.carbon
  21. library "[[@TEST_NAME]]";
  22. fn TestFailures() {
  23. var a: i64 = 1;
  24. // CHECK:STDERR: fail_narrow.carbon:[[@LINE+7]]:3: error: cannot implicitly convert expression of type `i64` to `i32` [ConversionFailure]
  25. // CHECK:STDERR: var unused b: i32 = a;
  26. // CHECK:STDERR: ^~~~~~~~~~~~~~~~~
  27. // CHECK:STDERR: fail_narrow.carbon:[[@LINE+4]]:3: note: type `i64` does not implement interface `Core.ImplicitAs(i32)` [MissingImplInMemberAccessInContext]
  28. // CHECK:STDERR: var unused b: i32 = a;
  29. // CHECK:STDERR: ^~~~~~~~~~~~~~~~~
  30. // CHECK:STDERR:
  31. var unused b: i32 = a;
  32. var w: u64 = 1;
  33. // CHECK:STDERR: fail_narrow.carbon:[[@LINE+7]]:3: error: cannot implicitly convert expression of type `u64` to `u32` [ConversionFailure]
  34. // CHECK:STDERR: var unused x: u32 = w;
  35. // CHECK:STDERR: ^~~~~~~~~~~~~~~~~
  36. // CHECK:STDERR: fail_narrow.carbon:[[@LINE+4]]:3: note: type `u64` does not implement interface `Core.ImplicitAs(u32)` [MissingImplInMemberAccessInContext]
  37. // CHECK:STDERR: var unused x: u32 = w;
  38. // CHECK:STDERR: ^~~~~~~~~~~~~~~~~
  39. // CHECK:STDERR:
  40. var unused x: u32 = w;
  41. }
  42. // --- cpp_compat.carbon
  43. library "[[@TEST_NAME]]";
  44. fn TestCppCompat() {
  45. var c: i32 = 1;
  46. var unused d: Core.CppCompat.Long32 = c;
  47. }
  48. // --- fail_todo_cpp_compat_widen.carbon
  49. library "[[@TEST_NAME]]";
  50. fn TestCppCompat() {
  51. var a: Core.CppCompat.Long32 = 1;
  52. // CHECK:STDERR: fail_todo_cpp_compat_widen.carbon:[[@LINE+11]]:17: error: bit width of integer type literal must be a multiple of 8; use `Core.Int(33)` instead [IntWidthNotMultipleOf8]
  53. // CHECK:STDERR: var unused b: i33 = a;
  54. // CHECK:STDERR: ^~~
  55. // CHECK:STDERR:
  56. // CHECK:STDERR: fail_todo_cpp_compat_widen.carbon:[[@LINE+7]]:3: error: cannot implicitly convert expression of type `Core.CppCompat.Long32` to `i33` [ConversionFailure]
  57. // CHECK:STDERR: var unused b: i33 = a;
  58. // CHECK:STDERR: ^~~~~~~~~~~~~~~~~
  59. // CHECK:STDERR: fail_todo_cpp_compat_widen.carbon:[[@LINE+4]]:3: note: type `Core.CppCompat.Long32` does not implement interface `Core.ImplicitAs(i33)` [MissingImplInMemberAccessInContext]
  60. // CHECK:STDERR: var unused b: i33 = a;
  61. // CHECK:STDERR: ^~~~~~~~~~~~~~~~~
  62. // CHECK:STDERR:
  63. var unused b: i33 = a;
  64. var c: Core.CppCompat.LongLong64 = 1;
  65. // CHECK:STDERR: fail_todo_cpp_compat_widen.carbon:[[@LINE+11]]:17: error: bit width of integer type literal must be a multiple of 8; use `Core.Int(65)` instead [IntWidthNotMultipleOf8]
  66. // CHECK:STDERR: var unused d: i65 = c;
  67. // CHECK:STDERR: ^~~
  68. // CHECK:STDERR:
  69. // CHECK:STDERR: fail_todo_cpp_compat_widen.carbon:[[@LINE+7]]:3: error: cannot implicitly convert expression of type `Core.CppCompat.LongLong64` to `i65` [ConversionFailure]
  70. // CHECK:STDERR: var unused d: i65 = c;
  71. // CHECK:STDERR: ^~~~~~~~~~~~~~~~~
  72. // CHECK:STDERR: fail_todo_cpp_compat_widen.carbon:[[@LINE+4]]:3: note: type `Core.CppCompat.LongLong64` does not implement interface `Core.ImplicitAs(i65)` [MissingImplInMemberAccessInContext]
  73. // CHECK:STDERR: var unused d: i65 = c;
  74. // CHECK:STDERR: ^~~~~~~~~~~~~~~~~
  75. // CHECK:STDERR:
  76. var unused d: i65 = c;
  77. var e: Core.CppCompat.ULong32 = 1;
  78. // CHECK:STDERR: fail_todo_cpp_compat_widen.carbon:[[@LINE+11]]:17: error: bit width of integer type literal must be a multiple of 8; use `Core.UInt(33)` instead [IntWidthNotMultipleOf8]
  79. // CHECK:STDERR: var unused f: u33 = e;
  80. // CHECK:STDERR: ^~~
  81. // CHECK:STDERR:
  82. // CHECK:STDERR: fail_todo_cpp_compat_widen.carbon:[[@LINE+7]]:3: error: cannot implicitly convert expression of type `Core.CppCompat.ULong32` to `u33` [ConversionFailure]
  83. // CHECK:STDERR: var unused f: u33 = e;
  84. // CHECK:STDERR: ^~~~~~~~~~~~~~~~~
  85. // CHECK:STDERR: fail_todo_cpp_compat_widen.carbon:[[@LINE+4]]:3: note: type `Core.CppCompat.ULong32` does not implement interface `Core.ImplicitAs(u33)` [MissingImplInMemberAccessInContext]
  86. // CHECK:STDERR: var unused f: u33 = e;
  87. // CHECK:STDERR: ^~~~~~~~~~~~~~~~~
  88. // CHECK:STDERR:
  89. var unused f: u33 = e;
  90. var g: Core.CppCompat.ULongLong64 = 1;
  91. // CHECK:STDERR: fail_todo_cpp_compat_widen.carbon:[[@LINE+11]]:17: error: bit width of integer type literal must be a multiple of 8; use `Core.UInt(65)` instead [IntWidthNotMultipleOf8]
  92. // CHECK:STDERR: var unused h: u65 = g;
  93. // CHECK:STDERR: ^~~
  94. // CHECK:STDERR:
  95. // CHECK:STDERR: fail_todo_cpp_compat_widen.carbon:[[@LINE+7]]:3: error: cannot implicitly convert expression of type `Core.CppCompat.ULongLong64` to `u65` [ConversionFailure]
  96. // CHECK:STDERR: var unused h: u65 = g;
  97. // CHECK:STDERR: ^~~~~~~~~~~~~~~~~
  98. // CHECK:STDERR: fail_todo_cpp_compat_widen.carbon:[[@LINE+4]]:3: note: type `Core.CppCompat.ULongLong64` does not implement interface `Core.ImplicitAs(u65)` [MissingImplInMemberAccessInContext]
  99. // CHECK:STDERR: var unused h: u65 = g;
  100. // CHECK:STDERR: ^~~~~~~~~~~~~~~~~
  101. // CHECK:STDERR:
  102. var unused h: u65 = g;
  103. }
  104. // --- fail_cpp_compat_narrow.carbon
  105. library "[[@TEST_NAME]]";
  106. fn TestCppCompat() {
  107. // Long32 is slightly wider than i32.
  108. var a: Core.CppCompat.Long32 = 1;
  109. // CHECK:STDERR: fail_cpp_compat_narrow.carbon:[[@LINE+7]]:3: error: cannot implicitly convert expression of type `Core.CppCompat.Long32` to `i32` [ConversionFailure]
  110. // CHECK:STDERR: var unused b: i32 = a;
  111. // CHECK:STDERR: ^~~~~~~~~~~~~~~~~
  112. // CHECK:STDERR: fail_cpp_compat_narrow.carbon:[[@LINE+4]]:3: note: type `Core.CppCompat.Long32` does not implement interface `Core.ImplicitAs(i32)` [MissingImplInMemberAccessInContext]
  113. // CHECK:STDERR: var unused b: i32 = a;
  114. // CHECK:STDERR: ^~~~~~~~~~~~~~~~~
  115. // CHECK:STDERR:
  116. var unused b: i32 = a;
  117. // LongLong64 is slightly wider than i64.
  118. var c: Core.CppCompat.LongLong64 = 1;
  119. // CHECK:STDERR: fail_cpp_compat_narrow.carbon:[[@LINE+7]]:3: error: cannot implicitly convert expression of type `Core.CppCompat.LongLong64` to `i64` [ConversionFailure]
  120. // CHECK:STDERR: var unused d: i64 = c;
  121. // CHECK:STDERR: ^~~~~~~~~~~~~~~~~
  122. // CHECK:STDERR: fail_cpp_compat_narrow.carbon:[[@LINE+4]]:3: note: type `Core.CppCompat.LongLong64` does not implement interface `Core.ImplicitAs(i64)` [MissingImplInMemberAccessInContext]
  123. // CHECK:STDERR: var unused d: i64 = c;
  124. // CHECK:STDERR: ^~~~~~~~~~~~~~~~~
  125. // CHECK:STDERR:
  126. var unused d: i64 = c;
  127. // ULong32 is slightly wider than u32.
  128. var e: Core.CppCompat.ULong32 = 1;
  129. // CHECK:STDERR: fail_cpp_compat_narrow.carbon:[[@LINE+7]]:3: error: cannot implicitly convert expression of type `Core.CppCompat.ULong32` to `u32` [ConversionFailure]
  130. // CHECK:STDERR: var unused f: u32 = e;
  131. // CHECK:STDERR: ^~~~~~~~~~~~~~~~~
  132. // CHECK:STDERR: fail_cpp_compat_narrow.carbon:[[@LINE+4]]:3: note: type `Core.CppCompat.ULong32` does not implement interface `Core.ImplicitAs(u32)` [MissingImplInMemberAccessInContext]
  133. // CHECK:STDERR: var unused f: u32 = e;
  134. // CHECK:STDERR: ^~~~~~~~~~~~~~~~~
  135. // CHECK:STDERR:
  136. var unused f: u32 = e;
  137. // ULongLong64 is slightly wider than u64.
  138. var g: Core.CppCompat.ULongLong64 = 1;
  139. // CHECK:STDERR: fail_cpp_compat_narrow.carbon:[[@LINE+7]]:3: error: cannot implicitly convert expression of type `Core.CppCompat.ULongLong64` to `u64` [ConversionFailure]
  140. // CHECK:STDERR: var unused h: u64 = g;
  141. // CHECK:STDERR: ^~~~~~~~~~~~~~~~~
  142. // CHECK:STDERR: fail_cpp_compat_narrow.carbon:[[@LINE+4]]:3: note: type `Core.CppCompat.ULongLong64` does not implement interface `Core.ImplicitAs(u64)` [MissingImplInMemberAccessInContext]
  143. // CHECK:STDERR: var unused h: u64 = g;
  144. // CHECK:STDERR: ^~~~~~~~~~~~~~~~~
  145. // CHECK:STDERR:
  146. var unused h: u64 = g;
  147. }
  148. // --- widen_sign_change.carbon
  149. library "[[@TEST_NAME]]";
  150. fn TestWidenSign() {
  151. var e: u32 = 1;
  152. var unused f: i64 = e;
  153. }
  154. // --- fail_narrow_sign_change.carbon
  155. library "[[@TEST_NAME]]";
  156. fn TestMixedSign() {
  157. var a: i32 = 1;
  158. // CHECK:STDERR: fail_narrow_sign_change.carbon:[[@LINE+7]]:3: error: cannot implicitly convert expression of type `i32` to `u32` [ConversionFailure]
  159. // CHECK:STDERR: var unused b: u32 = a;
  160. // CHECK:STDERR: ^~~~~~~~~~~~~~~~~
  161. // CHECK:STDERR: fail_narrow_sign_change.carbon:[[@LINE+4]]:3: note: type `i32` does not implement interface `Core.ImplicitAs(u32)` [MissingImplInMemberAccessInContext]
  162. // CHECK:STDERR: var unused b: u32 = a;
  163. // CHECK:STDERR: ^~~~~~~~~~~~~~~~~
  164. // CHECK:STDERR:
  165. var unused b: u32 = a;
  166. var c: u32 = 1;
  167. // CHECK:STDERR: fail_narrow_sign_change.carbon:[[@LINE+7]]:3: error: cannot implicitly convert expression of type `u32` to `i32` [ConversionFailure]
  168. // CHECK:STDERR: var unused d: i32 = c;
  169. // CHECK:STDERR: ^~~~~~~~~~~~~~~~~
  170. // CHECK:STDERR: fail_narrow_sign_change.carbon:[[@LINE+4]]:3: note: type `u32` does not implement interface `Core.ImplicitAs(i32)` [MissingImplInMemberAccessInContext]
  171. // CHECK:STDERR: var unused d: i32 = c;
  172. // CHECK:STDERR: ^~~~~~~~~~~~~~~~~
  173. // CHECK:STDERR:
  174. var unused d: i32 = c;
  175. var g: i32 = 1;
  176. // CHECK:STDERR: fail_narrow_sign_change.carbon:[[@LINE+7]]:3: error: cannot implicitly convert expression of type `i32` to `u64` [ConversionFailure]
  177. // CHECK:STDERR: var unused h: u64 = g;
  178. // CHECK:STDERR: ^~~~~~~~~~~~~~~~~
  179. // CHECK:STDERR: fail_narrow_sign_change.carbon:[[@LINE+4]]:3: note: type `i32` does not implement interface `Core.ImplicitAs(u64)` [MissingImplInMemberAccessInContext]
  180. // CHECK:STDERR: var unused h: u64 = g;
  181. // CHECK:STDERR: ^~~~~~~~~~~~~~~~~
  182. // CHECK:STDERR:
  183. var unused h: u64 = g;
  184. }
  185. // --- arbitrary_width.carbon
  186. library "[[@TEST_NAME]]";
  187. fn TestArbitraryWidth() {
  188. var a: Core.Int(33) = 1;
  189. var unused c: Core.Int(34) = a;
  190. var d: Core.UInt(33) = 1;
  191. var unused f: Core.UInt(34) = d;
  192. var unused h: Core.Int(34) = d;
  193. }
  194. // --- fail_narrow_arbitrary_width.carbon
  195. library "[[@TEST_NAME]]";
  196. fn TestArbitraryWidth() {
  197. var a: Core.Int(33) = 1;
  198. // CHECK:STDERR: fail_narrow_arbitrary_width.carbon:[[@LINE+7]]:3: error: cannot implicitly convert expression of type `i33` to `i32` [ConversionFailure]
  199. // CHECK:STDERR: var unused b: Core.Int(32) = a;
  200. // CHECK:STDERR: ^~~~~~~~~~~~~~~~~~~~~~~~~~
  201. // CHECK:STDERR: fail_narrow_arbitrary_width.carbon:[[@LINE+4]]:3: note: type `i33` does not implement interface `Core.ImplicitAs(i32)` [MissingImplInMemberAccessInContext]
  202. // CHECK:STDERR: var unused b: Core.Int(32) = a;
  203. // CHECK:STDERR: ^~~~~~~~~~~~~~~~~~~~~~~~~~
  204. // CHECK:STDERR:
  205. var unused b: Core.Int(32) = a;
  206. var d: Core.UInt(33) = 1;
  207. // CHECK:STDERR: fail_narrow_arbitrary_width.carbon:[[@LINE+7]]:3: error: cannot implicitly convert expression of type `u33` to `u32` [ConversionFailure]
  208. // CHECK:STDERR: var unused e: Core.UInt(32) = d;
  209. // CHECK:STDERR: ^~~~~~~~~~~~~~~~~~~~~~~~~~~
  210. // CHECK:STDERR: fail_narrow_arbitrary_width.carbon:[[@LINE+4]]:3: note: type `u33` does not implement interface `Core.ImplicitAs(u32)` [MissingImplInMemberAccessInContext]
  211. // CHECK:STDERR: var unused e: Core.UInt(32) = d;
  212. // CHECK:STDERR: ^~~~~~~~~~~~~~~~~~~~~~~~~~~
  213. // CHECK:STDERR:
  214. var unused e: Core.UInt(32) = d;
  215. // CHECK:STDERR: fail_narrow_arbitrary_width.carbon:[[@LINE+7]]:3: error: cannot implicitly convert expression of type `i33` to `u34` [ConversionFailure]
  216. // CHECK:STDERR: var unused g: Core.UInt(34) = a;
  217. // CHECK:STDERR: ^~~~~~~~~~~~~~~~~~~~~~~~~~~
  218. // CHECK:STDERR: fail_narrow_arbitrary_width.carbon:[[@LINE+4]]:3: note: type `i33` does not implement interface `Core.ImplicitAs(u34)` [MissingImplInMemberAccessInContext]
  219. // CHECK:STDERR: var unused g: Core.UInt(34) = a;
  220. // CHECK:STDERR: ^~~~~~~~~~~~~~~~~~~~~~~~~~~
  221. // CHECK:STDERR:
  222. var unused g: Core.UInt(34) = a;
  223. }