name_poisoning.carbon 8.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285
  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/none.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/class/name_poisoning.carbon
  10. // TIP: To dump output, run:
  11. // TIP: bazel run //toolchain/testing:file_test -- --dump_output --file_tests=toolchain/check/testdata/class/name_poisoning.carbon
  12. // --- no_poison.carbon
  13. library "[[@TEST_NAME]]";
  14. class C;
  15. // `N.F` uses `N.C` and not `package.C`.
  16. namespace N;
  17. class N.C {}
  18. fn N.F(x: C);
  19. fn TestCall(x: N.C) {
  20. // `N.F` accepts an `N.C` not a `package.C`.
  21. N.F(x);
  22. }
  23. // --- poison.carbon
  24. library "[[@TEST_NAME]]";
  25. class C;
  26. namespace N;
  27. // Use `package.C` and poison `N.C`.
  28. fn N.F(x: C);
  29. // --- fail_declare_after_poison.carbon
  30. library "[[@TEST_NAME]]";
  31. class C;
  32. namespace N;
  33. // Use `package.C` and poison `N.C`.
  34. // CHECK:STDERR: fail_declare_after_poison.carbon:[[@LINE+3]]:11: error: name `C` used before it was declared [NameUseBeforeDecl]
  35. // CHECK:STDERR: fn N.F(x: C);
  36. // CHECK:STDERR: ^
  37. fn N.F(x: C);
  38. // Failure: `N.C` declared after it was poisoned.
  39. // CHECK:STDERR: fail_declare_after_poison.carbon:[[@LINE+4]]:9: note: declared here [NameUseBeforeDeclNote]
  40. // CHECK:STDERR: class N.C;
  41. // CHECK:STDERR: ^
  42. // CHECK:STDERR:
  43. class N.C;
  44. // --- fail_use_poison.carbon
  45. library "[[@TEST_NAME]]";
  46. class C;
  47. namespace N;
  48. // Use `package.C` and poison `N.C`.
  49. fn N.F1() -> C;
  50. // Use `N.C` which was poisoned and not declared.
  51. // CHECK:STDERR: fail_use_poison.carbon:[[@LINE+4]]:14: error: member name `C` not found in `N` [MemberNameNotFoundInInstScope]
  52. // CHECK:STDERR: fn N.F2() -> N.C;
  53. // CHECK:STDERR: ^~~
  54. // CHECK:STDERR:
  55. fn N.F2() -> N.C;
  56. // --- fail_use_declaration_after_poison.carbon
  57. library "[[@TEST_NAME]]";
  58. class C;
  59. namespace N;
  60. // Use `package.C` and poison `N.C`.
  61. // CHECK:STDERR: fail_use_declaration_after_poison.carbon:[[@LINE+3]]:12: error: name `C` used before it was declared [NameUseBeforeDecl]
  62. // CHECK:STDERR: fn N.F1(x: C);
  63. // CHECK:STDERR: ^
  64. fn N.F1(x: C);
  65. // Failure: N.C declared after it was poisoned.
  66. // CHECK:STDERR: fail_use_declaration_after_poison.carbon:[[@LINE+4]]:9: note: declared here [NameUseBeforeDeclNote]
  67. // CHECK:STDERR: class N.C;
  68. // CHECK:STDERR: ^
  69. // CHECK:STDERR:
  70. class N.C;
  71. // Failure: `N.C` used after declaration failed.
  72. // CHECK:STDERR: fail_use_declaration_after_poison.carbon:[[@LINE+4]]:12: error: member name `C` not found in `N` [MemberNameNotFoundInInstScope]
  73. // CHECK:STDERR: fn N.F2(x: N.C);
  74. // CHECK:STDERR: ^~~
  75. // CHECK:STDERR:
  76. fn N.F2(x: N.C);
  77. // --- fail_alias.carbon
  78. library "[[@TEST_NAME]]";
  79. class C;
  80. namespace N;
  81. // CHECK:STDERR: fail_alias.carbon:[[@LINE+7]]:13: error: name `C` used before it was declared [NameUseBeforeDecl]
  82. // CHECK:STDERR: alias N.C = C;
  83. // CHECK:STDERR: ^
  84. // CHECK:STDERR: fail_alias.carbon:[[@LINE+4]]:9: note: declared here [NameUseBeforeDeclNote]
  85. // CHECK:STDERR: alias N.C = C;
  86. // CHECK:STDERR: ^
  87. // CHECK:STDERR:
  88. alias N.C = C;
  89. // --- fail_poison_multiple_scopes.carbon
  90. library "[[@TEST_NAME]]";
  91. class C1;
  92. class C2 {
  93. class C3 {
  94. class C4 {
  95. // Use `package.C1` and poison:
  96. // * `C2.C1`
  97. // * `C2.C3.C1`
  98. // * `C2.C3.C4.C1`
  99. // CHECK:STDERR: fail_poison_multiple_scopes.carbon:[[@LINE+3]]:15: error: name `C1` used before it was declared [NameUseBeforeDecl]
  100. // CHECK:STDERR: fn F(x: C1);
  101. // CHECK:STDERR: ^~
  102. fn F(x: C1);
  103. // CHECK:STDERR: fail_poison_multiple_scopes.carbon:[[@LINE+7]]:13: note: declared here [NameUseBeforeDeclNote]
  104. // CHECK:STDERR: class C1;
  105. // CHECK:STDERR: ^~
  106. // CHECK:STDERR:
  107. // CHECK:STDERR: fail_poison_multiple_scopes.carbon:[[@LINE-6]]:15: error: name `C1` used before it was declared [NameUseBeforeDecl]
  108. // CHECK:STDERR: fn F(x: C1);
  109. // CHECK:STDERR: ^~
  110. class C1;
  111. }
  112. // CHECK:STDERR: fail_poison_multiple_scopes.carbon:[[@LINE+7]]:11: note: declared here [NameUseBeforeDeclNote]
  113. // CHECK:STDERR: class C1;
  114. // CHECK:STDERR: ^~
  115. // CHECK:STDERR:
  116. // CHECK:STDERR: fail_poison_multiple_scopes.carbon:[[@LINE-15]]:15: error: name `C1` used before it was declared [NameUseBeforeDecl]
  117. // CHECK:STDERR: fn F(x: C1);
  118. // CHECK:STDERR: ^~
  119. class C1;
  120. }
  121. // CHECK:STDERR: fail_poison_multiple_scopes.carbon:[[@LINE+4]]:9: note: declared here [NameUseBeforeDeclNote]
  122. // CHECK:STDERR: class C1;
  123. // CHECK:STDERR: ^~
  124. // CHECK:STDERR:
  125. class C1;
  126. }
  127. // --- ignored_poison_in_import.carbon
  128. library "[[@TEST_NAME]]";
  129. import library "poison";
  130. // This doesn't fail.
  131. class N.C;
  132. // --- poison.impl.carbon
  133. impl library "[[@TEST_NAME]]";
  134. // TODO: #4622 This should fail since `N.C` was poisoned in the api.
  135. class N.C {}
  136. // --- fail_poison_when_lookup_fails.carbon
  137. library "[[@TEST_NAME]]";
  138. namespace N;
  139. // `package.C` and `N.C` poisoned when not found.
  140. // CHECK:STDERR: fail_poison_when_lookup_fails.carbon:[[@LINE+7]]:11: error: name `C` not found [NameNotFound]
  141. // CHECK:STDERR: fn N.F(x: C);
  142. // CHECK:STDERR: ^
  143. // CHECK:STDERR:
  144. // CHECK:STDERR: fail_poison_when_lookup_fails.carbon:[[@LINE+3]]:11: error: name `C` used before it was declared [NameUseBeforeDecl]
  145. // CHECK:STDERR: fn N.F(x: C);
  146. // CHECK:STDERR: ^
  147. fn N.F(x: C);
  148. // TODO: We should ideally only produce one diagnostic here.
  149. // CHECK:STDERR: fail_poison_when_lookup_fails.carbon:[[@LINE+7]]:7: note: declared here [NameUseBeforeDeclNote]
  150. // CHECK:STDERR: class C;
  151. // CHECK:STDERR: ^
  152. // CHECK:STDERR:
  153. // CHECK:STDERR: fail_poison_when_lookup_fails.carbon:[[@LINE-7]]:11: error: name `C` used before it was declared [NameUseBeforeDecl]
  154. // CHECK:STDERR: fn N.F(x: C);
  155. // CHECK:STDERR: ^
  156. class C;
  157. // CHECK:STDERR: fail_poison_when_lookup_fails.carbon:[[@LINE+4]]:9: note: declared here [NameUseBeforeDeclNote]
  158. // CHECK:STDERR: class N.C;
  159. // CHECK:STDERR: ^
  160. // CHECK:STDERR:
  161. class N.C;
  162. // --- fail_poison_with_lexical_result.carbon
  163. library "[[@TEST_NAME]]";
  164. fn F() {
  165. class C1 {}
  166. class C2 {
  167. // CHECK:STDERR: fail_poison_with_lexical_result.carbon:[[@LINE+3]]:12: error: name `C1` used before it was declared [NameUseBeforeDecl]
  168. // CHECK:STDERR: var v: C1;
  169. // CHECK:STDERR: ^~
  170. var v: C1;
  171. // CHECK:STDERR: fail_poison_with_lexical_result.carbon:[[@LINE+4]]:11: note: declared here [NameUseBeforeDeclNote]
  172. // CHECK:STDERR: class C1;
  173. // CHECK:STDERR: ^~
  174. // CHECK:STDERR:
  175. class C1;
  176. }
  177. }
  178. // --- fail_declare_data_member_after_poison.carbon
  179. library "[[@TEST_NAME]]";
  180. class C1;
  181. class C2 {
  182. // Use `package.C1` and poison `C2.C1`.
  183. // CHECK:STDERR: fail_declare_data_member_after_poison.carbon:[[@LINE+3]]:11: error: name `C1` used before it was declared [NameUseBeforeDecl]
  184. // CHECK:STDERR: fn F(x: C1);
  185. // CHECK:STDERR: ^~
  186. fn F(x: C1);
  187. class C2 {}
  188. // Failure: `C2.C1` declared after it was poisoned.
  189. // CHECK:STDERR: fail_declare_data_member_after_poison.carbon:[[@LINE+4]]:7: note: declared here [NameUseBeforeDeclNote]
  190. // CHECK:STDERR: var C1: C2;
  191. // CHECK:STDERR: ^~~~~~
  192. // CHECK:STDERR:
  193. var C1: C2;
  194. }
  195. // --- fail_extend_poison_class_members.carbon
  196. library "[[@TEST_NAME]]";
  197. base class B {}
  198. class C {
  199. // CHECK:STDERR: fail_extend_poison_class_members.carbon:[[@LINE+3]]:16: error: name `B` used before it was declared [NameUseBeforeDecl]
  200. // CHECK:STDERR: extend base: B;
  201. // CHECK:STDERR: ^
  202. extend base: B;
  203. // CHECK:STDERR: fail_extend_poison_class_members.carbon:[[@LINE+4]]:6: note: declared here [NameUseBeforeDeclNote]
  204. // CHECK:STDERR: fn B();
  205. // CHECK:STDERR: ^
  206. // CHECK:STDERR:
  207. fn B();
  208. }
  209. // --- todo_fail_poisoned_name_in_extend.carbon
  210. library "[[@TEST_NAME]]";
  211. base class B {
  212. fn F1();
  213. }
  214. class F1 {}
  215. class C {
  216. // Use `package.F1` and poison `C.F1`.
  217. fn F2(x: F1);
  218. // TODO: #4622 This should diagnose since `C.F1` is poisoned.
  219. extend base: B;
  220. }