| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521 |
- // Part of the Carbon Language project, under the Apache License v2.0 with LLVM
- // Exceptions. See /LICENSE for license information.
- // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
- //
- // AUTOUPDATE
- // TIP: To test this file alone, run:
- // TIP: bazel test //toolchain/testing:file_test --test_arg=--file_tests=toolchain/parse/testdata/function/declaration.carbon
- // TIP: To dump output, run:
- // TIP: bazel run //toolchain/testing:file_test -- --dump_output --file_tests=toolchain/parse/testdata/function/declaration.carbon
- // --- basic.carbon
- fn F();
- // --- ref.carbon
- fn foo(ref a: i32);
- // --- implicit_empty.carbon
- fn foo[]();
- // --- implicit_params.carbon
- fn foo[a: i32, b: i32]();
- // --- no_params.carbon
- fn foo {}
- // --- params.carbon
- fn foo(a: i32, b: i32);
- // --- with_return_type.carbon
- fn foo() -> u32;
- // --- impl_fn.carbon
- override fn F();
- abstract override fn G();
- override abstract fn H();
- private override default fn I();
- // --- fail_identifier_instead_of_sig.carbon
- // CHECK:STDERR: fail_identifier_instead_of_sig.carbon:[[@LINE+4]]:8: error: `fn` declarations must either end with a `;` or have a `{ ... }` block for a definition [ExpectedDeclSemiOrDefinition]
- // CHECK:STDERR: fn foo bar;
- // CHECK:STDERR: ^~~
- // CHECK:STDERR:
- fn foo bar;
- // --- fail_missing_implicit_close.carbon
- // CHECK:STDERR: fail_missing_implicit_close.carbon:[[@LINE+8]]:7: error: opening symbol without a corresponding closing symbol [UnmatchedOpening]
- // CHECK:STDERR: fn Div[();
- // CHECK:STDERR: ^
- // CHECK:STDERR:
- // CHECK:STDERR: fail_missing_implicit_close.carbon:[[@LINE+4]]:7: error: `fn` declarations must either end with a `;` or have a `{ ... }` block for a definition [ExpectedDeclSemiOrDefinition]
- // CHECK:STDERR: fn Div[();
- // CHECK:STDERR: ^
- // CHECK:STDERR:
- fn Div[();
- // --- fail_missing_name.carbon
- // CHECK:STDERR: fail_missing_name.carbon:[[@LINE+4]]:4: error: `fn` introducer should be followed by a name [ExpectedDeclName]
- // CHECK:STDERR: fn ();
- // CHECK:STDERR: ^
- // CHECK:STDERR:
- fn ();
- // --- fail_no_sig_or_semi.carbon
- fn foo
- // CHECK:STDERR: fail_no_sig_or_semi.carbon:[[@LINE+4]]:1: error: `fn` declarations must either end with a `;` or have a `{ ... }` block for a definition [ExpectedDeclSemiOrDefinition]
- // CHECK:STDERR:
- // CHECK:STDERR: ^
- // CHECK:STDERR:
- // --- fail_only_fn_and_semi.carbon
- // CHECK:STDERR: fail_only_fn_and_semi.carbon:[[@LINE+4]]:3: error: `fn` introducer should be followed by a name [ExpectedDeclName]
- // CHECK:STDERR: fn;
- // CHECK:STDERR: ^
- // CHECK:STDERR:
- fn;
- // --- fail_repeated_fn_and_semi.carbon
- // CHECK:STDERR: fail_repeated_fn_and_semi.carbon:[[@LINE+4]]:4: error: `fn` introducer should be followed by a name [ExpectedDeclName]
- // CHECK:STDERR: fn fn;
- // CHECK:STDERR: ^~
- // CHECK:STDERR:
- fn fn;
- // --- fail_skip_indented_newline_until_outdent.carbon
- // CHECK:STDERR: fail_skip_indented_newline_until_outdent.carbon:[[@LINE+4]]:6: error: `fn` introducer should be followed by a name [ExpectedDeclName]
- // CHECK:STDERR: fn (x,
- // CHECK:STDERR: ^
- // CHECK:STDERR:
- fn (x,
- y,
- z)
- fn F();
- // --- fail_skip_indented_newline_with_semi.carbon
- // CHECK:STDERR: fail_skip_indented_newline_with_semi.carbon:[[@LINE+4]]:4: error: `fn` introducer should be followed by a name [ExpectedDeclName]
- // CHECK:STDERR: fn (x,
- // CHECK:STDERR: ^
- // CHECK:STDERR:
- fn (x,
- y,
- z);
- fn F();
- // --- fail_skip_indented_newline_without_semi.carbon
- // CHECK:STDERR: fail_skip_indented_newline_without_semi.carbon:[[@LINE+4]]:4: error: `fn` introducer should be followed by a name [ExpectedDeclName]
- // CHECK:STDERR: fn (x,
- // CHECK:STDERR: ^
- // CHECK:STDERR:
- fn (x,
- y,
- z)
- fn F();
- // --- fail_skip_to_newline_without_semi.carbon
- // CHECK:STDERR: fail_skip_to_newline_without_semi.carbon:[[@LINE+4]]:4: error: `fn` introducer should be followed by a name [ExpectedDeclName]
- // CHECK:STDERR: fn ()
- // CHECK:STDERR: ^
- // CHECK:STDERR:
- fn ()
- fn F();
- // --- fail_skip_without_semi_to_curly.carbon
- // CHECK:STDERR: fail_skip_without_semi_to_curly.carbon:[[@LINE+4]]:1: error: unrecognized declaration introducer [UnrecognizedDecl]
- // CHECK:STDERR: struct X { fn () }
- // CHECK:STDERR: ^~~~~~
- // CHECK:STDERR:
- struct X { fn () }
- fn F();
- // --- with_identifier_as_param.carbon
- fn foo(bar);
- // --- fail_without_name_and_many_tokens_in_params.carbon
- // CHECK:STDERR: fail_without_name_and_many_tokens_in_params.carbon:[[@LINE+4]]:4: error: `fn` introducer should be followed by a name [ExpectedDeclName]
- // CHECK:STDERR: fn (a tokens c d e f g h i j k l m n o p q r s t u v w x y z);
- // CHECK:STDERR: ^
- // CHECK:STDERR:
- fn (a tokens c d e f g h i j k l m n o p q r s t u v w x y z);
- // --- form_parameter.carbon
- fn FormParam(x:? Form);
- fn ComplexFormParam(x:? X.Y(Z));
- // --- fail_ref_on_form_parameter.carbon
- // CHECK:STDERR: fail_ref_on_form_parameter.carbon:[[@LINE+4]]:6: error: expected `:` binding after `ref` [ExpectedRuntimeBindingPatternAfterRef]
- // CHECK:STDERR: fn F(ref x:? Form);
- // CHECK:STDERR: ^~~
- // CHECK:STDERR:
- fn F(ref x:? Form);
- // --- fail_form_within_var.carbon
- // CHECK:STDERR: fail_form_within_var.carbon:[[@LINE+4]]:26: error: found `:?` pattern inside `var` pattern [NonRegularBindingInVarDecl]
- // CHECK:STDERR: fn FormInVar(var x:? Form);
- // CHECK:STDERR: ^
- // CHECK:STDERR:
- fn FormInVar(var x:? Form);
- // --- return_form.carbon
- fn SimpleReturnForm() ->? Form;
- fn ComplexReturnForm() ->? X.Y(Z);
- // CHECK:STDOUT: - filename: basic.carbon
- // CHECK:STDOUT: parse_tree: [
- // CHECK:STDOUT: {kind: 'FileStart', text: ''},
- // CHECK:STDOUT: {kind: 'FunctionIntroducer', text: 'fn'},
- // CHECK:STDOUT: {kind: 'IdentifierNameMaybeBeforeSignature', text: 'F'},
- // CHECK:STDOUT: {kind: 'ExplicitParamListStart', text: '('},
- // CHECK:STDOUT: {kind: 'ExplicitParamList', text: ')', subtree_size: 2},
- // CHECK:STDOUT: {kind: 'FunctionDecl', text: ';', subtree_size: 5},
- // CHECK:STDOUT: {kind: 'FileEnd', text: ''},
- // CHECK:STDOUT: ]
- // CHECK:STDOUT: - filename: ref.carbon
- // CHECK:STDOUT: parse_tree: [
- // CHECK:STDOUT: {kind: 'FileStart', text: ''},
- // CHECK:STDOUT: {kind: 'FunctionIntroducer', text: 'fn'},
- // CHECK:STDOUT: {kind: 'IdentifierNameMaybeBeforeSignature', text: 'foo'},
- // CHECK:STDOUT: {kind: 'ExplicitParamListStart', text: '('},
- // CHECK:STDOUT: {kind: 'IdentifierNameNotBeforeSignature', text: 'a'},
- // CHECK:STDOUT: {kind: 'RefBindingName', text: 'ref', subtree_size: 2},
- // CHECK:STDOUT: {kind: 'IntTypeLiteral', text: 'i32'},
- // CHECK:STDOUT: {kind: 'LetBindingPattern', text: ':', subtree_size: 4},
- // CHECK:STDOUT: {kind: 'ExplicitParamList', text: ')', subtree_size: 6},
- // CHECK:STDOUT: {kind: 'FunctionDecl', text: ';', subtree_size: 9},
- // CHECK:STDOUT: {kind: 'FileEnd', text: ''},
- // CHECK:STDOUT: ]
- // CHECK:STDOUT: - filename: implicit_empty.carbon
- // CHECK:STDOUT: parse_tree: [
- // CHECK:STDOUT: {kind: 'FileStart', text: ''},
- // CHECK:STDOUT: {kind: 'FunctionIntroducer', text: 'fn'},
- // CHECK:STDOUT: {kind: 'IdentifierNameMaybeBeforeSignature', text: 'foo'},
- // CHECK:STDOUT: {kind: 'ImplicitParamListStart', text: '['},
- // CHECK:STDOUT: {kind: 'ImplicitParamList', text: ']', subtree_size: 2},
- // CHECK:STDOUT: {kind: 'ExplicitParamListStart', text: '('},
- // CHECK:STDOUT: {kind: 'ExplicitParamList', text: ')', subtree_size: 2},
- // CHECK:STDOUT: {kind: 'FunctionDecl', text: ';', subtree_size: 7},
- // CHECK:STDOUT: {kind: 'FileEnd', text: ''},
- // CHECK:STDOUT: ]
- // CHECK:STDOUT: - filename: implicit_params.carbon
- // CHECK:STDOUT: parse_tree: [
- // CHECK:STDOUT: {kind: 'FileStart', text: ''},
- // CHECK:STDOUT: {kind: 'FunctionIntroducer', text: 'fn'},
- // CHECK:STDOUT: {kind: 'IdentifierNameMaybeBeforeSignature', text: 'foo'},
- // CHECK:STDOUT: {kind: 'ImplicitParamListStart', text: '['},
- // CHECK:STDOUT: {kind: 'IdentifierNameNotBeforeSignature', text: 'a'},
- // CHECK:STDOUT: {kind: 'IntTypeLiteral', text: 'i32'},
- // CHECK:STDOUT: {kind: 'LetBindingPattern', text: ':', subtree_size: 3},
- // CHECK:STDOUT: {kind: 'PatternListComma', text: ','},
- // CHECK:STDOUT: {kind: 'IdentifierNameNotBeforeSignature', text: 'b'},
- // CHECK:STDOUT: {kind: 'IntTypeLiteral', text: 'i32'},
- // CHECK:STDOUT: {kind: 'LetBindingPattern', text: ':', subtree_size: 3},
- // CHECK:STDOUT: {kind: 'ImplicitParamList', text: ']', subtree_size: 9},
- // CHECK:STDOUT: {kind: 'ExplicitParamListStart', text: '('},
- // CHECK:STDOUT: {kind: 'ExplicitParamList', text: ')', subtree_size: 2},
- // CHECK:STDOUT: {kind: 'FunctionDecl', text: ';', subtree_size: 14},
- // CHECK:STDOUT: {kind: 'FileEnd', text: ''},
- // CHECK:STDOUT: ]
- // CHECK:STDOUT: - filename: no_params.carbon
- // CHECK:STDOUT: parse_tree: [
- // CHECK:STDOUT: {kind: 'FileStart', text: ''},
- // CHECK:STDOUT: {kind: 'FunctionIntroducer', text: 'fn'},
- // CHECK:STDOUT: {kind: 'IdentifierNameNotBeforeSignature', text: 'foo'},
- // CHECK:STDOUT: {kind: 'FunctionDefinitionStart', text: '{', subtree_size: 3},
- // CHECK:STDOUT: {kind: 'FunctionDefinition', text: '}', subtree_size: 4},
- // CHECK:STDOUT: {kind: 'FileEnd', text: ''},
- // CHECK:STDOUT: ]
- // CHECK:STDOUT: - filename: params.carbon
- // CHECK:STDOUT: parse_tree: [
- // CHECK:STDOUT: {kind: 'FileStart', text: ''},
- // CHECK:STDOUT: {kind: 'FunctionIntroducer', text: 'fn'},
- // CHECK:STDOUT: {kind: 'IdentifierNameMaybeBeforeSignature', text: 'foo'},
- // CHECK:STDOUT: {kind: 'ExplicitParamListStart', text: '('},
- // CHECK:STDOUT: {kind: 'IdentifierNameNotBeforeSignature', text: 'a'},
- // CHECK:STDOUT: {kind: 'IntTypeLiteral', text: 'i32'},
- // CHECK:STDOUT: {kind: 'LetBindingPattern', text: ':', subtree_size: 3},
- // CHECK:STDOUT: {kind: 'PatternListComma', text: ','},
- // CHECK:STDOUT: {kind: 'IdentifierNameNotBeforeSignature', text: 'b'},
- // CHECK:STDOUT: {kind: 'IntTypeLiteral', text: 'i32'},
- // CHECK:STDOUT: {kind: 'LetBindingPattern', text: ':', subtree_size: 3},
- // CHECK:STDOUT: {kind: 'ExplicitParamList', text: ')', subtree_size: 9},
- // CHECK:STDOUT: {kind: 'FunctionDecl', text: ';', subtree_size: 12},
- // CHECK:STDOUT: {kind: 'FileEnd', text: ''},
- // CHECK:STDOUT: ]
- // CHECK:STDOUT: - filename: with_return_type.carbon
- // CHECK:STDOUT: parse_tree: [
- // CHECK:STDOUT: {kind: 'FileStart', text: ''},
- // CHECK:STDOUT: {kind: 'FunctionIntroducer', text: 'fn'},
- // CHECK:STDOUT: {kind: 'IdentifierNameMaybeBeforeSignature', text: 'foo'},
- // CHECK:STDOUT: {kind: 'ExplicitParamListStart', text: '('},
- // CHECK:STDOUT: {kind: 'ExplicitParamList', text: ')', subtree_size: 2},
- // CHECK:STDOUT: {kind: 'UnsignedIntTypeLiteral', text: 'u32'},
- // CHECK:STDOUT: {kind: 'ReturnType', text: '->', subtree_size: 2},
- // CHECK:STDOUT: {kind: 'FunctionDecl', text: ';', subtree_size: 7},
- // CHECK:STDOUT: {kind: 'FileEnd', text: ''},
- // CHECK:STDOUT: ]
- // CHECK:STDOUT: - filename: impl_fn.carbon
- // CHECK:STDOUT: parse_tree: [
- // CHECK:STDOUT: {kind: 'FileStart', text: ''},
- // CHECK:STDOUT: {kind: 'FunctionIntroducer', text: 'fn'},
- // CHECK:STDOUT: {kind: 'OverrideModifier', text: 'override'},
- // CHECK:STDOUT: {kind: 'IdentifierNameMaybeBeforeSignature', text: 'F'},
- // CHECK:STDOUT: {kind: 'ExplicitParamListStart', text: '('},
- // CHECK:STDOUT: {kind: 'ExplicitParamList', text: ')', subtree_size: 2},
- // CHECK:STDOUT: {kind: 'FunctionDecl', text: ';', subtree_size: 6},
- // CHECK:STDOUT: {kind: 'FunctionIntroducer', text: 'fn'},
- // CHECK:STDOUT: {kind: 'AbstractModifier', text: 'abstract'},
- // CHECK:STDOUT: {kind: 'OverrideModifier', text: 'override'},
- // CHECK:STDOUT: {kind: 'IdentifierNameMaybeBeforeSignature', text: 'G'},
- // CHECK:STDOUT: {kind: 'ExplicitParamListStart', text: '('},
- // CHECK:STDOUT: {kind: 'ExplicitParamList', text: ')', subtree_size: 2},
- // CHECK:STDOUT: {kind: 'FunctionDecl', text: ';', subtree_size: 7},
- // CHECK:STDOUT: {kind: 'FunctionIntroducer', text: 'fn'},
- // CHECK:STDOUT: {kind: 'OverrideModifier', text: 'override'},
- // CHECK:STDOUT: {kind: 'AbstractModifier', text: 'abstract'},
- // CHECK:STDOUT: {kind: 'IdentifierNameMaybeBeforeSignature', text: 'H'},
- // CHECK:STDOUT: {kind: 'ExplicitParamListStart', text: '('},
- // CHECK:STDOUT: {kind: 'ExplicitParamList', text: ')', subtree_size: 2},
- // CHECK:STDOUT: {kind: 'FunctionDecl', text: ';', subtree_size: 7},
- // CHECK:STDOUT: {kind: 'FunctionIntroducer', text: 'fn'},
- // CHECK:STDOUT: {kind: 'PrivateModifier', text: 'private'},
- // CHECK:STDOUT: {kind: 'OverrideModifier', text: 'override'},
- // CHECK:STDOUT: {kind: 'DefaultModifier', text: 'default'},
- // CHECK:STDOUT: {kind: 'IdentifierNameMaybeBeforeSignature', text: 'I'},
- // CHECK:STDOUT: {kind: 'ExplicitParamListStart', text: '('},
- // CHECK:STDOUT: {kind: 'ExplicitParamList', text: ')', subtree_size: 2},
- // CHECK:STDOUT: {kind: 'FunctionDecl', text: ';', subtree_size: 8},
- // CHECK:STDOUT: {kind: 'FileEnd', text: ''},
- // CHECK:STDOUT: ]
- // CHECK:STDOUT: - filename: fail_identifier_instead_of_sig.carbon
- // CHECK:STDOUT: parse_tree: [
- // CHECK:STDOUT: {kind: 'FileStart', text: ''},
- // CHECK:STDOUT: {kind: 'FunctionIntroducer', text: 'fn'},
- // CHECK:STDOUT: {kind: 'IdentifierNameNotBeforeSignature', text: 'foo'},
- // CHECK:STDOUT: {kind: 'FunctionDecl', text: ';', has_error: yes, subtree_size: 3},
- // CHECK:STDOUT: {kind: 'FileEnd', text: ''},
- // CHECK:STDOUT: ]
- // CHECK:STDOUT: - filename: fail_missing_implicit_close.carbon
- // CHECK:STDOUT: parse_tree: [
- // CHECK:STDOUT: {kind: 'FileStart', text: ''},
- // CHECK:STDOUT: {kind: 'FunctionIntroducer', text: 'fn'},
- // CHECK:STDOUT: {kind: 'IdentifierNameNotBeforeSignature', text: 'Div'},
- // CHECK:STDOUT: {kind: 'FunctionDecl', text: ';', has_error: yes, subtree_size: 3},
- // CHECK:STDOUT: {kind: 'FileEnd', text: ''},
- // CHECK:STDOUT: ]
- // CHECK:STDOUT: - filename: fail_missing_name.carbon
- // CHECK:STDOUT: parse_tree: [
- // CHECK:STDOUT: {kind: 'FileStart', text: ''},
- // CHECK:STDOUT: {kind: 'FunctionIntroducer', text: 'fn'},
- // CHECK:STDOUT: {kind: 'InvalidParse', text: '(', has_error: yes},
- // CHECK:STDOUT: {kind: 'FunctionDecl', text: ';', has_error: yes, subtree_size: 3},
- // CHECK:STDOUT: {kind: 'FileEnd', text: ''},
- // CHECK:STDOUT: ]
- // CHECK:STDOUT: - filename: fail_no_sig_or_semi.carbon
- // CHECK:STDOUT: parse_tree: [
- // CHECK:STDOUT: {kind: 'FileStart', text: ''},
- // CHECK:STDOUT: {kind: 'FunctionIntroducer', text: 'fn'},
- // CHECK:STDOUT: {kind: 'IdentifierNameNotBeforeSignature', text: 'foo'},
- // CHECK:STDOUT: {kind: 'FunctionDecl', text: 'fn', has_error: yes, subtree_size: 3},
- // CHECK:STDOUT: {kind: 'FileEnd', text: ''},
- // CHECK:STDOUT: ]
- // CHECK:STDOUT: - filename: fail_only_fn_and_semi.carbon
- // CHECK:STDOUT: parse_tree: [
- // CHECK:STDOUT: {kind: 'FileStart', text: ''},
- // CHECK:STDOUT: {kind: 'FunctionIntroducer', text: 'fn'},
- // CHECK:STDOUT: {kind: 'InvalidParse', text: ';', has_error: yes},
- // CHECK:STDOUT: {kind: 'FunctionDecl', text: ';', has_error: yes, subtree_size: 3},
- // CHECK:STDOUT: {kind: 'FileEnd', text: ''},
- // CHECK:STDOUT: ]
- // CHECK:STDOUT: - filename: fail_repeated_fn_and_semi.carbon
- // CHECK:STDOUT: parse_tree: [
- // CHECK:STDOUT: {kind: 'FileStart', text: ''},
- // CHECK:STDOUT: {kind: 'FunctionIntroducer', text: 'fn'},
- // CHECK:STDOUT: {kind: 'InvalidParse', text: 'fn', has_error: yes},
- // CHECK:STDOUT: {kind: 'FunctionDecl', text: ';', has_error: yes, subtree_size: 3},
- // CHECK:STDOUT: {kind: 'FileEnd', text: ''},
- // CHECK:STDOUT: ]
- // CHECK:STDOUT: - filename: fail_skip_indented_newline_until_outdent.carbon
- // CHECK:STDOUT: parse_tree: [
- // CHECK:STDOUT: {kind: 'FileStart', text: ''},
- // CHECK:STDOUT: {kind: 'FunctionIntroducer', text: 'fn'},
- // CHECK:STDOUT: {kind: 'InvalidParse', text: '(', has_error: yes},
- // CHECK:STDOUT: {kind: 'FunctionDecl', text: ')', has_error: yes, subtree_size: 3},
- // CHECK:STDOUT: {kind: 'FunctionIntroducer', text: 'fn'},
- // CHECK:STDOUT: {kind: 'IdentifierNameMaybeBeforeSignature', text: 'F'},
- // CHECK:STDOUT: {kind: 'ExplicitParamListStart', text: '('},
- // CHECK:STDOUT: {kind: 'ExplicitParamList', text: ')', subtree_size: 2},
- // CHECK:STDOUT: {kind: 'FunctionDecl', text: ';', subtree_size: 5},
- // CHECK:STDOUT: {kind: 'FileEnd', text: ''},
- // CHECK:STDOUT: ]
- // CHECK:STDOUT: - filename: fail_skip_indented_newline_with_semi.carbon
- // CHECK:STDOUT: parse_tree: [
- // CHECK:STDOUT: {kind: 'FileStart', text: ''},
- // CHECK:STDOUT: {kind: 'FunctionIntroducer', text: 'fn'},
- // CHECK:STDOUT: {kind: 'InvalidParse', text: '(', has_error: yes},
- // CHECK:STDOUT: {kind: 'FunctionDecl', text: ';', has_error: yes, subtree_size: 3},
- // CHECK:STDOUT: {kind: 'FunctionIntroducer', text: 'fn'},
- // CHECK:STDOUT: {kind: 'IdentifierNameMaybeBeforeSignature', text: 'F'},
- // CHECK:STDOUT: {kind: 'ExplicitParamListStart', text: '('},
- // CHECK:STDOUT: {kind: 'ExplicitParamList', text: ')', subtree_size: 2},
- // CHECK:STDOUT: {kind: 'FunctionDecl', text: ';', subtree_size: 5},
- // CHECK:STDOUT: {kind: 'FileEnd', text: ''},
- // CHECK:STDOUT: ]
- // CHECK:STDOUT: - filename: fail_skip_indented_newline_without_semi.carbon
- // CHECK:STDOUT: parse_tree: [
- // CHECK:STDOUT: {kind: 'FileStart', text: ''},
- // CHECK:STDOUT: {kind: 'FunctionIntroducer', text: 'fn'},
- // CHECK:STDOUT: {kind: 'InvalidParse', text: '(', has_error: yes},
- // CHECK:STDOUT: {kind: 'FunctionDecl', text: ')', has_error: yes, subtree_size: 3},
- // CHECK:STDOUT: {kind: 'FunctionIntroducer', text: 'fn'},
- // CHECK:STDOUT: {kind: 'IdentifierNameMaybeBeforeSignature', text: 'F'},
- // CHECK:STDOUT: {kind: 'ExplicitParamListStart', text: '('},
- // CHECK:STDOUT: {kind: 'ExplicitParamList', text: ')', subtree_size: 2},
- // CHECK:STDOUT: {kind: 'FunctionDecl', text: ';', subtree_size: 5},
- // CHECK:STDOUT: {kind: 'FileEnd', text: ''},
- // CHECK:STDOUT: ]
- // CHECK:STDOUT: - filename: fail_skip_to_newline_without_semi.carbon
- // CHECK:STDOUT: parse_tree: [
- // CHECK:STDOUT: {kind: 'FileStart', text: ''},
- // CHECK:STDOUT: {kind: 'FunctionIntroducer', text: 'fn'},
- // CHECK:STDOUT: {kind: 'InvalidParse', text: '(', has_error: yes},
- // CHECK:STDOUT: {kind: 'FunctionDecl', text: ')', has_error: yes, subtree_size: 3},
- // CHECK:STDOUT: {kind: 'FunctionIntroducer', text: 'fn'},
- // CHECK:STDOUT: {kind: 'IdentifierNameMaybeBeforeSignature', text: 'F'},
- // CHECK:STDOUT: {kind: 'ExplicitParamListStart', text: '('},
- // CHECK:STDOUT: {kind: 'ExplicitParamList', text: ')', subtree_size: 2},
- // CHECK:STDOUT: {kind: 'FunctionDecl', text: ';', subtree_size: 5},
- // CHECK:STDOUT: {kind: 'FileEnd', text: ''},
- // CHECK:STDOUT: ]
- // CHECK:STDOUT: - filename: fail_skip_without_semi_to_curly.carbon
- // CHECK:STDOUT: parse_tree: [
- // CHECK:STDOUT: {kind: 'FileStart', text: ''},
- // CHECK:STDOUT: {kind: 'InvalidParseStart', text: 'struct', has_error: yes},
- // CHECK:STDOUT: {kind: 'InvalidParseSubtree', text: '}', has_error: yes, subtree_size: 2},
- // CHECK:STDOUT: {kind: 'FunctionIntroducer', text: 'fn'},
- // CHECK:STDOUT: {kind: 'IdentifierNameMaybeBeforeSignature', text: 'F'},
- // CHECK:STDOUT: {kind: 'ExplicitParamListStart', text: '('},
- // CHECK:STDOUT: {kind: 'ExplicitParamList', text: ')', subtree_size: 2},
- // CHECK:STDOUT: {kind: 'FunctionDecl', text: ';', subtree_size: 5},
- // CHECK:STDOUT: {kind: 'FileEnd', text: ''},
- // CHECK:STDOUT: ]
- // CHECK:STDOUT: - filename: with_identifier_as_param.carbon
- // CHECK:STDOUT: parse_tree: [
- // CHECK:STDOUT: {kind: 'FileStart', text: ''},
- // CHECK:STDOUT: {kind: 'FunctionIntroducer', text: 'fn'},
- // CHECK:STDOUT: {kind: 'IdentifierNameMaybeBeforeSignature', text: 'foo'},
- // CHECK:STDOUT: {kind: 'ExplicitParamListStart', text: '('},
- // CHECK:STDOUT: {kind: 'IdentifierNameExpr', text: 'bar'},
- // CHECK:STDOUT: {kind: 'ExplicitParamList', text: ')', subtree_size: 3},
- // CHECK:STDOUT: {kind: 'FunctionDecl', text: ';', subtree_size: 6},
- // CHECK:STDOUT: {kind: 'FileEnd', text: ''},
- // CHECK:STDOUT: ]
- // CHECK:STDOUT: - filename: fail_without_name_and_many_tokens_in_params.carbon
- // CHECK:STDOUT: parse_tree: [
- // CHECK:STDOUT: {kind: 'FileStart', text: ''},
- // CHECK:STDOUT: {kind: 'FunctionIntroducer', text: 'fn'},
- // CHECK:STDOUT: {kind: 'InvalidParse', text: '(', has_error: yes},
- // CHECK:STDOUT: {kind: 'FunctionDecl', text: ';', has_error: yes, subtree_size: 3},
- // CHECK:STDOUT: {kind: 'FileEnd', text: ''},
- // CHECK:STDOUT: ]
- // CHECK:STDOUT: - filename: form_parameter.carbon
- // CHECK:STDOUT: parse_tree: [
- // CHECK:STDOUT: {kind: 'FileStart', text: ''},
- // CHECK:STDOUT: {kind: 'FunctionIntroducer', text: 'fn'},
- // CHECK:STDOUT: {kind: 'IdentifierNameMaybeBeforeSignature', text: 'FormParam'},
- // CHECK:STDOUT: {kind: 'ExplicitParamListStart', text: '('},
- // CHECK:STDOUT: {kind: 'IdentifierNameNotBeforeSignature', text: 'x'},
- // CHECK:STDOUT: {kind: 'IdentifierNameExpr', text: 'Form'},
- // CHECK:STDOUT: {kind: 'FormBindingPattern', text: ':?', subtree_size: 3},
- // CHECK:STDOUT: {kind: 'ExplicitParamList', text: ')', subtree_size: 5},
- // CHECK:STDOUT: {kind: 'FunctionDecl', text: ';', subtree_size: 8},
- // CHECK:STDOUT: {kind: 'FunctionIntroducer', text: 'fn'},
- // CHECK:STDOUT: {kind: 'IdentifierNameMaybeBeforeSignature', text: 'ComplexFormParam'},
- // CHECK:STDOUT: {kind: 'ExplicitParamListStart', text: '('},
- // CHECK:STDOUT: {kind: 'IdentifierNameNotBeforeSignature', text: 'x'},
- // CHECK:STDOUT: {kind: 'IdentifierNameExpr', text: 'X'},
- // CHECK:STDOUT: {kind: 'IdentifierNameNotBeforeSignature', text: 'Y'},
- // CHECK:STDOUT: {kind: 'MemberAccessExpr', text: '.', subtree_size: 3},
- // CHECK:STDOUT: {kind: 'CallExprStart', text: '(', subtree_size: 4},
- // CHECK:STDOUT: {kind: 'IdentifierNameExpr', text: 'Z'},
- // CHECK:STDOUT: {kind: 'CallExpr', text: ')', subtree_size: 6},
- // CHECK:STDOUT: {kind: 'FormBindingPattern', text: ':?', subtree_size: 8},
- // CHECK:STDOUT: {kind: 'ExplicitParamList', text: ')', subtree_size: 10},
- // CHECK:STDOUT: {kind: 'FunctionDecl', text: ';', subtree_size: 13},
- // CHECK:STDOUT: {kind: 'FileEnd', text: ''},
- // CHECK:STDOUT: ]
- // CHECK:STDOUT: - filename: fail_ref_on_form_parameter.carbon
- // CHECK:STDOUT: parse_tree: [
- // CHECK:STDOUT: {kind: 'FileStart', text: ''},
- // CHECK:STDOUT: {kind: 'FunctionIntroducer', text: 'fn'},
- // CHECK:STDOUT: {kind: 'IdentifierNameMaybeBeforeSignature', text: 'F'},
- // CHECK:STDOUT: {kind: 'ExplicitParamListStart', text: '('},
- // CHECK:STDOUT: {kind: 'IdentifierNameNotBeforeSignature', text: 'x'},
- // CHECK:STDOUT: {kind: 'RefBindingName', text: 'ref', has_error: yes, subtree_size: 2},
- // CHECK:STDOUT: {kind: 'IdentifierNameExpr', text: 'Form'},
- // CHECK:STDOUT: {kind: 'FormBindingPattern', text: ':?', has_error: yes, subtree_size: 4},
- // CHECK:STDOUT: {kind: 'ExplicitParamList', text: ')', has_error: yes, subtree_size: 6},
- // CHECK:STDOUT: {kind: 'FunctionDecl', text: ';', subtree_size: 9},
- // CHECK:STDOUT: {kind: 'FileEnd', text: ''},
- // CHECK:STDOUT: ]
- // CHECK:STDOUT: - filename: fail_form_within_var.carbon
- // CHECK:STDOUT: parse_tree: [
- // CHECK:STDOUT: {kind: 'FileStart', text: ''},
- // CHECK:STDOUT: {kind: 'FunctionIntroducer', text: 'fn'},
- // CHECK:STDOUT: {kind: 'IdentifierNameMaybeBeforeSignature', text: 'FormInVar'},
- // CHECK:STDOUT: {kind: 'ExplicitParamListStart', text: '('},
- // CHECK:STDOUT: {kind: 'IdentifierNameNotBeforeSignature', text: 'x'},
- // CHECK:STDOUT: {kind: 'IdentifierNameExpr', text: 'Form'},
- // CHECK:STDOUT: {kind: 'VarBindingPattern', text: ':?', has_error: yes, subtree_size: 3},
- // CHECK:STDOUT: {kind: 'VariablePattern', text: 'var', has_error: yes, subtree_size: 4},
- // CHECK:STDOUT: {kind: 'ExplicitParamList', text: ')', has_error: yes, subtree_size: 6},
- // CHECK:STDOUT: {kind: 'FunctionDecl', text: ';', subtree_size: 9},
- // CHECK:STDOUT: {kind: 'FileEnd', text: ''},
- // CHECK:STDOUT: ]
- // CHECK:STDOUT: - filename: return_form.carbon
- // CHECK:STDOUT: parse_tree: [
- // CHECK:STDOUT: {kind: 'FileStart', text: ''},
- // CHECK:STDOUT: {kind: 'FunctionIntroducer', text: 'fn'},
- // CHECK:STDOUT: {kind: 'IdentifierNameMaybeBeforeSignature', text: 'SimpleReturnForm'},
- // CHECK:STDOUT: {kind: 'ExplicitParamListStart', text: '('},
- // CHECK:STDOUT: {kind: 'ExplicitParamList', text: ')', subtree_size: 2},
- // CHECK:STDOUT: {kind: 'IdentifierNameExpr', text: 'Form'},
- // CHECK:STDOUT: {kind: 'ReturnForm', text: '->?', subtree_size: 2},
- // CHECK:STDOUT: {kind: 'FunctionDecl', text: ';', subtree_size: 7},
- // CHECK:STDOUT: {kind: 'FunctionIntroducer', text: 'fn'},
- // CHECK:STDOUT: {kind: 'IdentifierNameMaybeBeforeSignature', text: 'ComplexReturnForm'},
- // CHECK:STDOUT: {kind: 'ExplicitParamListStart', text: '('},
- // CHECK:STDOUT: {kind: 'ExplicitParamList', text: ')', subtree_size: 2},
- // CHECK:STDOUT: {kind: 'IdentifierNameExpr', text: 'X'},
- // CHECK:STDOUT: {kind: 'IdentifierNameNotBeforeSignature', text: 'Y'},
- // CHECK:STDOUT: {kind: 'MemberAccessExpr', text: '.', subtree_size: 3},
- // CHECK:STDOUT: {kind: 'CallExprStart', text: '(', subtree_size: 4},
- // CHECK:STDOUT: {kind: 'IdentifierNameExpr', text: 'Z'},
- // CHECK:STDOUT: {kind: 'CallExpr', text: ')', subtree_size: 6},
- // CHECK:STDOUT: {kind: 'ReturnForm', text: '->?', subtree_size: 7},
- // CHECK:STDOUT: {kind: 'FunctionDecl', text: ';', subtree_size: 12},
- // CHECK:STDOUT: {kind: 'FileEnd', text: ''},
- // CHECK:STDOUT: ]
|