mirror of
https://github.com/carbon-language/carbon-lang.git
synced 2026-10-05 21:51:12 +01:00
Initial support for return forms (#6556)
The main changes here are: - Introducing `InitForm` and `RefForm` to represent initializing and reference forms (the two return forms currently supported by the parser). - Introducing the `FormType` singleton inst to represent their type (i.e. `Core.Form`). - Emitting an inst representing a function's declared return form as part of handling the function signature. The return form inst is currently ignored. Subsequent PRs will expose it in `SemIR::Function` and use it to determine the form of call expressions.
This commit is contained in:
@@ -94,6 +94,7 @@ fn F() -> Cpp.AbstractFinal {
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: constants {
|
||||
// CHECK:STDOUT: %AbstractFinal: type = class_type @AbstractFinal [concrete]
|
||||
// CHECK:STDOUT: %.fd6: form = init_form %AbstractFinal, call_param0 [concrete]
|
||||
// CHECK:STDOUT: %pattern_type: type = pattern_type %AbstractFinal [concrete]
|
||||
// CHECK:STDOUT: %F.type: type = fn_type @F [concrete]
|
||||
// CHECK:STDOUT: %F: %F.type = struct_value () [concrete]
|
||||
@@ -114,6 +115,7 @@ fn F() -> Cpp.AbstractFinal {
|
||||
// CHECK:STDOUT: } {
|
||||
// CHECK:STDOUT: %Cpp.ref: <namespace> = name_ref Cpp, imports.%Cpp [concrete = imports.%Cpp]
|
||||
// CHECK:STDOUT: %AbstractFinal.ref: type = name_ref AbstractFinal, imports.%AbstractFinal.decl [concrete = constants.%AbstractFinal]
|
||||
// CHECK:STDOUT: %.loc11_14: form = init_form %AbstractFinal.ref, call_param0 [concrete = constants.%.fd6]
|
||||
// CHECK:STDOUT: %return.param: ref %AbstractFinal = out_param call_param0
|
||||
// CHECK:STDOUT: %return: ref %AbstractFinal = return_slot %return.param
|
||||
// CHECK:STDOUT: }
|
||||
@@ -122,8 +124,8 @@ fn F() -> Cpp.AbstractFinal {
|
||||
// CHECK:STDOUT: fn @F() -> %return.param: %AbstractFinal {
|
||||
// CHECK:STDOUT: !entry:
|
||||
// CHECK:STDOUT: %F.ref: %F.type = name_ref F, file.%F.decl [concrete = constants.%F]
|
||||
// CHECK:STDOUT: %.loc11: ref %AbstractFinal = splice_block %return {}
|
||||
// CHECK:STDOUT: %F.call: init %AbstractFinal = call %F.ref() to %.loc11
|
||||
// CHECK:STDOUT: %.loc11_8: ref %AbstractFinal = splice_block %return {}
|
||||
// CHECK:STDOUT: %F.call: init %AbstractFinal = call %F.ref() to %.loc11_8
|
||||
// CHECK:STDOUT: return %F.call to %return
|
||||
// CHECK:STDOUT: }
|
||||
// CHECK:STDOUT:
|
||||
|
||||
+3
-1
@@ -465,6 +465,7 @@ class V {
|
||||
// CHECK:STDOUT: %pattern_type.5c86: type = pattern_type %ptr.ddb [concrete]
|
||||
// CHECK:STDOUT: %Base: type = class_type @Base [concrete]
|
||||
// CHECK:STDOUT: %ptr.fb2: type = ptr_type %Base [concrete]
|
||||
// CHECK:STDOUT: %.43a: form = init_form %ptr.fb2, call_param1 [concrete]
|
||||
// CHECK:STDOUT: %pattern_type.72a: type = pattern_type %ptr.fb2 [concrete]
|
||||
// CHECK:STDOUT: %ConvertPtr.type: type = fn_type @ConvertPtr [concrete]
|
||||
// CHECK:STDOUT: %ConvertPtr: %ConvertPtr.type = struct_value () [concrete]
|
||||
@@ -508,8 +509,9 @@ class V {
|
||||
// CHECK:STDOUT: %Cpp.ref.loc7_35: <namespace> = name_ref Cpp, imports.%Cpp [concrete = imports.%Cpp]
|
||||
// CHECK:STDOUT: %Base.ref: type = name_ref Base, imports.%Base.decl [concrete = constants.%Base]
|
||||
// CHECK:STDOUT: %ptr.loc7_43: type = ptr_type %Base.ref [concrete = constants.%ptr.fb2]
|
||||
// CHECK:STDOUT: %.loc7_43: form = init_form %ptr.loc7_43, call_param1 [concrete = constants.%.43a]
|
||||
// CHECK:STDOUT: %d.param: %ptr.ddb = value_param call_param0
|
||||
// CHECK:STDOUT: %.loc7: type = splice_block %ptr.loc7_29 [concrete = constants.%ptr.ddb] {
|
||||
// CHECK:STDOUT: %.loc7_29: type = splice_block %ptr.loc7_29 [concrete = constants.%ptr.ddb] {
|
||||
// CHECK:STDOUT: %Cpp.ref.loc7_18: <namespace> = name_ref Cpp, imports.%Cpp [concrete = imports.%Cpp]
|
||||
// CHECK:STDOUT: %Derived.ref: type = name_ref Derived, imports.%Derived.decl [concrete = constants.%Derived]
|
||||
// CHECK:STDOUT: %ptr.loc7_29: type = ptr_type %Derived.ref [concrete = constants.%ptr.ddb]
|
||||
|
||||
@@ -75,6 +75,7 @@ fn G() -> str {
|
||||
// CHECK:STDOUT: %ptr.85f: type = ptr_type %str.ee0 [concrete]
|
||||
// CHECK:STDOUT: %Consume__carbon_thunk.type: type = fn_type @Consume__carbon_thunk [concrete]
|
||||
// CHECK:STDOUT: %Consume__carbon_thunk: %Consume__carbon_thunk.type = struct_value () [concrete]
|
||||
// CHECK:STDOUT: %.a70: form = init_form %str.ee0, call_param0 [concrete]
|
||||
// CHECK:STDOUT: %G.type: type = fn_type @G [concrete]
|
||||
// CHECK:STDOUT: %G: %G.type = struct_value () [concrete]
|
||||
// CHECK:STDOUT: %Produce.cpp_overload_set.type: type = cpp_overload_set_type @Produce.cpp_overload_set [concrete]
|
||||
@@ -109,6 +110,7 @@ fn G() -> str {
|
||||
// CHECK:STDOUT: %return.patt: %pattern_type.461 = return_slot_pattern [concrete]
|
||||
// CHECK:STDOUT: %return.param_patt: %pattern_type.461 = out_param_pattern %return.patt, call_param0 [concrete]
|
||||
// CHECK:STDOUT: } {
|
||||
// CHECK:STDOUT: %.loc13_11: form = init_form constants.%str.ee0, call_param0 [concrete = constants.%.a70]
|
||||
// CHECK:STDOUT: %return.param: ref %str.ee0 = out_param call_param0
|
||||
// CHECK:STDOUT: %return: ref %str.ee0 = return_slot %return.param
|
||||
// CHECK:STDOUT: }
|
||||
@@ -131,10 +133,10 @@ fn G() -> str {
|
||||
// CHECK:STDOUT: !entry:
|
||||
// CHECK:STDOUT: %Cpp.ref: <namespace> = name_ref Cpp, imports.%Cpp [concrete = imports.%Cpp]
|
||||
// CHECK:STDOUT: %Produce.ref: %Produce.cpp_overload_set.type = name_ref Produce, imports.%Produce.cpp_overload_set.value [concrete = constants.%Produce.cpp_overload_set.value]
|
||||
// CHECK:STDOUT: %.loc13: ref %str.ee0 = splice_block %return {}
|
||||
// CHECK:STDOUT: %addr: %ptr.85f = addr_of %.loc13
|
||||
// CHECK:STDOUT: %.loc13_8: ref %str.ee0 = splice_block %return {}
|
||||
// CHECK:STDOUT: %addr: %ptr.85f = addr_of %.loc13_8
|
||||
// CHECK:STDOUT: %Produce__carbon_thunk.call: init %empty_tuple.type = call imports.%Produce__carbon_thunk.decl(%addr)
|
||||
// CHECK:STDOUT: %.loc14: init %str.ee0 = in_place_init %Produce__carbon_thunk.call, %.loc13
|
||||
// CHECK:STDOUT: %.loc14: init %str.ee0 = in_place_init %Produce__carbon_thunk.call, %.loc13_8
|
||||
// CHECK:STDOUT: return %.loc14 to %return
|
||||
// CHECK:STDOUT: }
|
||||
// CHECK:STDOUT:
|
||||
|
||||
Reference in New Issue
Block a user