decl_statement.carbon 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188
  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/parse/testdata/function/decl_statement.carbon
  8. // TIP: To dump output, run:
  9. // TIP: bazel run //toolchain/testing:file_test -- --dump_output --file_tests=toolchain/parse/testdata/function/decl_statement.carbon
  10. // --- valid.carbon
  11. // These are expected to work.
  12. fn F() {
  13. alias A = i32;
  14. class A {}
  15. base class B {}
  16. abstract class Abstract {}
  17. fn F() {}
  18. constraint C {}
  19. interface I {}
  20. impl A as I {}
  21. final impl A as I {}
  22. choice C {}
  23. let n: i32 = 0;
  24. var v: i32;
  25. }
  26. // --- syntactically_valid.carbon
  27. // These parse but should not type-check.
  28. fn F() {
  29. adapt A;
  30. extend adapt A;
  31. extend base: B;
  32. extend impl as I;
  33. namespace N;
  34. default fn F();
  35. impl fn G();
  36. override fn H();
  37. virtual fn H();
  38. private var v: i32;
  39. protected var v: i32;
  40. }
  41. // CHECK:STDOUT: - filename: valid.carbon
  42. // CHECK:STDOUT: parse_tree: [
  43. // CHECK:STDOUT: {kind: 'FileStart', text: ''},
  44. // CHECK:STDOUT: {kind: 'FunctionIntroducer', text: 'fn'},
  45. // CHECK:STDOUT: {kind: 'IdentifierNameMaybeBeforeSignature', text: 'F'},
  46. // CHECK:STDOUT: {kind: 'ExplicitParamListStart', text: '('},
  47. // CHECK:STDOUT: {kind: 'ExplicitParamList', text: ')', subtree_size: 2},
  48. // CHECK:STDOUT: {kind: 'FunctionDefinitionStart', text: '{', subtree_size: 5},
  49. // CHECK:STDOUT: {kind: 'AliasIntroducer', text: 'alias'},
  50. // CHECK:STDOUT: {kind: 'IdentifierNameNotBeforeSignature', text: 'A'},
  51. // CHECK:STDOUT: {kind: 'AliasInitializer', text: '='},
  52. // CHECK:STDOUT: {kind: 'IntTypeLiteral', text: 'i32'},
  53. // CHECK:STDOUT: {kind: 'Alias', text: ';', subtree_size: 5},
  54. // CHECK:STDOUT: {kind: 'ClassIntroducer', text: 'class'},
  55. // CHECK:STDOUT: {kind: 'IdentifierNameNotBeforeSignature', text: 'A'},
  56. // CHECK:STDOUT: {kind: 'ClassDefinitionStart', text: '{', subtree_size: 3},
  57. // CHECK:STDOUT: {kind: 'ClassDefinition', text: '}', subtree_size: 4},
  58. // CHECK:STDOUT: {kind: 'ClassIntroducer', text: 'class'},
  59. // CHECK:STDOUT: {kind: 'BaseModifier', text: 'base'},
  60. // CHECK:STDOUT: {kind: 'IdentifierNameNotBeforeSignature', text: 'B'},
  61. // CHECK:STDOUT: {kind: 'ClassDefinitionStart', text: '{', subtree_size: 4},
  62. // CHECK:STDOUT: {kind: 'ClassDefinition', text: '}', subtree_size: 5},
  63. // CHECK:STDOUT: {kind: 'ClassIntroducer', text: 'class'},
  64. // CHECK:STDOUT: {kind: 'AbstractModifier', text: 'abstract'},
  65. // CHECK:STDOUT: {kind: 'IdentifierNameNotBeforeSignature', text: 'Abstract'},
  66. // CHECK:STDOUT: {kind: 'ClassDefinitionStart', text: '{', subtree_size: 4},
  67. // CHECK:STDOUT: {kind: 'ClassDefinition', text: '}', subtree_size: 5},
  68. // CHECK:STDOUT: {kind: 'FunctionIntroducer', text: 'fn'},
  69. // CHECK:STDOUT: {kind: 'IdentifierNameMaybeBeforeSignature', text: 'F'},
  70. // CHECK:STDOUT: {kind: 'ExplicitParamListStart', text: '('},
  71. // CHECK:STDOUT: {kind: 'ExplicitParamList', text: ')', subtree_size: 2},
  72. // CHECK:STDOUT: {kind: 'FunctionDefinitionStart', text: '{', subtree_size: 5},
  73. // CHECK:STDOUT: {kind: 'FunctionDefinition', text: '}', subtree_size: 6},
  74. // CHECK:STDOUT: {kind: 'NamedConstraintIntroducer', text: 'constraint'},
  75. // CHECK:STDOUT: {kind: 'IdentifierNameNotBeforeSignature', text: 'C'},
  76. // CHECK:STDOUT: {kind: 'NamedConstraintDefinitionStart', text: '{', subtree_size: 3},
  77. // CHECK:STDOUT: {kind: 'NamedConstraintDefinition', text: '}', subtree_size: 4},
  78. // CHECK:STDOUT: {kind: 'InterfaceIntroducer', text: 'interface'},
  79. // CHECK:STDOUT: {kind: 'IdentifierNameNotBeforeSignature', text: 'I'},
  80. // CHECK:STDOUT: {kind: 'InterfaceDefinitionStart', text: '{', subtree_size: 3},
  81. // CHECK:STDOUT: {kind: 'InterfaceDefinition', text: '}', subtree_size: 4},
  82. // CHECK:STDOUT: {kind: 'ImplIntroducer', text: 'impl'},
  83. // CHECK:STDOUT: {kind: 'IdentifierNameExpr', text: 'A'},
  84. // CHECK:STDOUT: {kind: 'ImplTypeAs', text: 'as', subtree_size: 2},
  85. // CHECK:STDOUT: {kind: 'IdentifierNameExpr', text: 'I'},
  86. // CHECK:STDOUT: {kind: 'ImplDefinitionStart', text: '{', subtree_size: 5},
  87. // CHECK:STDOUT: {kind: 'ImplDefinition', text: '}', subtree_size: 6},
  88. // CHECK:STDOUT: {kind: 'ImplIntroducer', text: 'impl'},
  89. // CHECK:STDOUT: {kind: 'FinalModifier', text: 'final'},
  90. // CHECK:STDOUT: {kind: 'IdentifierNameExpr', text: 'A'},
  91. // CHECK:STDOUT: {kind: 'ImplTypeAs', text: 'as', subtree_size: 2},
  92. // CHECK:STDOUT: {kind: 'IdentifierNameExpr', text: 'I'},
  93. // CHECK:STDOUT: {kind: 'ImplDefinitionStart', text: '{', subtree_size: 6},
  94. // CHECK:STDOUT: {kind: 'ImplDefinition', text: '}', subtree_size: 7},
  95. // CHECK:STDOUT: {kind: 'ChoiceIntroducer', text: 'choice'},
  96. // CHECK:STDOUT: {kind: 'IdentifierNameNotBeforeSignature', text: 'C'},
  97. // CHECK:STDOUT: {kind: 'ChoiceDefinitionStart', text: '{', subtree_size: 3},
  98. // CHECK:STDOUT: {kind: 'ChoiceDefinition', text: '}', subtree_size: 4},
  99. // CHECK:STDOUT: {kind: 'LetIntroducer', text: 'let'},
  100. // CHECK:STDOUT: {kind: 'IdentifierNameNotBeforeSignature', text: 'n'},
  101. // CHECK:STDOUT: {kind: 'IntTypeLiteral', text: 'i32'},
  102. // CHECK:STDOUT: {kind: 'LetBindingPattern', text: ':', subtree_size: 3},
  103. // CHECK:STDOUT: {kind: 'LetInitializer', text: '='},
  104. // CHECK:STDOUT: {kind: 'IntLiteral', text: '0'},
  105. // CHECK:STDOUT: {kind: 'LetDecl', text: ';', subtree_size: 7},
  106. // CHECK:STDOUT: {kind: 'VariableIntroducer', text: 'var'},
  107. // CHECK:STDOUT: {kind: 'IdentifierNameNotBeforeSignature', text: 'v'},
  108. // CHECK:STDOUT: {kind: 'IntTypeLiteral', text: 'i32'},
  109. // CHECK:STDOUT: {kind: 'VarBindingPattern', text: ':', subtree_size: 3},
  110. // CHECK:STDOUT: {kind: 'VariablePattern', text: 'var', subtree_size: 4},
  111. // CHECK:STDOUT: {kind: 'VariableDecl', text: ';', subtree_size: 6},
  112. // CHECK:STDOUT: {kind: 'FunctionDefinition', text: '}', subtree_size: 69},
  113. // CHECK:STDOUT: {kind: 'FileEnd', text: ''},
  114. // CHECK:STDOUT: ]
  115. // CHECK:STDOUT: - filename: syntactically_valid.carbon
  116. // CHECK:STDOUT: parse_tree: [
  117. // CHECK:STDOUT: {kind: 'FileStart', text: ''},
  118. // CHECK:STDOUT: {kind: 'FunctionIntroducer', text: 'fn'},
  119. // CHECK:STDOUT: {kind: 'IdentifierNameMaybeBeforeSignature', text: 'F'},
  120. // CHECK:STDOUT: {kind: 'ExplicitParamListStart', text: '('},
  121. // CHECK:STDOUT: {kind: 'ExplicitParamList', text: ')', subtree_size: 2},
  122. // CHECK:STDOUT: {kind: 'FunctionDefinitionStart', text: '{', subtree_size: 5},
  123. // CHECK:STDOUT: {kind: 'AdaptIntroducer', text: 'adapt'},
  124. // CHECK:STDOUT: {kind: 'IdentifierNameExpr', text: 'A'},
  125. // CHECK:STDOUT: {kind: 'AdaptDecl', text: ';', subtree_size: 3},
  126. // CHECK:STDOUT: {kind: 'AdaptIntroducer', text: 'adapt'},
  127. // CHECK:STDOUT: {kind: 'ExtendModifier', text: 'extend'},
  128. // CHECK:STDOUT: {kind: 'IdentifierNameExpr', text: 'A'},
  129. // CHECK:STDOUT: {kind: 'AdaptDecl', text: ';', subtree_size: 4},
  130. // CHECK:STDOUT: {kind: 'BaseIntroducer', text: 'base'},
  131. // CHECK:STDOUT: {kind: 'ExtendModifier', text: 'extend'},
  132. // CHECK:STDOUT: {kind: 'BaseColon', text: ':'},
  133. // CHECK:STDOUT: {kind: 'IdentifierNameExpr', text: 'B'},
  134. // CHECK:STDOUT: {kind: 'BaseDecl', text: ';', subtree_size: 5},
  135. // CHECK:STDOUT: {kind: 'ImplIntroducer', text: 'impl'},
  136. // CHECK:STDOUT: {kind: 'ExtendModifier', text: 'extend'},
  137. // CHECK:STDOUT: {kind: 'ImplDefaultSelfAs', text: 'as'},
  138. // CHECK:STDOUT: {kind: 'IdentifierNameExpr', text: 'I'},
  139. // CHECK:STDOUT: {kind: 'ImplDecl', text: ';', subtree_size: 5},
  140. // CHECK:STDOUT: {kind: 'NamespaceStart', text: 'namespace'},
  141. // CHECK:STDOUT: {kind: 'IdentifierNameNotBeforeSignature', text: 'N'},
  142. // CHECK:STDOUT: {kind: 'Namespace', text: ';', subtree_size: 3},
  143. // CHECK:STDOUT: {kind: 'FunctionIntroducer', text: 'fn'},
  144. // CHECK:STDOUT: {kind: 'DefaultModifier', text: 'default'},
  145. // CHECK:STDOUT: {kind: 'IdentifierNameMaybeBeforeSignature', text: 'F'},
  146. // CHECK:STDOUT: {kind: 'ExplicitParamListStart', text: '('},
  147. // CHECK:STDOUT: {kind: 'ExplicitParamList', text: ')', subtree_size: 2},
  148. // CHECK:STDOUT: {kind: 'FunctionDecl', text: ';', subtree_size: 6},
  149. // CHECK:STDOUT: {kind: 'FunctionIntroducer', text: 'fn'},
  150. // CHECK:STDOUT: {kind: 'ImplModifier', text: 'impl'},
  151. // CHECK:STDOUT: {kind: 'IdentifierNameMaybeBeforeSignature', text: 'G'},
  152. // CHECK:STDOUT: {kind: 'ExplicitParamListStart', text: '('},
  153. // CHECK:STDOUT: {kind: 'ExplicitParamList', text: ')', subtree_size: 2},
  154. // CHECK:STDOUT: {kind: 'FunctionDecl', text: ';', subtree_size: 6},
  155. // CHECK:STDOUT: {kind: 'FunctionIntroducer', text: 'fn'},
  156. // CHECK:STDOUT: {kind: 'OverrideModifier', text: 'override'},
  157. // CHECK:STDOUT: {kind: 'IdentifierNameMaybeBeforeSignature', text: 'H'},
  158. // CHECK:STDOUT: {kind: 'ExplicitParamListStart', text: '('},
  159. // CHECK:STDOUT: {kind: 'ExplicitParamList', text: ')', subtree_size: 2},
  160. // CHECK:STDOUT: {kind: 'FunctionDecl', text: ';', subtree_size: 6},
  161. // CHECK:STDOUT: {kind: 'FunctionIntroducer', text: 'fn'},
  162. // CHECK:STDOUT: {kind: 'VirtualModifier', text: 'virtual'},
  163. // CHECK:STDOUT: {kind: 'IdentifierNameMaybeBeforeSignature', text: 'H'},
  164. // CHECK:STDOUT: {kind: 'ExplicitParamListStart', text: '('},
  165. // CHECK:STDOUT: {kind: 'ExplicitParamList', text: ')', subtree_size: 2},
  166. // CHECK:STDOUT: {kind: 'FunctionDecl', text: ';', subtree_size: 6},
  167. // CHECK:STDOUT: {kind: 'VariableIntroducer', text: 'var'},
  168. // CHECK:STDOUT: {kind: 'PrivateModifier', text: 'private'},
  169. // CHECK:STDOUT: {kind: 'IdentifierNameNotBeforeSignature', text: 'v'},
  170. // CHECK:STDOUT: {kind: 'IntTypeLiteral', text: 'i32'},
  171. // CHECK:STDOUT: {kind: 'VarBindingPattern', text: ':', subtree_size: 3},
  172. // CHECK:STDOUT: {kind: 'VariablePattern', text: 'var', subtree_size: 4},
  173. // CHECK:STDOUT: {kind: 'VariableDecl', text: ';', subtree_size: 7},
  174. // CHECK:STDOUT: {kind: 'VariableIntroducer', text: 'var'},
  175. // CHECK:STDOUT: {kind: 'ProtectedModifier', text: 'protected'},
  176. // CHECK:STDOUT: {kind: 'IdentifierNameNotBeforeSignature', text: 'v'},
  177. // CHECK:STDOUT: {kind: 'IntTypeLiteral', text: 'i32'},
  178. // CHECK:STDOUT: {kind: 'VarBindingPattern', text: ':', subtree_size: 3},
  179. // CHECK:STDOUT: {kind: 'VariablePattern', text: 'var', subtree_size: 4},
  180. // CHECK:STDOUT: {kind: 'VariableDecl', text: ';', subtree_size: 7},
  181. // CHECK:STDOUT: {kind: 'FunctionDefinition', text: '}', subtree_size: 64},
  182. // CHECK:STDOUT: {kind: 'FileEnd', text: ''},
  183. // CHECK:STDOUT: ]