fail_incomplete.carbon 7.7 KB

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