fail_incomplete.carbon 7.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177
  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+7]]:24: 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. fn ConvertFromStruct() -> Class { return {}; }
  49. fn G(p: Class*) -> () {
  50. // CHECK:STDERR: fail_forward_decl.carbon:[[@LINE+7]]:10: error: member access into object of incomplete type `Class` [IncompleteTypeInMemberAccess]
  51. // CHECK:STDERR: return p->n;
  52. // CHECK:STDERR: ^~~~
  53. // CHECK:STDERR: fail_forward_decl.carbon:[[@LINE-44]]:1: note: class was forward declared here [ClassForwardDeclaredHere]
  54. // CHECK:STDERR: class Class;
  55. // CHECK:STDERR: ^~~~~~~~~~~~
  56. // CHECK:STDERR:
  57. return p->n;
  58. }
  59. fn MemberAccess(p: Class*) -> () {
  60. // CHECK:STDERR: fail_forward_decl.carbon:[[@LINE+7]]:11: error: member access into object of incomplete type `Class` [IncompleteTypeInMemberAccess]
  61. // CHECK:STDERR: return (*p).n;
  62. // CHECK:STDERR: ^~
  63. // CHECK:STDERR: fail_forward_decl.carbon:[[@LINE-55]]:1: note: class was forward declared here [ClassForwardDeclaredHere]
  64. // CHECK:STDERR: class Class;
  65. // CHECK:STDERR: ^~~~~~~~~~~~
  66. // CHECK:STDERR:
  67. return (*p).n;
  68. }
  69. // CHECK:STDERR: fail_forward_decl.carbon:[[@LINE+7]]:20: error: function returns incomplete type `Class` [IncompleteTypeInFunctionReturnType]
  70. // CHECK:STDERR: fn Copy(p: Class*) -> Class {
  71. // CHECK:STDERR: ^~~~~~~~
  72. // CHECK:STDERR: fail_forward_decl.carbon:[[@LINE-65]]:1: note: class was forward declared here [ClassForwardDeclaredHere]
  73. // CHECK:STDERR: class Class;
  74. // CHECK:STDERR: ^~~~~~~~~~~~
  75. // CHECK:STDERR:
  76. fn Copy(p: Class*) -> Class {
  77. return *p;
  78. }
  79. fn Let(p: Class*) {
  80. // CHECK:STDERR: fail_forward_decl.carbon:[[@LINE+7]]:10: error: binding pattern has incomplete type `Class` in name binding declaration [IncompleteTypeInBindingDecl]
  81. // CHECK:STDERR: let c: Class = *p;
  82. // CHECK:STDERR: ^~~~~
  83. // CHECK:STDERR: fail_forward_decl.carbon:[[@LINE-77]]:1: note: class was forward declared here [ClassForwardDeclaredHere]
  84. // CHECK:STDERR: class Class;
  85. // CHECK:STDERR: ^~~~~~~~~~~~
  86. // CHECK:STDERR:
  87. let c: Class = *p;
  88. }
  89. fn TakeIncomplete(c: Class);
  90. fn ReturnIncomplete() -> Class;
  91. fn CallTakeIncomplete(p: Class*) {
  92. // CHECK:STDERR: fail_forward_decl.carbon:[[@LINE+10]]:18: error: forming value of incomplete type `Class` [IncompleteTypeInValueConversion]
  93. // CHECK:STDERR: TakeIncomplete(*p);
  94. // CHECK:STDERR: ^~
  95. // CHECK:STDERR: fail_forward_decl.carbon:[[@LINE-92]]:1: note: class was forward declared here [ClassForwardDeclaredHere]
  96. // CHECK:STDERR: class Class;
  97. // CHECK:STDERR: ^~~~~~~~~~~~
  98. // CHECK:STDERR: fail_forward_decl.carbon:[[@LINE-11]]:19: note: initializing function parameter [InCallToFunctionParam]
  99. // CHECK:STDERR: fn TakeIncomplete(c: Class);
  100. // CHECK:STDERR: ^~~~~~~~
  101. // CHECK:STDERR:
  102. TakeIncomplete(*p);
  103. // CHECK:STDERR: fail_forward_decl.carbon:[[@LINE+10]]:18: error: forming value of incomplete type `Class` [IncompleteTypeInValueConversion]
  104. // CHECK:STDERR: TakeIncomplete({});
  105. // CHECK:STDERR: ^~
  106. // CHECK:STDERR: fail_forward_decl.carbon:[[@LINE-104]]:1: note: class was forward declared here [ClassForwardDeclaredHere]
  107. // CHECK:STDERR: class Class;
  108. // CHECK:STDERR: ^~~~~~~~~~~~
  109. // CHECK:STDERR: fail_forward_decl.carbon:[[@LINE-23]]:19: note: initializing function parameter [InCallToFunctionParam]
  110. // CHECK:STDERR: fn TakeIncomplete(c: Class);
  111. // CHECK:STDERR: ^~~~~~~~
  112. // CHECK:STDERR:
  113. TakeIncomplete({});
  114. }
  115. fn CallReturnIncomplete() {
  116. // CHECK:STDERR: fail_forward_decl.carbon:[[@LINE+10]]:3: error: function returns incomplete type `Class` [IncompleteTypeInFunctionReturnType]
  117. // CHECK:STDERR: ReturnIncomplete();
  118. // CHECK:STDERR: ^~~~~~~~~~~~~~~~~~
  119. // CHECK:STDERR: fail_forward_decl.carbon:[[@LINE-118]]:1: note: class was forward declared here [ClassForwardDeclaredHere]
  120. // CHECK:STDERR: class Class;
  121. // CHECK:STDERR: ^~~~~~~~~~~~
  122. // CHECK:STDERR: fail_forward_decl.carbon:[[@LINE-35]]:23: note: return type declared here [IncompleteReturnTypeHere]
  123. // CHECK:STDERR: fn ReturnIncomplete() -> Class;
  124. // CHECK:STDERR: ^~~~~~~~
  125. // CHECK:STDERR:
  126. ReturnIncomplete();
  127. }
  128. class IncompleteRefSelf {
  129. fn F[ref self: Class]();
  130. }
  131. fn CallIncompleteAddrSelf(p: Class*) {
  132. // TODO: Should this be valid?
  133. // CHECK:STDERR: fail_forward_decl.carbon:[[@LINE+10]]:3: error: invalid use of incomplete type `Class` [IncompleteTypeInConversion]
  134. // CHECK:STDERR: p->(IncompleteRefSelf.F)();
  135. // CHECK:STDERR: ^~~~~~~~~~~~~~~~~~~~~~~~
  136. // CHECK:STDERR: fail_forward_decl.carbon:[[@LINE-137]]:1: note: class was forward declared here [ClassForwardDeclaredHere]
  137. // CHECK:STDERR: class Class;
  138. // CHECK:STDERR: ^~~~~~~~~~~~
  139. // CHECK:STDERR: fail_forward_decl.carbon:[[@LINE-11]]:8: note: initializing function parameter [InCallToFunctionParam]
  140. // CHECK:STDERR: fn F[ref self: Class]();
  141. // CHECK:STDERR: ^~~~~~~~~~~~~~~
  142. // CHECK:STDERR:
  143. p->(IncompleteRefSelf.F)();
  144. }
  145. // --- fail_in_definition.carbon
  146. library "[[@TEST_NAME]]";
  147. class C {
  148. // CHECK:STDERR: fail_in_definition.carbon:[[@LINE+7]]:10: error: field has incomplete type `C` [IncompleteTypeInFieldDecl]
  149. // CHECK:STDERR: var c: C;
  150. // CHECK:STDERR: ^
  151. // CHECK:STDERR: fail_in_definition.carbon:[[@LINE-4]]:1: note: class is incomplete within its definition [ClassIncompleteWithinDefinition]
  152. // CHECK:STDERR: class C {
  153. // CHECK:STDERR: ^~~~~~~~~
  154. // CHECK:STDERR:
  155. var c: C;
  156. }