fail_incomplete.carbon 8.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191
  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/convert.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/fail_incomplete.carbon
  10. // TIP: To dump output, run:
  11. // TIP: bazel run //toolchain/testing:file_test -- --dump_output --file_tests=toolchain/check/testdata/class/fail_incomplete.carbon
  12. // --- fail_forward_decl.carbon
  13. library "[[@TEST_NAME]]";
  14. class Class;
  15. // CHECK:STDERR: fail_forward_decl.carbon:[[@LINE+7]]:4: error: cannot declare a member of incomplete class `Class` [QualifiedDeclInIncompleteClassScope]
  16. // CHECK:STDERR: fn Class.Function() {}
  17. // CHECK:STDERR: ^~~~~
  18. // CHECK:STDERR: fail_forward_decl.carbon:[[@LINE-5]]:1: note: class was forward declared here [ClassForwardDeclaredHere]
  19. // CHECK:STDERR: class Class;
  20. // CHECK:STDERR: ^~~~~~~~~~~~
  21. // CHECK:STDERR:
  22. fn Class.Function() {}
  23. fn CallClassFunction() {
  24. // CHECK:STDERR: fail_forward_decl.carbon:[[@LINE+7]]:3: error: member access into incomplete class `Class` [QualifiedExprInIncompleteClassScope]
  25. // CHECK:STDERR: Class.Function();
  26. // CHECK:STDERR: ^~~~~~~~~~~~~~
  27. // CHECK:STDERR: fail_forward_decl.carbon:[[@LINE-15]]:1: note: class was forward declared here [ClassForwardDeclaredHere]
  28. // CHECK:STDERR: class Class;
  29. // CHECK:STDERR: ^~~~~~~~~~~~
  30. // CHECK:STDERR:
  31. Class.Function();
  32. }
  33. // CHECK:STDERR: fail_forward_decl.carbon:[[@LINE+7]]:17: error: binding pattern has incomplete type `Class` in name binding declaration [IncompleteTypeInBindingDecl]
  34. // CHECK:STDERR: var global_var: Class;
  35. // CHECK:STDERR: ^~~~~
  36. // CHECK:STDERR: fail_forward_decl.carbon:[[@LINE-25]]:1: note: class was forward declared here [ClassForwardDeclaredHere]
  37. // CHECK:STDERR: class Class;
  38. // CHECK:STDERR: ^~~~~~~~~~~~
  39. // CHECK:STDERR:
  40. var global_var: Class;
  41. // CHECK:STDERR: fail_forward_decl.carbon:[[@LINE+14]]:27: error: function returns incomplete type `Class` [IncompleteTypeInFunctionReturnType]
  42. // CHECK:STDERR: fn ConvertFromStruct() -> Class { return {}; }
  43. // CHECK:STDERR: ^~~~~
  44. // CHECK:STDERR: fail_forward_decl.carbon:[[@LINE-34]]:1: note: class was forward declared here [ClassForwardDeclaredHere]
  45. // CHECK:STDERR: class Class;
  46. // CHECK:STDERR: ^~~~~~~~~~~~
  47. // CHECK:STDERR:
  48. // CHECK:STDERR: fail_forward_decl.carbon:[[@LINE+7]]:27: error: parameter has incomplete type `Class` in function definition [IncompleteTypeInFunctionParam]
  49. // CHECK:STDERR: fn ConvertFromStruct() -> Class { return {}; }
  50. // CHECK:STDERR: ^~~~~
  51. // CHECK:STDERR: fail_forward_decl.carbon:[[@LINE-41]]:1: note: class was forward declared here [ClassForwardDeclaredHere]
  52. // CHECK:STDERR: class Class;
  53. // CHECK:STDERR: ^~~~~~~~~~~~
  54. // CHECK:STDERR:
  55. fn ConvertFromStruct() -> Class { return {}; }
  56. fn G(p: Class*) -> () {
  57. // CHECK:STDERR: fail_forward_decl.carbon:[[@LINE+7]]:10: error: member access into object of incomplete type `Class` [IncompleteTypeInMemberAccess]
  58. // CHECK:STDERR: return p->n;
  59. // CHECK:STDERR: ^~~~
  60. // CHECK:STDERR: fail_forward_decl.carbon:[[@LINE-51]]:1: note: class was forward declared here [ClassForwardDeclaredHere]
  61. // CHECK:STDERR: class Class;
  62. // CHECK:STDERR: ^~~~~~~~~~~~
  63. // CHECK:STDERR:
  64. return p->n;
  65. }
  66. fn MemberAccess(p: Class*) -> () {
  67. // CHECK:STDERR: fail_forward_decl.carbon:[[@LINE+7]]:11: error: member access into object of incomplete type `Class` [IncompleteTypeInMemberAccess]
  68. // CHECK:STDERR: return (*p).n;
  69. // CHECK:STDERR: ^~
  70. // CHECK:STDERR: fail_forward_decl.carbon:[[@LINE-62]]:1: note: class was forward declared here [ClassForwardDeclaredHere]
  71. // CHECK:STDERR: class Class;
  72. // CHECK:STDERR: ^~~~~~~~~~~~
  73. // CHECK:STDERR:
  74. return (*p).n;
  75. }
  76. // CHECK:STDERR: fail_forward_decl.carbon:[[@LINE+14]]:23: error: function returns incomplete type `Class` [IncompleteTypeInFunctionReturnType]
  77. // CHECK:STDERR: fn Copy(p: Class*) -> Class {
  78. // CHECK:STDERR: ^~~~~
  79. // CHECK:STDERR: fail_forward_decl.carbon:[[@LINE-72]]:1: note: class was forward declared here [ClassForwardDeclaredHere]
  80. // CHECK:STDERR: class Class;
  81. // CHECK:STDERR: ^~~~~~~~~~~~
  82. // CHECK:STDERR:
  83. // CHECK:STDERR: fail_forward_decl.carbon:[[@LINE+7]]:23: error: parameter has incomplete type `Class` in function definition [IncompleteTypeInFunctionParam]
  84. // CHECK:STDERR: fn Copy(p: Class*) -> Class {
  85. // CHECK:STDERR: ^~~~~
  86. // CHECK:STDERR: fail_forward_decl.carbon:[[@LINE-79]]:1: note: class was forward declared here [ClassForwardDeclaredHere]
  87. // CHECK:STDERR: class Class;
  88. // CHECK:STDERR: ^~~~~~~~~~~~
  89. // CHECK:STDERR:
  90. fn Copy(p: Class*) -> Class {
  91. return *p;
  92. }
  93. fn Let(p: Class*) {
  94. // CHECK:STDERR: fail_forward_decl.carbon:[[@LINE+7]]:10: error: binding pattern has incomplete type `Class` in name binding declaration [IncompleteTypeInBindingDecl]
  95. // CHECK:STDERR: let c: Class = *p;
  96. // CHECK:STDERR: ^~~~~
  97. // CHECK:STDERR: fail_forward_decl.carbon:[[@LINE-91]]:1: note: class was forward declared here [ClassForwardDeclaredHere]
  98. // CHECK:STDERR: class Class;
  99. // CHECK:STDERR: ^~~~~~~~~~~~
  100. // CHECK:STDERR:
  101. let c: Class = *p;
  102. }
  103. fn TakeIncomplete(c: Class);
  104. fn ReturnIncomplete() -> Class;
  105. fn CallTakeIncomplete(p: Class*) {
  106. // CHECK:STDERR: fail_forward_decl.carbon:[[@LINE+10]]:18: error: forming value of incomplete type `Class` [IncompleteTypeInValueConversion]
  107. // CHECK:STDERR: TakeIncomplete(*p);
  108. // CHECK:STDERR: ^~
  109. // CHECK:STDERR: fail_forward_decl.carbon:[[@LINE-106]]:1: note: class was forward declared here [ClassForwardDeclaredHere]
  110. // CHECK:STDERR: class Class;
  111. // CHECK:STDERR: ^~~~~~~~~~~~
  112. // CHECK:STDERR: fail_forward_decl.carbon:[[@LINE-11]]:19: note: initializing function parameter [InCallToFunctionParam]
  113. // CHECK:STDERR: fn TakeIncomplete(c: Class);
  114. // CHECK:STDERR: ^~~~~~~~
  115. // CHECK:STDERR:
  116. TakeIncomplete(*p);
  117. // CHECK:STDERR: fail_forward_decl.carbon:[[@LINE+10]]:18: error: forming value of incomplete type `Class` [IncompleteTypeInValueConversion]
  118. // CHECK:STDERR: TakeIncomplete({});
  119. // CHECK:STDERR: ^~
  120. // CHECK:STDERR: fail_forward_decl.carbon:[[@LINE-118]]:1: note: class was forward declared here [ClassForwardDeclaredHere]
  121. // CHECK:STDERR: class Class;
  122. // CHECK:STDERR: ^~~~~~~~~~~~
  123. // CHECK:STDERR: fail_forward_decl.carbon:[[@LINE-23]]:19: note: initializing function parameter [InCallToFunctionParam]
  124. // CHECK:STDERR: fn TakeIncomplete(c: Class);
  125. // CHECK:STDERR: ^~~~~~~~
  126. // CHECK:STDERR:
  127. TakeIncomplete({});
  128. }
  129. fn CallReturnIncomplete() {
  130. // CHECK:STDERR: fail_forward_decl.carbon:[[@LINE+10]]:3: error: function returns incomplete type `Class` [IncompleteTypeInFunctionReturnType]
  131. // CHECK:STDERR: ReturnIncomplete();
  132. // CHECK:STDERR: ^~~~~~~~~~~~~~~~~~
  133. // CHECK:STDERR: fail_forward_decl.carbon:[[@LINE-132]]:1: note: class was forward declared here [ClassForwardDeclaredHere]
  134. // CHECK:STDERR: class Class;
  135. // CHECK:STDERR: ^~~~~~~~~~~~
  136. // CHECK:STDERR: fail_forward_decl.carbon:[[@LINE-35]]:26: note: return type declared here [IncompleteReturnTypeHere]
  137. // CHECK:STDERR: fn ReturnIncomplete() -> Class;
  138. // CHECK:STDERR: ^~~~~
  139. // CHECK:STDERR:
  140. ReturnIncomplete();
  141. }
  142. class IncompleteRefSelf {
  143. fn F[ref self: Class]();
  144. }
  145. fn CallIncompleteAddrSelf(p: Class*) {
  146. // TODO: Should this be valid?
  147. // CHECK:STDERR: fail_forward_decl.carbon:[[@LINE+10]]:3: error: invalid use of incomplete type `Class` [IncompleteTypeInConversion]
  148. // CHECK:STDERR: p->(IncompleteRefSelf.F)();
  149. // CHECK:STDERR: ^~~~~~~~~~~~~~~~~~~~~~~~
  150. // CHECK:STDERR: fail_forward_decl.carbon:[[@LINE-151]]:1: note: class was forward declared here [ClassForwardDeclaredHere]
  151. // CHECK:STDERR: class Class;
  152. // CHECK:STDERR: ^~~~~~~~~~~~
  153. // CHECK:STDERR: fail_forward_decl.carbon:[[@LINE-11]]:8: note: initializing function parameter [InCallToFunctionParam]
  154. // CHECK:STDERR: fn F[ref self: Class]();
  155. // CHECK:STDERR: ^~~~~~~~~~~~~~~
  156. // CHECK:STDERR:
  157. p->(IncompleteRefSelf.F)();
  158. }
  159. // --- fail_in_definition.carbon
  160. library "[[@TEST_NAME]]";
  161. class C {
  162. // CHECK:STDERR: fail_in_definition.carbon:[[@LINE+7]]:10: error: field has incomplete type `C` [IncompleteTypeInFieldDecl]
  163. // CHECK:STDERR: var c: C;
  164. // CHECK:STDERR: ^
  165. // CHECK:STDERR: fail_in_definition.carbon:[[@LINE-4]]:1: note: class is incomplete within its definition [ClassIncompleteWithinDefinition]
  166. // CHECK:STDERR: class C {
  167. // CHECK:STDERR: ^~~~~~~~~
  168. // CHECK:STDERR:
  169. var c: C;
  170. }