Skip to content

Commit 2c1d02d

Browse files
authored
Don't eagerly materialize an initializing expression used as the object in a compound member access. (#4496)
Instead, wait until we know whether it is used as a value or reference expression. This allows us to avoid materializing a temporary if it is used as a value and the initializing representation holds a copy of a value representation.
1 parent a69c263 commit 2c1d02d

18 files changed

+110
-74
lines changed

toolchain/check/member_access.cpp

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -462,8 +462,6 @@ auto PerformCompoundMemberAccess(
462462
Context& context, SemIR::LocId loc_id, SemIR::InstId base_id,
463463
SemIR::InstId member_expr_id,
464464
Context::BuildDiagnosticFn missing_impl_diagnoser) -> SemIR::InstId {
465-
// Materialize a temporary for the base expression if necessary.
466-
base_id = ConvertToValueOrRefExpr(context, base_id);
467465
auto base_type_id = context.insts().Get(base_id).type_id();
468466
auto base_type_const_id = context.types().GetConstantId(base_type_id);
469467

toolchain/check/testdata/as/adapter_conversion.carbon

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -541,7 +541,6 @@ var b: B = {.x = 1} as B;
541541
// CHECK:STDOUT: %.9: type = assoc_entity_type %As.type.3, %Convert.type.2 [template]
542542
// CHECK:STDOUT: %.10: %.9 = assoc_entity element0, imports.%import_ref.6 [template]
543543
// CHECK:STDOUT: %.11: %.7 = assoc_entity element0, imports.%import_ref.7 [symbolic]
544-
// CHECK:STDOUT: %struct: %.2 = struct_value (%.6) [template]
545544
// CHECK:STDOUT: }
546545
// CHECK:STDOUT:
547546
// CHECK:STDOUT: imports {
@@ -629,11 +628,9 @@ var b: B = {.x = 1} as B;
629628
// CHECK:STDOUT: fn @__global_init() {
630629
// CHECK:STDOUT: !entry:
631630
// CHECK:STDOUT: %.loc21_18: i32 = int_value 1 [template = constants.%.6]
632-
// CHECK:STDOUT: %.loc21_19.1: %.2 = struct_literal (%.loc21_18)
631+
// CHECK:STDOUT: %.loc21_19: %.2 = struct_literal (%.loc21_18)
633632
// CHECK:STDOUT: %B.ref: type = name_ref B, file.%B.decl [template = constants.%B]
634-
// CHECK:STDOUT: %struct: %.2 = struct_value (%.loc21_18) [template = constants.%struct]
635-
// CHECK:STDOUT: %.loc21_19.2: %.2 = converted %.loc21_19.1, %struct [template = constants.%struct]
636-
// CHECK:STDOUT: %.loc21_21: %B = converted %.loc21_19.1, <error> [template = <error>]
633+
// CHECK:STDOUT: %.loc21_21: %B = converted %.loc21_19, <error> [template = <error>]
637634
// CHECK:STDOUT: assign file.%b.var, <error>
638635
// CHECK:STDOUT: return
639636
// CHECK:STDOUT: }

toolchain/check/testdata/as/overloaded.carbon

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -235,9 +235,9 @@ let n: i32 = ((4 as i32) as X) as i32;
235235
// CHECK:STDOUT: %int.make_type_32.loc23_35: init type = call constants.%Int32() [template = i32]
236236
// CHECK:STDOUT: %.loc23_35.1: type = value_of_initializer %int.make_type_32.loc23_35 [template = i32]
237237
// CHECK:STDOUT: %.loc23_35.2: type = converted %int.make_type_32.loc23_35, %.loc23_35.1 [template = i32]
238-
// CHECK:STDOUT: %.loc23_26.5: ref %X = temporary %.loc23_26.3, %.loc23_26.4
239238
// CHECK:STDOUT: %.loc23_32.1: %Convert.type.5 = interface_witness_access constants.%.12, element0 [template = constants.%Convert.4]
240-
// CHECK:STDOUT: %.loc23_32.2: <bound method> = bound_method %.loc23_26.5, %.loc23_32.1
239+
// CHECK:STDOUT: %.loc23_32.2: <bound method> = bound_method %.loc23_26.4, %.loc23_32.1
240+
// CHECK:STDOUT: %.loc23_26.5: ref %X = temporary %.loc23_26.3, %.loc23_26.4
241241
// CHECK:STDOUT: %.loc23_26.6: %X = bind_value %.loc23_26.5
242242
// CHECK:STDOUT: %Convert.call.loc23_32: init i32 = call %.loc23_32.2(%.loc23_26.6)
243243
// CHECK:STDOUT: %.loc23_32.3: i32 = value_of_initializer %Convert.call.loc23_32

toolchain/check/testdata/class/fail_incomplete.carbon

Lines changed: 70 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -140,6 +140,25 @@ fn CallReturnIncomplete() {
140140
ReturnIncomplete();
141141
}
142142

143+
class IncompleteAddrSelf {
144+
fn F[addr self: Class*]();
145+
}
146+
147+
fn CallIncompleteAddrSelf(p: Class*) {
148+
// TODO: Should this be valid?
149+
// CHECK:STDERR: fail_forward_decl.carbon:[[@LINE+10]]:3: error: invalid use of incomplete type `Class` [IncompleteTypeInConversion]
150+
// CHECK:STDERR: p->(IncompleteAddrSelf.F)();
151+
// CHECK:STDERR: ^~~~~~~~~~~~~~~~~~~~~~~~~
152+
// CHECK:STDERR: fail_forward_decl.carbon:[[@LINE-137]]:1: note: class was forward declared here [ClassForwardDeclaredHere]
153+
// CHECK:STDERR: class Class;
154+
// CHECK:STDERR: ^~~~~~~~~~~~
155+
// CHECK:STDERR: fail_forward_decl.carbon:[[@LINE-11]]:8: note: initializing function parameter [InCallToFunctionParam]
156+
// CHECK:STDERR: fn F[addr self: Class*]();
157+
// CHECK:STDERR: ^~~~~~~~~~~~~~~~~
158+
// CHECK:STDERR:
159+
p->(IncompleteAddrSelf.F)();
160+
}
161+
143162
// --- fail_in_definition.carbon
144163

145164
library "[[@TEST_NAME]]";
@@ -185,6 +204,13 @@ class C {
185204
// CHECK:STDOUT: %CallTakeIncomplete: %CallTakeIncomplete.type = struct_value () [template]
186205
// CHECK:STDOUT: %CallReturnIncomplete.type: type = fn_type @CallReturnIncomplete [template]
187206
// CHECK:STDOUT: %CallReturnIncomplete: %CallReturnIncomplete.type = struct_value () [template]
207+
// CHECK:STDOUT: %IncompleteAddrSelf: type = class_type @IncompleteAddrSelf [template]
208+
// CHECK:STDOUT: %F.type: type = fn_type @F [template]
209+
// CHECK:STDOUT: %F: %F.type = struct_value () [template]
210+
// CHECK:STDOUT: %.4: <witness> = complete_type_witness %.2 [template]
211+
// CHECK:STDOUT: %CallIncompleteAddrSelf.type: type = fn_type @CallIncompleteAddrSelf [template]
212+
// CHECK:STDOUT: %CallIncompleteAddrSelf: %CallIncompleteAddrSelf.type = struct_value () [template]
213+
// CHECK:STDOUT: %.5: type = ptr_type %.2 [template]
188214
// CHECK:STDOUT: }
189215
// CHECK:STDOUT:
190216
// CHECK:STDOUT: imports {
@@ -211,6 +237,8 @@ class C {
211237
// CHECK:STDOUT: .ReturnIncomplete = %ReturnIncomplete.decl
212238
// CHECK:STDOUT: .CallTakeIncomplete = %CallTakeIncomplete.decl
213239
// CHECK:STDOUT: .CallReturnIncomplete = %CallReturnIncomplete.decl
240+
// CHECK:STDOUT: .IncompleteAddrSelf = %IncompleteAddrSelf.decl
241+
// CHECK:STDOUT: .CallIncompleteAddrSelf = %CallIncompleteAddrSelf.decl
214242
// CHECK:STDOUT: }
215243
// CHECK:STDOUT: %Core.import = import Core
216244
// CHECK:STDOUT: %Class.decl: type = class_decl @Class [template = constants.%Class] {} {}
@@ -308,10 +336,38 @@ class C {
308336
// CHECK:STDOUT: %p: %.3 = bind_name p, %p.param
309337
// CHECK:STDOUT: }
310338
// CHECK:STDOUT: %CallReturnIncomplete.decl: %CallReturnIncomplete.type = fn_decl @CallReturnIncomplete [template = constants.%CallReturnIncomplete] {} {}
339+
// CHECK:STDOUT: %IncompleteAddrSelf.decl: type = class_decl @IncompleteAddrSelf [template = constants.%IncompleteAddrSelf] {} {}
340+
// CHECK:STDOUT: %CallIncompleteAddrSelf.decl: %CallIncompleteAddrSelf.type = fn_decl @CallIncompleteAddrSelf [template = constants.%CallIncompleteAddrSelf] {
341+
// CHECK:STDOUT: %p.patt: %.3 = binding_pattern p
342+
// CHECK:STDOUT: %p.param_patt: %.3 = value_param_pattern %p.patt, runtime_param0
343+
// CHECK:STDOUT: } {
344+
// CHECK:STDOUT: %Class.ref: type = name_ref Class, file.%Class.decl [template = constants.%Class]
345+
// CHECK:STDOUT: %.loc136: type = ptr_type %Class [template = constants.%.3]
346+
// CHECK:STDOUT: %p.param: %.3 = value_param runtime_param0
347+
// CHECK:STDOUT: %p: %.3 = bind_name p, %p.param
348+
// CHECK:STDOUT: }
311349
// CHECK:STDOUT: }
312350
// CHECK:STDOUT:
313351
// CHECK:STDOUT: class @Class;
314352
// CHECK:STDOUT:
353+
// CHECK:STDOUT: class @IncompleteAddrSelf {
354+
// CHECK:STDOUT: %F.decl: %F.type = fn_decl @F [template = constants.%F] {
355+
// CHECK:STDOUT: %self.patt: %.3 = binding_pattern self
356+
// CHECK:STDOUT: %self.param_patt: %.3 = value_param_pattern %self.patt, runtime_param0
357+
// CHECK:STDOUT: %.loc133_8: auto = addr_pattern %self.param_patt
358+
// CHECK:STDOUT: } {
359+
// CHECK:STDOUT: %Class.ref: type = name_ref Class, file.%Class.decl [template = constants.%Class]
360+
// CHECK:STDOUT: %.loc133_24: type = ptr_type %Class [template = constants.%.3]
361+
// CHECK:STDOUT: %self.param: %.3 = value_param runtime_param0
362+
// CHECK:STDOUT: %self: %.3 = bind_name self, %self.param
363+
// CHECK:STDOUT: }
364+
// CHECK:STDOUT: %.loc134: <witness> = complete_type_witness %.2 [template = constants.%.4]
365+
// CHECK:STDOUT:
366+
// CHECK:STDOUT: !members:
367+
// CHECK:STDOUT: .Self = constants.%IncompleteAddrSelf
368+
// CHECK:STDOUT: .F = %F.decl
369+
// CHECK:STDOUT: }
370+
// CHECK:STDOUT:
315371
// CHECK:STDOUT: fn @.1() {
316372
// CHECK:STDOUT: !entry:
317373
// CHECK:STDOUT: return
@@ -385,6 +441,20 @@ class C {
385441
// CHECK:STDOUT: return
386442
// CHECK:STDOUT: }
387443
// CHECK:STDOUT:
444+
// CHECK:STDOUT: fn @F[addr %self.param_patt: %.3]();
445+
// CHECK:STDOUT:
446+
// CHECK:STDOUT: fn @CallIncompleteAddrSelf(%p.param_patt: %.3) {
447+
// CHECK:STDOUT: !entry:
448+
// CHECK:STDOUT: %p.ref: %.3 = name_ref p, %p
449+
// CHECK:STDOUT: %IncompleteAddrSelf.ref: type = name_ref IncompleteAddrSelf, file.%IncompleteAddrSelf.decl [template = constants.%IncompleteAddrSelf]
450+
// CHECK:STDOUT: %F.ref: %F.type = name_ref F, @IncompleteAddrSelf.%F.decl [template = constants.%F]
451+
// CHECK:STDOUT: %.loc148_4.1: ref %Class = deref %p.ref
452+
// CHECK:STDOUT: %.loc148_4.2: <bound method> = bound_method %.loc148_4.1, %F.ref
453+
// CHECK:STDOUT: %.1: <error> = addr_of <error> [template = <error>]
454+
// CHECK:STDOUT: %F.call: init %empty_tuple.type = call %.loc148_4.2(<error>)
455+
// CHECK:STDOUT: return
456+
// CHECK:STDOUT: }
457+
// CHECK:STDOUT:
388458
// CHECK:STDOUT: --- fail_in_definition.carbon
389459
// CHECK:STDOUT:
390460
// CHECK:STDOUT: constants {

toolchain/check/testdata/class/generic/import.carbon

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -728,9 +728,8 @@ class Class(U:! type) {
728728
// CHECK:STDOUT: %v.var: ref %CompleteClass.3 = var v
729729
// CHECK:STDOUT: %v: ref %CompleteClass.3 = bind_name v, %v.var
730730
// CHECK:STDOUT: %F.ref: %F.type.3 = name_ref F, imports.%import_ref.3 [template = constants.%F.3]
731-
// CHECK:STDOUT: %.loc14_33.1: ref %CompleteClass.4 = temporary_storage
732-
// CHECK:STDOUT: %F.call: init %CompleteClass.4 = call %F.ref() to %.loc14_33.1
733-
// CHECK:STDOUT: %.loc14_33.2: ref %CompleteClass.4 = temporary %.loc14_33.1, %F.call
731+
// CHECK:STDOUT: %.loc14_33: ref %CompleteClass.4 = temporary_storage
732+
// CHECK:STDOUT: %F.call: init %CompleteClass.4 = call %F.ref() to %.loc14_33
734733
// CHECK:STDOUT: %.loc14_35: %CompleteClass.3 = converted %F.call, <error> [template = <error>]
735734
// CHECK:STDOUT: assign %v.var, <error>
736735
// CHECK:STDOUT: return

toolchain/check/testdata/class/generic/member_access.carbon

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -546,9 +546,8 @@ fn StaticMemberFunctionCall(T:! type) -> Class(T) {
546546
// CHECK:STDOUT: %.loc15_18.1: @StaticMemberFunctionCall.%Make.type (%Make.type) = specific_constant @Class.%Make.decl, @Class(constants.%T) [symbolic = %Make (constants.%Make)]
547547
// CHECK:STDOUT: %Make.ref: @StaticMemberFunctionCall.%Make.type (%Make.type) = name_ref Make, %.loc15_18.1 [symbolic = %Make (constants.%Make)]
548548
// CHECK:STDOUT: %.loc15_18.2: <specific function> = specific_function %Make.ref, @Make(constants.%T) [symbolic = %.loc15_18.3 (constants.%.4)]
549-
// CHECK:STDOUT: %.loc15_23.1: ref @StaticMemberFunctionCall.%Class.loc8_47.2 (%Class.2) = temporary_storage
550-
// CHECK:STDOUT: %Make.call: init @StaticMemberFunctionCall.%Class.loc8_47.2 (%Class.2) = call %.loc15_18.2() to %.loc15_23.1
551-
// CHECK:STDOUT: %.loc15_23.2: ref @StaticMemberFunctionCall.%Class.loc8_47.2 (%Class.2) = temporary %.loc15_23.1, %Make.call
549+
// CHECK:STDOUT: %.loc15_23: ref @StaticMemberFunctionCall.%Class.loc8_47.2 (%Class.2) = temporary_storage
550+
// CHECK:STDOUT: %Make.call: init @StaticMemberFunctionCall.%Class.loc8_47.2 (%Class.2) = call %.loc15_18.2() to %.loc15_23
552551
// CHECK:STDOUT: %.loc15_25: @StaticMemberFunctionCall.%Class.loc8_47.2 (%Class.2) = converted %Make.call, <error> [template = <error>]
553552
// CHECK:STDOUT: return <error> to %return
554553
// CHECK:STDOUT: }

toolchain/check/testdata/class/init_adapt.carbon

Lines changed: 5 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,7 @@ let b: AdaptC = a;
6464
// CHECK:STDERR: fail_not_implicit.carbon:[[@LINE+7]]:1: error: cannot implicitly convert from `AdaptC` to `C` [ImplicitAsConversionFailure]
6565
// CHECK:STDERR: let c: C = b;
6666
// CHECK:STDERR: ^~~~~~~~~~~~~
67-
// CHECK:STDERR: fail_not_implicit.carbon:[[@LINE+4]]:1: note: type `<error>` does not implement interface `ImplicitAs` [MissingImplInMemberAccessNote]
67+
// CHECK:STDERR: fail_not_implicit.carbon:[[@LINE+4]]:1: note: type `AdaptC` does not implement interface `ImplicitAs` [MissingImplInMemberAccessNote]
6868
// CHECK:STDERR: let c: C = b;
6969
// CHECK:STDERR: ^~~~~~~~~~~~~
7070
// CHECK:STDERR:
@@ -424,15 +424,13 @@ var e: C = MakeAdaptC();
424424
// CHECK:STDOUT: %.loc33: %C = converted %b.ref, <error> [template = <error>]
425425
// CHECK:STDOUT: %c: %C = bind_name c, <error>
426426
// CHECK:STDOUT: %MakeC.ref: %MakeC.type = name_ref MakeC, file.%MakeC.decl [template = constants.%MakeC]
427-
// CHECK:STDOUT: %.loc46_22.1: ref %C = temporary_storage
428-
// CHECK:STDOUT: %MakeC.call: init %C = call %MakeC.ref() to %.loc46_22.1
429-
// CHECK:STDOUT: %.loc46_22.2: ref %C = temporary %.loc46_22.1, %MakeC.call
427+
// CHECK:STDOUT: %.loc46_22: ref %C = temporary_storage
428+
// CHECK:STDOUT: %MakeC.call: init %C = call %MakeC.ref() to %.loc46_22
430429
// CHECK:STDOUT: %.loc46_24: %AdaptC = converted %MakeC.call, <error> [template = <error>]
431430
// CHECK:STDOUT: assign file.%d.var, <error>
432431
// CHECK:STDOUT: %MakeAdaptC.ref: %MakeAdaptC.type = name_ref MakeAdaptC, file.%MakeAdaptC.decl [template = constants.%MakeAdaptC]
433-
// CHECK:STDOUT: %.loc54_22.1: ref %AdaptC = temporary_storage
434-
// CHECK:STDOUT: %MakeAdaptC.call: init %AdaptC = call %MakeAdaptC.ref() to %.loc54_22.1
435-
// CHECK:STDOUT: %.loc54_22.2: ref %AdaptC = temporary %.loc54_22.1, %MakeAdaptC.call
432+
// CHECK:STDOUT: %.loc54_22: ref %AdaptC = temporary_storage
433+
// CHECK:STDOUT: %MakeAdaptC.call: init %AdaptC = call %MakeAdaptC.ref() to %.loc54_22
436434
// CHECK:STDOUT: %.loc54_24: %C = converted %MakeAdaptC.call, <error> [template = <error>]
437435
// CHECK:STDOUT: assign file.%e.var, <error>
438436
// CHECK:STDOUT: return

toolchain/check/testdata/class/self.carbon

Lines changed: 3 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -32,17 +32,10 @@ fn Class.G[addr self: Self*]() -> i32 {
3232
library "[[@TEST_NAME]]";
3333

3434
class Class {
35-
// CHECK:STDERR: fail_return_self_value.carbon:[[@LINE+13]]:25: error: invalid use of incomplete type `Class` [IncompleteTypeInConversion]
36-
// CHECK:STDERR: fn F[self: Self]() -> self;
37-
// CHECK:STDERR: ^~~~
38-
// CHECK:STDERR: fail_return_self_value.carbon:[[@LINE-4]]:1: note: class is incomplete within its definition [ClassIncompleteWithinDefinition]
39-
// CHECK:STDERR: class Class {
40-
// CHECK:STDERR: ^~~~~~~~~~~~~
41-
// CHECK:STDERR:
4235
// CHECK:STDERR: fail_return_self_value.carbon:[[@LINE+6]]:25: error: cannot implicitly convert from `Class` to `type` [ImplicitAsConversionFailure]
4336
// CHECK:STDERR: fn F[self: Self]() -> self;
4437
// CHECK:STDERR: ^~~~
45-
// CHECK:STDERR: fail_return_self_value.carbon:[[@LINE+3]]:25: note: type `<error>` does not implement interface `ImplicitAs` [MissingImplInMemberAccessNote]
38+
// CHECK:STDERR: fail_return_self_value.carbon:[[@LINE+3]]:25: note: type `Class` does not implement interface `ImplicitAs` [MissingImplInMemberAccessNote]
4639
// CHECK:STDERR: fn F[self: Self]() -> self;
4740
// CHECK:STDERR: ^~~~
4841
fn F[self: Self]() -> self;
@@ -263,13 +256,13 @@ class Class {
263256
// CHECK:STDOUT: } {
264257
// CHECK:STDOUT: %Self.ref: type = name_ref Self, constants.%Class [template = constants.%Class]
265258
// CHECK:STDOUT: %self.ref: %Class = name_ref self, %self
266-
// CHECK:STDOUT: %.loc18: type = converted %self.ref, <error> [template = <error>]
259+
// CHECK:STDOUT: %.loc11: type = converted %self.ref, <error> [template = <error>]
267260
// CHECK:STDOUT: %self.param: %Class = value_param runtime_param0
268261
// CHECK:STDOUT: %self: %Class = bind_name self, %self.param
269262
// CHECK:STDOUT: %return.param: ref <error> = out_param runtime_param1
270263
// CHECK:STDOUT: %return: ref <error> = return_slot %return.param
271264
// CHECK:STDOUT: }
272-
// CHECK:STDOUT: %.loc19: <witness> = complete_type_witness %.6 [template = constants.%.7]
265+
// CHECK:STDOUT: %.loc12: <witness> = complete_type_witness %.6 [template = constants.%.7]
273266
// CHECK:STDOUT:
274267
// CHECK:STDOUT: !members:
275268
// CHECK:STDOUT: .Self = constants.%Class

toolchain/check/testdata/function/call/fail_return_type_mismatch.carbon

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -129,8 +129,6 @@ fn Run() {
129129
// CHECK:STDOUT: %x: ref i32 = bind_name x, %x.var
130130
// CHECK:STDOUT: %Foo.ref: %Foo.type = name_ref Foo, file.%Foo.decl [template = constants.%Foo]
131131
// CHECK:STDOUT: %Foo.call: init f64 = call %Foo.ref()
132-
// CHECK:STDOUT: %.loc20_19.1: ref f64 = temporary_storage
133-
// CHECK:STDOUT: %.loc20_19.2: ref f64 = temporary %.loc20_19.1, %Foo.call
134132
// CHECK:STDOUT: %.loc20_21: i32 = converted %Foo.call, <error> [template = <error>]
135133
// CHECK:STDOUT: assign %x.var, <error>
136134
// CHECK:STDOUT: return

toolchain/check/testdata/impl/fail_todo_impl_assoc_const.carbon

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -85,9 +85,7 @@ impl bool as I where .T = bool {}
8585
// CHECK:STDOUT: %.Self.ref: %I.type.1 = name_ref .Self, %.Self [symbolic = constants.%.Self]
8686
// CHECK:STDOUT: %T.ref: %.1 = name_ref T, @I.%.loc11 [template = constants.%.2]
8787
// CHECK:STDOUT: %bool.make_type.loc23_27: init type = call constants.%Bool() [template = bool]
88-
// CHECK:STDOUT: %.loc23_27.1: ref type = temporary_storage
89-
// CHECK:STDOUT: %.loc23_27.2: ref type = temporary %.loc23_27.1, %bool.make_type.loc23_27
90-
// CHECK:STDOUT: %.loc23_27.3: %.1 = converted %bool.make_type.loc23_27, <error> [template = <error>]
88+
// CHECK:STDOUT: %.loc23_27: %.1 = converted %bool.make_type.loc23_27, <error> [template = <error>]
9189
// CHECK:STDOUT: %.loc23_16: type = where_expr %.Self [template = constants.%I.type.2] {
9290
// CHECK:STDOUT: requirement_rewrite %T.ref, <error>
9391
// CHECK:STDOUT: }

0 commit comments

Comments
 (0)