mirror of
https://github.com/carbon-language/carbon-lang.git
synced 2026-10-05 22:02:55 +01:00
Add handling for return types. (#2596)
This starts handling return types on functions, and comparing types with `return` statements. Note, errors remain poor because the type literal is currently associated with a builtin, losing the parse_node that specified it. This means we don't have the original source location to associate with, even though it may be helpful to point at the type in source. We could point at the signature overall, but my leaning is that we wouldn't want that long-term, so TODOs for now and may want to change a little about how the parse node is tracked once things are a little further along.
This commit is contained in:
@@ -0,0 +1,52 @@
|
||||
// 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
|
||||
// RUN: %{not} %{carbon-run-semantics}
|
||||
// CHECK:STDOUT: cross_reference_irs_size: 1
|
||||
// CHECK:STDOUT: calls: [
|
||||
// CHECK:STDOUT: ]
|
||||
// CHECK:STDOUT: callables: [
|
||||
// CHECK:STDOUT: {param_ir: block0, param_refs: block0, return_type: node2},
|
||||
// CHECK:STDOUT: ]
|
||||
// CHECK:STDOUT: integer_literals: [
|
||||
// CHECK:STDOUT: ]
|
||||
// CHECK:STDOUT: real_literals: [
|
||||
// CHECK:STDOUT: {mantissa: 10, exponent: -1, is_decimal: 1},
|
||||
// CHECK:STDOUT: ]
|
||||
// CHECK:STDOUT: strings: [
|
||||
// CHECK:STDOUT: Main,
|
||||
// CHECK:STDOUT: ]
|
||||
// CHECK:STDOUT: nodes: [
|
||||
// CHECK:STDOUT: {kind: CrossReference, arg0: ir0, arg1: node0, type: node0},
|
||||
// CHECK:STDOUT: {kind: CrossReference, arg0: ir0, arg1: node1, type: node1},
|
||||
// CHECK:STDOUT: {kind: CrossReference, arg0: ir0, arg1: node2, type: node0},
|
||||
// CHECK:STDOUT: {kind: CrossReference, arg0: ir0, arg1: node3, type: node0},
|
||||
// CHECK:STDOUT: {kind: CrossReference, arg0: ir0, arg1: node4, type: node0},
|
||||
// CHECK:STDOUT: {kind: CrossReference, arg0: ir0, arg1: node5, type: node0},
|
||||
// CHECK:STDOUT: {kind: CrossReference, arg0: ir0, arg1: node6, type: node5},
|
||||
// CHECK:STDOUT: {kind: FunctionDeclaration, arg0: callable0},
|
||||
// CHECK:STDOUT: {kind: BindName, arg0: str0, arg1: node7},
|
||||
// CHECK:STDOUT: {kind: RealLiteral, arg0: real0, type: node3},
|
||||
// CHECK:STDOUT: {kind: ReturnExpression, arg0: node9},
|
||||
// CHECK:STDOUT: {kind: FunctionDefinition, arg0: node7, arg1: block2},
|
||||
// CHECK:STDOUT: ]
|
||||
// CHECK:STDOUT: node_blocks: [
|
||||
// CHECK:STDOUT: [
|
||||
// CHECK:STDOUT: ],
|
||||
// CHECK:STDOUT: [
|
||||
// CHECK:STDOUT: node7,
|
||||
// CHECK:STDOUT: node8,
|
||||
// CHECK:STDOUT: node11,
|
||||
// CHECK:STDOUT: ],
|
||||
// CHECK:STDOUT: [
|
||||
// CHECK:STDOUT: node9,
|
||||
// CHECK:STDOUT: node10,
|
||||
// CHECK:STDOUT: ],
|
||||
// CHECK:STDOUT: ]
|
||||
|
||||
fn Main() -> i32 {
|
||||
// CHECK:STDERR: {{.*}}/toolchain/semantics/testdata/return/fail_type_mismatch.carbon:[[@LINE+1]]:13: Cannot convert node3 to node2.
|
||||
return 1.0;
|
||||
}
|
||||
@@ -0,0 +1,53 @@
|
||||
// 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
|
||||
// RUN: %{not} %{carbon-run-semantics}
|
||||
// CHECK:STDOUT: cross_reference_irs_size: 1
|
||||
// CHECK:STDOUT: calls: [
|
||||
// CHECK:STDOUT: ]
|
||||
// CHECK:STDOUT: callables: [
|
||||
// CHECK:STDOUT: {param_ir: block0, param_refs: block0},
|
||||
// CHECK:STDOUT: ]
|
||||
// CHECK:STDOUT: integer_literals: [
|
||||
// CHECK:STDOUT: 0,
|
||||
// CHECK:STDOUT: ]
|
||||
// CHECK:STDOUT: real_literals: [
|
||||
// CHECK:STDOUT: ]
|
||||
// CHECK:STDOUT: strings: [
|
||||
// CHECK:STDOUT: Main,
|
||||
// CHECK:STDOUT: ]
|
||||
// CHECK:STDOUT: nodes: [
|
||||
// CHECK:STDOUT: {kind: CrossReference, arg0: ir0, arg1: node0, type: node0},
|
||||
// CHECK:STDOUT: {kind: CrossReference, arg0: ir0, arg1: node1, type: node1},
|
||||
// CHECK:STDOUT: {kind: CrossReference, arg0: ir0, arg1: node2, type: node0},
|
||||
// CHECK:STDOUT: {kind: CrossReference, arg0: ir0, arg1: node3, type: node0},
|
||||
// CHECK:STDOUT: {kind: CrossReference, arg0: ir0, arg1: node4, type: node0},
|
||||
// CHECK:STDOUT: {kind: CrossReference, arg0: ir0, arg1: node5, type: node0},
|
||||
// CHECK:STDOUT: {kind: CrossReference, arg0: ir0, arg1: node6, type: node5},
|
||||
// CHECK:STDOUT: {kind: FunctionDeclaration, arg0: callable0},
|
||||
// CHECK:STDOUT: {kind: BindName, arg0: str0, arg1: node7},
|
||||
// CHECK:STDOUT: {kind: IntegerLiteral, arg0: int0, type: node2},
|
||||
// CHECK:STDOUT: {kind: ReturnExpression, arg0: node9, type: node2},
|
||||
// CHECK:STDOUT: {kind: FunctionDefinition, arg0: node7, arg1: block2},
|
||||
// CHECK:STDOUT: ]
|
||||
// CHECK:STDOUT: node_blocks: [
|
||||
// CHECK:STDOUT: [
|
||||
// CHECK:STDOUT: ],
|
||||
// CHECK:STDOUT: [
|
||||
// CHECK:STDOUT: node7,
|
||||
// CHECK:STDOUT: node8,
|
||||
// CHECK:STDOUT: node11,
|
||||
// CHECK:STDOUT: ],
|
||||
// CHECK:STDOUT: [
|
||||
// CHECK:STDOUT: node9,
|
||||
// CHECK:STDOUT: node10,
|
||||
// CHECK:STDOUT: ],
|
||||
// CHECK:STDOUT: ]
|
||||
|
||||
fn Main() {
|
||||
// CHECK:STDERR: {{.*}}/toolchain/semantics/testdata/return/fail_value_disallowed.carbon:[[@LINE+2]]:11: No return expression should be provided in this context.
|
||||
// CHECK:STDERR: {{.*}}/toolchain/semantics/testdata/return/fail_value_disallowed.carbon:[[@LINE-2]]:1: There was no return type provided.
|
||||
return 0;
|
||||
}
|
||||
@@ -0,0 +1,49 @@
|
||||
// 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
|
||||
// RUN: %{not} %{carbon-run-semantics}
|
||||
// CHECK:STDOUT: cross_reference_irs_size: 1
|
||||
// CHECK:STDOUT: calls: [
|
||||
// CHECK:STDOUT: ]
|
||||
// CHECK:STDOUT: callables: [
|
||||
// CHECK:STDOUT: {param_ir: block0, param_refs: block0, return_type: node2},
|
||||
// CHECK:STDOUT: ]
|
||||
// CHECK:STDOUT: integer_literals: [
|
||||
// CHECK:STDOUT: ]
|
||||
// CHECK:STDOUT: real_literals: [
|
||||
// CHECK:STDOUT: ]
|
||||
// CHECK:STDOUT: strings: [
|
||||
// CHECK:STDOUT: Main,
|
||||
// CHECK:STDOUT: ]
|
||||
// CHECK:STDOUT: nodes: [
|
||||
// CHECK:STDOUT: {kind: CrossReference, arg0: ir0, arg1: node0, type: node0},
|
||||
// CHECK:STDOUT: {kind: CrossReference, arg0: ir0, arg1: node1, type: node1},
|
||||
// CHECK:STDOUT: {kind: CrossReference, arg0: ir0, arg1: node2, type: node0},
|
||||
// CHECK:STDOUT: {kind: CrossReference, arg0: ir0, arg1: node3, type: node0},
|
||||
// CHECK:STDOUT: {kind: CrossReference, arg0: ir0, arg1: node4, type: node0},
|
||||
// CHECK:STDOUT: {kind: CrossReference, arg0: ir0, arg1: node5, type: node0},
|
||||
// CHECK:STDOUT: {kind: CrossReference, arg0: ir0, arg1: node6, type: node5},
|
||||
// CHECK:STDOUT: {kind: FunctionDeclaration, arg0: callable0},
|
||||
// CHECK:STDOUT: {kind: BindName, arg0: str0, arg1: node7},
|
||||
// CHECK:STDOUT: {kind: Return},
|
||||
// CHECK:STDOUT: {kind: FunctionDefinition, arg0: node7, arg1: block2},
|
||||
// CHECK:STDOUT: ]
|
||||
// CHECK:STDOUT: node_blocks: [
|
||||
// CHECK:STDOUT: [
|
||||
// CHECK:STDOUT: ],
|
||||
// CHECK:STDOUT: [
|
||||
// CHECK:STDOUT: node7,
|
||||
// CHECK:STDOUT: node8,
|
||||
// CHECK:STDOUT: node10,
|
||||
// CHECK:STDOUT: ],
|
||||
// CHECK:STDOUT: [
|
||||
// CHECK:STDOUT: node9,
|
||||
// CHECK:STDOUT: ],
|
||||
// CHECK:STDOUT: ]
|
||||
|
||||
fn Main() -> i32 {
|
||||
// CHECK:STDERR: {{.*}}/toolchain/semantics/testdata/return/fail_value_missing.carbon:[[@LINE+1]]:9: Must return a node2.
|
||||
return;
|
||||
}
|
||||
+2
-2
@@ -8,7 +8,7 @@
|
||||
// CHECK:STDOUT: calls: [
|
||||
// CHECK:STDOUT: ]
|
||||
// CHECK:STDOUT: callables: [
|
||||
// CHECK:STDOUT: {param_ir: block0, param_refs: block0},
|
||||
// CHECK:STDOUT: {param_ir: block0, param_refs: block0, return_type: node2},
|
||||
// CHECK:STDOUT: ]
|
||||
// CHECK:STDOUT: integer_literals: [
|
||||
// CHECK:STDOUT: 0,
|
||||
@@ -46,6 +46,6 @@
|
||||
// CHECK:STDOUT: ],
|
||||
// CHECK:STDOUT: ]
|
||||
|
||||
fn Main() {
|
||||
fn Main() -> i32 {
|
||||
return 0;
|
||||
}
|
||||
Reference in New Issue
Block a user