unused.carbon 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168
  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/primitives.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/dataflow/unused.carbon
  10. // TIP: To dump output, run:
  11. // TIP: bazel run //toolchain/testing:file_test -- --dump_output --file_tests=toolchain/check/testdata/dataflow/unused.carbon
  12. // --- todo_ensure_no_warning.carbon
  13. library "[[@TEST_NAME]]";
  14. fn ReturnVar() -> i32 {
  15. var x: i32 = 0;
  16. x = 1;
  17. return x;
  18. // TODO: ensure no warning.
  19. }
  20. fn ReturnLet() -> i32 {
  21. let y: i32 = 1;
  22. return y;
  23. // TODO: ensure no warning.
  24. }
  25. fn RefParam(ref x: i32) {
  26. x = 1;
  27. // TODO: ensure no warning.
  28. }
  29. fn ReturnedVar() -> i32 {
  30. returned var x: i32 = 0;
  31. return var;
  32. // TODO: ensure no warning.
  33. }
  34. fn ReturnVarExplicit() -> i32 {
  35. var x: i32 = 0;
  36. return x;
  37. // TODO: ensure no warning.
  38. }
  39. fn FieldAccess() {
  40. var x: {.a: i32} = {.a = 0};
  41. // Accessing a field should count as a use of x.
  42. var y: i32 = x.a;
  43. // TODO: ensure no warning.
  44. }
  45. fn ParametersUsed(x: i32) -> i32 {
  46. // TODO: ensure no warning.
  47. return x;
  48. }
  49. // --- fail_todo_unused_ref_param.carbon
  50. library "[[@TEST_NAME]]";
  51. // CHECK:STDERR: fail_todo_unused_ref_param.carbon:[[@LINE+4]]:19: error: semantics TODO: `unused` [SemanticsTodo]
  52. // CHECK:STDERR: fn RefParamUnused(unused ref y: i32) {
  53. // CHECK:STDERR: ^~~~~~~~~~~~~~~~~
  54. // CHECK:STDERR:
  55. fn RefParamUnused(unused ref y: i32) {
  56. // TODO: ensure no warning
  57. }
  58. // --- todo_fail_local_let_named_not_used.carbon
  59. library "[[@TEST_NAME]]";
  60. fn F() {
  61. let x: i32 = 0;
  62. // TODO: warning, x is unused.
  63. }
  64. // --- todo_fail_local_var_named_not_used.carbon
  65. library "[[@TEST_NAME]]";
  66. fn F() {
  67. var a: i32 = 0;
  68. // TODO: warning, a is unused.
  69. }
  70. // --- todo_fail_local_var_shadowed_not_used.carbon
  71. library "[[@TEST_NAME]]";
  72. fn F() {
  73. var x: i32 = 0;
  74. if (true) {
  75. var x: i32 = 1;
  76. // TODO: warning, x is unused.
  77. }
  78. x = 2;
  79. // TODO: warning, x is unused.
  80. }
  81. // --- todo_fail_param_let_named_not_used.carbon
  82. library "[[@TEST_NAME]]";
  83. fn F(p: i32) {
  84. // TODO: warning, p is unused.
  85. }
  86. // --- todo_fail_param_ref_named_not_used.carbon
  87. library "[[@TEST_NAME]]";
  88. fn F(ref y: i32) {
  89. // TODO: warning, y is unused.
  90. }
  91. // --- fail_todo_read_from_param_unused_ref.carbon
  92. library "[[@TEST_NAME]]";
  93. // CHECK:STDERR: fail_todo_read_from_param_unused_ref.carbon:[[@LINE+4]]:19: error: semantics TODO: `unused` [SemanticsTodo]
  94. // CHECK:STDERR: fn RefParamUnused(unused ref y: i32) {
  95. // CHECK:STDERR: ^~~~~~~~~~~~~~~~~
  96. // CHECK:STDERR:
  97. fn RefParamUnused(unused ref y: i32) {
  98. var _: i32 = y;
  99. // TODO: ensure error, marked "unused" but used.
  100. }
  101. // --- fail_todo_fail_unused_returned_var.carbon
  102. library "[[@TEST_NAME]]";
  103. fn F() -> i32 {
  104. // CHECK:STDERR: fail_todo_fail_unused_returned_var.carbon:[[@LINE+4]]:16: error: semantics TODO: `unused` [SemanticsTodo]
  105. // CHECK:STDERR: returned var unused x: i32 = 0;
  106. // CHECK:STDERR: ^~~~~~~~~~~~~
  107. // CHECK:STDERR:
  108. returned var unused x: i32 = 0;
  109. // TODO: ensure error, marked "unused" but used.
  110. return var;
  111. }
  112. // --- fail_todo_fail_read_from_unused_local_var.carbon
  113. library "[[@TEST_NAME]]";
  114. fn F(x: i32) {
  115. var _: i32 = x;
  116. // CHECK:STDERR: fail_todo_fail_read_from_unused_local_var.carbon:[[@LINE+4]]:7: error: semantics TODO: `unused` [SemanticsTodo]
  117. // CHECK:STDERR: var unused y: i32 = x;
  118. // CHECK:STDERR: ^~~~~~~~~~~~~
  119. // CHECK:STDERR:
  120. var unused y: i32 = x;
  121. // TODO: error, marked "unused", but used
  122. var unused z: i32 = y;
  123. }
  124. // --- fail_todo_match.carbon
  125. library "[[@TEST_NAME]]";
  126. fn F() -> i32 {
  127. var x: i32 = 3;
  128. // CHECK:STDERR: fail_todo_match.carbon:[[@LINE+4]]:3: error: semantics TODO: `HandleMatchIntroducer` [SemanticsTodo]
  129. // CHECK:STDERR: match (f(x)) {
  130. // CHECK:STDERR: ^~~~~
  131. // CHECK:STDERR:
  132. match (f(x)) {
  133. case unused var (a: i32, b: i32) => { return 0; }
  134. case (a: i32) if (a < 0) => { return 2; }
  135. case var unused a: i32 if (a != x) => { return 3; }
  136. default => { return 4; }
  137. }
  138. return 0;
  139. // TODO: ensure no warning (after match is implemented).
  140. }