mirror of
https://github.com/carbon-language/carbon-lang.git
synced 2026-09-24 21:40:12 +01:00
Syntax is proposed in #5017, but has already been discussed with leads. Semantics is left as a TODO. --------- Co-authored-by: josh11b <15258583+josh11b@users.noreply.github.com>
487 lines
24 KiB
Plaintext
487 lines
24 KiB
Plaintext
// 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();
|
|
|
|
// --- addr.carbon
|
|
|
|
fn foo(addr 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;
|
|
|
|
// --- keyword.carbon
|
|
|
|
fn destroy() {}
|
|
|
|
// --- keyword_no_params.carbon
|
|
|
|
fn destroy {}
|
|
|
|
// --- keyword_in_qualified.carbon
|
|
|
|
fn MyClass.destroy() {}
|
|
|
|
// --- keyword_decl.carbon
|
|
|
|
fn destroy.destroy() {}
|
|
|
|
// --- impl_fn.carbon
|
|
|
|
impl fn F();
|
|
abstract impl fn G();
|
|
impl abstract fn H();
|
|
private impl 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();
|
|
|
|
// --- fail_with_identifier_as_param.carbon
|
|
|
|
// CHECK:STDERR: fail_with_identifier_as_param.carbon:[[@LINE+4]]:11: error: expected `:` or `:!` in binding pattern [ExpectedBindingPattern]
|
|
// CHECK:STDERR: fn foo(bar);
|
|
// CHECK:STDERR: ^
|
|
// CHECK:STDERR:
|
|
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);
|
|
|
|
// CHECK:STDOUT: - filename: basic.carbon
|
|
// CHECK:STDOUT: parse_tree: [
|
|
// CHECK:STDOUT: {kind: 'FileStart', text: ''},
|
|
// CHECK:STDOUT: {kind: 'FunctionIntroducer', text: 'fn'},
|
|
// CHECK:STDOUT: {kind: 'IdentifierNameBeforeParams', 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: addr.carbon
|
|
// CHECK:STDOUT: parse_tree: [
|
|
// CHECK:STDOUT: {kind: 'FileStart', text: ''},
|
|
// CHECK:STDOUT: {kind: 'FunctionIntroducer', text: 'fn'},
|
|
// CHECK:STDOUT: {kind: 'IdentifierNameBeforeParams', text: 'foo'},
|
|
// CHECK:STDOUT: {kind: 'ExplicitParamListStart', text: '('},
|
|
// CHECK:STDOUT: {kind: 'IdentifierNameNotBeforeParams', text: 'a'},
|
|
// CHECK:STDOUT: {kind: 'IntTypeLiteral', text: 'i32'},
|
|
// CHECK:STDOUT: {kind: 'PostfixOperatorStar', text: '*', subtree_size: 2},
|
|
// CHECK:STDOUT: {kind: 'LetBindingPattern', text: ':', subtree_size: 4},
|
|
// CHECK:STDOUT: {kind: 'Addr', text: 'addr', subtree_size: 5},
|
|
// CHECK:STDOUT: {kind: 'ExplicitParamList', text: ')', subtree_size: 7},
|
|
// CHECK:STDOUT: {kind: 'FunctionDecl', text: ';', subtree_size: 10},
|
|
// 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: 'IdentifierNameBeforeParams', 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: 'IdentifierNameBeforeParams', text: 'foo'},
|
|
// CHECK:STDOUT: {kind: 'ImplicitParamListStart', text: '['},
|
|
// CHECK:STDOUT: {kind: 'IdentifierNameNotBeforeParams', text: 'a'},
|
|
// CHECK:STDOUT: {kind: 'IntTypeLiteral', text: 'i32'},
|
|
// CHECK:STDOUT: {kind: 'LetBindingPattern', text: ':', subtree_size: 3},
|
|
// CHECK:STDOUT: {kind: 'PatternListComma', text: ','},
|
|
// CHECK:STDOUT: {kind: 'IdentifierNameNotBeforeParams', 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: 'IdentifierNameNotBeforeParams', 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: 'IdentifierNameBeforeParams', text: 'foo'},
|
|
// CHECK:STDOUT: {kind: 'ExplicitParamListStart', text: '('},
|
|
// CHECK:STDOUT: {kind: 'IdentifierNameNotBeforeParams', text: 'a'},
|
|
// CHECK:STDOUT: {kind: 'IntTypeLiteral', text: 'i32'},
|
|
// CHECK:STDOUT: {kind: 'LetBindingPattern', text: ':', subtree_size: 3},
|
|
// CHECK:STDOUT: {kind: 'PatternListComma', text: ','},
|
|
// CHECK:STDOUT: {kind: 'IdentifierNameNotBeforeParams', 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: 'IdentifierNameBeforeParams', 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: keyword.carbon
|
|
// CHECK:STDOUT: parse_tree: [
|
|
// CHECK:STDOUT: {kind: 'FileStart', text: ''},
|
|
// CHECK:STDOUT: {kind: 'FunctionIntroducer', text: 'fn'},
|
|
// CHECK:STDOUT: {kind: 'KeywordNameBeforeParams', text: 'destroy'},
|
|
// CHECK:STDOUT: {kind: 'ExplicitParamListStart', text: '('},
|
|
// CHECK:STDOUT: {kind: 'ExplicitParamList', text: ')', subtree_size: 2},
|
|
// CHECK:STDOUT: {kind: 'FunctionDefinitionStart', text: '{', subtree_size: 5},
|
|
// CHECK:STDOUT: {kind: 'FunctionDefinition', text: '}', subtree_size: 6},
|
|
// CHECK:STDOUT: {kind: 'FileEnd', text: ''},
|
|
// CHECK:STDOUT: ]
|
|
// CHECK:STDOUT: - filename: keyword_no_params.carbon
|
|
// CHECK:STDOUT: parse_tree: [
|
|
// CHECK:STDOUT: {kind: 'FileStart', text: ''},
|
|
// CHECK:STDOUT: {kind: 'FunctionIntroducer', text: 'fn'},
|
|
// CHECK:STDOUT: {kind: 'KeywordNameNotBeforeParams', text: 'destroy'},
|
|
// 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: keyword_in_qualified.carbon
|
|
// CHECK:STDOUT: parse_tree: [
|
|
// CHECK:STDOUT: {kind: 'FileStart', text: ''},
|
|
// CHECK:STDOUT: {kind: 'FunctionIntroducer', text: 'fn'},
|
|
// CHECK:STDOUT: {kind: 'IdentifierNameNotBeforeParams', text: 'MyClass'},
|
|
// CHECK:STDOUT: {kind: 'IdentifierNameQualifierWithoutParams', text: '.', subtree_size: 2},
|
|
// CHECK:STDOUT: {kind: 'KeywordNameBeforeParams', text: 'destroy'},
|
|
// CHECK:STDOUT: {kind: 'ExplicitParamListStart', text: '('},
|
|
// CHECK:STDOUT: {kind: 'ExplicitParamList', text: ')', subtree_size: 2},
|
|
// CHECK:STDOUT: {kind: 'FunctionDefinitionStart', text: '{', subtree_size: 7},
|
|
// CHECK:STDOUT: {kind: 'FunctionDefinition', text: '}', subtree_size: 8},
|
|
// CHECK:STDOUT: {kind: 'FileEnd', text: ''},
|
|
// CHECK:STDOUT: ]
|
|
// CHECK:STDOUT: - filename: keyword_decl.carbon
|
|
// CHECK:STDOUT: parse_tree: [
|
|
// CHECK:STDOUT: {kind: 'FileStart', text: ''},
|
|
// CHECK:STDOUT: {kind: 'FunctionIntroducer', text: 'fn'},
|
|
// CHECK:STDOUT: {kind: 'KeywordNameNotBeforeParams', text: 'destroy'},
|
|
// CHECK:STDOUT: {kind: 'KeywordNameQualifierWithoutParams', text: '.', subtree_size: 2},
|
|
// CHECK:STDOUT: {kind: 'KeywordNameBeforeParams', text: 'destroy'},
|
|
// CHECK:STDOUT: {kind: 'ExplicitParamListStart', text: '('},
|
|
// CHECK:STDOUT: {kind: 'ExplicitParamList', text: ')', subtree_size: 2},
|
|
// CHECK:STDOUT: {kind: 'FunctionDefinitionStart', text: '{', subtree_size: 7},
|
|
// CHECK:STDOUT: {kind: 'FunctionDefinition', text: '}', subtree_size: 8},
|
|
// 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: 'ImplModifier', text: 'impl'},
|
|
// CHECK:STDOUT: {kind: 'IdentifierNameBeforeParams', 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: 'ImplModifier', text: 'impl'},
|
|
// CHECK:STDOUT: {kind: 'IdentifierNameBeforeParams', 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: 'ImplModifier', text: 'impl'},
|
|
// CHECK:STDOUT: {kind: 'AbstractModifier', text: 'abstract'},
|
|
// CHECK:STDOUT: {kind: 'IdentifierNameBeforeParams', 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: 'ImplModifier', text: 'impl'},
|
|
// CHECK:STDOUT: {kind: 'DefaultModifier', text: 'default'},
|
|
// CHECK:STDOUT: {kind: 'IdentifierNameBeforeParams', 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: 'IdentifierNameNotBeforeParams', 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: 'IdentifierNameNotBeforeParams', 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: 'IdentifierNameNotBeforeParams', 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: 'IdentifierNameBeforeParams', 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: 'IdentifierNameBeforeParams', 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: 'IdentifierNameBeforeParams', 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: 'IdentifierNameBeforeParams', 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: 'IdentifierNameBeforeParams', 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_with_identifier_as_param.carbon
|
|
// CHECK:STDOUT: parse_tree: [
|
|
// CHECK:STDOUT: {kind: 'FileStart', text: ''},
|
|
// CHECK:STDOUT: {kind: 'FunctionIntroducer', text: 'fn'},
|
|
// CHECK:STDOUT: {kind: 'IdentifierNameBeforeParams', text: 'foo'},
|
|
// CHECK:STDOUT: {kind: 'ExplicitParamListStart', text: '('},
|
|
// CHECK:STDOUT: {kind: 'IdentifierNameNotBeforeParams', text: 'bar'},
|
|
// CHECK:STDOUT: {kind: 'InvalidParse', text: ')', has_error: yes},
|
|
// CHECK:STDOUT: {kind: 'LetBindingPattern', text: 'bar', has_error: yes, subtree_size: 3},
|
|
// CHECK:STDOUT: {kind: 'ExplicitParamList', text: ')', has_error: yes, subtree_size: 5},
|
|
// CHECK:STDOUT: {kind: 'FunctionDecl', text: ';', subtree_size: 8},
|
|
// 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: ]
|