mirror of
https://github.com/carbon-language/carbon-lang.git
synced 2026-10-05 22:02:55 +01:00
Model function calls as initializing expressions (#3089)
Start treating function calls as initializing expressions instead of as value expressions. This required adding support for expression categories. Value bindings and temporary materialization conversions are created where necessary to transition between expression categories. For a function call with a return slot, we speculatively create a materialized temporary before the call and either commit to it or replace it with something else later, once we see how the function call expression is actually used. This change follows the direction suggested in #3133 for initializing expressions: depending on the return type of a function, the return value will either be initialized in-place or returned directly. This is visible in the semantics IR, which is a little unfortunate but is probably necessary as this is part of the semantics of the program. --------- Co-authored-by: Chandler Carruth <chandlerc@gmail.com>
This commit is contained in:
co-authored by
Chandler Carruth
parent
f790a27ace
commit
1013d1773c
+19
-11
@@ -11,7 +11,7 @@ fn F() -> i32 {
|
||||
|
||||
// CHECK:STDOUT: cross_reference_irs_size: 1
|
||||
// CHECK:STDOUT: functions: [
|
||||
// CHECK:STDOUT: {name: str0, param_refs: block0, return_type: type0, body: [block2]},
|
||||
// CHECK:STDOUT: {name: str0, param_refs: block0, return_type: type0, body: [block3]},
|
||||
// CHECK:STDOUT: ]
|
||||
// CHECK:STDOUT: integer_literals: [
|
||||
// CHECK:STDOUT: 0,
|
||||
@@ -20,25 +20,28 @@ fn F() -> i32 {
|
||||
// CHECK:STDOUT: ]
|
||||
// CHECK:STDOUT: strings: [
|
||||
// CHECK:STDOUT: F,
|
||||
// CHECK:STDOUT: return,
|
||||
// CHECK:STDOUT: n,
|
||||
// CHECK:STDOUT: ]
|
||||
// CHECK:STDOUT: types: [
|
||||
// CHECK:STDOUT: nodeIntegerType,
|
||||
// CHECK:STDOUT: node+4,
|
||||
// CHECK:STDOUT: node+5,
|
||||
// CHECK:STDOUT: ]
|
||||
// CHECK:STDOUT: type_blocks: [
|
||||
// CHECK:STDOUT: ]
|
||||
// CHECK:STDOUT: nodes: [
|
||||
// CHECK:STDOUT: {kind: FunctionDeclaration, arg0: function0},
|
||||
// CHECK:STDOUT: {kind: VarStorage, arg0: str1, type: type0},
|
||||
// CHECK:STDOUT: {kind: FunctionDeclaration, arg0: function0},
|
||||
// CHECK:STDOUT: {kind: VarStorage, arg0: str2, type: type0},
|
||||
// CHECK:STDOUT: {kind: IntegerLiteral, arg0: int0, type: type0},
|
||||
// CHECK:STDOUT: {kind: Assign, arg0: node+1, arg1: node+2},
|
||||
// CHECK:STDOUT: {kind: Assign, arg0: node+2, arg1: node+3},
|
||||
// CHECK:STDOUT: {kind: PointerType, arg0: type0, type: typeTypeType},
|
||||
// CHECK:STDOUT: {kind: AddressOf, arg0: node+1, type: type1},
|
||||
// CHECK:STDOUT: {kind: Dereference, arg0: node+5, type: type0},
|
||||
// CHECK:STDOUT: {kind: AddressOf, arg0: node+6, type: type1},
|
||||
// CHECK:STDOUT: {kind: Dereference, arg0: node+7, type: type0},
|
||||
// CHECK:STDOUT: {kind: ReturnExpression, arg0: node+8},
|
||||
// CHECK:STDOUT: {kind: AddressOf, arg0: node+2, type: type1},
|
||||
// CHECK:STDOUT: {kind: Dereference, arg0: node+6, type: type0},
|
||||
// CHECK:STDOUT: {kind: AddressOf, arg0: node+7, type: type1},
|
||||
// CHECK:STDOUT: {kind: Dereference, arg0: node+8, type: type0},
|
||||
// CHECK:STDOUT: {kind: BindValue, arg0: node+9, type: type0},
|
||||
// CHECK:STDOUT: {kind: ReturnExpression, arg0: node+10},
|
||||
// CHECK:STDOUT: ]
|
||||
// CHECK:STDOUT: node_blocks: [
|
||||
// CHECK:STDOUT: [
|
||||
@@ -48,6 +51,8 @@ fn F() -> i32 {
|
||||
// CHECK:STDOUT: ],
|
||||
// CHECK:STDOUT: [
|
||||
// CHECK:STDOUT: node+1,
|
||||
// CHECK:STDOUT: ],
|
||||
// CHECK:STDOUT: [
|
||||
// CHECK:STDOUT: node+2,
|
||||
// CHECK:STDOUT: node+3,
|
||||
// CHECK:STDOUT: node+4,
|
||||
@@ -56,6 +61,8 @@ fn F() -> i32 {
|
||||
// CHECK:STDOUT: node+7,
|
||||
// CHECK:STDOUT: node+8,
|
||||
// CHECK:STDOUT: node+9,
|
||||
// CHECK:STDOUT: node+10,
|
||||
// CHECK:STDOUT: node+11,
|
||||
// CHECK:STDOUT: ],
|
||||
// CHECK:STDOUT: ]
|
||||
// CHECK:STDOUT:
|
||||
@@ -72,6 +79,7 @@ fn F() -> i32 {
|
||||
// CHECK:STDOUT: %.loc9_13.2: i32* = address_of %n
|
||||
// CHECK:STDOUT: %.loc9_12: i32 = dereference %.loc9_13.2
|
||||
// CHECK:STDOUT: %.loc9_11: i32* = address_of %.loc9_12
|
||||
// CHECK:STDOUT: %.loc9_10: i32 = dereference %.loc9_11
|
||||
// CHECK:STDOUT: return %.loc9_10
|
||||
// CHECK:STDOUT: %.loc9_10.1: i32 = dereference %.loc9_11
|
||||
// CHECK:STDOUT: %.loc9_10.2: i32 = bind_value %.loc9_10.1
|
||||
// CHECK:STDOUT: return %.loc9_10.2
|
||||
// CHECK:STDOUT: }
|
||||
|
||||
+22
-11
@@ -13,7 +13,7 @@ fn F() -> i32 {
|
||||
|
||||
// CHECK:STDOUT: cross_reference_irs_size: 1
|
||||
// CHECK:STDOUT: functions: [
|
||||
// CHECK:STDOUT: {name: str0, param_refs: block0, return_type: type0, body: [block2]},
|
||||
// CHECK:STDOUT: {name: str0, param_refs: block0, return_type: type0, body: [block3]},
|
||||
// CHECK:STDOUT: ]
|
||||
// CHECK:STDOUT: integer_literals: [
|
||||
// CHECK:STDOUT: 0,
|
||||
@@ -22,26 +22,30 @@ fn F() -> i32 {
|
||||
// CHECK:STDOUT: ]
|
||||
// CHECK:STDOUT: strings: [
|
||||
// CHECK:STDOUT: F,
|
||||
// CHECK:STDOUT: return,
|
||||
// CHECK:STDOUT: n,
|
||||
// CHECK:STDOUT: p,
|
||||
// CHECK:STDOUT: ]
|
||||
// CHECK:STDOUT: types: [
|
||||
// CHECK:STDOUT: nodeIntegerType,
|
||||
// CHECK:STDOUT: node+4,
|
||||
// CHECK:STDOUT: node+5,
|
||||
// CHECK:STDOUT: ]
|
||||
// CHECK:STDOUT: type_blocks: [
|
||||
// CHECK:STDOUT: ]
|
||||
// CHECK:STDOUT: nodes: [
|
||||
// CHECK:STDOUT: {kind: FunctionDeclaration, arg0: function0},
|
||||
// CHECK:STDOUT: {kind: VarStorage, arg0: str1, type: type0},
|
||||
// CHECK:STDOUT: {kind: FunctionDeclaration, arg0: function0},
|
||||
// CHECK:STDOUT: {kind: VarStorage, arg0: str2, type: type0},
|
||||
// CHECK:STDOUT: {kind: IntegerLiteral, arg0: int0, type: type0},
|
||||
// CHECK:STDOUT: {kind: Assign, arg0: node+1, arg1: node+2},
|
||||
// CHECK:STDOUT: {kind: Assign, arg0: node+2, arg1: node+3},
|
||||
// CHECK:STDOUT: {kind: PointerType, arg0: type0, type: typeTypeType},
|
||||
// CHECK:STDOUT: {kind: VarStorage, arg0: str2, type: type1},
|
||||
// CHECK:STDOUT: {kind: AddressOf, arg0: node+1, type: type1},
|
||||
// CHECK:STDOUT: {kind: Assign, arg0: node+5, arg1: node+6},
|
||||
// CHECK:STDOUT: {kind: Dereference, arg0: node+5, type: type0},
|
||||
// CHECK:STDOUT: {kind: ReturnExpression, arg0: node+8},
|
||||
// CHECK:STDOUT: {kind: VarStorage, arg0: str3, type: type1},
|
||||
// CHECK:STDOUT: {kind: AddressOf, arg0: node+2, type: type1},
|
||||
// CHECK:STDOUT: {kind: Assign, arg0: node+6, arg1: node+7},
|
||||
// CHECK:STDOUT: {kind: BindValue, arg0: node+6, type: type1},
|
||||
// CHECK:STDOUT: {kind: Dereference, arg0: node+9, type: type0},
|
||||
// CHECK:STDOUT: {kind: BindValue, arg0: node+10, type: type0},
|
||||
// CHECK:STDOUT: {kind: ReturnExpression, arg0: node+11},
|
||||
// CHECK:STDOUT: ]
|
||||
// CHECK:STDOUT: node_blocks: [
|
||||
// CHECK:STDOUT: [
|
||||
@@ -51,6 +55,8 @@ fn F() -> i32 {
|
||||
// CHECK:STDOUT: ],
|
||||
// CHECK:STDOUT: [
|
||||
// CHECK:STDOUT: node+1,
|
||||
// CHECK:STDOUT: ],
|
||||
// CHECK:STDOUT: [
|
||||
// CHECK:STDOUT: node+2,
|
||||
// CHECK:STDOUT: node+3,
|
||||
// CHECK:STDOUT: node+4,
|
||||
@@ -59,6 +65,9 @@ fn F() -> i32 {
|
||||
// CHECK:STDOUT: node+7,
|
||||
// CHECK:STDOUT: node+8,
|
||||
// CHECK:STDOUT: node+9,
|
||||
// CHECK:STDOUT: node+10,
|
||||
// CHECK:STDOUT: node+11,
|
||||
// CHECK:STDOUT: node+12,
|
||||
// CHECK:STDOUT: ],
|
||||
// CHECK:STDOUT: ]
|
||||
// CHECK:STDOUT:
|
||||
@@ -75,6 +84,8 @@ fn F() -> i32 {
|
||||
// CHECK:STDOUT: %p: i32* = var "p"
|
||||
// CHECK:STDOUT: %.loc9_17: i32* = address_of %n
|
||||
// CHECK:STDOUT: assign %p, %.loc9_17
|
||||
// CHECK:STDOUT: %.loc11: i32 = dereference %p
|
||||
// CHECK:STDOUT: return %.loc11
|
||||
// CHECK:STDOUT: %.loc9_7: i32* = bind_value %p
|
||||
// CHECK:STDOUT: %.loc11_10.1: i32 = dereference %.loc9_7
|
||||
// CHECK:STDOUT: %.loc11_10.2: i32 = bind_value %.loc11_10.1
|
||||
// CHECK:STDOUT: return %.loc11_10.2
|
||||
// CHECK:STDOUT: }
|
||||
|
||||
+105
-92
@@ -40,7 +40,7 @@ fn AddressOfOperator() {
|
||||
// CHECK:STDERR: &(1 + 1);
|
||||
// CHECK:STDERR: ^
|
||||
&(1 + 1);
|
||||
// CHECK:STDERR: fail_address_of_value.carbon:[[@LINE+3]]:3: Cannot take the address of non-reference expression.
|
||||
// CHECK:STDERR: fail_address_of_value.carbon:[[@LINE+3]]:3: Cannot take the address of a temporary object.
|
||||
// CHECK:STDERR: &H().a;
|
||||
// CHECK:STDERR: ^
|
||||
&H().a;
|
||||
@@ -85,13 +85,13 @@ fn AddressOfParameter(param: i32) {
|
||||
// CHECK:STDOUT: cross_reference_irs_size: 1
|
||||
// CHECK:STDOUT: functions: [
|
||||
// CHECK:STDOUT: {name: str0, param_refs: block0, return_type: type0},
|
||||
// CHECK:STDOUT: {name: str1, param_refs: block0, return_type: type1},
|
||||
// CHECK:STDOUT: {name: str3, param_refs: block0, body: [block4]},
|
||||
// CHECK:STDOUT: {name: str5, param_refs: block0, body: [block8]},
|
||||
// CHECK:STDOUT: {name: str2, param_refs: block0, return_type: type1},
|
||||
// CHECK:STDOUT: {name: str4, param_refs: block0, body: [block5]},
|
||||
// CHECK:STDOUT: {name: str6, param_refs: block0, body: [block9]},
|
||||
// CHECK:STDOUT: {name: str7, param_refs: block0, body: [block10]},
|
||||
// CHECK:STDOUT: {name: str8, param_refs: block0, body: [block11]},
|
||||
// CHECK:STDOUT: {name: str9, param_refs: block14, body: [block15]},
|
||||
// CHECK:STDOUT: {name: str9, param_refs: block0, body: [block12]},
|
||||
// CHECK:STDOUT: {name: str10, param_refs: block15, body: [block16]},
|
||||
// CHECK:STDOUT: ]
|
||||
// CHECK:STDOUT: integer_literals: [
|
||||
// CHECK:STDOUT: 0,
|
||||
@@ -109,6 +109,7 @@ fn AddressOfParameter(param: i32) {
|
||||
// CHECK:STDOUT: ]
|
||||
// CHECK:STDOUT: strings: [
|
||||
// CHECK:STDOUT: G,
|
||||
// CHECK:STDOUT: return,
|
||||
// CHECK:STDOUT: H,
|
||||
// CHECK:STDOUT: a,
|
||||
// CHECK:STDOUT: AddressOfLiteral,
|
||||
@@ -123,19 +124,19 @@ fn AddressOfParameter(param: i32) {
|
||||
// CHECK:STDOUT: ]
|
||||
// CHECK:STDOUT: types: [
|
||||
// CHECK:STDOUT: nodeIntegerType,
|
||||
// CHECK:STDOUT: node+2,
|
||||
// CHECK:STDOUT: node+6,
|
||||
// CHECK:STDOUT: node+3,
|
||||
// CHECK:STDOUT: node+8,
|
||||
// CHECK:STDOUT: nodeBoolType,
|
||||
// CHECK:STDOUT: node+9,
|
||||
// CHECK:STDOUT: node+11,
|
||||
// CHECK:STDOUT: nodeFloatingPointType,
|
||||
// CHECK:STDOUT: node+12,
|
||||
// CHECK:STDOUT: node+14,
|
||||
// CHECK:STDOUT: nodeStringType,
|
||||
// CHECK:STDOUT: node+15,
|
||||
// CHECK:STDOUT: node+21,
|
||||
// CHECK:STDOUT: node+17,
|
||||
// CHECK:STDOUT: node+23,
|
||||
// CHECK:STDOUT: node+29,
|
||||
// CHECK:STDOUT: node+49,
|
||||
// CHECK:STDOUT: node+51,
|
||||
// CHECK:STDOUT: node+25,
|
||||
// CHECK:STDOUT: node+31,
|
||||
// CHECK:STDOUT: node+53,
|
||||
// CHECK:STDOUT: node+55,
|
||||
// CHECK:STDOUT: ]
|
||||
// CHECK:STDOUT: type_blocks: [
|
||||
// CHECK:STDOUT: [
|
||||
@@ -144,77 +145,81 @@ fn AddressOfParameter(param: i32) {
|
||||
// CHECK:STDOUT: ],
|
||||
// CHECK:STDOUT: ]
|
||||
// CHECK:STDOUT: nodes: [
|
||||
// CHECK:STDOUT: {kind: VarStorage, arg0: str1, type: type0},
|
||||
// CHECK:STDOUT: {kind: FunctionDeclaration, arg0: function0},
|
||||
// CHECK:STDOUT: {kind: StructTypeField, arg0: str2, arg1: type0},
|
||||
// CHECK:STDOUT: {kind: StructType, arg0: block3, type: typeTypeType},
|
||||
// CHECK:STDOUT: {kind: StructTypeField, arg0: str3, arg1: type0},
|
||||
// CHECK:STDOUT: {kind: StructType, arg0: block4, type: typeTypeType},
|
||||
// CHECK:STDOUT: {kind: VarStorage, arg0: str1, type: type1},
|
||||
// CHECK:STDOUT: {kind: FunctionDeclaration, arg0: function1},
|
||||
// CHECK:STDOUT: {kind: FunctionDeclaration, arg0: function2},
|
||||
// CHECK:STDOUT: {kind: IntegerLiteral, arg0: int0, type: type0},
|
||||
// CHECK:STDOUT: {kind: PointerType, arg0: type0, type: typeTypeType},
|
||||
// CHECK:STDOUT: {kind: AddressOf, arg0: node+5, type: type2},
|
||||
// CHECK:STDOUT: {kind: AddressOf, arg0: node+7, type: type2},
|
||||
// CHECK:STDOUT: {kind: BoolLiteral, arg0: true, type: type3},
|
||||
// CHECK:STDOUT: {kind: PointerType, arg0: type3, type: typeTypeType},
|
||||
// CHECK:STDOUT: {kind: AddressOf, arg0: node+8, type: type4},
|
||||
// CHECK:STDOUT: {kind: AddressOf, arg0: node+10, type: type4},
|
||||
// CHECK:STDOUT: {kind: RealLiteral, arg0: real0, type: type5},
|
||||
// CHECK:STDOUT: {kind: PointerType, arg0: type5, type: typeTypeType},
|
||||
// CHECK:STDOUT: {kind: AddressOf, arg0: node+11, type: type6},
|
||||
// CHECK:STDOUT: {kind: StringLiteral, arg0: str4, type: type7},
|
||||
// CHECK:STDOUT: {kind: AddressOf, arg0: node+13, type: type6},
|
||||
// CHECK:STDOUT: {kind: StringLiteral, arg0: str5, type: type7},
|
||||
// CHECK:STDOUT: {kind: PointerType, arg0: type7, type: typeTypeType},
|
||||
// CHECK:STDOUT: {kind: AddressOf, arg0: node+14, type: type8},
|
||||
// CHECK:STDOUT: {kind: AddressOf, arg0: node+16, type: type8},
|
||||
// CHECK:STDOUT: {kind: IntegerLiteral, arg0: int1, type: type0},
|
||||
// CHECK:STDOUT: {kind: StubReference, arg0: node+17, type: type0},
|
||||
// CHECK:STDOUT: {kind: IntegerLiteral, arg0: int2, type: type0},
|
||||
// CHECK:STDOUT: {kind: StubReference, arg0: node+19, type: type0},
|
||||
// CHECK:STDOUT: {kind: IntegerLiteral, arg0: int2, type: type0},
|
||||
// CHECK:STDOUT: {kind: StubReference, arg0: node+21, type: type0},
|
||||
// CHECK:STDOUT: {kind: TupleType, arg0: typeBlock0, type: typeTypeType},
|
||||
// CHECK:STDOUT: {kind: TupleValue, arg0: block5, type: type9},
|
||||
// CHECK:STDOUT: {kind: TupleValue, arg0: block6, type: type9},
|
||||
// CHECK:STDOUT: {kind: PointerType, arg0: type9, type: typeTypeType},
|
||||
// CHECK:STDOUT: {kind: AddressOf, arg0: node+22, type: type10},
|
||||
// CHECK:STDOUT: {kind: AddressOf, arg0: node+24, type: type10},
|
||||
// CHECK:STDOUT: {kind: IntegerLiteral, arg0: int3, type: type0},
|
||||
// CHECK:STDOUT: {kind: StructTypeField, arg0: str2, arg1: type0},
|
||||
// CHECK:STDOUT: {kind: StubReference, arg0: node+25, type: type0},
|
||||
// CHECK:STDOUT: {kind: StructValue, arg0: block7, type: type1},
|
||||
// CHECK:STDOUT: {kind: StructTypeField, arg0: str3, arg1: type0},
|
||||
// CHECK:STDOUT: {kind: StubReference, arg0: node+27, type: type0},
|
||||
// CHECK:STDOUT: {kind: StructValue, arg0: block8, type: type1},
|
||||
// CHECK:STDOUT: {kind: PointerType, arg0: type1, type: typeTypeType},
|
||||
// CHECK:STDOUT: {kind: AddressOf, arg0: node+28, type: type11},
|
||||
// CHECK:STDOUT: {kind: AddressOf, arg0: node+30, type: type11},
|
||||
// CHECK:STDOUT: {kind: Return},
|
||||
// CHECK:STDOUT: {kind: FunctionDeclaration, arg0: function3},
|
||||
// CHECK:STDOUT: {kind: IntegerLiteral, arg0: int4, type: type0},
|
||||
// CHECK:STDOUT: {kind: IntegerLiteral, arg0: int5, type: type0},
|
||||
// CHECK:STDOUT: {kind: BinaryOperatorAdd, arg0: node+33, arg1: node+34, type: type0},
|
||||
// CHECK:STDOUT: {kind: AddressOf, arg0: node+35, type: type2},
|
||||
// CHECK:STDOUT: {kind: BinaryOperatorAdd, arg0: node+35, arg1: node+36, type: type0},
|
||||
// CHECK:STDOUT: {kind: AddressOf, arg0: node+37, type: type2},
|
||||
// CHECK:STDOUT: {kind: Call, arg0: block0, arg1: function1, type: type1},
|
||||
// CHECK:STDOUT: {kind: StructAccess, arg0: node+37, arg1: member0, type: type0},
|
||||
// CHECK:STDOUT: {kind: AddressOf, arg0: node+38, type: type2},
|
||||
// CHECK:STDOUT: {kind: MaterializeTemporary, type: type1},
|
||||
// CHECK:STDOUT: {kind: Assign, arg0: node+40, arg1: node+39},
|
||||
// CHECK:STDOUT: {kind: StructAccess, arg0: node+40, arg1: member0, type: type0},
|
||||
// CHECK:STDOUT: {kind: AddressOf, arg0: node+42, type: type2},
|
||||
// CHECK:STDOUT: {kind: BoolLiteral, arg0: true, type: type3},
|
||||
// CHECK:STDOUT: {kind: UnaryOperatorNot, arg0: node+40, type: type3},
|
||||
// CHECK:STDOUT: {kind: AddressOf, arg0: node+41, type: type4},
|
||||
// CHECK:STDOUT: {kind: UnaryOperatorNot, arg0: node+44, type: type3},
|
||||
// CHECK:STDOUT: {kind: AddressOf, arg0: node+45, type: type4},
|
||||
// CHECK:STDOUT: {kind: Return},
|
||||
// CHECK:STDOUT: {kind: FunctionDeclaration, arg0: function4},
|
||||
// CHECK:STDOUT: {kind: Call, arg0: block0, arg1: function0, type: type0},
|
||||
// CHECK:STDOUT: {kind: AddressOf, arg0: node+45, type: type2},
|
||||
// CHECK:STDOUT: {kind: AddressOf, arg0: node+49, type: type2},
|
||||
// CHECK:STDOUT: {kind: Return},
|
||||
// CHECK:STDOUT: {kind: FunctionDeclaration, arg0: function5},
|
||||
// CHECK:STDOUT: {kind: PointerType, arg0: typeTypeType, type: typeTypeType},
|
||||
// CHECK:STDOUT: {kind: AddressOf, arg0: nodeIntegerType, type: type12},
|
||||
// CHECK:STDOUT: {kind: ConstType, arg0: type0, type: typeTypeType},
|
||||
// CHECK:STDOUT: {kind: PointerType, arg0: type13, type: typeTypeType},
|
||||
// CHECK:STDOUT: {kind: AddressOf, arg0: node+52, type: type12},
|
||||
// CHECK:STDOUT: {kind: AddressOf, arg0: node+56, type: type12},
|
||||
// CHECK:STDOUT: {kind: Return},
|
||||
// CHECK:STDOUT: {kind: FunctionDeclaration, arg0: function6},
|
||||
// CHECK:STDOUT: {kind: IntegerLiteral, arg0: int6, type: type0},
|
||||
// CHECK:STDOUT: {kind: StubReference, arg0: node+56, type: type0},
|
||||
// CHECK:STDOUT: {kind: StubReference, arg0: node+60, type: type0},
|
||||
// CHECK:STDOUT: {kind: IntegerLiteral, arg0: int7, type: type0},
|
||||
// CHECK:STDOUT: {kind: StubReference, arg0: node+58, type: type0},
|
||||
// CHECK:STDOUT: {kind: TupleValue, arg0: block12, type: type9},
|
||||
// CHECK:STDOUT: {kind: StubReference, arg0: node+62, type: type0},
|
||||
// CHECK:STDOUT: {kind: TupleValue, arg0: block13, type: type9},
|
||||
// CHECK:STDOUT: {kind: IntegerLiteral, arg0: int8, type: type0},
|
||||
// CHECK:STDOUT: {kind: TupleIndex, arg0: node+60, arg1: node+61, type: type0},
|
||||
// CHECK:STDOUT: {kind: AddressOf, arg0: node+62, type: type2},
|
||||
// CHECK:STDOUT: {kind: TupleIndex, arg0: node+64, arg1: node+65, type: type0},
|
||||
// CHECK:STDOUT: {kind: AddressOf, arg0: node+66, type: type2},
|
||||
// CHECK:STDOUT: {kind: Return},
|
||||
// CHECK:STDOUT: {kind: Parameter, arg0: str10, type: type0},
|
||||
// CHECK:STDOUT: {kind: Parameter, arg0: str11, type: type0},
|
||||
// CHECK:STDOUT: {kind: FunctionDeclaration, arg0: function7},
|
||||
// CHECK:STDOUT: {kind: PointerType, arg0: type0, type: typeTypeType},
|
||||
// CHECK:STDOUT: {kind: VarStorage, arg0: str11, type: type2},
|
||||
// CHECK:STDOUT: {kind: AddressOf, arg0: node+65, type: type2},
|
||||
// CHECK:STDOUT: {kind: Assign, arg0: node+68, arg1: node+69},
|
||||
// CHECK:STDOUT: {kind: VarStorage, arg0: str12, type: type2},
|
||||
// CHECK:STDOUT: {kind: AddressOf, arg0: node+69, type: type2},
|
||||
// CHECK:STDOUT: {kind: Assign, arg0: node+72, arg1: node+73},
|
||||
// CHECK:STDOUT: {kind: Return},
|
||||
// CHECK:STDOUT: ]
|
||||
// CHECK:STDOUT: node_blocks: [
|
||||
@@ -222,24 +227,26 @@ fn AddressOfParameter(param: i32) {
|
||||
// CHECK:STDOUT: ],
|
||||
// CHECK:STDOUT: [
|
||||
// CHECK:STDOUT: node+0,
|
||||
// CHECK:STDOUT: node+3,
|
||||
// CHECK:STDOUT: node+4,
|
||||
// CHECK:STDOUT: node+32,
|
||||
// CHECK:STDOUT: node+44,
|
||||
// CHECK:STDOUT: node+48,
|
||||
// CHECK:STDOUT: node+55,
|
||||
// CHECK:STDOUT: node+66,
|
||||
// CHECK:STDOUT: ],
|
||||
// CHECK:STDOUT: [
|
||||
// CHECK:STDOUT: node+1,
|
||||
// CHECK:STDOUT: node+5,
|
||||
// CHECK:STDOUT: node+6,
|
||||
// CHECK:STDOUT: node+34,
|
||||
// CHECK:STDOUT: node+48,
|
||||
// CHECK:STDOUT: node+52,
|
||||
// CHECK:STDOUT: node+59,
|
||||
// CHECK:STDOUT: node+70,
|
||||
// CHECK:STDOUT: ],
|
||||
// CHECK:STDOUT: [
|
||||
// CHECK:STDOUT: node+2,
|
||||
// CHECK:STDOUT: node+3,
|
||||
// CHECK:STDOUT: node+4,
|
||||
// CHECK:STDOUT: ],
|
||||
// CHECK:STDOUT: [
|
||||
// CHECK:STDOUT: node+2,
|
||||
// CHECK:STDOUT: ],
|
||||
// CHECK:STDOUT: [
|
||||
// CHECK:STDOUT: node+1,
|
||||
// CHECK:STDOUT: ],
|
||||
// CHECK:STDOUT: [
|
||||
// CHECK:STDOUT: node+5,
|
||||
// CHECK:STDOUT: node+6,
|
||||
// CHECK:STDOUT: node+7,
|
||||
// CHECK:STDOUT: node+8,
|
||||
// CHECK:STDOUT: node+9,
|
||||
@@ -259,25 +266,25 @@ fn AddressOfParameter(param: i32) {
|
||||
// CHECK:STDOUT: node+23,
|
||||
// CHECK:STDOUT: node+24,
|
||||
// CHECK:STDOUT: node+25,
|
||||
// CHECK:STDOUT: node+26,
|
||||
// CHECK:STDOUT: node+27,
|
||||
// CHECK:STDOUT: node+28,
|
||||
// CHECK:STDOUT: node+29,
|
||||
// CHECK:STDOUT: node+30,
|
||||
// CHECK:STDOUT: node+31,
|
||||
// CHECK:STDOUT: ],
|
||||
// CHECK:STDOUT: [
|
||||
// CHECK:STDOUT: node+18,
|
||||
// CHECK:STDOUT: node+20,
|
||||
// CHECK:STDOUT: ],
|
||||
// CHECK:STDOUT: [
|
||||
// CHECK:STDOUT: node+26,
|
||||
// CHECK:STDOUT: ],
|
||||
// CHECK:STDOUT: [
|
||||
// CHECK:STDOUT: node+27,
|
||||
// CHECK:STDOUT: ],
|
||||
// CHECK:STDOUT: [
|
||||
// CHECK:STDOUT: node+32,
|
||||
// CHECK:STDOUT: node+33,
|
||||
// CHECK:STDOUT: node+34,
|
||||
// CHECK:STDOUT: ],
|
||||
// CHECK:STDOUT: [
|
||||
// CHECK:STDOUT: node+20,
|
||||
// CHECK:STDOUT: node+22,
|
||||
// CHECK:STDOUT: ],
|
||||
// CHECK:STDOUT: [
|
||||
// CHECK:STDOUT: node+28,
|
||||
// CHECK:STDOUT: ],
|
||||
// CHECK:STDOUT: [
|
||||
// CHECK:STDOUT: node+29,
|
||||
// CHECK:STDOUT: ],
|
||||
// CHECK:STDOUT: [
|
||||
// CHECK:STDOUT: node+35,
|
||||
// CHECK:STDOUT: node+36,
|
||||
// CHECK:STDOUT: node+37,
|
||||
@@ -287,8 +294,7 @@ fn AddressOfParameter(param: i32) {
|
||||
// CHECK:STDOUT: node+41,
|
||||
// CHECK:STDOUT: node+42,
|
||||
// CHECK:STDOUT: node+43,
|
||||
// CHECK:STDOUT: ],
|
||||
// CHECK:STDOUT: [
|
||||
// CHECK:STDOUT: node+44,
|
||||
// CHECK:STDOUT: node+45,
|
||||
// CHECK:STDOUT: node+46,
|
||||
// CHECK:STDOUT: node+47,
|
||||
@@ -297,37 +303,42 @@ fn AddressOfParameter(param: i32) {
|
||||
// CHECK:STDOUT: node+49,
|
||||
// CHECK:STDOUT: node+50,
|
||||
// CHECK:STDOUT: node+51,
|
||||
// CHECK:STDOUT: node+52,
|
||||
// CHECK:STDOUT: node+53,
|
||||
// CHECK:STDOUT: node+54,
|
||||
// CHECK:STDOUT: ],
|
||||
// CHECK:STDOUT: [
|
||||
// CHECK:STDOUT: node+53,
|
||||
// CHECK:STDOUT: node+54,
|
||||
// CHECK:STDOUT: node+55,
|
||||
// CHECK:STDOUT: node+56,
|
||||
// CHECK:STDOUT: node+57,
|
||||
// CHECK:STDOUT: node+58,
|
||||
// CHECK:STDOUT: node+59,
|
||||
// CHECK:STDOUT: ],
|
||||
// CHECK:STDOUT: [
|
||||
// CHECK:STDOUT: node+60,
|
||||
// CHECK:STDOUT: node+61,
|
||||
// CHECK:STDOUT: node+62,
|
||||
// CHECK:STDOUT: node+63,
|
||||
// CHECK:STDOUT: node+64,
|
||||
// CHECK:STDOUT: ],
|
||||
// CHECK:STDOUT: [
|
||||
// CHECK:STDOUT: node+57,
|
||||
// CHECK:STDOUT: node+59,
|
||||
// CHECK:STDOUT: ],
|
||||
// CHECK:STDOUT: [
|
||||
// CHECK:STDOUT: node+65,
|
||||
// CHECK:STDOUT: ],
|
||||
// CHECK:STDOUT: [
|
||||
// CHECK:STDOUT: node+65,
|
||||
// CHECK:STDOUT: ],
|
||||
// CHECK:STDOUT: [
|
||||
// CHECK:STDOUT: node+66,
|
||||
// CHECK:STDOUT: node+67,
|
||||
// CHECK:STDOUT: node+68,
|
||||
// CHECK:STDOUT: ],
|
||||
// CHECK:STDOUT: [
|
||||
// CHECK:STDOUT: node+61,
|
||||
// CHECK:STDOUT: node+63,
|
||||
// CHECK:STDOUT: ],
|
||||
// CHECK:STDOUT: [
|
||||
// CHECK:STDOUT: node+69,
|
||||
// CHECK:STDOUT: node+70,
|
||||
// CHECK:STDOUT: ],
|
||||
// CHECK:STDOUT: [
|
||||
// CHECK:STDOUT: node+69,
|
||||
// CHECK:STDOUT: ],
|
||||
// CHECK:STDOUT: [
|
||||
// CHECK:STDOUT: node+71,
|
||||
// CHECK:STDOUT: node+72,
|
||||
// CHECK:STDOUT: node+73,
|
||||
// CHECK:STDOUT: node+74,
|
||||
// CHECK:STDOUT: node+75,
|
||||
// CHECK:STDOUT: ],
|
||||
// CHECK:STDOUT: ]
|
||||
// CHECK:STDOUT:
|
||||
@@ -382,8 +393,10 @@ fn AddressOfParameter(param: i32) {
|
||||
// CHECK:STDOUT: %.loc42_9: i32 = int_literal 1
|
||||
// CHECK:STDOUT: %.loc42_7: i32 = add %.loc42_5, %.loc42_9
|
||||
// CHECK:STDOUT: %.loc42_3: i32* = address_of %.loc42_7
|
||||
// CHECK:STDOUT: %.loc46_5: {.a: i32} = call @H()
|
||||
// CHECK:STDOUT: %.loc46_7: i32 = struct_access %.loc46_5, member0
|
||||
// CHECK:STDOUT: %.loc46_5.1: {.a: i32} = call @H()
|
||||
// CHECK:STDOUT: %.loc46_5.2: {.a: i32} = materialize_temporary
|
||||
// CHECK:STDOUT: assign %.loc46_5.2, %.loc46_5.1
|
||||
// CHECK:STDOUT: %.loc46_7: i32 = struct_access %.loc46_5.2, member0
|
||||
// CHECK:STDOUT: %.loc46_3: i32* = address_of %.loc46_7
|
||||
// CHECK:STDOUT: %.loc50_9: bool = bool_literal true
|
||||
// CHECK:STDOUT: %.loc50_5: bool = not %.loc50_9
|
||||
|
||||
@@ -22,6 +22,7 @@ fn ConstMismatch(p: const {}*) -> const ({}*) {
|
||||
// CHECK:STDOUT: strings: [
|
||||
// CHECK:STDOUT: ConstMismatch,
|
||||
// CHECK:STDOUT: p,
|
||||
// CHECK:STDOUT: return,
|
||||
// CHECK:STDOUT: ]
|
||||
// CHECK:STDOUT: types: [
|
||||
// CHECK:STDOUT: node+0,
|
||||
@@ -41,6 +42,7 @@ fn ConstMismatch(p: const {}*) -> const ({}*) {
|
||||
// CHECK:STDOUT: {kind: StructValue, arg0: block0, type: type0},
|
||||
// CHECK:STDOUT: {kind: PointerType, arg0: type0, type: typeTypeType},
|
||||
// CHECK:STDOUT: {kind: ConstType, arg0: type3, type: typeTypeType},
|
||||
// CHECK:STDOUT: {kind: VarStorage, arg0: str2, type: type4},
|
||||
// CHECK:STDOUT: {kind: FunctionDeclaration, arg0: function0},
|
||||
// CHECK:STDOUT: {kind: ReturnExpression, arg0: nodeError},
|
||||
// CHECK:STDOUT: ]
|
||||
@@ -56,15 +58,16 @@ fn ConstMismatch(p: const {}*) -> const ({}*) {
|
||||
// CHECK:STDOUT: node+5,
|
||||
// CHECK:STDOUT: node+6,
|
||||
// CHECK:STDOUT: node+7,
|
||||
// CHECK:STDOUT: node+8,
|
||||
// CHECK:STDOUT: ],
|
||||
// CHECK:STDOUT: [
|
||||
// CHECK:STDOUT: node+4,
|
||||
// CHECK:STDOUT: ],
|
||||
// CHECK:STDOUT: [
|
||||
// CHECK:STDOUT: node+8,
|
||||
// CHECK:STDOUT: node+9,
|
||||
// CHECK:STDOUT: ],
|
||||
// CHECK:STDOUT: [
|
||||
// CHECK:STDOUT: node+9,
|
||||
// CHECK:STDOUT: node+10,
|
||||
// CHECK:STDOUT: ],
|
||||
// CHECK:STDOUT: ]
|
||||
// CHECK:STDOUT:
|
||||
|
||||
+16
-7
@@ -20,6 +20,7 @@ fn F(p: const (const (const i32*)*)) -> const i32 {
|
||||
// CHECK:STDOUT: strings: [
|
||||
// CHECK:STDOUT: F,
|
||||
// CHECK:STDOUT: p,
|
||||
// CHECK:STDOUT: return,
|
||||
// CHECK:STDOUT: ]
|
||||
// CHECK:STDOUT: types: [
|
||||
// CHECK:STDOUT: nodeIntegerType,
|
||||
@@ -39,10 +40,13 @@ fn F(p: const (const (const i32*)*)) -> const i32 {
|
||||
// CHECK:STDOUT: {kind: ConstType, arg0: type4, type: typeTypeType},
|
||||
// CHECK:STDOUT: {kind: Parameter, arg0: str1, type: type5},
|
||||
// CHECK:STDOUT: {kind: ConstType, arg0: type0, type: typeTypeType},
|
||||
// CHECK:STDOUT: {kind: VarStorage, arg0: str2, type: type1},
|
||||
// CHECK:STDOUT: {kind: FunctionDeclaration, arg0: function0},
|
||||
// CHECK:STDOUT: {kind: Dereference, arg0: node+5, type: type3},
|
||||
// CHECK:STDOUT: {kind: Dereference, arg0: node+8, type: type1},
|
||||
// CHECK:STDOUT: {kind: ReturnExpression, arg0: node+9},
|
||||
// CHECK:STDOUT: {kind: BindValue, arg0: node+9, type: type3},
|
||||
// CHECK:STDOUT: {kind: Dereference, arg0: node+10, type: type1},
|
||||
// CHECK:STDOUT: {kind: BindValue, arg0: node+11, type: type1},
|
||||
// CHECK:STDOUT: {kind: ReturnExpression, arg0: node+12},
|
||||
// CHECK:STDOUT: ]
|
||||
// CHECK:STDOUT: node_blocks: [
|
||||
// CHECK:STDOUT: [
|
||||
@@ -55,17 +59,20 @@ fn F(p: const (const (const i32*)*)) -> const i32 {
|
||||
// CHECK:STDOUT: node+4,
|
||||
// CHECK:STDOUT: node+5,
|
||||
// CHECK:STDOUT: node+6,
|
||||
// CHECK:STDOUT: node+7,
|
||||
// CHECK:STDOUT: ],
|
||||
// CHECK:STDOUT: [
|
||||
// CHECK:STDOUT: node+5,
|
||||
// CHECK:STDOUT: ],
|
||||
// CHECK:STDOUT: [
|
||||
// CHECK:STDOUT: node+7,
|
||||
// CHECK:STDOUT: node+8,
|
||||
// CHECK:STDOUT: ],
|
||||
// CHECK:STDOUT: [
|
||||
// CHECK:STDOUT: node+8,
|
||||
// CHECK:STDOUT: node+9,
|
||||
// CHECK:STDOUT: node+10,
|
||||
// CHECK:STDOUT: node+11,
|
||||
// CHECK:STDOUT: node+12,
|
||||
// CHECK:STDOUT: node+13,
|
||||
// CHECK:STDOUT: ],
|
||||
// CHECK:STDOUT: ]
|
||||
// CHECK:STDOUT:
|
||||
@@ -75,7 +82,9 @@ fn F(p: const (const (const i32*)*)) -> const i32 {
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: fn @F(%p: const (const (const i32*)*)) -> const i32 {
|
||||
// CHECK:STDOUT: !entry:
|
||||
// CHECK:STDOUT: %.loc9_11: const (const i32*) = dereference %p
|
||||
// CHECK:STDOUT: %.loc9_10: const i32 = dereference %.loc9_11
|
||||
// CHECK:STDOUT: return %.loc9_10
|
||||
// CHECK:STDOUT: %.loc9_11.1: const (const i32*) = dereference %p
|
||||
// CHECK:STDOUT: %.loc9_11.2: const (const i32*) = bind_value %.loc9_11.1
|
||||
// CHECK:STDOUT: %.loc9_10.1: const i32 = dereference %.loc9_11.2
|
||||
// CHECK:STDOUT: %.loc9_10.2: const i32 = bind_value %.loc9_10.1
|
||||
// CHECK:STDOUT: return %.loc9_10.2
|
||||
// CHECK:STDOUT: }
|
||||
|
||||
+17
-12
@@ -15,7 +15,7 @@ fn ConstPtr(p: const i32*) -> (const i32)* {
|
||||
// CHECK:STDOUT: cross_reference_irs_size: 1
|
||||
// CHECK:STDOUT: functions: [
|
||||
// CHECK:STDOUT: {name: str0, param_refs: block2, return_type: type1, body: [block4]},
|
||||
// CHECK:STDOUT: {name: str2, param_refs: block6, return_type: type3, body: [block7]},
|
||||
// CHECK:STDOUT: {name: str3, param_refs: block6, return_type: type3, body: [block7]},
|
||||
// CHECK:STDOUT: ]
|
||||
// CHECK:STDOUT: integer_literals: [
|
||||
// CHECK:STDOUT: ]
|
||||
@@ -24,13 +24,14 @@ fn ConstPtr(p: const i32*) -> (const i32)* {
|
||||
// CHECK:STDOUT: strings: [
|
||||
// CHECK:STDOUT: Ptr,
|
||||
// CHECK:STDOUT: p,
|
||||
// CHECK:STDOUT: return,
|
||||
// CHECK:STDOUT: ConstPtr,
|
||||
// CHECK:STDOUT: ]
|
||||
// CHECK:STDOUT: types: [
|
||||
// CHECK:STDOUT: nodeIntegerType,
|
||||
// CHECK:STDOUT: node+0,
|
||||
// CHECK:STDOUT: node+5,
|
||||
// CHECK:STDOUT: node+6,
|
||||
// CHECK:STDOUT: node+7,
|
||||
// CHECK:STDOUT: ]
|
||||
// CHECK:STDOUT: type_blocks: [
|
||||
// CHECK:STDOUT: ]
|
||||
@@ -38,6 +39,7 @@ fn ConstPtr(p: const i32*) -> (const i32)* {
|
||||
// CHECK:STDOUT: {kind: PointerType, arg0: type0, type: typeTypeType},
|
||||
// CHECK:STDOUT: {kind: Parameter, arg0: str1, type: type1},
|
||||
// CHECK:STDOUT: {kind: PointerType, arg0: type0, type: typeTypeType},
|
||||
// CHECK:STDOUT: {kind: VarStorage, arg0: str2, type: type1},
|
||||
// CHECK:STDOUT: {kind: FunctionDeclaration, arg0: function0},
|
||||
// CHECK:STDOUT: {kind: ReturnExpression, arg0: node+1},
|
||||
// CHECK:STDOUT: {kind: ConstType, arg0: type0, type: typeTypeType},
|
||||
@@ -45,8 +47,9 @@ fn ConstPtr(p: const i32*) -> (const i32)* {
|
||||
// CHECK:STDOUT: {kind: Parameter, arg0: str1, type: type3},
|
||||
// CHECK:STDOUT: {kind: ConstType, arg0: type0, type: typeTypeType},
|
||||
// CHECK:STDOUT: {kind: PointerType, arg0: type2, type: typeTypeType},
|
||||
// CHECK:STDOUT: {kind: VarStorage, arg0: str2, type: type3},
|
||||
// CHECK:STDOUT: {kind: FunctionDeclaration, arg0: function1},
|
||||
// CHECK:STDOUT: {kind: ReturnExpression, arg0: node+7},
|
||||
// CHECK:STDOUT: {kind: ReturnExpression, arg0: node+8},
|
||||
// CHECK:STDOUT: ]
|
||||
// CHECK:STDOUT: node_blocks: [
|
||||
// CHECK:STDOUT: [
|
||||
@@ -55,30 +58,32 @@ fn ConstPtr(p: const i32*) -> (const i32)* {
|
||||
// CHECK:STDOUT: node+0,
|
||||
// CHECK:STDOUT: node+1,
|
||||
// CHECK:STDOUT: node+2,
|
||||
// CHECK:STDOUT: node+3,
|
||||
// CHECK:STDOUT: ],
|
||||
// CHECK:STDOUT: [
|
||||
// CHECK:STDOUT: node+1,
|
||||
// CHECK:STDOUT: ],
|
||||
// CHECK:STDOUT: [
|
||||
// CHECK:STDOUT: node+3,
|
||||
// CHECK:STDOUT: node+10,
|
||||
// CHECK:STDOUT: ],
|
||||
// CHECK:STDOUT: [
|
||||
// CHECK:STDOUT: node+4,
|
||||
// CHECK:STDOUT: node+12,
|
||||
// CHECK:STDOUT: ],
|
||||
// CHECK:STDOUT: [
|
||||
// CHECK:STDOUT: node+5,
|
||||
// CHECK:STDOUT: ],
|
||||
// CHECK:STDOUT: [
|
||||
// CHECK:STDOUT: node+6,
|
||||
// CHECK:STDOUT: node+7,
|
||||
// CHECK:STDOUT: node+8,
|
||||
// CHECK:STDOUT: node+9,
|
||||
// CHECK:STDOUT: ],
|
||||
// CHECK:STDOUT: [
|
||||
// CHECK:STDOUT: node+7,
|
||||
// CHECK:STDOUT: ],
|
||||
// CHECK:STDOUT: [
|
||||
// CHECK:STDOUT: node+10,
|
||||
// CHECK:STDOUT: node+11,
|
||||
// CHECK:STDOUT: ],
|
||||
// CHECK:STDOUT: [
|
||||
// CHECK:STDOUT: node+8,
|
||||
// CHECK:STDOUT: ],
|
||||
// CHECK:STDOUT: [
|
||||
// CHECK:STDOUT: node+13,
|
||||
// CHECK:STDOUT: ],
|
||||
// CHECK:STDOUT: ]
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: package {
|
||||
|
||||
Reference in New Issue
Block a user