mirror of
https://github.com/carbon-language/carbon-lang.git
synced 2026-09-27 22:02:33 +01:00
This shifts logic so that bindings are added to name lookup only after the scope is complete, removing logic around adding/removing/re-adding names in certain scopes. This does mean that things like a function's forward declaration will need to go through an extra hoop for name conflict checks, because under this approach a function definition does conflict checking when it adds names for the body's use. But, that seems easy to address, and better than the current hoops.
74 lines
2.3 KiB
Plaintext
74 lines
2.3 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
|
|
// CHECK:STDOUT: cross_reference_irs_size: 1
|
|
// CHECK:STDOUT: functions: [
|
|
// CHECK:STDOUT: {name: str1, param_refs: block2, return_type: type0, body: block4},
|
|
// CHECK:STDOUT: {name: str2, param_refs: block0, body: block5},
|
|
// CHECK:STDOUT: ]
|
|
// CHECK:STDOUT: integer_literals: [
|
|
// CHECK:STDOUT: ]
|
|
// CHECK:STDOUT: real_literals: [
|
|
// CHECK:STDOUT: ]
|
|
// CHECK:STDOUT: strings: [
|
|
// CHECK:STDOUT: a,
|
|
// CHECK:STDOUT: Echo,
|
|
// CHECK:STDOUT: Main,
|
|
// CHECK:STDOUT: ]
|
|
// CHECK:STDOUT: types: [
|
|
// CHECK:STDOUT: node+0,
|
|
// CHECK:STDOUT: nodeEmptyTupleType,
|
|
// CHECK:STDOUT: ]
|
|
// CHECK:STDOUT: nodes: [
|
|
// CHECK:STDOUT: {kind: StructType, arg0: block0, type: typeTypeType},
|
|
// CHECK:STDOUT: {kind: StructValue, arg0: block0, type: type0},
|
|
// CHECK:STDOUT: {kind: VarStorage, type: type0},
|
|
// CHECK:STDOUT: {kind: BindName, arg0: str0, arg1: node+2, type: type0},
|
|
// CHECK:STDOUT: {kind: StructValue, arg0: block0, type: type0},
|
|
// CHECK:STDOUT: {kind: FunctionDeclaration, arg0: function0},
|
|
// CHECK:STDOUT: {kind: ReturnExpression, arg0: node+2, type: type0},
|
|
// CHECK:STDOUT: {kind: FunctionDeclaration, arg0: function1},
|
|
// CHECK:STDOUT: {kind: StructValue, arg0: block0, type: type0},
|
|
// CHECK:STDOUT: {kind: StubReference, arg0: node+8, type: type0},
|
|
// CHECK:STDOUT: {kind: Call, arg0: block6, arg1: function0, type: type0},
|
|
// CHECK:STDOUT: ]
|
|
// CHECK:STDOUT: node_blocks: [
|
|
// CHECK:STDOUT: [
|
|
// CHECK:STDOUT: ],
|
|
// CHECK:STDOUT: [
|
|
// CHECK:STDOUT: node+0,
|
|
// CHECK:STDOUT: node+1,
|
|
// CHECK:STDOUT: node+2,
|
|
// CHECK:STDOUT: node+3,
|
|
// CHECK:STDOUT: ],
|
|
// CHECK:STDOUT: [
|
|
// CHECK:STDOUT: node+3,
|
|
// CHECK:STDOUT: ],
|
|
// CHECK:STDOUT: [
|
|
// CHECK:STDOUT: node+4,
|
|
// CHECK:STDOUT: node+5,
|
|
// CHECK:STDOUT: node+7,
|
|
// CHECK:STDOUT: ],
|
|
// CHECK:STDOUT: [
|
|
// CHECK:STDOUT: node+6,
|
|
// CHECK:STDOUT: ],
|
|
// CHECK:STDOUT: [
|
|
// CHECK:STDOUT: node+8,
|
|
// CHECK:STDOUT: node+9,
|
|
// CHECK:STDOUT: node+10,
|
|
// CHECK:STDOUT: ],
|
|
// CHECK:STDOUT: [
|
|
// CHECK:STDOUT: node+9,
|
|
// CHECK:STDOUT: ],
|
|
// CHECK:STDOUT: ]
|
|
|
|
fn Echo(a: {}) -> {} {
|
|
return a;
|
|
}
|
|
|
|
fn Main() {
|
|
Echo({});
|
|
}
|