From 08385adeb5b2ed09879f24fc243bdd88d7365e35 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=96zg=C3=BCr=20T=2E=20=C3=96nsoy?= Date: Wed, 8 Jul 2026 20:07:10 +0300 Subject: [PATCH] Implement checking observe declarations (#6709) This adds SemIR structs and implements building `observe` lists, as well as naming, formatting, and importing `observe` declarations. --------- Co-authored-by: Dana Jansens --- toolchain/check/BUILD | 1 + toolchain/check/context.h | 13 + toolchain/check/function.cpp | 6 + toolchain/check/generic.cpp | 8 + toolchain/check/generic.h | 2 + toolchain/check/handle_interface.cpp | 6 + toolchain/check/handle_observe.cpp | 101 +- toolchain/check/handle_where.cpp | 5 +- toolchain/check/import_ref.cpp | 135 + toolchain/check/node_stack.h | 6 +- toolchain/check/testdata/alias/basics.carbon | 6 + .../check/testdata/alias/builtins.carbon | 2 + .../check/testdata/alias/export_name.carbon | 6 + toolchain/check/testdata/alias/import.carbon | 12 + .../check/testdata/alias/import_access.carbon | 6 + .../check/testdata/alias/import_order.carbon | 2 + .../check/testdata/alias/in_namespace.carbon | 2 + toolchain/check/testdata/alias/var.carbon | 6 + toolchain/check/testdata/array/basics.carbon | 24 + .../check/testdata/array/bound_values.carbon | 4 + toolchain/check/testdata/array/import.carbon | 8 + .../testdata/array/index_not_literal.carbon | 10 + .../array/init_dependent_bound.carbon | 4 + .../testdata/as/adapter_conversion.carbon | 10 + toolchain/check/testdata/as/basics.carbon | 22 + toolchain/check/testdata/as/const.carbon | 18 + .../check/testdata/as/maybe_unformed.carbon | 18 + toolchain/check/testdata/as/partial.carbon | 14 + toolchain/check/testdata/as/var_init.carbon | 4 + .../testdata/basics/dump_sem_ir_ranges.carbon | 6 + .../basics/duplicate_name_same_line.carbon | 2 + .../testdata/basics/include_in_dumps.carbon | 10 + .../check/testdata/basics/multi_error.carbon | 2 + .../check/testdata/basics/name_lookup.carbon | 4 + toolchain/check/testdata/basics/parens.carbon | 2 + .../testdata/basics/raw_identifier.carbon | 6 + .../multifile_with_textual_ir.carbon | 4 + .../one_file_with_textual_ir.carbon | 2 + .../check/testdata/builtins/bool/eq.carbon | 4 + .../testdata/builtins/bool/make_type.carbon | 2 + .../check/testdata/builtins/bool/neq.carbon | 4 + .../testdata/builtins/char_literal/add.carbon | 2 + .../builtins/char_literal/convert_char.carbon | 2 + .../builtins/char_literal/convert_int.carbon | 2 + .../testdata/builtins/char_literal/eq.carbon | 2 + .../builtins/char_literal/greater.carbon | 2 + .../builtins/char_literal/greater_eq.carbon | 2 + .../builtins/char_literal/less.carbon | 2 + .../builtins/char_literal/less_eq.carbon | 2 + .../builtins/char_literal/make_type.carbon | 2 + .../testdata/builtins/char_literal/neq.carbon | 2 + .../builtins/char_literal/sub_char.carbon | 2 + .../builtins/char_literal/sub_int.carbon | 2 + .../check/testdata/builtins/float/add.carbon | 4 + .../testdata/builtins/float/convert.carbon | 14 + .../builtins/float/convert_checked.carbon | 18 + .../builtins/float/convert_int.carbon | 4 + .../check/testdata/builtins/float/div.carbon | 4 + .../check/testdata/builtins/float/eq.carbon | 2 + .../testdata/builtins/float/greater.carbon | 2 + .../testdata/builtins/float/greater_eq.carbon | 2 + .../check/testdata/builtins/float/less.carbon | 2 + .../testdata/builtins/float/less_eq.carbon | 2 + .../testdata/builtins/float/make_type.carbon | 4 + .../check/testdata/builtins/float/mul.carbon | 4 + .../testdata/builtins/float/negate.carbon | 4 + .../check/testdata/builtins/float/neq.carbon | 2 + .../check/testdata/builtins/float/sub.carbon | 4 + .../builtins/float_literal/make_type.carbon | 2 + .../testdata/builtins/form/make_type.carbon | 2 + .../builtins/int/add_char_literal.carbon | 2 + .../check/testdata/builtins/int/and.carbon | 4 + .../testdata/builtins/int/and_assign.carbon | 2 + .../testdata/builtins/int/complement.carbon | 4 + .../testdata/builtins/int/convert.carbon | 6 + .../builtins/int/convert_char_literal.carbon | 2 + .../builtins/int/convert_checked.carbon | 2 + .../builtins/int/convert_float.carbon | 4 + .../builtins/int/convert_float_checked.carbon | 2 + .../check/testdata/builtins/int/eq.carbon | 2 + .../testdata/builtins/int/greater.carbon | 2 + .../testdata/builtins/int/greater_eq.carbon | 2 + .../testdata/builtins/int/left_shift.carbon | 4 + .../builtins/int/left_shift_assign.carbon | 4 + .../check/testdata/builtins/int/less.carbon | 2 + .../testdata/builtins/int/less_eq.carbon | 2 + .../builtins/int/make_type_signed.carbon | 4 + .../builtins/int/make_type_unsigned.carbon | 4 + .../check/testdata/builtins/int/neq.carbon | 2 + .../check/testdata/builtins/int/or.carbon | 4 + .../testdata/builtins/int/or_assign.carbon | 2 + .../testdata/builtins/int/right_shift.carbon | 4 + .../builtins/int/right_shift_assign.carbon | 4 + .../check/testdata/builtins/int/sadd.carbon | 2 + .../check/testdata/builtins/int/sdiv.carbon | 4 + .../testdata/builtins/int/sdiv_assign.carbon | 2 + .../check/testdata/builtins/int/smod.carbon | 4 + .../testdata/builtins/int/smod_assign.carbon | 2 + .../check/testdata/builtins/int/smul.carbon | 2 + .../testdata/builtins/int/smul_assign.carbon | 2 + .../testdata/builtins/int/snegate.carbon | 4 + .../check/testdata/builtins/int/ssub.carbon | 4 + .../testdata/builtins/int/ssub_assign.carbon | 2 + .../check/testdata/builtins/int/uadd.carbon | 4 + .../testdata/builtins/int/uadd_assign.carbon | 2 + .../check/testdata/builtins/int/udiv.carbon | 4 + .../testdata/builtins/int/udiv_assign.carbon | 2 + .../check/testdata/builtins/int/umod.carbon | 4 + .../testdata/builtins/int/umod_assign.carbon | 2 + .../check/testdata/builtins/int/umul.carbon | 4 + .../testdata/builtins/int/umul_assign.carbon | 2 + .../testdata/builtins/int/unegate.carbon | 4 + .../check/testdata/builtins/int/usub.carbon | 4 + .../testdata/builtins/int/usub_assign.carbon | 2 + .../check/testdata/builtins/int/xor.carbon | 4 + .../testdata/builtins/int/xor_assign.carbon | 2 + .../builtins/maybe_unformed/make_type.carbon | 4 + .../check/testdata/builtins/no_op.carbon | 8 + .../testdata/builtins/pointer/is_null.carbon | 8 + .../builtins/pointer/make_null.carbon | 4 + .../check/testdata/builtins/print/char.carbon | 2 + .../check/testdata/builtins/print/int.carbon | 2 + .../check/testdata/builtins/read/char.carbon | 2 + toolchain/check/testdata/choice/basic.carbon | 4 + .../testdata/class/abstract/abstract.carbon | 24 + .../abstract/fail_abstract_in_struct.carbon | 12 + .../abstract/fail_abstract_in_tuple.carbon | 12 + .../class/access/access_modifers.carbon | 28 + .../class/access/import_access.carbon | 18 + .../class/access/inheritance_access.carbon | 46 + .../class/access/method_access.carbon | 2 + .../check/testdata/class/adapter/adapt.carbon | 6 + .../testdata/class/adapter/adapt_copy.carbon | 56 + .../class/adapter/extend_adapt.carbon | 14 + .../testdata/class/adapter/init_adapt.carbon | 4 + toolchain/check/testdata/class/basic.carbon | 6 + .../class/complete_in_member_fn.carbon | 2 + .../class/cross_package_import.carbon | 10 + .../check/testdata/class/destroy_calls.carbon | 32 + .../check/testdata/class/export_name.carbon | 2 + .../class/field/compound_field.carbon | 8 + .../testdata/class/field/field_access.carbon | 8 + .../class/field/field_access_in_value.carbon | 8 + .../class/field/field_initializer.carbon | 2 + .../check/testdata/class/field/static.carbon | 4 + .../testdata/class/forward_declared.carbon | 2 + .../check/testdata/class/generic/adapt.carbon | 14 + .../class/generic/base_is_generic.carbon | 14 + .../check/testdata/class/generic/basic.carbon | 4 + .../check/testdata/class/generic/call.carbon | 16 + .../generic/complete_in_conversion.carbon | 2 + .../check/testdata/class/generic/field.carbon | 6 + .../class/generic/generic_vs_params.carbon | 4 + .../testdata/class/generic/import.carbon | 22 + .../check/testdata/class/generic/init.carbon | 14 + .../class/generic/member_access.carbon | 12 + .../class/generic/member_inline.carbon | 6 + .../class/generic/member_lookup.carbon | 4 + .../class/generic/member_out_of_line.carbon | 6 + .../testdata/class/generic/member_type.carbon | 18 + .../class/generic/method_deduce.carbon | 14 + .../check/testdata/class/generic/self.carbon | 6 + .../testdata/class/generic/stringify.carbon | 8 + toolchain/check/testdata/class/import.carbon | 12 + .../testdata/class/import_indirect.carbon | 12 + .../testdata/class/import_member_cycle.carbon | 2 + .../testdata/class/import_struct_cycle.carbon | 4 + .../class/indirect_import_member.carbon | 12 + .../testdata/class/inheritance/base.carbon | 4 + .../class/inheritance/base_field.carbon | 2 + .../base_function_unqualified.carbon | 4 + .../class/inheritance/base_method.carbon | 4 + .../inheritance/base_method_qualified.carbon | 8 + .../inheritance/base_method_shadow.carbon | 2 + .../class/inheritance/derived_to_base.carbon | 30 + .../class/inheritance/import_base.carbon | 12 + .../class/inheritance/self_conversion.carbon | 6 + toolchain/check/testdata/class/init.carbon | 4 + toolchain/check/testdata/class/init_as.carbon | 10 + .../check/testdata/class/init_nested.carbon | 2 + toolchain/check/testdata/class/local.carbon | 10 + .../method/call_without_method_syntax.carbon | 10 + .../class/method/generic_method.carbon | 2 + .../check/testdata/class/method/method.carbon | 24 + .../class/method/static_method.carbon | 4 + .../testdata/class/method/virtual.carbon | 46 + toolchain/check/testdata/class/nested.carbon | 16 + .../check/testdata/class/nested_name.carbon | 10 + .../check/testdata/class/partial/init.carbon | 2 + .../check/testdata/class/redeclaration.carbon | 2 + .../check/testdata/class/reenter_scope.carbon | 2 + toolchain/check/testdata/class/reorder.carbon | 4 + .../testdata/class/reorder_qualified.carbon | 20 + toolchain/check/testdata/class/scope.carbon | 10 + .../testdata/class/self/fail_ref_self.carbon | 4 + .../check/testdata/class/self/raw_self.carbon | 4 + .../testdata/class/self/raw_self_type.carbon | 4 + .../check/testdata/class/self/self.carbon | 10 + .../testdata/class/self/self_type.carbon | 4 + .../testdata/class/syntactic_merge.carbon | 2 + toolchain/check/testdata/const/basics.carbon | 6 + toolchain/check/testdata/const/import.carbon | 2 + toolchain/check/testdata/deduce/array.carbon | 52 + .../check/testdata/deduce/conversion.carbon | 10 + .../check/testdata/deduce/generic_type.carbon | 18 + .../check/testdata/deduce/int_float.carbon | 8 + toolchain/check/testdata/deduce/tuple.carbon | 10 + .../testdata/deduce/type_operator.carbon | 16 + .../value_with_type_through_access.carbon | 32 + .../check/testdata/eval/aggregates.carbon | 8 + toolchain/check/testdata/eval/binding.carbon | 2 + toolchain/check/testdata/eval/branch.carbon | 4 + toolchain/check/testdata/eval/call.carbon | 26 + toolchain/check/testdata/eval/symbolic.carbon | 2 + toolchain/check/testdata/facet/access.carbon | 10 + .../facet/call_combined_impl_witness.carbon | 16 + .../convert_class_type_to_facet_type.carbon | 6 + ...t_class_type_to_generic_facet_value.carbon | 22 + ...rt_class_value_to_facet_value_value.carbon | 8 + ..._value_to_generic_facet_value_value.carbon | 32 + ...t_value_as_type_knows_original_type.carbon | 8 + .../convert_facet_value_to_itself.carbon | 8 + ..._facet_value_to_narrowed_facet_type.carbon | 50 + ...t_facet_value_value_to_blanket_impl.carbon | 8 + ..._value_to_generic_facet_value_value.carbon | 16 + ...convert_facet_value_value_to_itself.carbon | 10 + .../testdata/facet/convert_interface.carbon | 8 + .../testdata/facet/facet_assoc_const.carbon | 2 + ...t_class_type_to_generic_facet_value.carbon | 8 + ...convert_facet_value_to_missing_impl.carbon | 8 + ...l_convert_type_erased_type_to_facet.carbon | 4 + ...uction_uses_runtime_type_conversion.carbon | 8 + .../check/testdata/facet/period_self.carbon | 6 + .../testdata/facet/require_import.carbon | 6 + .../check/testdata/facet/runtime_value.carbon | 4 + .../facet/self_in_interface_param.carbon | 2 + .../facet/validate_rewrite_constraints.carbon | 2 + toolchain/check/testdata/for/actual.carbon | 16 + toolchain/check/testdata/for/basic.carbon | 8 + toolchain/check/testdata/for/pattern.carbon | 42 + .../function/builtin/adapted_type.carbon | 2 + .../testdata/function/builtin/call.carbon | 4 + .../builtin/call_from_operator.carbon | 14 + .../function/builtin/fail_redefined.carbon | 4 + .../testdata/function/builtin/import.carbon | 2 + .../testdata/function/builtin/method.carbon | 4 + .../check/testdata/function/call/alias.carbon | 4 + .../function/call/empty_struct.carbon | 4 + .../testdata/function/call/empty_tuple.carbon | 4 + .../function/call/fail_param_count.carbon | 8 + .../function/call/fail_param_type.carbon | 4 + .../call/fail_return_type_mismatch.carbon | 6 + .../call/fail_runtime_implicit_param.carbon | 2 + .../check/testdata/function/call/form.carbon | 22 + .../check/testdata/function/call/i32.carbon | 6 + .../function/call/more_param_ir.carbon | 8 + .../testdata/function/call/params_one.carbon | 4 + .../function/call/params_one_comma.carbon | 4 + .../testdata/function/call/params_two.carbon | 4 + .../function/call/params_two_comma.carbon | 4 + .../testdata/function/call/params_zero.carbon | 4 + .../call/prefer_unqualified_lookup.carbon | 4 + .../check/testdata/function/call/ref.carbon | 8 + .../function/call/return_implicit.carbon | 4 + .../function/declaration/export_name.carbon | 2 + .../function/declaration/extern.carbon | 2 + .../declaration/extern_library.carbon | 2 + .../fail_import_incomplete_return.carbon | 6 + .../declaration/fail_modifiers.carbon | 8 + .../function/declaration/fail_redecl.carbon | 6 + .../declaration/fail_todo_no_params.carbon | 2 + .../declaration/implicit_import.carbon | 2 + .../function/declaration/import.carbon | 10 + .../no_definition_in_impl_file.carbon | 2 + .../declaration/pattern_in_signature.carbon | 4 + .../testdata/function/declaration/ref.carbon | 2 + .../function/declaration/simple.carbon | 2 + .../function/definition/basics.carbon | 2 + .../function/definition/extern.carbon | 16 + .../function/definition/extern_library.carbon | 12 + .../fail_decl_param_mismatch.carbon | 12 + .../function/definition/fail_redef.carbon | 4 + .../function/definition/forward_decl.carbon | 2 + .../definition/implicit_import.carbon | 14 + .../function/definition/import.carbon | 14 + .../function/definition/import_access.carbon | 26 + .../testdata/function/definition/order.carbon | 6 + .../function/definition/params_one.carbon | 2 + .../definition/params_one_comma.carbon | 2 + .../function/definition/params_two.carbon | 2 + .../definition/params_two_comma.carbon | 2 + .../function/definition/params_zero.carbon | 2 + .../definition/syntactic_merge.carbon | 28 + .../testdata/function/generic/call.carbon | 16 + .../call_method_on_generic_facet.carbon | 10 + .../testdata/function/generic/deduce.carbon | 54 + .../generic/deduce_nested_facet_value.carbon | 8 + .../fail_deduce_imported_function.carbon | 10 + .../function/generic/import_specific.carbon | 6 + .../generic/indirect_generic_type.carbon | 2 + .../function/generic/redeclare.carbon | 8 + .../function/generic/resolve_used.carbon | 6 + .../function/generic/return_slot.carbon | 12 + .../function/generic/template_param.carbon | 4 + .../function/generic/type_param.carbon | 2 + .../function/generic/type_param_scope.carbon | 2 + .../testdata/generic/call_basic_depth.carbon | 8 + .../testdata/generic/complete_type.carbon | 10 + .../testdata/generic/dependent_param.carbon | 4 + .../generic/dot_self_symbolic_type.carbon | 6 + toolchain/check/testdata/generic/local.carbon | 10 + .../testdata/generic/local_function.carbon | 4 + .../testdata/generic/template/convert.carbon | 12 + .../generic/template/member_access.carbon | 14 + .../generic/template/unimplemented.carbon | 8 + .../generic/template_dependence.carbon | 4 + .../check/testdata/generic/var_param.carbon | 6 + toolchain/check/testdata/global/basics.carbon | 10 + toolchain/check/testdata/if/basics.carbon | 6 + toolchain/check/testdata/if_expr/basic.carbon | 6 + .../if_expr/constant_condition.carbon | 14 + .../testdata/if_expr/control_flow.carbon | 6 + .../if_expr/fail_partial_constant.carbon | 4 + .../check/testdata/if_expr/nested.carbon | 2 + .../check/testdata/if_expr/struct.carbon | 6 + .../testdata/impl/assoc_const_self.carbon | 14 + toolchain/check/testdata/impl/basic.carbon | 2 + toolchain/check/testdata/impl/compound.carbon | 38 + .../check/testdata/impl/declaration.carbon | 2 + toolchain/check/testdata/impl/empty.carbon | 2 + .../check/testdata/impl/error_recovery.carbon | 6 + .../check/testdata/impl/extend_impl.carbon | 2 + .../testdata/impl/extend_impl_generic.carbon | 16 + .../check/testdata/impl/fail_alias.carbon | 2 + .../testdata/impl/fail_call_invalid.carbon | 6 + .../impl/fail_extend_impl_forall.carbon | 4 + .../impl/fail_extend_impl_scope.carbon | 16 + .../impl/fail_extend_impl_type_as.carbon | 2 + ..._extend_partially_defined_interface.carbon | 2 + .../fail_extend_undefined_interface.carbon | 2 + .../testdata/impl/fail_impl_as_scope.carbon | 34 + .../impl/fail_impl_bad_assoc_const.carbon | 2 + .../impl/fail_impl_bad_assoc_fn.carbon | 26 + .../impl/fail_impl_bad_interface.carbon | 2 + .../testdata/impl/fail_impl_bad_type.carbon | 2 + .../testdata/impl/fail_redefinition.carbon | 2 + .../impl/fail_self_type_mismatch.carbon | 4 + .../check/testdata/impl/forward_decls.carbon | 46 + .../impl/generic_redeclaration.carbon | 26 + toolchain/check/testdata/impl/impl_as.carbon | 6 + .../impl/impl_assoc_const_with_prelude.carbon | 4 + .../check/testdata/impl/impl_forall.carbon | 4 + .../check/testdata/impl/impl_thunk.carbon | 32 + .../impl/impl_thunk_min_prelude.carbon | 2 + .../testdata/impl/import_builtin_call.carbon | 4 + .../testdata/impl/import_compound.carbon | 30 + .../testdata/impl/import_extend_impl.carbon | 8 + .../check/testdata/impl/import_generic.carbon | 24 + .../impl/import_interface_assoc_const.carbon | 36 + .../check/testdata/impl/import_self.carbon | 8 + .../testdata/impl/import_self_specific.carbon | 14 + .../check/testdata/impl/import_thunk.carbon | 14 + .../testdata/impl/import_use_generic.carbon | 12 + .../check/testdata/impl/incomplete.carbon | 12 + .../check/testdata/impl/interface_args.carbon | 30 + .../check/testdata/impl/lookup/alias.carbon | 6 + .../impl/lookup/canonical_query_self.carbon | 14 + .../lookup/fail_alias_impl_not_found.carbon | 4 + .../lookup/fail_todo_undefined_impl.carbon | 8 + .../check/testdata/impl/lookup/generic.carbon | 36 + .../testdata/impl/lookup/impl_forall.carbon | 6 + .../check/testdata/impl/lookup/import.carbon | 114 + .../impl/lookup/instance_method.carbon | 4 + ...g_generic_inside_rewrite_constraint.carbon | 16 + ...pecialization_with_symbolic_rewrite.carbon | 22 + .../testdata/impl/lookup/specific_args.carbon | 18 + .../testdata/impl/lookup/transitive.carbon | 12 + .../testdata/impl/multiple_extend.carbon | 48 + .../name_lookup_in_impl_definition.carbon | 2 + .../impl/no_definition_in_impl_file.carbon | 14 + .../check/testdata/impl/self_in_class.carbon | 4 + .../testdata/impl/self_in_signature.carbon | 8 + .../impl/todo_impl_with_unrelated_fn.carbon | 6 + .../testdata/impl/use_assoc_entity.carbon | 22 + .../index/array_element_access.carbon | 2 + .../check/testdata/index/expr_category.carbon | 8 + .../index/fail_array_large_index.carbon | 2 + .../index/fail_array_non_int_indexing.carbon | 2 + .../fail_array_out_of_bound_access.carbon | 2 + .../testdata/index/fail_expr_category.carbon | 6 + .../testdata/index/fail_invalid_base.carbon | 2 + .../testdata/index/fail_name_not_found.carbon | 4 + .../index/fail_negative_indexing.carbon | 2 + .../index/fail_non_tuple_access.carbon | 2 + .../check/testdata/interface/as_type.carbon | 4 + .../testdata/interface/as_type_of_type.carbon | 4 + .../testdata/interface/assoc_const.carbon | 2 + .../interface/assoc_const_in_generic.carbon | 6 + .../check/testdata/interface/basic.carbon | 4 + .../interface/compound_member_access.carbon | 42 + .../testdata/interface/default_fn.carbon | 8 + .../testdata/interface/export_name.carbon | 8 + .../fail_add_member_outside_definition.carbon | 8 + .../interface/fail_assoc_const_alias.carbon | 6 + .../fail_assoc_const_bad_default.carbon | 2 + .../fail_assoc_fn_invalid_use.carbon | 4 + .../interface/fail_definition_imported.carbon | 2 + .../testdata/interface/fail_duplicate.carbon | 10 + .../fail_generic_redeclaration.carbon | 6 + .../interface/fail_lookup_in_type_type.carbon | 4 + .../interface/fail_lookup_undefined.carbon | 4 + .../interface/fail_member_lookup.carbon | 6 + .../testdata/interface/fail_modifiers.carbon | 8 + .../interface/fail_redeclare_member.carbon | 2 + .../fail_todo_assoc_const_default.carbon | 2 + .../fail_todo_define_default_fn_inline.carbon | 4 + ..._todo_define_default_fn_out_of_line.carbon | 8 + .../interface/fail_todo_modifiers.carbon | 6 + .../check/testdata/interface/final.carbon | 12 + .../check/testdata/interface/generic.carbon | 18 + .../generic_binding_after_assoc_const.carbon | 2 + .../testdata/interface/generic_import.carbon | 6 + .../testdata/interface/generic_method.carbon | 40 + .../interface/generic_vs_params.carbon | 18 + .../check/testdata/interface/import.carbon | 22 + .../testdata/interface/import_access.carbon | 30 + .../interface/import_interface_decl.carbon | 2 + .../testdata/interface/incomplete.carbon | 14 + .../check/testdata/interface/local.carbon | 6 + .../testdata/interface/member_lookup.carbon | 12 + .../check/testdata/interface/observe.carbon | 6550 +++++++++++++++++ .../check/testdata/interface/require.carbon | 18 + .../check/testdata/interface/self.carbon | 2 + .../testdata/interface/syntactic_merge.carbon | 24 + .../interface/todo_define_not_default.carbon | 4 + .../cpp/basics/import/cpp_namespace.carbon | 2 + .../interop/cpp/basics/import/import.carbon | 4 + .../interop/cpp/basics/import/indirect.carbon | 10 + .../interop/cpp/basics/inline/import.carbon | 4 + .../cpp/basics/unsupported_decl_type.carbon | 2 + .../interop/cpp/class/import/abstract.carbon | 2 + .../interop/cpp/class/import/access.carbon | 44 + .../interop/cpp/class/import/base.carbon | 16 + .../interop/cpp/class/import/class.carbon | 10 + .../cpp/class/import/constructor.carbon | 16 + .../interop/cpp/class/import/field.carbon | 16 + .../interop/cpp/class/import/method.carbon | 12 + .../interop/cpp/class/import/template.carbon | 6 + .../interop/cpp/class/import/union.carbon | 6 + .../interop/cpp/enum/anonymous.carbon | 2 + .../testdata/interop/cpp/enum/convert.carbon | 2 + .../testdata/interop/cpp/enum/copy.carbon | 2 + .../testdata/interop/cpp/enum/fixed.carbon | 2 + .../testdata/interop/cpp/enum/member.carbon | 2 + .../testdata/interop/cpp/enum/scoped.carbon | 2 + .../testdata/interop/cpp/enum/unscoped.carbon | 2 + .../testdata/interop/cpp/enum/using.carbon | 2 + .../cpp/function/export/generic.carbon | 20 + .../import/arithmetic_types_bridged.carbon | 82 + .../import/arithmetic_types_direct.carbon | 24 + .../interop/cpp/function/import/class.carbon | 30 + .../cpp/function/import/decayed_param.carbon | 18 + .../cpp/function/import/default_arg.carbon | 8 + .../cpp/function/import/extern_c.carbon | 8 + .../cpp/function/import/full_semir.carbon | 10 + .../cpp/function/import/function.carbon | 14 + .../cpp/function/import/in_template.carbon | 2 + .../interop/cpp/function/import/inline.carbon | 8 + .../import/multiple_too_few_args_calls.carbon | 2 + .../cpp/function/import/overloads.carbon | 66 + .../function/import/param_unsupported.carbon | 4 + .../cpp/function/import/pointer.carbon | 86 + .../function/import/qualified_param.carbon | 2 + .../cpp/function/import/reference.carbon | 30 + .../interop/cpp/function/import/return.carbon | 18 + .../interop/cpp/function/import/struct.carbon | 28 + .../interop/cpp/function/import/union.carbon | 26 + .../cpp/function/import/variadic.carbon | 6 + .../cpp/function/import/void_pointer.carbon | 32 + .../testdata/interop/cpp/impls/as.carbon | 20 + .../testdata/interop/cpp/impls/copy.carbon | 8 + .../testdata/interop/cpp/impls/destroy.carbon | 18 + .../interop/cpp/impls/implicit_as.carbon | 36 + .../testdata/interop/cpp/macros/macros.carbon | 50 + .../interop/cpp/namespace/import.carbon | 10 + .../cpp/operators/arithmetic_operators.carbon | 26 + .../interop/cpp/operators/deref.carbon | 4 + .../interop/cpp/operators/eq_with.carbon | 4 + .../interop/cpp/operators/operators.carbon | 26 + .../interop/cpp/operators/ordered_with.carbon | 4 + .../interop/cpp/operators/spaceship.carbon | 4 + .../cpp/primitive_types/arithmetic.carbon | 6 + .../long_and_long_long.llp64.carbon | 74 + .../long_and_long_long.lp64.carbon | 72 + .../cpp/primitive_types/void_pointer.carbon | 16 + .../testdata/interop/cpp/range_for.carbon | 98 + .../cpp/stdlib/initializer_list.carbon | 6 + .../interop/cpp/stdlib/string_view.carbon | 6 + .../cpp/template/alias_template.carbon | 2 + .../cpp/template/argument_count.carbon | 4 + .../cpp/template/class_template.carbon | 2 + .../interop/cpp/template/concept.carbon | 2 + .../cpp/template/non_type_param.carbon | 4 + .../template/template_template_param.carbon | 4 + .../interop/cpp/template/type_param.carbon | 4 + .../interop/cpp/template/var_template.carbon | 2 + .../interop/cpp/type_alias/import.carbon | 6 + .../interop/cpp/var/import/global.carbon | 4 + .../interop/cpp/var/import/namespace.carbon | 2 + .../testdata/let/compile_time_bindings.carbon | 12 + toolchain/check/testdata/let/convert.carbon | 2 + .../testdata/let/fail_duplicate_decl.carbon | 2 + .../testdata/let/fail_generic_import.carbon | 4 + .../testdata/let/fail_missing_value.carbon | 2 + .../check/testdata/let/fail_modifiers.carbon | 2 + .../testdata/let/fail_use_in_init.carbon | 2 + .../check/testdata/let/generic_import.carbon | 4 + toolchain/check/testdata/let/global.carbon | 4 + toolchain/check/testdata/let/import.carbon | 8 + .../check/testdata/let/import_access.carbon | 8 + toolchain/check/testdata/let/local.carbon | 2 + toolchain/check/testdata/let/ref.carbon | 2 + .../check/testdata/let/shadowed_decl.carbon | 2 + .../check/testdata/main_run/no_return.carbon | 4 + .../check/testdata/main_run/return_i32.carbon | 4 + .../testdata/named_constraint/convert.carbon | 4 + .../testdata/named_constraint/empty.carbon | 4 + .../named_constraint/empty_generic.carbon | 4 + .../extend_name_lookup.carbon | 4 + .../testdata/named_constraint/generic.carbon | 2 + .../import_constraint_decl.carbon | 4 + .../named_constraint/import_type_and.carbon | 10 + .../testdata/named_constraint/require.carbon | 4 + .../testdata/namespace/add_to_import.carbon | 4 + .../check/testdata/namespace/alias.carbon | 6 + ...conflict_in_imports_namespace_first.carbon | 6 + ...onflict_in_imports_namespace_second.carbon | 6 + .../namespace/fail_decl_in_alias.carbon | 2 + .../testdata/namespace/fail_duplicate.carbon | 4 + .../namespace/fail_not_top_level.carbon | 10 + .../testdata/namespace/fail_params.carbon | 4 + .../namespace/fail_unresolved_scope.carbon | 2 + .../check/testdata/namespace/function.carbon | 6 + .../check/testdata/namespace/imported.carbon | 2 + .../namespace/imported_indirect.carbon | 8 + .../check/testdata/namespace/merging.carbon | 10 + .../merging_with_indirections.carbon | 6 + .../check/testdata/namespace/nested.carbon | 4 + .../check/testdata/namespace/shadow.carbon | 4 + .../namespace/unqualified_lookup.carbon | 6 + .../testdata/operators/builtin/and.carbon | 10 + .../operators/builtin/assignment.carbon | 8 + .../fail_and_or_not_in_function.carbon | 4 + .../fail_and_or_partial_constant.carbon | 4 + .../builtin/fail_assignment_to_error.carbon | 2 + .../fail_assignment_to_non_assignable.carbon | 4 + .../fail_redundant_compound_access.carbon | 6 + .../builtin/fail_type_mismatch.carbon | 2 + .../fail_type_mismatch_assignment.carbon | 4 + .../builtin/fail_type_mismatch_once.carbon | 2 + .../builtin/fail_unimplemented_op.carbon | 2 + .../testdata/operators/builtin/or.carbon | 10 + .../operators/builtin/unary_op.carbon | 6 + .../testdata/operators/overloaded/add.carbon | 4 + .../operators/overloaded/bit_and.carbon | 4 + .../overloaded/bit_complement.carbon | 2 + .../operators/overloaded/bit_or.carbon | 4 + .../operators/overloaded/bit_xor.carbon | 4 + .../testdata/operators/overloaded/dec.carbon | 2 + .../testdata/operators/overloaded/div.carbon | 4 + .../testdata/operators/overloaded/eq.carbon | 12 + .../overloaded/fail_assign_non_ref.carbon | 4 + .../overloaded/fail_error_recovery.carbon | 4 + .../operators/overloaded/fail_no_impl.carbon | 8 + .../operators/overloaded/implicit_as.carbon | 14 + .../testdata/operators/overloaded/inc.carbon | 2 + .../operators/overloaded/index.carbon | 14 + .../overloaded/index_with_prelude.carbon | 14 + .../operators/overloaded/left_shift.carbon | 4 + .../testdata/operators/overloaded/mod.carbon | 4 + .../testdata/operators/overloaded/mul.carbon | 4 + .../operators/overloaded/negate.carbon | 2 + .../operators/overloaded/ordered.carbon | 16 + .../operators/overloaded/right_shift.carbon | 4 + .../overloaded/string_indexing.carbon | 4 + .../testdata/operators/overloaded/sub.carbon | 4 + .../check/testdata/package_expr/syntax.carbon | 12 + .../packages/cross_package_export.carbon | 16 + .../packages/cross_package_import.carbon | 24 + .../testdata/packages/export_import.carbon | 20 + .../testdata/packages/export_mixed.carbon | 12 + .../testdata/packages/export_name.carbon | 12 + .../fail_conflict_no_namespaces.carbon | 2 + .../packages/fail_import_type_error.carbon | 4 + .../fail_name_with_import_failure.carbon | 2 + .../packages/implicit_imports_entities.carbon | 10 + .../packages/implicit_imports_prelude.carbon | 4 + .../testdata/packages/loaded_global.carbon | 4 + .../testdata/packages/missing_prelude.carbon | 14 + .../check/testdata/packages/raw_core.carbon | 10 + .../check/testdata/patterns/expression.carbon | 2 + .../check/testdata/patterns/tuple.carbon | 10 + .../check/testdata/patterns/underscore.carbon | 16 + .../testdata/pointer/address_of_deref.carbon | 4 + .../testdata/pointer/address_of_lvalue.carbon | 8 + toolchain/check/testdata/pointer/arrow.carbon | 2 + toolchain/check/testdata/pointer/basic.carbon | 4 + .../pointer/convert_qualifiers.carbon | 10 + .../pointer/fail_address_of_error.carbon | 2 + .../testdata/pointer/fail_deref_error.carbon | 2 + .../pointer/fail_deref_function.carbon | 2 + .../pointer/fail_deref_namespace.carbon | 2 + .../pointer/fail_deref_not_pointer.carbon | 2 + .../testdata/pointer/fail_deref_type.carbon | 2 + .../pointer/fail_type_mismatch.carbon | 2 + .../check/testdata/pointer/import.carbon | 4 + .../testdata/pointer/nested_const.carbon | 2 + toolchain/check/testdata/pointer/types.carbon | 4 + .../primitives/import_symbolic.carbon | 16 + .../primitives/numeric_literals.carbon | 2 + .../primitives/string_literals.carbon | 4 + .../testdata/primitives/type_literals.carbon | 12 + .../testdata/return/code_after_return.carbon | 2 + .../return/code_after_return_value.carbon | 2 + .../testdata/return/fail_call_in_type.carbon | 4 + .../testdata/return/fail_let_in_type.carbon | 8 + .../return/fail_missing_return.carbon | 2 + .../fail_missing_return_empty_tuple.carbon | 2 + .../fail_return_var_no_returned_var.carbon | 2 + .../fail_return_with_returned_var.carbon | 6 + .../fail_returned_var_no_return_type.carbon | 4 + .../return/fail_returned_var_shadow.carbon | 6 + .../return/fail_returned_var_type.carbon | 4 + .../testdata/return/fail_type_mismatch.carbon | 2 + .../return/fail_value_disallowed.carbon | 2 + .../testdata/return/fail_value_missing.carbon | 2 + .../testdata/return/fail_var_in_type.carbon | 4 + .../return/import_convert_function.carbon | 36 + .../missing_return_no_return_type.carbon | 2 + .../check/testdata/return/no_value.carbon | 2 + .../check/testdata/return/returned_var.carbon | 6 + .../testdata/return/returned_var_scope.carbon | 6 + toolchain/check/testdata/return/struct.carbon | 2 + toolchain/check/testdata/return/tuple.carbon | 2 + toolchain/check/testdata/return/value.carbon | 2 + toolchain/check/testdata/struct/empty.carbon | 2 + .../struct/fail_access_into_invalid.carbon | 2 + .../testdata/struct/fail_assign_empty.carbon | 2 + .../testdata/struct/fail_assign_nested.carbon | 2 + .../struct/fail_assign_to_empty.carbon | 2 + .../struct/fail_duplicate_name.carbon | 2 + .../struct/fail_field_name_mismatch.carbon | 2 + .../struct/fail_field_type_mismatch.carbon | 2 + .../struct/fail_member_access_type.carbon | 2 + .../struct/fail_member_of_function.carbon | 2 + .../struct/fail_nested_incomplete.carbon | 2 + .../struct/fail_non_member_access.carbon | 2 + .../struct/fail_too_few_values.carbon | 2 + .../testdata/struct/fail_type_assign.carbon | 2 + .../testdata/struct/fail_value_as_type.carbon | 2 + toolchain/check/testdata/struct/import.carbon | 4 + .../struct/literal_member_access.carbon | 6 + .../testdata/struct/member_access.carbon | 2 + .../struct/nested_struct_in_place.carbon | 8 + .../check/testdata/struct/one_entry.carbon | 2 + .../testdata/struct/partially_const.carbon | 2 + .../testdata/struct/reorder_fields.carbon | 2 + .../testdata/struct/tuple_as_element.carbon | 2 + .../check/testdata/struct/two_entries.carbon | 2 + toolchain/check/testdata/tuple/basics.carbon | 8 + .../testdata/tuple/element_access.carbon | 6 + toolchain/check/testdata/tuple/import.carbon | 4 + .../testdata/tuple/in_place_tuple_init.carbon | 20 + .../check/testdata/tuple/tuple_pattern.carbon | 16 + .../check/testdata/var/export_name.carbon | 4 + .../testdata/var/fail_duplicate_decl.carbon | 2 + .../var/fail_init_type_mismatch.carbon | 2 + .../testdata/var/fail_init_with_self.carbon | 2 + .../var/fail_storage_is_literal.carbon | 2 + .../check/testdata/var/global_decl.carbon | 2 + .../testdata/var/global_decl_import.carbon | 2 + .../testdata/var/global_decl_with_init.carbon | 6 + .../check/testdata/var/global_lookup.carbon | 2 + .../var/global_lookup_in_scope.carbon | 6 + toolchain/check/testdata/var/import.carbon | 4 + .../check/testdata/var/import_access.carbon | 8 + .../check/testdata/var/initialization.carbon | 4 + toolchain/check/testdata/var/lookup.carbon | 2 + toolchain/check/testdata/var/shadowing.carbon | 2 + .../check/testdata/var/var_pattern.carbon | 28 + .../testdata/where_expr/constraints.carbon | 2 + .../testdata/where_expr/dot_self_index.carbon | 2 + .../testdata/where_expr/equal_rewrite.carbon | 8 + .../testdata/where_expr/non_generic.carbon | 2 + toolchain/check/testdata/while/while.carbon | 6 + toolchain/diagnostics/kind.def | 3 + toolchain/sem_ir/BUILD | 2 + toolchain/sem_ir/file.cpp | 3 + toolchain/sem_ir/file.h | 13 + toolchain/sem_ir/formatter.cpp | 61 + toolchain/sem_ir/formatter.h | 8 + toolchain/sem_ir/function.h | 3 + toolchain/sem_ir/id_kind.h | 1 + toolchain/sem_ir/ids.cpp | 8 + toolchain/sem_ir/ids.h | 21 + toolchain/sem_ir/inst_fingerprinter.cpp | 7 + toolchain/sem_ir/inst_kind.def | 3 + toolchain/sem_ir/inst_namer.cpp | 46 + toolchain/sem_ir/inst_namer.h | 9 +- toolchain/sem_ir/interface.h | 1 + toolchain/sem_ir/observe.cpp | 18 + toolchain/sem_ir/observe.h | 53 + toolchain/sem_ir/typed_insts.h | 41 + 713 files changed, 13013 insertions(+), 13 deletions(-) create mode 100644 toolchain/check/testdata/interface/observe.carbon create mode 100644 toolchain/sem_ir/observe.cpp create mode 100644 toolchain/sem_ir/observe.h diff --git a/toolchain/check/BUILD b/toolchain/check/BUILD index a4c1684e63d3..5b5517a2726d 100644 --- a/toolchain/check/BUILD +++ b/toolchain/check/BUILD @@ -244,6 +244,7 @@ cc_library( "//common:error", "//common:find", "//common:growing_range", + "//common:hashtable_key_context", "//common:map", "//common:ostream", "//common:pretty_stack_trace_function", diff --git a/toolchain/check/context.h b/toolchain/check/context.h index df37b2eb2bdc..bb7113232edb 100644 --- a/toolchain/check/context.h +++ b/toolchain/check/context.h @@ -37,6 +37,7 @@ #include "toolchain/sem_ir/import_ir.h" #include "toolchain/sem_ir/inst.h" #include "toolchain/sem_ir/name_scope.h" +#include "toolchain/sem_ir/observe.h" #include "toolchain/sem_ir/specific_interface.h" #include "toolchain/sem_ir/typed_insts.h" @@ -131,6 +132,10 @@ class Context { return require_impls_stack_; } + auto observe_stack() -> ArrayStack& { + return observe_stack_; + } + auto decl_name_stack() -> DeclNameStack& { return decl_name_stack_; } auto decl_introducer_state_stack() -> DeclIntroducerStateStack& { @@ -356,6 +361,10 @@ class Context { auto require_impls_blocks() -> SemIR::RequireImplsBlockStore& { return sem_ir().require_impls_blocks(); } + auto observes() -> SemIR::ObserveStore& { return sem_ir().observes(); } + auto observe_blocks() -> SemIR::ObserveBlockStore& { + return sem_ir().observe_blocks(); + } auto associated_constants() -> SemIR::AssociatedConstantStore& { return sem_ir().associated_constants(); } @@ -464,6 +473,10 @@ class Context { // definitions. RequireImplsStack require_impls_stack_; + // The stack of Observe for in-progress Interface and Function + // definitions. + ArrayStack observe_stack_; + // The stack used for qualified declaration name construction. DeclNameStack decl_name_stack_; diff --git a/toolchain/check/function.cpp b/toolchain/check/function.cpp index a5fbe13905d3..a6a10612e362 100644 --- a/toolchain/check/function.cpp +++ b/toolchain/check/function.cpp @@ -458,6 +458,7 @@ auto StartFunctionDefinition(Context& context, SemIR::InstId decl_id, // Create the function scope and the entry block. context.scope_stack().PushForFunctionBody(decl_id); context.inst_block_stack().Push(); + context.observe_stack().PushArray(); context.region_stack().PushRegion(context.inst_block_stack().PeekOrAdd()); StartGenericDefinition(context, context.functions().Get(function_id).generic_id); @@ -470,8 +471,13 @@ auto FinishFunctionDefinition(Context& context, SemIR::FunctionId function_id) context.inst_block_stack().Pop(); context.scope_stack().Pop(/*check_unused=*/true); + auto observe_block_id = + context.observe_blocks().Add(context.observe_stack().PeekArray()); + context.observe_stack().PopArray(); + auto& function = context.functions().Get(function_id); function.body_block_ids = context.region_stack().PopRegion(); + function.observe_block_id = observe_block_id; // If this is a generic function, collect information about the definition. FinishGenericDefinition(context, function.generic_id); diff --git a/toolchain/check/generic.cpp b/toolchain/check/generic.cpp index 5036892c9fd9..0c204984018c 100644 --- a/toolchain/check/generic.cpp +++ b/toolchain/check/generic.cpp @@ -889,4 +889,12 @@ auto CopySpecificToGeneric(Context& context, SemIR::LocId loc_id, return MakeSpecific(context, loc_id, target_generic_id, args_id); } +auto DiagnoseImplsOnNonFacetType(Context& context, SemIR::LocId loc_id) + -> void { + CARBON_DIAGNOSTIC( + ImplsOnNonFacetType, Error, + "right argument of `impls` requirement must be a facet type"); + context.emitter().Emit(loc_id, ImplsOnNonFacetType); +} + } // namespace Carbon::Check diff --git a/toolchain/check/generic.h b/toolchain/check/generic.h index 65f1dc382f35..1a58a1f38a0f 100644 --- a/toolchain/check/generic.h +++ b/toolchain/check/generic.h @@ -168,6 +168,8 @@ auto CopySpecificToGeneric(Context& context, SemIR::LocId loc_id, SemIR::GenericId target_generic_id) -> SemIR::SpecificId; +auto DiagnoseImplsOnNonFacetType(Context& context, SemIR::LocId loc_id) -> void; + } // namespace Carbon::Check #endif // CARBON_TOOLCHAIN_CHECK_GENERIC_H_ diff --git a/toolchain/check/handle_interface.cpp b/toolchain/check/handle_interface.cpp index 84a7289e3b86..977d4b03c3df 100644 --- a/toolchain/check/handle_interface.cpp +++ b/toolchain/check/handle_interface.cpp @@ -198,6 +198,7 @@ auto HandleParseNode(Context& context, context.inst_block_stack().Push(); context.require_impls_stack().Push(interface_id); + context.observe_stack().PushArray(); // We use the arg stack to build the witness table type. context.args_type_info_stack().Push(); @@ -229,9 +230,14 @@ auto HandleParseNode(Context& context, Parse::InterfaceDefinitionId /*node_id*/) context.require_impls_stack().PeekTop()); context.require_impls_stack().Pop(); + auto observe_block_id = + context.observe_blocks().Add(context.observe_stack().PeekArray()); + context.observe_stack().PopArray(); + auto& interface_info = context.interfaces().Get(interface_id); if (!interface_info.associated_entities_id.has_value()) { interface_info.require_impls_block_id = require_impls_block_id; + interface_info.observe_block_id = observe_block_id; // This marks the interface type as fully defined. interface_info.associated_entities_id = associated_entities_id; } diff --git a/toolchain/check/handle_observe.cpp b/toolchain/check/handle_observe.cpp index c8e82b2c1164..bc701c7ebaf4 100644 --- a/toolchain/check/handle_observe.cpp +++ b/toolchain/check/handle_observe.cpp @@ -2,28 +2,121 @@ // Exceptions. See /LICENSE for license information. // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +#include "common/hashtable_key_context.h" #include "toolchain/check/context.h" +#include "toolchain/check/convert.h" +#include "toolchain/check/diagnostic_helpers.h" +#include "toolchain/check/generic.h" #include "toolchain/check/handle.h" +#include "toolchain/check/inst.h" +#include "toolchain/check/type.h" #include "toolchain/parse/node_ids.h" +#include "toolchain/parse/node_kind.h" +#include "toolchain/sem_ir/ids.h" +#include "toolchain/sem_ir/inst.h" +#include "toolchain/sem_ir/typed_insts.h" namespace Carbon::Check { auto HandleParseNode(Context& context, Parse::ObserveIntroducerId node_id) -> bool { - return context.TODO(node_id, "ObserveIntroducerId"); + auto scope_inst_id = context.scope_stack().PeekInstId(); + if (!context.insts() + .IsOneOf( + scope_inst_id)) { + CARBON_DIAGNOSTIC( + ObserveInWrongScope, Error, + "`observe` can only be used in an `interface` or `function`"); + context.emitter().Emit(node_id, ObserveInWrongScope); + scope_inst_id = SemIR::ErrorInst::InstId; + } + + context.args_type_info_stack().Push(); + + context.node_stack().Push(node_id, scope_inst_id); + return true; } auto HandleParseNode(Context& context, Parse::ObserveEqualEqualId node_id) -> bool { - return context.TODO(node_id, "ObserveEqualEqualId"); + auto [rhs_node_id, rhs_inst_id] = context.node_stack().PopExprWithNodeId(); + auto [lhs_node_id, lhs_inst_id] = context.node_stack().PopExprWithNodeId(); + + if (context.node_stack().Peek() == + SemIR::ErrorInst::InstId) { + context.node_stack().Push(rhs_node_id, rhs_inst_id); + return true; + } + + auto rhs_as_type = ExprAsType(context, rhs_node_id, rhs_inst_id); + auto lhs_as_type = ExprAsType(context, lhs_node_id, lhs_inst_id); + + // TODO: Type check lhs and rhs are same type. + + // Push rhs again for chain == expressions. + context.node_stack().Push(rhs_node_id, rhs_inst_id); + context.args_type_info_stack().AddInstId( + AddInstInNoBlock( + context, node_id, + {.lhs_id = GetCanonicalFacetOrTypeValue(context, lhs_as_type.inst_id), + .rhs_id = + GetCanonicalFacetOrTypeValue(context, rhs_as_type.inst_id)})); + return true; } auto HandleParseNode(Context& context, Parse::ObserveImplsId node_id) -> bool { - return context.TODO(node_id, "ObserveImplsId"); + auto [rhs_node_id, rhs_inst_id] = context.node_stack().PopExprWithNodeId(); + auto [lhs_node_id, lhs_inst_id] = context.node_stack().PopExprWithNodeId(); + + if (context.node_stack().Peek() == + SemIR::ErrorInst::InstId) { + context.node_stack().Push(rhs_node_id, rhs_inst_id); + return true; + } + + auto rhs_as_type = ExprAsType(context, rhs_node_id, rhs_inst_id); + auto lhs_as_type = ExprAsType(context, lhs_node_id, lhs_inst_id); + + if (!context.types().IsFacetTypeOrError(rhs_as_type.type_id)) { + DiagnoseImplsOnNonFacetType(context, rhs_node_id); + auto [node_id, scope_inst_id] = + context.node_stack() + .PopWithNodeId(); + context.node_stack().Push(node_id, SemIR::ErrorInst::InstId); + } + + // Dummy node for ObserveDeclId. + context.node_stack().Push(rhs_node_id, rhs_inst_id); + context.args_type_info_stack().AddInstId( + AddInstInNoBlock( + context, node_id, + {.lhs_id = GetCanonicalFacetOrTypeValue(context, lhs_as_type.inst_id), + .rhs_id = + GetCanonicalFacetOrTypeValue(context, rhs_as_type.inst_id)})); + return true; } auto HandleParseNode(Context& context, Parse::ObserveDeclId node_id) -> bool { - return context.TODO(node_id, "ObserveDeclId"); + context.node_stack().PopAndIgnore(); + auto scope_inst_id = + context.node_stack().Pop(); + auto operations_id = context.args_type_info_stack().Pop(); + + if (scope_inst_id == SemIR::ErrorInst::InstId) { + // We already diagnosed the errors. + return true; + } + + auto observe_decl = SemIR::ObserveDecl{// To be filled in after. + .observe_id = SemIR::ObserveId::None}; + auto decl_id = AddPlaceholderInst(context, node_id, observe_decl); + observe_decl.observe_id = + context.observes().Add({.decl_id = decl_id, + .operations_id = operations_id, + .enclosing_scope_inst_id = scope_inst_id}); + ReplaceInstBeforeConstantUse(context, decl_id, observe_decl); + context.observe_stack().AppendToTop(observe_decl.observe_id); + return true; } } // namespace Carbon::Check diff --git a/toolchain/check/handle_where.cpp b/toolchain/check/handle_where.cpp index 906fe262e5db..4daca4d9ba66 100644 --- a/toolchain/check/handle_where.cpp +++ b/toolchain/check/handle_where.cpp @@ -329,10 +329,7 @@ auto HandleParseNode(Context& context, Parse::RequirementImplsId node_id) auto rhs_as_type = ExprAsType(context, rhs_node, rhs_id); if (rhs_as_type.type_id != SemIR::ErrorInst::TypeId && !context.types().IsFacetType(rhs_as_type.type_id)) { - CARBON_DIAGNOSTIC( - ImplsOnNonFacetType, Error, - "right argument of `impls` requirement must be a facet type"); - context.emitter().Emit(rhs_node, ImplsOnNonFacetType); + DiagnoseImplsOnNonFacetType(context, rhs_node); rhs_as_type.type_id = SemIR::ErrorInst::TypeId; rhs_as_type.inst_id = SemIR::ErrorInst::TypeInstId; } diff --git a/toolchain/check/import_ref.cpp b/toolchain/check/import_ref.cpp index b14dbdd34286..f1cd211998f5 100644 --- a/toolchain/check/import_ref.cpp +++ b/toolchain/check/import_ref.cpp @@ -34,6 +34,7 @@ #include "toolchain/sem_ir/inst_categories.h" #include "toolchain/sem_ir/inst_kind.h" #include "toolchain/sem_ir/name_scope.h" +#include "toolchain/sem_ir/observe.h" #include "toolchain/sem_ir/specific_interface.h" #include "toolchain/sem_ir/specific_named_constraint.h" #include "toolchain/sem_ir/type_info.h" @@ -213,6 +214,12 @@ class ImportContext { auto import_require_impls_blocks() -> const SemIR::RequireImplsBlockStore& { return import_ir().require_impls_blocks(); } + auto import_observes() -> const SemIR::ObserveStore& { + return import_ir().observes(); + } + auto import_observe_blocks() -> const SemIR::ObserveBlockStore& { + return import_ir().observe_blocks(); + } auto import_specifics() -> const SemIR::SpecificStore& { return import_ir().specifics(); } @@ -295,6 +302,12 @@ class ImportContext { auto local_require_impls_blocks() -> SemIR::RequireImplsBlockStore& { return local_ir().require_impls_blocks(); } + auto local_observes() -> SemIR::ObserveStore& { + return local_ir().observes(); + } + auto local_observe_blocks() -> SemIR::ObserveBlockStore& { + return local_ir().observe_blocks(); + } auto local_specifics() -> SemIR::SpecificStore& { return local_ir().specifics(); } @@ -811,6 +824,52 @@ static auto GetLocalCanonicalRequireImplsBlockId( return context.local_require_impls_blocks().Add(contents); } +// Imports the ObserveDecl instructions for each ObserveId in the block, and +// gets the local ObserveIds from them. The returned vector is only complete if +// there is no more work to do in the resolver on return. +static auto GetLocalObserveBlockContents(ImportRefResolver& resolver, + SemIR::ObserveBlockId import_block_id) + -> llvm::SmallVector { + llvm::SmallVector observe_decl_ids; + if (!import_block_id.has_value() || + import_block_id == SemIR::ObserveBlockId::Empty) { + return observe_decl_ids; + } + + // Import the ObserveDecl for each Observe in the block. + auto import_block = resolver.import_observe_blocks().Get(import_block_id); + observe_decl_ids.reserve(import_block.size()); + for (auto import_observe_id : import_block) { + const auto& import_observe = + resolver.import_observes().Get(import_observe_id); + auto local_decl_id = + GetLocalConstantInstId(resolver, import_observe.decl_id); + // If `local_decl_id` is None, the resolver will have more work to do, and + // we will call this function to try get all the decl instructions again. + if (local_decl_id.has_value()) { + // Importing the ObserveDecl instruction in `local_decl_id` also imported + // the Observe structure that it points to through the ObserveId. + observe_decl_ids.push_back(resolver.local_insts() + .GetAs(local_decl_id) + .observe_id); + } + } + + return observe_decl_ids; +} + +// Gets the local block of ObserveIds from the imported block. Only valid +// to call once there is no more work to do after the call to +// GetLocalObserveBlockContents(). +static auto GetLocalCanonicalObserveBlockId( + ImportContext& context, SemIR::ObserveBlockId import_block_id, + llvm::ArrayRef contents) -> SemIR::ObserveBlockId { + if (!import_block_id.has_value()) { + return SemIR::ObserveBlockId::None; + } + return context.local_observe_blocks().Add(contents); +} + // Gets a local instruction block containing ImportRefs referring to the // instructions in the specified imported instruction block. static auto GetLocalImportRefInstBlock(ImportContext& context, @@ -2884,6 +2943,69 @@ static auto TryResolveTypedInst(ImportRefResolver& resolver, import_require.generic_id, new_require.generic_id, generic_data); } +static auto TryResolveTypedInst(ImportRefResolver& resolver, + SemIR::ObserveDecl inst, + SemIR::InstId import_inst_id) -> ResolveResult { + const auto& import_observe = resolver.import_observes().Get(inst.observe_id); + + auto operations = + GetLocalInstBlockContents(resolver, import_observe.operations_id); + auto operations_id = GetLocalCanonicalInstBlockId( + resolver, import_observe.operations_id, operations); + auto enclosing_scope_inst_id = + GetLocalConstantInstId(resolver, import_observe.enclosing_scope_inst_id); + if (resolver.HasNewWork()) { + return ResolveResult::Retry(); + } + + SemIR::ObserveDecl observe_decl = {.observe_id = SemIR::ObserveId::None}; + auto observe_decl_id = + AddPlaceholderImportedInst(resolver, import_inst_id, observe_decl); + auto observe_id = resolver.local_observes().Add( + {.decl_id = observe_decl_id, + .operations_id = operations_id, + .enclosing_scope_inst_id = enclosing_scope_inst_id}); + observe_decl.observe_id = observe_id; + return ResolveResult::Done( + ReplacePlaceholderImportedInst(resolver, observe_decl_id, observe_decl), + observe_decl_id); +} + +static auto TryResolveTypedInst(ImportRefResolver& resolver, + SemIR::ObserveEquivalent inst, + SemIR::InstId import_inst_id) -> ResolveResult { + auto lhs_id = GetLocalConstantInstId(resolver, inst.lhs_id); + auto rhs_id = GetLocalConstantInstId(resolver, inst.rhs_id); + + if (resolver.HasNewWork()) { + return ResolveResult::Retry(); + } + + auto observe_equivalent = + SemIR::ObserveEquivalent{.lhs_id = lhs_id, .rhs_id = rhs_id}; + auto observe_equivalent_id = + AddPlaceholderImportedInst(resolver, import_inst_id, observe_equivalent); + return ResolveResult::Done(SetConstantValue( + resolver.local_context(), observe_equivalent_id, observe_equivalent)); +} + +static auto TryResolveTypedInst(ImportRefResolver& resolver, + SemIR::ObserveImpls inst, + SemIR::InstId import_inst_id) -> ResolveResult { + auto lhs_id = GetLocalConstantInstId(resolver, inst.lhs_id); + auto rhs_id = GetLocalConstantInstId(resolver, inst.rhs_id); + + if (resolver.HasNewWork()) { + return ResolveResult::Retry(); + } + + auto observe_impls = SemIR::ObserveImpls{.lhs_id = lhs_id, .rhs_id = rhs_id}; + auto observe_impls_id = + AddPlaceholderImportedInst(resolver, import_inst_id, observe_impls); + return ResolveResult::Done(SetConstantValue(resolver.local_context(), + observe_impls_id, observe_impls)); +} + static auto TryResolveTypedInst(ImportRefResolver& resolver, SemIR::ImportRefLoaded /*inst*/, SemIR::InstId inst_id) -> ResolveResult { @@ -3018,6 +3140,8 @@ static auto TryResolveTypedInst(ImportRefResolver& resolver, GetLocalGenericData(resolver, import_interface.generic_id); auto require_impls = GetLocalRequireImplsBlockContents( resolver, import_interface.require_impls_block_id); + auto observes = + GetLocalObserveBlockContents(resolver, import_interface.observe_block_id); std::optional self_param_id; if (import_interface.is_complete()) { @@ -3047,6 +3171,8 @@ static auto TryResolveTypedInst(ImportRefResolver& resolver, AddLoadedImportRefBlock(resolver, param_patterns); new_interface.require_impls_block_id = GetLocalCanonicalRequireImplsBlockId( resolver, import_interface.require_impls_block_id, require_impls); + new_interface.observe_block_id = GetLocalCanonicalObserveBlockId( + resolver, import_interface.observe_block_id, observes); if (import_interface.is_complete()) { CARBON_CHECK(self_param_id); @@ -4353,6 +4479,15 @@ static auto TryResolveInstCanonical(ImportRefResolver& resolver, case CARBON_KIND(SemIR::Namespace inst): { return TryResolveTypedInst(resolver, inst, constant_inst_id); } + case CARBON_KIND(SemIR::ObserveDecl inst): { + return TryResolveTypedInst(resolver, inst, constant_inst_id); + } + case CARBON_KIND(SemIR::ObserveEquivalent inst): { + return TryResolveTypedInst(resolver, inst, constant_inst_id); + } + case CARBON_KIND(SemIR::ObserveImpls inst): { + return TryResolveTypedInst(resolver, inst, constant_inst_id); + } case CARBON_KIND(SemIR::OutParamPattern inst): { return TryResolveTypedInst(resolver, inst); } diff --git a/toolchain/check/node_stack.h b/toolchain/check/node_stack.h index 75b041738c6b..31260c657fdb 100644 --- a/toolchain/check/node_stack.h +++ b/toolchain/check/node_stack.h @@ -392,6 +392,8 @@ class NodeStack { Id::KindFor()); set_id_if_category_is(Parse::NodeCategory::Expr, Id::KindFor()); + set_id_if_category_is(Parse::NodeCategory::ObserveOperator, + Id::KindFor()); set_id_if_category_is( Parse::NodeCategory::MemberName | Parse::NodeCategory::NonExprName, Id::KindFor()); @@ -415,6 +417,7 @@ class NodeStack { switch (node_kind) { case Parse::NodeKind::CallExprStart: case Parse::NodeKind::IfExprThen: + case Parse::NodeKind::ObserveIntroducer: case Parse::NodeKind::RequireIntroducer: case Parse::NodeKind::ShortCircuitOperandAnd: case Parse::NodeKind::ShortCircuitOperandOr: @@ -462,7 +465,6 @@ class NodeStack { case Parse::NodeKind::LetInitializer: case Parse::NodeKind::LetIntroducer: case Parse::NodeKind::NamedConstraintIntroducer: - case Parse::NodeKind::ObserveIntroducer: case Parse::NodeKind::RefBindingName: case Parse::NodeKind::ReturnStatementStart: case Parse::NodeKind::StructLiteralStart: @@ -524,8 +526,6 @@ class NodeStack { case Parse::NodeKind::MatchIntroducer: case Parse::NodeKind::MatchStatementStart: case Parse::NodeKind::NamespaceStart: - case Parse::NodeKind::ObserveEqualEqual: - case Parse::NodeKind::ObserveImpls: case Parse::NodeKind::PackageIntroducer: case Parse::NodeKind::ParenExprStart: case Parse::NodeKind::PatternListComma: diff --git a/toolchain/check/testdata/alias/basics.carbon b/toolchain/check/testdata/alias/basics.carbon index 94e6a7b14a99..1eab6fccafe0 100644 --- a/toolchain/check/testdata/alias/basics.carbon +++ b/toolchain/check/testdata/alias/basics.carbon @@ -169,6 +169,8 @@ extern alias C = Class; // CHECK:STDOUT: fn @__global_init() { // CHECK:STDOUT: !entry: // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- alias_of_alias.carbon @@ -206,6 +208,8 @@ extern alias C = Class; // CHECK:STDOUT: !entry: // CHECK:STDOUT: %.loc10: %empty_struct_type = struct_literal () [concrete = constants.%empty_struct] // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- alias_to_generic.carbon @@ -229,5 +233,7 @@ extern alias C = Class; // CHECK:STDOUT: fn @__global_init() { // CHECK:STDOUT: !entry: // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/alias/builtins.carbon b/toolchain/check/testdata/alias/builtins.carbon index f54631ea01d8..748b55b76062 100644 --- a/toolchain/check/testdata/alias/builtins.carbon +++ b/toolchain/check/testdata/alias/builtins.carbon @@ -77,5 +77,7 @@ let a_test: bool = a; // CHECK:STDOUT: !entry: // CHECK:STDOUT: %a.ref: bool = name_ref a, file.%a [concrete = constants.%false] // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/alias/export_name.carbon b/toolchain/check/testdata/alias/export_name.carbon index a848ca7594c7..4fc122fe72d7 100644 --- a/toolchain/check/testdata/alias/export_name.carbon +++ b/toolchain/check/testdata/alias/export_name.carbon @@ -235,6 +235,8 @@ var d: D* = &c; // CHECK:STDOUT: %.loc6_1: init %C = converted %.loc6_13.1, %.loc6_13.2 [concrete = constants.%C.val] // CHECK:STDOUT: assign file.%d.var, %.loc6_1 // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- fail_orig_name_not_in_export.carbon @@ -275,6 +277,8 @@ var d: D* = &c; // CHECK:STDOUT: %.loc10: %empty_struct_type = struct_literal () [concrete = constants.%empty_struct] // CHECK:STDOUT: assign file.%c.var, // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- indirect_compat.carbon @@ -374,5 +378,7 @@ var d: D* = &c; // CHECK:STDOUT: %ptr.as.Copy.impl.Op.call: init %ptr.6b6 = call %bound_method.loc8_13.2(%addr) [concrete = constants.%addr] // CHECK:STDOUT: assign file.%d.var, %ptr.as.Copy.impl.Op.call // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/alias/import.carbon b/toolchain/check/testdata/alias/import.carbon index a94c65740051..2b1456086a30 100644 --- a/toolchain/check/testdata/alias/import.carbon +++ b/toolchain/check/testdata/alias/import.carbon @@ -138,6 +138,8 @@ var c: () = a_alias_alias; // CHECK:STDOUT: %T.as.DefaultOrUnformed.impl.Op.call: init %ptr = call %T.as.DefaultOrUnformed.impl.Op.specific_fn() // CHECK:STDOUT: assign file.%a.var, %T.as.DefaultOrUnformed.impl.Op.call // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- class2.carbon @@ -219,6 +221,8 @@ var c: () = a_alias_alias; // CHECK:STDOUT: %T.as.DefaultOrUnformed.impl.Op.call: init %ptr = call %T.as.DefaultOrUnformed.impl.Op.specific_fn() // CHECK:STDOUT: assign file.%b.var, %T.as.DefaultOrUnformed.impl.Op.call // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- class3.carbon @@ -295,6 +299,8 @@ var c: () = a_alias_alias; // CHECK:STDOUT: %T.as.DefaultOrUnformed.impl.Op.call: init %ptr = call %T.as.DefaultOrUnformed.impl.Op.specific_fn() // CHECK:STDOUT: assign file.%c.var, %T.as.DefaultOrUnformed.impl.Op.call // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- var1.carbon @@ -342,6 +348,8 @@ var c: () = a_alias_alias; // CHECK:STDOUT: %.loc4_1: init %empty_tuple.type = converted %.loc4_14.1, %.loc4_14.2 [concrete = constants.%empty_tuple] // CHECK:STDOUT: assign file.%a.var, %.loc4_1 // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- var2.carbon @@ -397,6 +405,8 @@ var c: () = a_alias_alias; // CHECK:STDOUT: %.loc8_1: init %empty_tuple.type = converted %a_alias.ref, %.loc8_13 [concrete = constants.%empty_tuple] // CHECK:STDOUT: assign file.%b.var, %.loc8_1 // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- var3.carbon @@ -449,5 +459,7 @@ var c: () = a_alias_alias; // CHECK:STDOUT: %.loc6_1: init %empty_tuple.type = converted %a_alias_alias.ref, %.loc6_13 [concrete = constants.%empty_tuple] // CHECK:STDOUT: assign file.%c.var, %.loc6_1 // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/alias/import_access.carbon b/toolchain/check/testdata/alias/import_access.carbon index 29cb192b6018..a887ced9dbeb 100644 --- a/toolchain/check/testdata/alias/import_access.carbon +++ b/toolchain/check/testdata/alias/import_access.carbon @@ -133,6 +133,8 @@ var inst: Test.A = {}; // CHECK:STDOUT: %.loc4_1: init %C = converted %.loc4_16.1, %.loc4_16.2 [concrete = constants.%C.val] // CHECK:STDOUT: assign file.%inst.var, %.loc4_1 // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- fail_local_def.carbon @@ -167,6 +169,8 @@ var inst: Test.A = {}; // CHECK:STDOUT: %.loc10: %empty_struct_type = struct_literal () [concrete = constants.%empty_struct] // CHECK:STDOUT: assign file.%inst.var, // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- fail_other_def.carbon @@ -206,5 +210,7 @@ var inst: Test.A = {}; // CHECK:STDOUT: %.loc10: %empty_struct_type = struct_literal () [concrete = constants.%empty_struct] // CHECK:STDOUT: assign file.%inst.var, // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/alias/import_order.carbon b/toolchain/check/testdata/alias/import_order.carbon index b870f639301a..f5d6b98f0f10 100644 --- a/toolchain/check/testdata/alias/import_order.carbon +++ b/toolchain/check/testdata/alias/import_order.carbon @@ -209,5 +209,7 @@ var a_val: a = {.v = b_val.v}; // CHECK:STDOUT: %.loc10_1: init %C = converted %.loc10_29.1, %.loc10_29.5 [concrete = constants.%C.val] // CHECK:STDOUT: assign file.%a_val.var, %.loc10_1 // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/alias/in_namespace.carbon b/toolchain/check/testdata/alias/in_namespace.carbon index c9c3b84b9976..9b4e8eaed4ff 100644 --- a/toolchain/check/testdata/alias/in_namespace.carbon +++ b/toolchain/check/testdata/alias/in_namespace.carbon @@ -64,5 +64,7 @@ fn F() -> {} { // CHECK:STDOUT: fn @__global_init() { // CHECK:STDOUT: !entry: // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/alias/var.carbon b/toolchain/check/testdata/alias/var.carbon index 57c02add37eb..458e39647e05 100644 --- a/toolchain/check/testdata/alias/var.carbon +++ b/toolchain/check/testdata/alias/var.carbon @@ -54,11 +54,15 @@ fn F() -> () { // CHECK:STDOUT: %a.ref: ref %empty_tuple.type = name_ref a, file.%a [concrete = file.%a.var] // CHECK:STDOUT: %b: ref %empty_tuple.type = alias_binding b, %a.ref [concrete = file.%a.var] // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @__global_init() { // CHECK:STDOUT: !entry: // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- fail_local.carbon @@ -73,5 +77,7 @@ fn F() -> () { // CHECK:STDOUT: %a.ref: ref %empty_tuple.type = name_ref a, %a // CHECK:STDOUT: %b: ref %empty_tuple.type = alias_binding b, %a.ref // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/array/basics.carbon b/toolchain/check/testdata/array/basics.carbon index bfaca68854e8..383c2da11c12 100644 --- a/toolchain/check/testdata/array/basics.carbon +++ b/toolchain/check/testdata/array/basics.carbon @@ -166,6 +166,8 @@ var a: array(1, 1); // CHECK:STDOUT: %.loc6_1: init %array_type = converted %a.ref, %.loc6_23.13 [concrete = constants.%array] // CHECK:STDOUT: assign file.%b.var, %.loc6_1 // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- array_in_place.carbon @@ -227,6 +229,8 @@ var a: array(1, 1); // CHECK:STDOUT: %Destroy.Op.bound: = bound_method %v.var, constants.%Destroy.Op.1a2547.4 // CHECK:STDOUT: %Destroy.Op.call: init %empty_tuple.type = call %Destroy.Op.bound(%v.var) // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Destroy.Op.loc10_3.1(%self.param: ref %empty_struct_type) = "no_op"; @@ -234,16 +238,22 @@ var a: array(1, 1); // CHECK:STDOUT: fn @Destroy.Op.loc10_3.2(%self.param: ref %C) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Destroy.Op.loc10_3.3(%self.param: ref %tuple.type.a8c) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Destroy.Op.loc10_3.4(%self.param: ref %array_type) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- array_vs_tuple.carbon @@ -331,6 +341,8 @@ var a: array(1, 1); // CHECK:STDOUT: %Destroy.Op.bound.loc7: = bound_method %a.var, constants.%Destroy.Op.1a2547.3 // CHECK:STDOUT: %Destroy.Op.call.loc7: init %empty_tuple.type = call %Destroy.Op.bound.loc7(%a.var) // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Destroy.Op.loc8_3.1(%self.param: ref %empty_tuple.type) = "no_op"; @@ -338,11 +350,15 @@ var a: array(1, 1); // CHECK:STDOUT: fn @Destroy.Op.loc8_3.2(%self.param: ref %tuple.type) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Destroy.Op.loc7(%self.param: ref %array_type) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- assign_return_value.carbon @@ -398,6 +414,8 @@ var a: array(1, 1); // CHECK:STDOUT: %Destroy.Op.bound.loc8_3: = bound_method %t.var, constants.%Destroy.Op.1a2547.3 // CHECK:STDOUT: %Destroy.Op.call.loc8_3: init %empty_tuple.type = call %Destroy.Op.bound.loc8_3(%t.var) // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Destroy.Op.loc8_34.1(%self.param: ref %empty_tuple.type) = "no_op"; @@ -405,11 +423,15 @@ var a: array(1, 1); // CHECK:STDOUT: fn @Destroy.Op.loc8_34.2(%self.param: ref %tuple.type) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Destroy.Op.loc8_3(%self.param: ref %array_type) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- nine_elements.carbon @@ -521,5 +543,7 @@ var a: array(1, 1); // CHECK:STDOUT: %.loc9_1: init %array_type = converted %a.ref, %.loc9_23.37 [concrete = constants.%array] // CHECK:STDOUT: assign file.%b.var, %.loc9_1 // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/array/bound_values.carbon b/toolchain/check/testdata/array/bound_values.carbon index bb586958061f..10b4ef99d27c 100644 --- a/toolchain/check/testdata/array/bound_values.carbon +++ b/toolchain/check/testdata/array/bound_values.carbon @@ -107,6 +107,8 @@ var b: array(1, 39999999999999999993); // CHECK:STDOUT: fn @__global_init() { // CHECK:STDOUT: !entry: // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- unsigned.carbon @@ -179,5 +181,7 @@ var b: array(1, 39999999999999999993); // CHECK:STDOUT: fn @__global_init() { // CHECK:STDOUT: !entry: // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/array/import.carbon b/toolchain/check/testdata/array/import.carbon index 07a0f401c530..2acaa0c9f8f6 100644 --- a/toolchain/check/testdata/array/import.carbon +++ b/toolchain/check/testdata/array/import.carbon @@ -99,6 +99,8 @@ fn F() -> i32 { // CHECK:STDOUT: %Destroy.Op.bound: = bound_method %.loc6_12.2, constants.%Destroy.Op.1a2547.3 // CHECK:STDOUT: %Destroy.Op.call: init %empty_tuple.type = call %Destroy.Op.bound(%.loc6_12.2) // CHECK:STDOUT: return %Int.as.Copy.impl.Op.call +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Destroy.Op.loc6_12.1(%self.param: ref %i32.builtin) = "no_op"; @@ -106,11 +108,15 @@ fn F() -> i32 { // CHECK:STDOUT: fn @Destroy.Op.loc6_12.2(%self.param: ref %i32) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Destroy.Op.loc6_12.3(%self.param: ref %array_type) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- import_symbolic_decl.carbon @@ -162,5 +168,7 @@ fn F() -> i32 { // CHECK:STDOUT: %a.patt: %pattern_type.97e = value_binding_pattern a [concrete = constants.%a.patt] // CHECK:STDOUT: } // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/array/index_not_literal.carbon b/toolchain/check/testdata/array/index_not_literal.carbon index 8551e9ca560c..4c82ba7cf3ba 100644 --- a/toolchain/check/testdata/array/index_not_literal.carbon +++ b/toolchain/check/testdata/array/index_not_literal.carbon @@ -120,6 +120,8 @@ fn F(a: array({}, 3)) -> {} { // CHECK:STDOUT: %bound_method.loc4_15.2: = bound_method %.loc4_15.3, %specific_fn // CHECK:STDOUT: %Int.as.Copy.impl.Op.call: init %i32 = call %bound_method.loc4_15.2(%.loc4_15.3) // CHECK:STDOUT: return %Int.as.Copy.impl.Op.call +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @G() -> out %return.param: %i32 { @@ -172,6 +174,8 @@ fn F(a: array({}, 3)) -> {} { // CHECK:STDOUT: %F.call: init %i32 = call %F.ref(%.loc10_20.15, %.loc10_23.2) // CHECK:STDOUT: %Destroy.Op.call: init %empty_tuple.type = call constants.%Destroy.Op.bound(constants.%.981) // CHECK:STDOUT: return %F.call +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Destroy.Op.loc10_20.1(%self.param: ref %i32.builtin) = "no_op"; @@ -179,11 +183,15 @@ fn F(a: array({}, 3)) -> {} { // CHECK:STDOUT: fn @Destroy.Op.loc10_20.2(%self.param: ref %i32) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Destroy.Op.loc10_20.3(%self.param: ref %array_type) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- index_non_literal.carbon @@ -241,5 +249,7 @@ fn F(a: array({}, 3)) -> {} { // CHECK:STDOUT: %.loc6_30.4: init %empty_struct_type = struct_init () [concrete = constants.%empty_struct] // CHECK:STDOUT: %.loc6_31: init %empty_struct_type = converted %.loc6_30.3, %.loc6_30.4 [concrete = constants.%empty_struct] // CHECK:STDOUT: return %.loc6_31 +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/array/init_dependent_bound.carbon b/toolchain/check/testdata/array/init_dependent_bound.carbon index 7044b567b14d..b64cab4f479a 100644 --- a/toolchain/check/testdata/array/init_dependent_bound.carbon +++ b/toolchain/check/testdata/array/init_dependent_bound.carbon @@ -138,6 +138,8 @@ fn H() { G(3); } // CHECK:STDOUT: %bound_method.loc7_3.2: = bound_method %arr.var, %specific_impl_fn.loc7_3.1 // CHECK:STDOUT: %Destroy.WithSelf.Op.call: init %empty_tuple.type = call %bound_method.loc7_3.2(%arr.var) // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: @@ -233,6 +235,8 @@ fn H() { G(3); } // CHECK:STDOUT: %arr.var_patt: = var_pattern %arr.patt [concrete = ] // CHECK:STDOUT: } // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/as/adapter_conversion.carbon b/toolchain/check/testdata/as/adapter_conversion.carbon index e2acfafd1a91..0aae5b8c3e7a 100644 --- a/toolchain/check/testdata/as/adapter_conversion.carbon +++ b/toolchain/check/testdata/as/adapter_conversion.carbon @@ -232,6 +232,8 @@ var b: B = {.x = ()} as B; // CHECK:STDOUT: %.loc25_29.2: init %B = converted %A.Make.call, %.loc25_29.1 // CHECK:STDOUT: assign file.%b_factory.var, %.loc25_29.2 // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- adapt_i32.carbon @@ -299,6 +301,8 @@ var b: B = {.x = ()} as B; // CHECK:STDOUT: %.loc10_16.1: %i32 = as_compatible %a.ref // CHECK:STDOUT: %.loc10_16.2: %i32 = converted %a.ref, %.loc10_16.1 // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- multi_level_adapt.carbon @@ -328,6 +332,8 @@ var b: B = {.x = ()} as B; // CHECK:STDOUT: %.loc10_15.1: %D = as_compatible %empty_struct [concrete = constants.%D.val] // CHECK:STDOUT: %.loc10_15.2: %D = converted %.loc10_13, %.loc10_15.1 [concrete = constants.%D.val] // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- init_class_value.carbon @@ -409,6 +415,8 @@ var b: B = {.x = ()} as B; // CHECK:STDOUT: %.loc14_42.1: init %B = as_compatible %.loc14_36 [concrete = constants.%B.val] // CHECK:STDOUT: %.loc14_42.2: init %B = converted %.loc14_36, %.loc14_42.1 [concrete = constants.%B.val] // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- init_tuple_value.carbon @@ -444,5 +452,7 @@ var b: B = {.x = ()} as B; // CHECK:STDOUT: %a_value.patt: %pattern_type = value_binding_pattern a_value [concrete = constants.%a_value.patt] // CHECK:STDOUT: } // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/as/basics.carbon b/toolchain/check/testdata/as/basics.carbon index cf0517179db7..8ec7d44291b9 100644 --- a/toolchain/check/testdata/as/basics.carbon +++ b/toolchain/check/testdata/as/basics.carbon @@ -168,6 +168,8 @@ let n: {.x: ()} = {.x = ()} as {.x = ()}; // CHECK:STDOUT: %.loc6_29.12: init %struct_type.x.y to %return.param = struct_init (%.loc6_29.6, %.loc6_29.11) [concrete = constants.%struct.005] // CHECK:STDOUT: %.loc6_48: init %struct_type.x.y = converted %.loc6_29.1, %.loc6_29.12 [concrete = constants.%struct.005] // CHECK:STDOUT: return %.loc6_48 to %return.param +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- as_type.carbon @@ -199,6 +201,8 @@ let n: {.x: ()} = {.x = ()} as {.x = ()}; // CHECK:STDOUT: %.loc5_24.2: type = converted constants.%empty_struct, constants.%empty_struct_type [concrete = constants.%empty_struct_type] // CHECK:STDOUT: %.loc5_24.3: type = converted %.loc5_22, constants.%tuple.type.b6b [concrete = constants.%tuple.type.b6b] // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- as_tuple.carbon @@ -256,6 +260,8 @@ let n: {.x: ()} = {.x = ()} as {.x = ()}; // CHECK:STDOUT: %Destroy.Op.bound.loc13_32: = bound_method %.loc13_32.2, constants.%Destroy.Op.1a2547.2 // CHECK:STDOUT: %Destroy.Op.call.loc13_32: init %empty_tuple.type = call %Destroy.Op.bound.loc13_32(%.loc13_32.2) // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Destroy.Op.loc13_40.1(%self.param: ref %empty_struct_type) = "no_op"; @@ -263,6 +269,8 @@ let n: {.x: ()} = {.x = ()} as {.x = ()}; // CHECK:STDOUT: fn @Destroy.Op.loc13_40.2(%self.param: ref %X) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Var() { @@ -296,11 +304,15 @@ let n: {.x: ()} = {.x = ()} as {.x = ()}; // CHECK:STDOUT: %Destroy.Op.bound: = bound_method %b.var, constants.%Destroy.Op.1a2547.3 // CHECK:STDOUT: %Destroy.Op.call: init %empty_tuple.type = call %Destroy.Op.bound(%b.var) // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Destroy.Op.loc20(%self.param: ref %tuple.type.359) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- identity.carbon @@ -332,6 +344,8 @@ let n: {.x: ()} = {.x = ()} as {.x = ()}; // CHECK:STDOUT: %m.patt: %pattern_type.6cb = value_binding_pattern m [concrete = constants.%m.patt] // CHECK:STDOUT: } // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Reference(%p.param: %ptr.db8) { @@ -349,6 +363,8 @@ let n: {.x: ()} = {.x = ()} as {.x = ()}; // CHECK:STDOUT: %q.patt: %pattern_type.990 = value_binding_pattern q [concrete = constants.%q.patt] // CHECK:STDOUT: } // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Initializing() { @@ -368,6 +384,8 @@ let n: {.x: ()} = {.x = ()} as {.x = ()}; // CHECK:STDOUT: %Destroy.Op.bound: = bound_method %x.var, constants.%Destroy.Op.1a2547.2 // CHECK:STDOUT: %Destroy.Op.call: init %empty_tuple.type = call %Destroy.Op.bound(%x.var) // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Destroy.Op.loc24_3.1(%self.param: ref %empty_struct_type) = "no_op"; @@ -375,6 +393,8 @@ let n: {.x: ()} = {.x = ()} as {.x = ()}; // CHECK:STDOUT: fn @Destroy.Op.loc24_3.2(%self.param: ref %X) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- overloaded.carbon @@ -431,5 +451,7 @@ let n: {.x: ()} = {.x = ()} as {.x = ()}; // CHECK:STDOUT: %X.as.As.impl.Convert.call: init %Y to %.loc19_29.1 = call %bound_method(%.loc19_23.3) // CHECK:STDOUT: %.loc19_29.2: init %Y = converted %.loc19_23.1, %X.as.As.impl.Convert.call // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/as/const.carbon b/toolchain/check/testdata/as/const.carbon index e2bce0572b91..5042f8318508 100644 --- a/toolchain/check/testdata/as/const.carbon +++ b/toolchain/check/testdata/as/const.carbon @@ -182,6 +182,8 @@ fn Use() { // CHECK:STDOUT: %Destroy.Op.bound: = bound_method %i.var, constants.%Destroy.Op.1a2547.3 // CHECK:STDOUT: %Destroy.Op.call: init %empty_tuple.type = call %Destroy.Op.bound(%i.var) // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Destroy.Op.loc14_3.1(%self.param: ref %empty_struct_type) = "no_op"; @@ -189,16 +191,22 @@ fn Use() { // CHECK:STDOUT: fn @Destroy.Op.loc14_3.2(%self.param: ref %X) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Destroy.Op.loc14_3.3(%self.param: ref %const) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @__global_init() { // CHECK:STDOUT: !entry: // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- remove_const.carbon @@ -246,6 +254,8 @@ fn Use() { // CHECK:STDOUT: %Destroy.Op.bound: = bound_method %i.var, constants.%Destroy.Op.1a2547.2 // CHECK:STDOUT: %Destroy.Op.call: init %empty_tuple.type = call %Destroy.Op.bound(%i.var) // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Destroy.Op.loc12_3.1(%self.param: ref %empty_struct_type) = "no_op"; @@ -253,11 +263,15 @@ fn Use() { // CHECK:STDOUT: fn @Destroy.Op.loc12_3.2(%self.param: ref %X) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @__global_init() { // CHECK:STDOUT: !entry: // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- unsafe_remove_const.carbon @@ -303,10 +317,14 @@ fn Use() { // CHECK:STDOUT: %b.patt: %pattern_type.990 = value_binding_pattern b [concrete = constants.%b.patt] // CHECK:STDOUT: } // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @__global_init() { // CHECK:STDOUT: !entry: // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/as/maybe_unformed.carbon b/toolchain/check/testdata/as/maybe_unformed.carbon index 9361217f8bac..a48912db2841 100644 --- a/toolchain/check/testdata/as/maybe_unformed.carbon +++ b/toolchain/check/testdata/as/maybe_unformed.carbon @@ -202,11 +202,15 @@ fn Use() { // CHECK:STDOUT: %b.patt: %pattern_type.abe = value_binding_pattern b [concrete = constants.%b.patt] // CHECK:STDOUT: } // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @__global_init() { // CHECK:STDOUT: !entry: // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- fail_todo_add_unformed_nonref.carbon @@ -287,6 +291,8 @@ fn Use() { // CHECK:STDOUT: %Destroy.Op.bound: = bound_method %i.var, constants.%Destroy.Op.1a2547.4 // CHECK:STDOUT: %Destroy.Op.call: init %empty_tuple.type = call %Destroy.Op.bound(%i.var) // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Destroy.Op.loc19_3.1(%self.param: ref %empty_struct_type) = "no_op"; @@ -294,21 +300,29 @@ fn Use() { // CHECK:STDOUT: fn @Destroy.Op.loc19_3.2(%self.param: ref %X) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Destroy.Op.loc19_3.3(%self.param: ref %.f01) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Destroy.Op.loc19_3.4(%self.param: ref %MaybeUnformed.198) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @__global_init() { // CHECK:STDOUT: !entry: // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- unsafe_remove_unformed.carbon @@ -365,10 +379,14 @@ fn Use() { // CHECK:STDOUT: %b.patt: %pattern_type.990 = value_binding_pattern b [concrete = constants.%b.patt] // CHECK:STDOUT: } // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @__global_init() { // CHECK:STDOUT: !entry: // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/as/partial.carbon b/toolchain/check/testdata/as/partial.carbon index 6fdb7762a6bb..4fb4123cfb5b 100644 --- a/toolchain/check/testdata/as/partial.carbon +++ b/toolchain/check/testdata/as/partial.carbon @@ -196,6 +196,8 @@ fn Use() { // CHECK:STDOUT: %Destroy.Op.bound: = bound_method %i.var, constants.%Destroy.Op.1a2547.2 // CHECK:STDOUT: %Destroy.Op.call: init %empty_tuple.type = call %Destroy.Op.bound(%i.var) // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Destroy.Op.loc14_3.1(%self.param: ref %empty_struct_type) = "no_op"; @@ -203,11 +205,15 @@ fn Use() { // CHECK:STDOUT: fn @Destroy.Op.loc14_3.2(%self.param: ref %.d74) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @__global_init() { // CHECK:STDOUT: !entry: // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- remove_partial_in_init.carbon @@ -280,6 +286,8 @@ fn Use() { // CHECK:STDOUT: %Destroy.Op.bound.loc10: = bound_method %i.var, constants.%Destroy.Op.1a2547.2 // CHECK:STDOUT: %Destroy.Op.call.loc10: init %empty_tuple.type = call %Destroy.Op.bound.loc10(%i.var) // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Destroy.Op.loc12_3.1(%self.param: ref %empty_struct_type) = "no_op"; @@ -287,6 +295,8 @@ fn Use() { // CHECK:STDOUT: fn @Destroy.Op.loc12_3.2(%self.param: ref %X) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- unsafe_remove_partial.carbon @@ -343,10 +353,14 @@ fn Use() { // CHECK:STDOUT: %b.patt: %pattern_type.990 = value_binding_pattern b [concrete = constants.%b.patt] // CHECK:STDOUT: } // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @__global_init() { // CHECK:STDOUT: !entry: // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/as/var_init.carbon b/toolchain/check/testdata/as/var_init.carbon index a8537ad5dcf1..2270b58e2a76 100644 --- a/toolchain/check/testdata/as/var_init.carbon +++ b/toolchain/check/testdata/as/var_init.carbon @@ -70,6 +70,8 @@ fn Convert(unused t: ()) { // CHECK:STDOUT: %Destroy.Op.bound: = bound_method %x.var, constants.%Destroy.Op.1a2547.2 // CHECK:STDOUT: %Destroy.Op.call: init %empty_tuple.type = call %Destroy.Op.bound(%x.var) // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Destroy.Op.loc12_3.1(%self.param: ref %empty_struct_type) = "no_op"; @@ -77,5 +79,7 @@ fn Convert(unused t: ()) { // CHECK:STDOUT: fn @Destroy.Op.loc12_3.2(%self.param: ref %X) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/basics/dump_sem_ir_ranges.carbon b/toolchain/check/testdata/basics/dump_sem_ir_ranges.carbon index 7b2de78c9459..06036d667b8e 100644 --- a/toolchain/check/testdata/basics/dump_sem_ir_ranges.carbon +++ b/toolchain/check/testdata/basics/dump_sem_ir_ranges.carbon @@ -139,6 +139,8 @@ library "[[@TEST_NAME]]"; // CHECK:STDOUT: %A.call: init %empty_tuple.type = call %A.ref() // CHECK:STDOUT: assign %b.ref.loc11, %A.call // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @C() -> out %return.param: %empty_tuple.type { @@ -167,6 +169,8 @@ library "[[@TEST_NAME]]"; // CHECK:STDOUT: %Destroy.Op.bound: = bound_method %c.var, constants.%Destroy.Op // CHECK:STDOUT: %Destroy.Op.call: init %empty_tuple.type = call %Destroy.Op.bound(%c.var) // CHECK:STDOUT: return %.loc20_11 +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- class.carbon @@ -248,6 +252,8 @@ library "[[@TEST_NAME]]"; // CHECK:STDOUT: %Destroy.Op.bound.loc13: = bound_method %.loc13_7.2, constants.%Destroy.Op // CHECK:STDOUT: %Destroy.Op.call.loc13: init %empty_tuple.type = call %Destroy.Op.bound.loc13(%.loc13_7.2) // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Destroy.Op(%self.param: ref %empty_tuple.type) = "no_op"; diff --git a/toolchain/check/testdata/basics/duplicate_name_same_line.carbon b/toolchain/check/testdata/basics/duplicate_name_same_line.carbon index 582ca85649d9..44c9f2212a5b 100644 --- a/toolchain/check/testdata/basics/duplicate_name_same_line.carbon +++ b/toolchain/check/testdata/basics/duplicate_name_same_line.carbon @@ -78,6 +78,8 @@ fn A() { // CHECK:STDOUT: %Destroy.Op.bound.loc18_5: = bound_method %n.var.loc18_5, constants.%Destroy.Op // CHECK:STDOUT: %Destroy.Op.call.loc18_5: init %empty_tuple.type = call %Destroy.Op.bound.loc18_5(%n.var.loc18_5) // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Destroy.Op(%self.param: ref %empty_tuple.type) = "no_op"; diff --git a/toolchain/check/testdata/basics/include_in_dumps.carbon b/toolchain/check/testdata/basics/include_in_dumps.carbon index f4e4eefecdd4..92ba3363dbe8 100644 --- a/toolchain/check/testdata/basics/include_in_dumps.carbon +++ b/toolchain/check/testdata/basics/include_in_dumps.carbon @@ -112,6 +112,8 @@ fn F(c: C) { c.(I.Op)(); } // CHECK:STDOUT: witness = () // CHECK:STDOUT: // CHECK:STDOUT: !requires: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: specific @I.WithSelf(constants.%Self) {} @@ -168,6 +170,8 @@ fn F(c: C) { c.(I.Op)(); } // CHECK:STDOUT: witness = (@I.WithSelf.%I.WithSelf.Op.decl) // CHECK:STDOUT: // CHECK:STDOUT: !requires: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: generic fn @I.WithSelf.Op(@I.%Self: %I.type) { @@ -288,6 +292,8 @@ fn F(c: C) { c.(I.Op)(); } // CHECK:STDOUT: witness = (imports.%Main.Op) // CHECK:STDOUT: // CHECK:STDOUT: !requires: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: impl @C.as.I.impl: imports.%Main.import_ref.335 as imports.%Main.import_ref.c3f [from "exclude/included_with_range.carbon"] { @@ -311,6 +317,8 @@ fn F(c: C) { c.(I.Op)(); } // CHECK:STDOUT: %bound_method: = bound_method %c.ref, %impl.elem0 // CHECK:STDOUT: %C.as.I.impl.Op.call: init %empty_tuple.type = call %bound_method(%c.ref) // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: generic fn @I.WithSelf.Op(imports.%Main.import_ref.e59c42.2: %I.type) [from "exclude/included_with_range.carbon"] { @@ -412,5 +420,7 @@ fn F(c: C) { c.(I.Op)(); } // CHECK:STDOUT: %bound_method: = bound_method %c.ref, %impl.elem0 // CHECK:STDOUT: %C.as.I.impl.Op.call: init %empty_tuple.type = call %bound_method(%c.ref) // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/basics/multi_error.carbon b/toolchain/check/testdata/basics/multi_error.carbon index 7b3e7c7303d9..34781b33055c 100644 --- a/toolchain/check/testdata/basics/multi_error.carbon +++ b/toolchain/check/testdata/basics/multi_error.carbon @@ -51,5 +51,7 @@ fn Boo[a: ()]() {} // CHECK:STDOUT: fn @Boo() { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/basics/name_lookup.carbon b/toolchain/check/testdata/basics/name_lookup.carbon index ebdd01a38d53..9342dbc0a1f7 100644 --- a/toolchain/check/testdata/basics/name_lookup.carbon +++ b/toolchain/check/testdata/basics/name_lookup.carbon @@ -44,6 +44,8 @@ fn F() { // CHECK:STDOUT: !entry: // CHECK:STDOUT: %x.ref: = name_ref x, [concrete = ] // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- fail_qualififier_unsupported.carbon @@ -56,5 +58,7 @@ fn F() { // CHECK:STDOUT: !entry: // CHECK:STDOUT: %true: bool = bool_literal true [concrete = constants.%true] // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/basics/parens.carbon b/toolchain/check/testdata/basics/parens.carbon index c73e73191773..7a6e187b1cce 100644 --- a/toolchain/check/testdata/basics/parens.carbon +++ b/toolchain/check/testdata/basics/parens.carbon @@ -104,5 +104,7 @@ var b: i32 = ((2)); // CHECK:STDOUT: %.loc15: init %i32 = converted %int_2, %Core.IntLiteral.as.ImplicitAs.impl.Convert.call.loc15 [concrete = constants.%int_2.295] // CHECK:STDOUT: assign file.%b.var, %.loc15 // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/basics/raw_identifier.carbon b/toolchain/check/testdata/basics/raw_identifier.carbon index 5d576ecb0e29..3d22fcb55ae8 100644 --- a/toolchain/check/testdata/basics/raw_identifier.carbon +++ b/toolchain/check/testdata/basics/raw_identifier.carbon @@ -112,6 +112,8 @@ fn C(r#if: ()) -> () { // CHECK:STDOUT: %.loc15_10: init %empty_tuple.type = tuple_init () [concrete = constants.%empty_tuple] // CHECK:STDOUT: %.loc15_13: init %empty_tuple.type = converted %n.ref, %.loc15_10 [concrete = constants.%empty_tuple] // CHECK:STDOUT: return %.loc15_13 +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @B(%n.param: %empty_tuple.type) -> out %return.param: %empty_tuple.type { @@ -120,6 +122,8 @@ fn C(r#if: ()) -> () { // CHECK:STDOUT: %.loc19_10: init %empty_tuple.type = tuple_init () [concrete = constants.%empty_tuple] // CHECK:STDOUT: %.loc19_11: init %empty_tuple.type = converted %n.ref, %.loc19_10 [concrete = constants.%empty_tuple] // CHECK:STDOUT: return %.loc19_11 +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @C(%if.param: %empty_tuple.type) -> out %return.param: %empty_tuple.type { @@ -128,5 +132,7 @@ fn C(r#if: ()) -> () { // CHECK:STDOUT: %.loc23_10: init %empty_tuple.type = tuple_init () [concrete = constants.%empty_tuple] // CHECK:STDOUT: %.loc23_14: init %empty_tuple.type = converted %if.ref, %.loc23_10 [concrete = constants.%empty_tuple] // CHECK:STDOUT: return %.loc23_14 +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/basics/raw_sem_ir/multifile_with_textual_ir.carbon b/toolchain/check/testdata/basics/raw_sem_ir/multifile_with_textual_ir.carbon index ccdbcf15d5f8..4488cffea983 100644 --- a/toolchain/check/testdata/basics/raw_sem_ir/multifile_with_textual_ir.carbon +++ b/toolchain/check/testdata/basics/raw_sem_ir/multifile_with_textual_ir.carbon @@ -144,6 +144,8 @@ fn B() { // CHECK:STDOUT: fn @A() { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- @@ -310,6 +312,8 @@ fn B() { // CHECK:STDOUT: %A.ref.loc6_4: %A.type = name_ref A, imports.%A.A [concrete = constants.%A] // CHECK:STDOUT: %A.call: init %empty_tuple.type = call %A.ref.loc6_4() // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @A [from "a.carbon"]; diff --git a/toolchain/check/testdata/basics/raw_sem_ir/one_file_with_textual_ir.carbon b/toolchain/check/testdata/basics/raw_sem_ir/one_file_with_textual_ir.carbon index 3f588cb92fe6..db7f4d2f0218 100644 --- a/toolchain/check/testdata/basics/raw_sem_ir/one_file_with_textual_ir.carbon +++ b/toolchain/check/testdata/basics/raw_sem_ir/one_file_with_textual_ir.carbon @@ -328,5 +328,7 @@ fn Foo(n: ()) -> ((), ()) { // CHECK:STDOUT: %.loc17_16.6: init %tuple.type to %return.param = tuple_init (%.loc17_16.3, %.loc17_16.5) [concrete = constants.%tuple] // CHECK:STDOUT: %.loc17_17: init %tuple.type = converted %.loc17_16.1, %.loc17_16.6 [concrete = constants.%tuple] // CHECK:STDOUT: return %.loc17_17 to %return.param +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/builtins/bool/eq.carbon b/toolchain/check/testdata/builtins/bool/eq.carbon index fffabf69c265..3a30d6eb3285 100644 --- a/toolchain/check/testdata/builtins/bool/eq.carbon +++ b/toolchain/check/testdata/builtins/bool/eq.carbon @@ -86,6 +86,8 @@ var d: C(false == false) = True(); // CHECK:STDOUT: %True.call.loc12: init %C.ac4 to %.loc12 = call %True.ref.loc12() // CHECK:STDOUT: assign file.%a.var, %True.call.loc12 // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- prelude.carbon @@ -143,5 +145,7 @@ var d: C(false == false) = True(); // CHECK:STDOUT: %True.call.loc10: init %C.ac4 to %.loc10 = call %True.ref.loc10() // CHECK:STDOUT: assign file.%a.var, %True.call.loc10 // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/builtins/bool/make_type.carbon b/toolchain/check/testdata/builtins/bool/make_type.carbon index 82cdc6e70981..9c416a621bc1 100644 --- a/toolchain/check/testdata/builtins/bool/make_type.carbon +++ b/toolchain/check/testdata/builtins/bool/make_type.carbon @@ -57,5 +57,7 @@ let b: Bool() = false; // CHECK:STDOUT: !entry: // CHECK:STDOUT: %false: bool = bool_literal false [concrete = constants.%false] // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/builtins/bool/neq.carbon b/toolchain/check/testdata/builtins/bool/neq.carbon index 187f2965668f..853d9c6efd4e 100644 --- a/toolchain/check/testdata/builtins/bool/neq.carbon +++ b/toolchain/check/testdata/builtins/bool/neq.carbon @@ -87,6 +87,8 @@ var d: C(false != false) = False(); // CHECK:STDOUT: %False.call.loc12: init %C.4b2 to %.loc12 = call %False.ref.loc12() // CHECK:STDOUT: assign file.%a.var, %False.call.loc12 // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- prelude.carbon @@ -145,5 +147,7 @@ var d: C(false != false) = False(); // CHECK:STDOUT: %False.call.loc10: init %C.4b2 to %.loc10 = call %False.ref.loc10() // CHECK:STDOUT: assign file.%a.var, %False.call.loc10 // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/builtins/char_literal/add.carbon b/toolchain/check/testdata/builtins/char_literal/add.carbon index 119f10bc343f..b3212e510321 100644 --- a/toolchain/check/testdata/builtins/char_literal/add.carbon +++ b/toolchain/check/testdata/builtins/char_literal/add.carbon @@ -129,5 +129,7 @@ let c: CharLiteral = AddCharInt('a', Negate(98)); // CHECK:STDOUT: %int_1.loc16: Core.IntLiteral = int_value 1 [concrete = constants.%int_1] // CHECK:STDOUT: %AddCharInt.call.loc16: init Core.CharLiteral = call %AddCharInt.ref.loc16(%.loc16, %int_1.loc16) [concrete = constants.%.a8b] // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/builtins/char_literal/convert_char.carbon b/toolchain/check/testdata/builtins/char_literal/convert_char.carbon index cc63ac6fd191..14911a33f06f 100644 --- a/toolchain/check/testdata/builtins/char_literal/convert_char.carbon +++ b/toolchain/check/testdata/builtins/char_literal/convert_char.carbon @@ -173,5 +173,7 @@ let c: UInt(8) = ToChar('\u{1E15}'); // CHECK:STDOUT: %.loc8: Core.CharLiteral = char_value U+007F [concrete = constants.%.e28] // CHECK:STDOUT: %ToChar.call.loc8: init %u8.builtin = call %ToChar.ref.loc8(%.loc8) [concrete = constants.%int_127] // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/builtins/char_literal/convert_int.carbon b/toolchain/check/testdata/builtins/char_literal/convert_int.carbon index db2e24ae9c91..edbbb917a9cc 100644 --- a/toolchain/check/testdata/builtins/char_literal/convert_int.carbon +++ b/toolchain/check/testdata/builtins/char_literal/convert_int.carbon @@ -170,5 +170,7 @@ let g: u8 = ConvertToU8('\u{100}'); // CHECK:STDOUT: %.loc20: Core.CharLiteral = char_value U+00FF [concrete = constants.%.ad8] // CHECK:STDOUT: %ConvertToU8.call.loc20: init %u8 = call %ConvertToU8.ref.loc20(%.loc20) [concrete = constants.%int_255] // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/builtins/char_literal/eq.carbon b/toolchain/check/testdata/builtins/char_literal/eq.carbon index 56ee66837fe4..fa54508d403d 100644 --- a/toolchain/check/testdata/builtins/char_literal/eq.carbon +++ b/toolchain/check/testdata/builtins/char_literal/eq.carbon @@ -64,5 +64,7 @@ let b: bool = Eq('a', 'b'); // CHECK:STDOUT: %.loc22_23: Core.CharLiteral = char_value U+0062 [concrete = constants.%.711] // CHECK:STDOUT: %Eq.call.loc22: init bool = call %Eq.ref.loc22(%.loc22_18, %.loc22_23) [concrete = constants.%false] // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/builtins/char_literal/greater.carbon b/toolchain/check/testdata/builtins/char_literal/greater.carbon index 7363a6757ad7..77d919d27096 100644 --- a/toolchain/check/testdata/builtins/char_literal/greater.carbon +++ b/toolchain/check/testdata/builtins/char_literal/greater.carbon @@ -64,5 +64,7 @@ let b: bool = Greater('a', 'b'); // CHECK:STDOUT: %.loc22_28: Core.CharLiteral = char_value U+0062 [concrete = constants.%.711] // CHECK:STDOUT: %Greater.call.loc22: init bool = call %Greater.ref.loc22(%.loc22_23, %.loc22_28) [concrete = constants.%false] // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/builtins/char_literal/greater_eq.carbon b/toolchain/check/testdata/builtins/char_literal/greater_eq.carbon index 1ce15bb42f1c..a572c2c727c6 100644 --- a/toolchain/check/testdata/builtins/char_literal/greater_eq.carbon +++ b/toolchain/check/testdata/builtins/char_literal/greater_eq.carbon @@ -77,5 +77,7 @@ let c: bool = GreaterEq('a', 'b'); // CHECK:STDOUT: %.loc23_30: Core.CharLiteral = char_value U+0062 [concrete = constants.%.711] // CHECK:STDOUT: %GreaterEq.call.loc23: init bool = call %GreaterEq.ref.loc23(%.loc23_25, %.loc23_30) [concrete = constants.%false] // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/builtins/char_literal/less.carbon b/toolchain/check/testdata/builtins/char_literal/less.carbon index 53ba2685e024..f0cfafda1b58 100644 --- a/toolchain/check/testdata/builtins/char_literal/less.carbon +++ b/toolchain/check/testdata/builtins/char_literal/less.carbon @@ -64,5 +64,7 @@ let b: bool = Less('b', 'a'); // CHECK:STDOUT: %.loc22_25: Core.CharLiteral = char_value U+0061 [concrete = constants.%.54f] // CHECK:STDOUT: %Less.call.loc22: init bool = call %Less.ref.loc22(%.loc22_20, %.loc22_25) [concrete = constants.%false] // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/builtins/char_literal/less_eq.carbon b/toolchain/check/testdata/builtins/char_literal/less_eq.carbon index 73a81d9bb3b0..e3e9e0bbb93b 100644 --- a/toolchain/check/testdata/builtins/char_literal/less_eq.carbon +++ b/toolchain/check/testdata/builtins/char_literal/less_eq.carbon @@ -77,5 +77,7 @@ let c: bool = LessEq('b', 'a'); // CHECK:STDOUT: %.loc23_27: Core.CharLiteral = char_value U+0061 [concrete = constants.%.54f] // CHECK:STDOUT: %LessEq.call.loc23: init bool = call %LessEq.ref.loc23(%.loc23_22, %.loc23_27) [concrete = constants.%false] // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/builtins/char_literal/make_type.carbon b/toolchain/check/testdata/builtins/char_literal/make_type.carbon index ecc1254a3b9d..5365d572792e 100644 --- a/toolchain/check/testdata/builtins/char_literal/make_type.carbon +++ b/toolchain/check/testdata/builtins/char_literal/make_type.carbon @@ -69,5 +69,7 @@ let not_8_bit: CharLiteral = '\u{1E15}'; // CHECK:STDOUT: %.loc8: Core.CharLiteral = char_value U+0080 [concrete = constants.%.ae7] // CHECK:STDOUT: %.loc9: Core.CharLiteral = char_value U+1E15 [concrete = constants.%.a81] // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/builtins/char_literal/neq.carbon b/toolchain/check/testdata/builtins/char_literal/neq.carbon index 1dc3fe6ffc2a..c1967cf10520 100644 --- a/toolchain/check/testdata/builtins/char_literal/neq.carbon +++ b/toolchain/check/testdata/builtins/char_literal/neq.carbon @@ -64,5 +64,7 @@ let b: bool = Neq('a', 'a'); // CHECK:STDOUT: %.loc22_24: Core.CharLiteral = char_value U+0061 [concrete = constants.%.54f] // CHECK:STDOUT: %Neq.call.loc22: init bool = call %Neq.ref.loc22(%.loc22_19, %.loc22_24) [concrete = constants.%false] // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/builtins/char_literal/sub_char.carbon b/toolchain/check/testdata/builtins/char_literal/sub_char.carbon index a1ee3ebc666c..9a5ab53d403d 100644 --- a/toolchain/check/testdata/builtins/char_literal/sub_char.carbon +++ b/toolchain/check/testdata/builtins/char_literal/sub_char.carbon @@ -130,5 +130,7 @@ let min: i32 = SubCharCharToI32('\u{0}', '\u{10FFFF}'); // CHECK:STDOUT: %.loc29_42: Core.CharLiteral = char_value U+10FFFF [concrete = constants.%.914] // CHECK:STDOUT: %SubCharCharToI32.call.loc29: init %i32 = call %SubCharCharToI32.ref.loc29(%.loc29_33, %.loc29_42) [concrete = constants.%int_-1114111] // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/builtins/char_literal/sub_int.carbon b/toolchain/check/testdata/builtins/char_literal/sub_int.carbon index a91b4d0a28f5..06d8bdae1abb 100644 --- a/toolchain/check/testdata/builtins/char_literal/sub_int.carbon +++ b/toolchain/check/testdata/builtins/char_literal/sub_int.carbon @@ -122,5 +122,7 @@ let b: CharLiteral = SubCharInt('\u{10FFFF}', Negate(1)); // CHECK:STDOUT: %.loc17_51.2: Core.IntLiteral = converted %Negate.call.loc17, %.loc17_51.1 [concrete = constants.%int_-1] // CHECK:STDOUT: %SubCharInt.call.loc17: init Core.CharLiteral = call %SubCharInt.ref.loc17(%.loc17_33, %.loc17_51.2) [concrete = constants.%.a8b] // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/builtins/float/add.carbon b/toolchain/check/testdata/builtins/float/add.carbon index 52aac1f19d22..8109dda8b715 100644 --- a/toolchain/check/testdata/builtins/float/add.carbon +++ b/toolchain/check/testdata/builtins/float/add.carbon @@ -84,10 +84,14 @@ fn AddLiteral(a: Literal(), b: Literal()) -> Literal() = "float.add"; // CHECK:STDOUT: %b.ref: %f64.dc1 = name_ref b, %b // CHECK:STDOUT: %Add.call: init %f64.dc1 = call %Add.ref(%a.ref, %b.ref) // CHECK:STDOUT: return %Add.call +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @__global_init() { // CHECK:STDOUT: !entry: // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/builtins/float/convert.carbon b/toolchain/check/testdata/builtins/float/convert.carbon index d9c2e5d1b0e5..63053ab872cb 100644 --- a/toolchain/check/testdata/builtins/float/convert.carbon +++ b/toolchain/check/testdata/builtins/float/convert.carbon @@ -150,6 +150,8 @@ let b: f64 = Float32ToFloat64(1.0e30); // CHECK:STDOUT: %float: Core.FloatLiteral = float_literal_value 10e-1 [concrete = constants.%float] // CHECK:STDOUT: %FloatLiteralToFloatLiteral.call: init Core.FloatLiteral = call %FloatLiteralToFloatLiteral.ref(%float) [concrete = constants.%float] // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- literal_f64.carbon @@ -224,6 +226,8 @@ let b: f64 = Float32ToFloat64(1.0e30); // CHECK:STDOUT: %float.loc10: Core.FloatLiteral = float_literal_value 10e308 [concrete = constants.%float.82f] // CHECK:STDOUT: %FloatLiteralToFloat64.call.loc10: init %f64.dc1 = call %FloatLiteralToFloat64.ref.loc10(%float.loc10) [concrete = constants.%float.7ae] // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- literal_f32.carbon @@ -298,6 +302,8 @@ let b: f64 = Float32ToFloat64(1.0e30); // CHECK:STDOUT: %float.loc10: Core.FloatLiteral = float_literal_value 10e38 [concrete = constants.%float.cfc] // CHECK:STDOUT: %FloatLiteralToFloat32.call.loc10: init %f32.c73 = call %FloatLiteralToFloat32.ref.loc10(%float.loc10) [concrete = constants.%float.021] // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- identity_f64.carbon @@ -399,6 +405,8 @@ let b: f64 = Float32ToFloat64(1.0e30); // CHECK:STDOUT: %.loc8_31.2: %f64.dc1 = converted %float.loc8, %.loc8_31.1 [concrete = constants.%float.672] // CHECK:STDOUT: %Float64ToFloat64.call.loc8: init %f64.dc1 = call %Float64ToFloat64.ref.loc8(%.loc8_31.2) [concrete = constants.%float.672] // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- identity_f32.carbon @@ -500,6 +508,8 @@ let b: f64 = Float32ToFloat64(1.0e30); // CHECK:STDOUT: %.loc8_31.2: %f32.c73 = converted %float.loc8, %.loc8_31.1 [concrete = constants.%float.c47] // CHECK:STDOUT: %Float32ToFloat32.call.loc8: init %f32.c73 = call %Float32ToFloat32.ref.loc8(%.loc8_31.2) [concrete = constants.%float.c47] // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- truncate.carbon @@ -583,6 +593,8 @@ let b: f64 = Float32ToFloat64(1.0e30); // CHECK:STDOUT: %.loc9_31.2: %f64.dc1 = converted %float.loc9, %.loc9_31.1 [concrete = constants.%float.7b6] // CHECK:STDOUT: %Float64ToFloat32.call.loc9: init %f32.c73 = call %Float64ToFloat32.ref.loc9(%.loc9_31.2) [concrete = constants.%float.021] // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- extend.carbon @@ -666,5 +678,7 @@ let b: f64 = Float32ToFloat64(1.0e30); // CHECK:STDOUT: %.loc8_31.2: %f32.c73 = converted %float.loc8, %.loc8_31.1 [concrete = constants.%float.518] // CHECK:STDOUT: %Float32ToFloat64.call.loc8: init %f64.dc1 = call %Float32ToFloat64.ref.loc8(%.loc8_31.2) [concrete = constants.%float.84e] // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/builtins/float/convert_checked.carbon b/toolchain/check/testdata/builtins/float/convert_checked.carbon index bcef3b7a8e88..38913992cf53 100644 --- a/toolchain/check/testdata/builtins/float/convert_checked.carbon +++ b/toolchain/check/testdata/builtins/float/convert_checked.carbon @@ -186,6 +186,8 @@ let convert_not_constant: f64 = Float64ToFloat64(not_constant_64); // CHECK:STDOUT: %float: Core.FloatLiteral = float_literal_value 10e-1 [concrete = constants.%float] // CHECK:STDOUT: %FloatLiteralToFloatLiteral.call: init Core.FloatLiteral = call %FloatLiteralToFloatLiteral.ref(%float) [concrete = constants.%float] // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- literal_f64.carbon @@ -247,6 +249,8 @@ let convert_not_constant: f64 = Float64ToFloat64(not_constant_64); // CHECK:STDOUT: %float.loc8: Core.FloatLiteral = float_literal_value 10e307 [concrete = constants.%float.12a] // CHECK:STDOUT: %FloatLiteralToFloat64.call.loc8: init %f64.dc1 = call %FloatLiteralToFloat64.ref.loc8(%float.loc8) [concrete = constants.%float.672] // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- literal_f32.carbon @@ -308,6 +312,8 @@ let convert_not_constant: f64 = Float64ToFloat64(not_constant_64); // CHECK:STDOUT: %float.loc8: Core.FloatLiteral = float_literal_value 10e37 [concrete = constants.%float.8d2] // CHECK:STDOUT: %FloatLiteralToFloat32.call.loc8: init %f32.c73 = call %FloatLiteralToFloat32.ref.loc8(%float.loc8) [concrete = constants.%float.c47] // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- identity_f64.carbon @@ -409,6 +415,8 @@ let convert_not_constant: f64 = Float64ToFloat64(not_constant_64); // CHECK:STDOUT: %.loc8_31.2: %f64.dc1 = converted %float.loc8, %.loc8_31.1 [concrete = constants.%float.672] // CHECK:STDOUT: %Float64ToFloat64.call.loc8: init %f64.dc1 = call %Float64ToFloat64.ref.loc8(%.loc8_31.2) [concrete = constants.%float.672] // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- identity_f32.carbon @@ -510,6 +518,8 @@ let convert_not_constant: f64 = Float64ToFloat64(not_constant_64); // CHECK:STDOUT: %.loc8_31.2: %f32.c73 = converted %float.loc8, %.loc8_31.1 [concrete = constants.%float.c47] // CHECK:STDOUT: %Float32ToFloat32.call.loc8: init %f32.c73 = call %Float32ToFloat32.ref.loc8(%.loc8_31.2) [concrete = constants.%float.c47] // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- truncate.carbon @@ -570,6 +580,8 @@ let convert_not_constant: f64 = Float64ToFloat64(not_constant_64); // CHECK:STDOUT: %.loc6_31.2: %f64.dc1 = converted %float, %.loc6_31.1 [concrete = constants.%float.3b9] // CHECK:STDOUT: %Float64ToFloat32.call: init %f32.c73 = call %Float64ToFloat32.ref(%.loc6_31.2) [concrete = constants.%float.943] // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- fail_truncate_overflow.carbon @@ -660,6 +672,8 @@ let convert_not_constant: f64 = Float64ToFloat64(not_constant_64); // CHECK:STDOUT: %float.loc21: Core.FloatLiteral = float_literal_value 10e308 [concrete = constants.%float.82f] // CHECK:STDOUT: %FloatLiteralToFloat64.call: init %f64.dc1 = call %FloatLiteralToFloat64.ref(%float.loc21) [concrete = ] // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- extend.carbon @@ -743,6 +757,8 @@ let convert_not_constant: f64 = Float64ToFloat64(not_constant_64); // CHECK:STDOUT: %.loc7_31.2: %f32.c73 = converted %float.loc7, %.loc7_31.1 [concrete = constants.%float.518] // CHECK:STDOUT: %Float32ToFloat64.call.loc7: init %f64.dc1 = call %Float32ToFloat64.ref.loc7(%.loc7_31.2) [concrete = constants.%float.84e] // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- fail_not_constant.carbon @@ -807,5 +823,7 @@ let convert_not_constant: f64 = Float64ToFloat64(not_constant_64); // CHECK:STDOUT: %not_constant_64.ref: %f64.dc1 = name_ref not_constant_64, file.%not_constant_64 // CHECK:STDOUT: %Float64ToFloat64.call: init %f64.dc1 = call %Float64ToFloat64.ref(%not_constant_64.ref) // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/builtins/float/convert_int.carbon b/toolchain/check/testdata/builtins/float/convert_int.carbon index 147aa853ce6a..ed3d36188a58 100644 --- a/toolchain/check/testdata/builtins/float/convert_int.carbon +++ b/toolchain/check/testdata/builtins/float/convert_int.carbon @@ -513,6 +513,8 @@ let inf_val: i32 = ConvertF64ToI32(Div(1.0, 0.0)); // CHECK:STDOUT: %float.loc104: Core.FloatLiteral = float_literal_value 16p28 [concrete = constants.%float.97b] // CHECK:STDOUT: %ConvertFloatLiteralToU32.call.loc104: init %u32 = call %ConvertFloatLiteralToU32.ref.loc104(%float.loc104) [concrete = ] // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- fail_nan_inf.carbon @@ -629,5 +631,7 @@ let inf_val: i32 = ConvertF64ToI32(Div(1.0, 0.0)); // CHECK:STDOUT: %.loc15_48.2: %f64.dc1 = converted %Div.call.loc15, %.loc15_48.1 [concrete = constants.%float.7ae] // CHECK:STDOUT: %ConvertF64ToI32.call.loc15: init %i32 = call %ConvertF64ToI32.ref.loc15(%.loc15_48.2) [concrete = ] // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/builtins/float/div.carbon b/toolchain/check/testdata/builtins/float/div.carbon index 159f53d2519e..f57855d503c4 100644 --- a/toolchain/check/testdata/builtins/float/div.carbon +++ b/toolchain/check/testdata/builtins/float/div.carbon @@ -95,10 +95,14 @@ fn DivLiteral(a: Literal(), b: Literal()) -> Literal() = "float.div"; // CHECK:STDOUT: %b.ref: %f64.dc1 = name_ref b, %b // CHECK:STDOUT: %Div.call: init %f64.dc1 = call %Div.ref(%a.ref, %b.ref) // CHECK:STDOUT: return %Div.call +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @__global_init() { // CHECK:STDOUT: !entry: // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/builtins/float/eq.carbon b/toolchain/check/testdata/builtins/float/eq.carbon index f2f6208471e0..a3829ba95d6c 100644 --- a/toolchain/check/testdata/builtins/float/eq.carbon +++ b/toolchain/check/testdata/builtins/float/eq.carbon @@ -64,5 +64,7 @@ fn Eq(a: Core.FloatLiteral, b: Core.FloatLiteral) -> bool = "float.eq"; // CHECK:STDOUT: %b.ref: %f64.dc1 = name_ref b, %b // CHECK:STDOUT: %Eq.call: init bool = call %Eq.ref(%a.ref, %b.ref) // CHECK:STDOUT: return %Eq.call +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/builtins/float/greater.carbon b/toolchain/check/testdata/builtins/float/greater.carbon index d0b48f0d6465..5b0a982714ac 100644 --- a/toolchain/check/testdata/builtins/float/greater.carbon +++ b/toolchain/check/testdata/builtins/float/greater.carbon @@ -48,5 +48,7 @@ fn RuntimeCallIsValid(a: f64, b: f64) -> bool { // CHECK:STDOUT: %b.ref: %f64.dc1 = name_ref b, %b // CHECK:STDOUT: %Greater.call: init bool = call %Greater.ref(%a.ref, %b.ref) // CHECK:STDOUT: return %Greater.call +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/builtins/float/greater_eq.carbon b/toolchain/check/testdata/builtins/float/greater_eq.carbon index 630d9ffe3381..54d99567e33f 100644 --- a/toolchain/check/testdata/builtins/float/greater_eq.carbon +++ b/toolchain/check/testdata/builtins/float/greater_eq.carbon @@ -48,5 +48,7 @@ fn RuntimeCallIsValid(a: f64, b: f64) -> bool { // CHECK:STDOUT: %b.ref: %f64.dc1 = name_ref b, %b // CHECK:STDOUT: %GreaterEq.call: init bool = call %GreaterEq.ref(%a.ref, %b.ref) // CHECK:STDOUT: return %GreaterEq.call +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/builtins/float/less.carbon b/toolchain/check/testdata/builtins/float/less.carbon index 382ff2db3e40..2a8f01c3481b 100644 --- a/toolchain/check/testdata/builtins/float/less.carbon +++ b/toolchain/check/testdata/builtins/float/less.carbon @@ -48,5 +48,7 @@ fn RuntimeCallIsValid(a: f64, b: f64) -> bool { // CHECK:STDOUT: %b.ref: %f64.dc1 = name_ref b, %b // CHECK:STDOUT: %Less.call: init bool = call %Less.ref(%a.ref, %b.ref) // CHECK:STDOUT: return %Less.call +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/builtins/float/less_eq.carbon b/toolchain/check/testdata/builtins/float/less_eq.carbon index f14a99629001..7c7983429de4 100644 --- a/toolchain/check/testdata/builtins/float/less_eq.carbon +++ b/toolchain/check/testdata/builtins/float/less_eq.carbon @@ -58,5 +58,7 @@ fn LessEq(a: Core.FloatLiteral, b: Core.FloatLiteral) -> bool = "float.less_eq"; // CHECK:STDOUT: %b.ref: %f64.dc1 = name_ref b, %b // CHECK:STDOUT: %LessEq.call: init bool = call %LessEq.ref(%a.ref, %b.ref) // CHECK:STDOUT: return %LessEq.call +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/builtins/float/make_type.carbon b/toolchain/check/testdata/builtins/float/make_type.carbon index 3e9beece3a33..96d1c5b2c2eb 100644 --- a/toolchain/check/testdata/builtins/float/make_type.carbon +++ b/toolchain/check/testdata/builtins/float/make_type.carbon @@ -77,10 +77,14 @@ var dyn: Float(dyn_size); // CHECK:STDOUT: %dyn_size.ref: %i32 = name_ref dyn_size, %dyn_size // CHECK:STDOUT: %Float.call: init type = call %Float.ref(%dyn_size.ref) // CHECK:STDOUT: return %Float.call +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @__global_init() { // CHECK:STDOUT: !entry: // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/builtins/float/mul.carbon b/toolchain/check/testdata/builtins/float/mul.carbon index eaffd52a57bb..eb454bab92ec 100644 --- a/toolchain/check/testdata/builtins/float/mul.carbon +++ b/toolchain/check/testdata/builtins/float/mul.carbon @@ -93,10 +93,14 @@ fn MulLiteral(a: Literal(), b: Literal()) -> Literal() = "float.mul"; // CHECK:STDOUT: %b.ref: %f64.dc1 = name_ref b, %b // CHECK:STDOUT: %Mul.call: init %f64.dc1 = call %Mul.ref(%a.ref, %b.ref) // CHECK:STDOUT: return %Mul.call +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @__global_init() { // CHECK:STDOUT: !entry: // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/builtins/float/negate.carbon b/toolchain/check/testdata/builtins/float/negate.carbon index 60ef206acedc..78aa4a1ba7c2 100644 --- a/toolchain/check/testdata/builtins/float/negate.carbon +++ b/toolchain/check/testdata/builtins/float/negate.carbon @@ -81,10 +81,14 @@ fn RuntimeCallIsValidBadReturnType(a: f64) -> bool { // CHECK:STDOUT: %a.ref: %f64.dc1 = name_ref a, %a // CHECK:STDOUT: %Negate.call: init %f64.dc1 = call %Negate.ref(%a.ref) // CHECK:STDOUT: return %Negate.call +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @__global_init() { // CHECK:STDOUT: !entry: // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/builtins/float/neq.carbon b/toolchain/check/testdata/builtins/float/neq.carbon index cc2cfea1615d..84d0a7ebce62 100644 --- a/toolchain/check/testdata/builtins/float/neq.carbon +++ b/toolchain/check/testdata/builtins/float/neq.carbon @@ -56,5 +56,7 @@ fn WrongResult(a: f64, b: f64) -> f64 = "float.neq"; // CHECK:STDOUT: %b.ref: %f64.dc1 = name_ref b, %b // CHECK:STDOUT: %Neq.call: init bool = call %Neq.ref(%a.ref, %b.ref) // CHECK:STDOUT: return %Neq.call +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/builtins/float/sub.carbon b/toolchain/check/testdata/builtins/float/sub.carbon index 67f65d316e6e..7426ee7d33e9 100644 --- a/toolchain/check/testdata/builtins/float/sub.carbon +++ b/toolchain/check/testdata/builtins/float/sub.carbon @@ -93,10 +93,14 @@ fn SubLiteral(a: Literal(), b: Literal()) -> Literal() = "float.sub"; // CHECK:STDOUT: %b.ref: %f64.dc1 = name_ref b, %b // CHECK:STDOUT: %Sub.call: init %f64.dc1 = call %Sub.ref(%a.ref, %b.ref) // CHECK:STDOUT: return %Sub.call +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @__global_init() { // CHECK:STDOUT: !entry: // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/builtins/float_literal/make_type.carbon b/toolchain/check/testdata/builtins/float_literal/make_type.carbon index 9075205076a1..7a14c50d8427 100644 --- a/toolchain/check/testdata/builtins/float_literal/make_type.carbon +++ b/toolchain/check/testdata/builtins/float_literal/make_type.carbon @@ -51,5 +51,7 @@ let f: FloatLiteral = 1.0; // CHECK:STDOUT: !entry: // CHECK:STDOUT: %float: Core.FloatLiteral = float_literal_value 10e-1 [concrete = constants.%float] // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/builtins/form/make_type.carbon b/toolchain/check/testdata/builtins/form/make_type.carbon index 8db3a8196d01..0b8bf413e415 100644 --- a/toolchain/check/testdata/builtins/form/make_type.carbon +++ b/toolchain/check/testdata/builtins/form/make_type.carbon @@ -55,5 +55,7 @@ let f: Form = form(var ()); // CHECK:STDOUT: %.loc7_25.2: type = converted %.loc7_25.1, constants.%empty_tuple.type [concrete = constants.%empty_tuple.type] // CHECK:STDOUT: %.loc7_20: Core.Form = init_form %.loc7_25.2 [concrete = constants.%.262] // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/builtins/int/add_char_literal.carbon b/toolchain/check/testdata/builtins/int/add_char_literal.carbon index 45db50f701cd..6267fa7b0458 100644 --- a/toolchain/check/testdata/builtins/int/add_char_literal.carbon +++ b/toolchain/check/testdata/builtins/int/add_char_literal.carbon @@ -101,5 +101,7 @@ let c: CharLiteral = AddIntChar(Negate(98), 'a'); // CHECK:STDOUT: %.loc12: Core.CharLiteral = char_value U+0061 [concrete = constants.%.54f] // CHECK:STDOUT: %AddIntChar.call: init Core.CharLiteral = call %AddIntChar.ref(%int_1, %.loc12) [concrete = constants.%.711] // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/builtins/int/and.carbon b/toolchain/check/testdata/builtins/int/and.carbon index c0e0ec158779..18f00ec47184 100644 --- a/toolchain/check/testdata/builtins/int/and.carbon +++ b/toolchain/check/testdata/builtins/int/and.carbon @@ -139,10 +139,14 @@ fn Test(n: Core.IntLiteral) { // CHECK:STDOUT: %b.ref: %i32 = name_ref b, %b // CHECK:STDOUT: %And.call: init %i32 = call %And.ref(%a.ref, %b.ref) // CHECK:STDOUT: return %And.call +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @__global_init() { // CHECK:STDOUT: !entry: // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/builtins/int/and_assign.carbon b/toolchain/check/testdata/builtins/int/and_assign.carbon index ae47eeeae510..46c4c1337360 100644 --- a/toolchain/check/testdata/builtins/int/and_assign.carbon +++ b/toolchain/check/testdata/builtins/int/and_assign.carbon @@ -72,5 +72,7 @@ fn MixedTypes(ref a: i32, b: i64) = "int.and_assign"; // CHECK:STDOUT: %b.ref: %i32 = name_ref b, %b // CHECK:STDOUT: %Builtin.call: init %empty_tuple.type = call %Builtin.ref(%a.ref, %b.ref) // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/builtins/int/complement.carbon b/toolchain/check/testdata/builtins/int/complement.carbon index 04e535bf71f5..8dbfc095bd96 100644 --- a/toolchain/check/testdata/builtins/int/complement.carbon +++ b/toolchain/check/testdata/builtins/int/complement.carbon @@ -77,10 +77,14 @@ fn F(a: Core.IntLiteral) -> Core.IntLiteral { // CHECK:STDOUT: %a.ref: %i32 = name_ref a, %a // CHECK:STDOUT: %Complement.call: init %i32 = call %Complement.ref(%a.ref) // CHECK:STDOUT: return %Complement.call +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @__global_init() { // CHECK:STDOUT: !entry: // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/builtins/int/convert.carbon b/toolchain/check/testdata/builtins/int/convert.carbon index ef81a83b685a..5997bb89c25a 100644 --- a/toolchain/check/testdata/builtins/int/convert.carbon +++ b/toolchain/check/testdata/builtins/int/convert.carbon @@ -317,6 +317,8 @@ fn F() { // CHECK:STDOUT: %a.ref: %i32 = name_ref a, %a // CHECK:STDOUT: %Int32ToUint32.call: init %u32 = call %Int32ToUint32.ref(%a.ref) // CHECK:STDOUT: return %Int32ToUint32.call +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Narrowing(%a.param: %i32) -> out %return.param: %i16 { @@ -325,6 +327,8 @@ fn F() { // CHECK:STDOUT: %a.ref: %i32 = name_ref a, %a // CHECK:STDOUT: %Int32ToInt16.call: init %i16 = call %Int32ToInt16.ref(%a.ref) // CHECK:STDOUT: return %Int32ToInt16.call +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Widening(%a.param: %i32) -> out %return.param: %i64 { @@ -333,5 +337,7 @@ fn F() { // CHECK:STDOUT: %a.ref: %i32 = name_ref a, %a // CHECK:STDOUT: %Int32ToInt64.call: init %i64 = call %Int32ToInt64.ref(%a.ref) // CHECK:STDOUT: return %Int32ToInt64.call +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/builtins/int/convert_char_literal.carbon b/toolchain/check/testdata/builtins/int/convert_char_literal.carbon index 7738283f0c8d..06abbc29d2c9 100644 --- a/toolchain/check/testdata/builtins/int/convert_char_literal.carbon +++ b/toolchain/check/testdata/builtins/int/convert_char_literal.carbon @@ -166,5 +166,7 @@ let c: CharLiteral = ConvertFromIntLiteral(0x110000); // CHECK:STDOUT: %.loc16_37.2: %u32 = converted %int_99, %.loc16_37.1 [concrete = constants.%int_99.d4e] // CHECK:STDOUT: %ConvertFromU32.call: init Core.CharLiteral = call %ConvertFromU32.ref(%.loc16_37.2) [concrete = constants.%.b9b] // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/builtins/int/convert_checked.carbon b/toolchain/check/testdata/builtins/int/convert_checked.carbon index 8838a2bba7b7..200f7319ce4d 100644 --- a/toolchain/check/testdata/builtins/int/convert_checked.carbon +++ b/toolchain/check/testdata/builtins/int/convert_checked.carbon @@ -370,5 +370,7 @@ let convert_not_constant_widen: i64 = Int32ToInt64(not_constant); // CHECK:STDOUT: %.loc8_34.2: %i32 = converted %int_1.loc8, %.loc8_34.1 [concrete = constants.%int_1.0c6] // CHECK:STDOUT: %Int32ToInt64.call: init %i64 = call %Int32ToInt64.ref(%.loc8_34.2) [concrete = constants.%int_1.d98] // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/builtins/int/convert_float.carbon b/toolchain/check/testdata/builtins/int/convert_float.carbon index 0b0a2fbf4f36..45e1028eefda 100644 --- a/toolchain/check/testdata/builtins/int/convert_float.carbon +++ b/toolchain/check/testdata/builtins/int/convert_float.carbon @@ -99,6 +99,8 @@ let invalid: f64 = ConvertIntLiteralToFloatLiteral(-1) as f64; // CHECK:STDOUT: %int_1000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000: Core.IntLiteral = int_value 1000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 [concrete = constants.%int_1000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000] // CHECK:STDOUT: %ConvertIntLiteralToF64.call: init %f64.dc1 = call %ConvertIntLiteralToF64.ref(%int_1000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000) [concrete = ] // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- fail_todo_negative_literal.carbon @@ -171,5 +173,7 @@ let invalid: f64 = ConvertIntLiteralToFloatLiteral(-1) as f64; // CHECK:STDOUT: %.loc9_56.1: %f64.dc1 = value_of_initializer %Core.FloatLiteral.as.As.impl.Convert.call [concrete = ] // CHECK:STDOUT: %.loc9_56.2: %f64.dc1 = converted %ConvertIntLiteralToFloatLiteral.call, %.loc9_56.1 [concrete = ] // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/builtins/int/convert_float_checked.carbon b/toolchain/check/testdata/builtins/int/convert_float_checked.carbon index 00a4a63ffbac..7b68888d4e97 100644 --- a/toolchain/check/testdata/builtins/int/convert_float_checked.carbon +++ b/toolchain/check/testdata/builtins/int/convert_float_checked.carbon @@ -75,5 +75,7 @@ let lossy: f32 = ConvertIntLiteralToF32(123456789); // CHECK:STDOUT: %int_123456789: Core.IntLiteral = int_value 123456789 [concrete = constants.%int_123456789] // CHECK:STDOUT: %ConvertIntLiteralToF32.call: init %f32.c73 = call %ConvertIntLiteralToF32.ref(%int_123456789) [concrete = ] // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/builtins/int/eq.carbon b/toolchain/check/testdata/builtins/int/eq.carbon index bb614a626234..484fb238953a 100644 --- a/toolchain/check/testdata/builtins/int/eq.carbon +++ b/toolchain/check/testdata/builtins/int/eq.carbon @@ -123,5 +123,7 @@ fn Test(n: Core.IntLiteral) { // CHECK:STDOUT: %b.ref: %i32 = name_ref b, %b // CHECK:STDOUT: %Eq.call: init bool = call %Eq.ref(%a.ref, %b.ref) // CHECK:STDOUT: return %Eq.call +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/builtins/int/greater.carbon b/toolchain/check/testdata/builtins/int/greater.carbon index 923ae09134fc..b1d6cc93eba6 100644 --- a/toolchain/check/testdata/builtins/int/greater.carbon +++ b/toolchain/check/testdata/builtins/int/greater.carbon @@ -48,5 +48,7 @@ fn RuntimeCallIsValid(a: i32, b: i32) -> bool { // CHECK:STDOUT: %b.ref: %i32 = name_ref b, %b // CHECK:STDOUT: %Greater.call: init bool = call %Greater.ref(%a.ref, %b.ref) // CHECK:STDOUT: return %Greater.call +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/builtins/int/greater_eq.carbon b/toolchain/check/testdata/builtins/int/greater_eq.carbon index f472263f1a16..c346bef06202 100644 --- a/toolchain/check/testdata/builtins/int/greater_eq.carbon +++ b/toolchain/check/testdata/builtins/int/greater_eq.carbon @@ -86,5 +86,7 @@ fn F() { // CHECK:STDOUT: %b.ref: %i32 = name_ref b, %b // CHECK:STDOUT: %GreaterEq.call: init bool = call %GreaterEq.ref(%a.ref, %b.ref) // CHECK:STDOUT: return %GreaterEq.call +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/builtins/int/left_shift.carbon b/toolchain/check/testdata/builtins/int/left_shift.carbon index 74706b9baf13..fe46dc044542 100644 --- a/toolchain/check/testdata/builtins/int/left_shift.carbon +++ b/toolchain/check/testdata/builtins/int/left_shift.carbon @@ -244,6 +244,8 @@ let bad4: Core.IntLiteral = LeftShiftOfLit(12, an_i32); // CHECK:STDOUT: %b.ref: %i32 = name_ref b, %b // CHECK:STDOUT: %LeftShift.call: init %i32 = call %LeftShift.ref(%a.ref, %b.ref) // CHECK:STDOUT: return %LeftShift.call +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- u32.carbon @@ -263,5 +265,7 @@ let bad4: Core.IntLiteral = LeftShiftOfLit(12, an_i32); // CHECK:STDOUT: %b.ref: %i32 = name_ref b, %b // CHECK:STDOUT: %LeftShift.call: init %u32 = call %LeftShift.ref(%a.ref, %b.ref) // CHECK:STDOUT: return %LeftShift.call +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/builtins/int/left_shift_assign.carbon b/toolchain/check/testdata/builtins/int/left_shift_assign.carbon index eac2ca838fe3..4ee76eb7a75a 100644 --- a/toolchain/check/testdata/builtins/int/left_shift_assign.carbon +++ b/toolchain/check/testdata/builtins/int/left_shift_assign.carbon @@ -72,6 +72,8 @@ fn NotRef(a: i32, b: i32) = "int.left_shift_assign"; // CHECK:STDOUT: %b.ref: %i32 = name_ref b, %b // CHECK:STDOUT: %Builtin.call: init %empty_tuple.type = call %Builtin.ref(%a.ref, %b.ref) // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @CallMixed(%a.param: ref %i32, %b.param: %i64) { @@ -82,5 +84,7 @@ fn NotRef(a: i32, b: i32) = "int.left_shift_assign"; // CHECK:STDOUT: %b.ref: %i64 = name_ref b, %b // CHECK:STDOUT: %MixedTypes.call: init %empty_tuple.type = call %MixedTypes.ref(%a.ref, %b.ref) // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/builtins/int/less.carbon b/toolchain/check/testdata/builtins/int/less.carbon index 3a031d2ab47f..3e2258829e90 100644 --- a/toolchain/check/testdata/builtins/int/less.carbon +++ b/toolchain/check/testdata/builtins/int/less.carbon @@ -48,5 +48,7 @@ fn RuntimeCallIsValid(a: i32, b: i32) -> bool { // CHECK:STDOUT: %b.ref: %i32 = name_ref b, %b // CHECK:STDOUT: %Less.call: init bool = call %Less.ref(%a.ref, %b.ref) // CHECK:STDOUT: return %Less.call +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/builtins/int/less_eq.carbon b/toolchain/check/testdata/builtins/int/less_eq.carbon index 18d0fca1be8a..6140a1510b0c 100644 --- a/toolchain/check/testdata/builtins/int/less_eq.carbon +++ b/toolchain/check/testdata/builtins/int/less_eq.carbon @@ -121,5 +121,7 @@ fn Test(n: Core.IntLiteral) { // CHECK:STDOUT: %b.ref: %i32 = name_ref b, %b // CHECK:STDOUT: %LessEq.call: init bool = call %LessEq.ref(%a.ref, %b.ref) // CHECK:STDOUT: return %LessEq.call +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/builtins/int/make_type_signed.carbon b/toolchain/check/testdata/builtins/int/make_type_signed.carbon index 72720d7e7da1..9cc2c1fa481b 100644 --- a/toolchain/check/testdata/builtins/int/make_type_signed.carbon +++ b/toolchain/check/testdata/builtins/int/make_type_signed.carbon @@ -115,10 +115,14 @@ var m: Int(1000000000); // CHECK:STDOUT: fn @F(%n.param: %i64.builtin) -> out %return.param: %i64.builtin { // CHECK:STDOUT: !entry: // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @G(%n.param: %i13.builtin) -> out %return.param: %i13.builtin { // CHECK:STDOUT: !entry: // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/builtins/int/make_type_unsigned.carbon b/toolchain/check/testdata/builtins/int/make_type_unsigned.carbon index ba788c3c2558..927823838ca9 100644 --- a/toolchain/check/testdata/builtins/int/make_type_unsigned.carbon +++ b/toolchain/check/testdata/builtins/int/make_type_unsigned.carbon @@ -97,10 +97,14 @@ var m: UInt(1000000000); // CHECK:STDOUT: fn @F(%n.param: %u64.builtin) -> out %return.param: %u64.builtin { // CHECK:STDOUT: !entry: // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @G(%n.param: %u13.builtin) -> out %return.param: %u13.builtin { // CHECK:STDOUT: !entry: // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/builtins/int/neq.carbon b/toolchain/check/testdata/builtins/int/neq.carbon index 102753bbe5e9..ae109044570f 100644 --- a/toolchain/check/testdata/builtins/int/neq.carbon +++ b/toolchain/check/testdata/builtins/int/neq.carbon @@ -44,5 +44,7 @@ fn RuntimeCallIsValid(a: i32, b: i32) -> bool { // CHECK:STDOUT: %b.ref: %i32 = name_ref b, %b // CHECK:STDOUT: %Neq.call: init bool = call %Neq.ref(%a.ref, %b.ref) // CHECK:STDOUT: return %Neq.call +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/builtins/int/or.carbon b/toolchain/check/testdata/builtins/int/or.carbon index ddc6aa1a04f3..f49ddeb6d9b4 100644 --- a/toolchain/check/testdata/builtins/int/or.carbon +++ b/toolchain/check/testdata/builtins/int/or.carbon @@ -39,10 +39,14 @@ fn RuntimeCallIsValid(a: i32, b: i32) -> i32 { // CHECK:STDOUT: %b.ref: %i32 = name_ref b, %b // CHECK:STDOUT: %Or.call: init %i32 = call %Or.ref(%a.ref, %b.ref) // CHECK:STDOUT: return %Or.call +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @__global_init() { // CHECK:STDOUT: !entry: // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/builtins/int/or_assign.carbon b/toolchain/check/testdata/builtins/int/or_assign.carbon index c21d742dcb9d..623f33557688 100644 --- a/toolchain/check/testdata/builtins/int/or_assign.carbon +++ b/toolchain/check/testdata/builtins/int/or_assign.carbon @@ -66,5 +66,7 @@ fn MixedTypes(ref a: i32, b: i64) = "int.or_assign"; // CHECK:STDOUT: %b.ref: %i32 = name_ref b, %b // CHECK:STDOUT: %Builtin.call: init %empty_tuple.type = call %Builtin.ref(%a.ref, %b.ref) // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/builtins/int/right_shift.carbon b/toolchain/check/testdata/builtins/int/right_shift.carbon index 37e3ae8a34ed..17d9ac6b19a7 100644 --- a/toolchain/check/testdata/builtins/int/right_shift.carbon +++ b/toolchain/check/testdata/builtins/int/right_shift.carbon @@ -148,6 +148,8 @@ let negative_lit_zero: Core.IntLiteral = RightShiftLit(0, -1); // CHECK:STDOUT: %b.ref: %i32 = name_ref b, %b // CHECK:STDOUT: %RightShift.call: init %i32 = call %RightShift.ref(%a.ref, %b.ref) // CHECK:STDOUT: return %RightShift.call +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- u32.carbon @@ -167,5 +169,7 @@ let negative_lit_zero: Core.IntLiteral = RightShiftLit(0, -1); // CHECK:STDOUT: %b.ref: %i32 = name_ref b, %b // CHECK:STDOUT: %RightShift.call: init %u32 = call %RightShift.ref(%a.ref, %b.ref) // CHECK:STDOUT: return %RightShift.call +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/builtins/int/right_shift_assign.carbon b/toolchain/check/testdata/builtins/int/right_shift_assign.carbon index 694b0ab226d1..921f735611ac 100644 --- a/toolchain/check/testdata/builtins/int/right_shift_assign.carbon +++ b/toolchain/check/testdata/builtins/int/right_shift_assign.carbon @@ -72,6 +72,8 @@ fn NotRef(a: i32, b: i32) = "int.right_shift_assign"; // CHECK:STDOUT: %b.ref: %i32 = name_ref b, %b // CHECK:STDOUT: %Builtin.call: init %empty_tuple.type = call %Builtin.ref(%a.ref, %b.ref) // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @CallMixed(%a.param: ref %i32, %b.param: %i64) { @@ -82,5 +84,7 @@ fn NotRef(a: i32, b: i32) = "int.right_shift_assign"; // CHECK:STDOUT: %b.ref: %i64 = name_ref b, %b // CHECK:STDOUT: %MixedTypes.call: init %empty_tuple.type = call %MixedTypes.ref(%a.ref, %b.ref) // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/builtins/int/sadd.carbon b/toolchain/check/testdata/builtins/int/sadd.carbon index bf6589e46431..7f5a11be113a 100644 --- a/toolchain/check/testdata/builtins/int/sadd.carbon +++ b/toolchain/check/testdata/builtins/int/sadd.carbon @@ -177,5 +177,7 @@ let b: i32 = Add(0x7FFFFFFF, 1); // CHECK:STDOUT: %b.ref: %i32 = name_ref b, %b // CHECK:STDOUT: %Add.call: init %i32 = call %Add.ref(%a.ref, %b.ref) // CHECK:STDOUT: return %Add.call +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/builtins/int/sdiv.carbon b/toolchain/check/testdata/builtins/int/sdiv.carbon index b5620076dced..de5cde711813 100644 --- a/toolchain/check/testdata/builtins/int/sdiv.carbon +++ b/toolchain/check/testdata/builtins/int/sdiv.carbon @@ -108,10 +108,14 @@ let d: Core.IntLiteral = DivLit(0, 0); // CHECK:STDOUT: %b.ref: %i32 = name_ref b, %b // CHECK:STDOUT: %Div.call: init %i32 = call %Div.ref(%a.ref, %b.ref) // CHECK:STDOUT: return %Div.call +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @__global_init() { // CHECK:STDOUT: !entry: // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/builtins/int/sdiv_assign.carbon b/toolchain/check/testdata/builtins/int/sdiv_assign.carbon index 35572841e3b6..0a0c897b0c47 100644 --- a/toolchain/check/testdata/builtins/int/sdiv_assign.carbon +++ b/toolchain/check/testdata/builtins/int/sdiv_assign.carbon @@ -66,5 +66,7 @@ fn MixedTypes(ref a: i32, b: i64) = "int.sdiv_assign"; // CHECK:STDOUT: %b.ref: %i32 = name_ref b, %b // CHECK:STDOUT: %Builtin.call: init %empty_tuple.type = call %Builtin.ref(%a.ref, %b.ref) // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/builtins/int/smod.carbon b/toolchain/check/testdata/builtins/int/smod.carbon index 014c5fd89f31..d6b104ce97f8 100644 --- a/toolchain/check/testdata/builtins/int/smod.carbon +++ b/toolchain/check/testdata/builtins/int/smod.carbon @@ -83,10 +83,14 @@ let b: i32 = Mod(0, 0); // CHECK:STDOUT: %b.ref: %i32 = name_ref b, %b // CHECK:STDOUT: %Mod.call: init %i32 = call %Mod.ref(%a.ref, %b.ref) // CHECK:STDOUT: return %Mod.call +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @__global_init() { // CHECK:STDOUT: !entry: // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/builtins/int/smod_assign.carbon b/toolchain/check/testdata/builtins/int/smod_assign.carbon index c5236fc9fa62..9fd8b4794fe4 100644 --- a/toolchain/check/testdata/builtins/int/smod_assign.carbon +++ b/toolchain/check/testdata/builtins/int/smod_assign.carbon @@ -66,5 +66,7 @@ fn MixedTypes(ref a: i32, b: i64) = "int.smod_assign"; // CHECK:STDOUT: %b.ref: %i32 = name_ref b, %b // CHECK:STDOUT: %Builtin.call: init %empty_tuple.type = call %Builtin.ref(%a.ref, %b.ref) // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/builtins/int/smul.carbon b/toolchain/check/testdata/builtins/int/smul.carbon index 1de0075e6128..0c2bc4af4310 100644 --- a/toolchain/check/testdata/builtins/int/smul.carbon +++ b/toolchain/check/testdata/builtins/int/smul.carbon @@ -90,5 +90,7 @@ let b: i32 = Mul(0x8000, 0x10000); // CHECK:STDOUT: %b.ref: %i32 = name_ref b, %b // CHECK:STDOUT: %Mul.call: init %i32 = call %Mul.ref(%a.ref, %b.ref) // CHECK:STDOUT: return %Mul.call +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/builtins/int/smul_assign.carbon b/toolchain/check/testdata/builtins/int/smul_assign.carbon index fdca90483e38..db12fbde2d61 100644 --- a/toolchain/check/testdata/builtins/int/smul_assign.carbon +++ b/toolchain/check/testdata/builtins/int/smul_assign.carbon @@ -66,5 +66,7 @@ fn MixedTypes(ref a: i32, b: i64) = "int.smul_assign"; // CHECK:STDOUT: %b.ref: %i32 = name_ref b, %b // CHECK:STDOUT: %Builtin.call: init %empty_tuple.type = call %Builtin.ref(%a.ref, %b.ref) // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/builtins/int/snegate.carbon b/toolchain/check/testdata/builtins/int/snegate.carbon index 108a82f5dba5..13aa2cbc7336 100644 --- a/toolchain/check/testdata/builtins/int/snegate.carbon +++ b/toolchain/check/testdata/builtins/int/snegate.carbon @@ -150,10 +150,14 @@ let b: i32 = Negate(-0x8000_0000); // CHECK:STDOUT: %a.ref: %i32 = name_ref a, %a // CHECK:STDOUT: %Negate.call: init %i32 = call %Negate.ref(%a.ref) // CHECK:STDOUT: return %Negate.call +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @__global_init() { // CHECK:STDOUT: !entry: // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/builtins/int/ssub.carbon b/toolchain/check/testdata/builtins/int/ssub.carbon index c9610226c514..063317aab479 100644 --- a/toolchain/check/testdata/builtins/int/ssub.carbon +++ b/toolchain/check/testdata/builtins/int/ssub.carbon @@ -55,10 +55,14 @@ let c: i32 = Sub(Sub(0, 0x7FFFFFFF), 2); // CHECK:STDOUT: %b.ref: %i32 = name_ref b, %b // CHECK:STDOUT: %Sub.call: init %i32 = call %Sub.ref(%a.ref, %b.ref) // CHECK:STDOUT: return %Sub.call +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @__global_init() { // CHECK:STDOUT: !entry: // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/builtins/int/ssub_assign.carbon b/toolchain/check/testdata/builtins/int/ssub_assign.carbon index b601810f8b74..21544589b9a6 100644 --- a/toolchain/check/testdata/builtins/int/ssub_assign.carbon +++ b/toolchain/check/testdata/builtins/int/ssub_assign.carbon @@ -66,5 +66,7 @@ fn MixedTypes(ref a: i32, b: i64) = "int.ssub_assign"; // CHECK:STDOUT: %b.ref: %i32 = name_ref b, %b // CHECK:STDOUT: %Builtin.call: init %empty_tuple.type = call %Builtin.ref(%a.ref, %b.ref) // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/builtins/int/uadd.carbon b/toolchain/check/testdata/builtins/int/uadd.carbon index 6df7010ea51d..2ad0a3b204df 100644 --- a/toolchain/check/testdata/builtins/int/uadd.carbon +++ b/toolchain/check/testdata/builtins/int/uadd.carbon @@ -126,10 +126,14 @@ let b: i32 = Add(0x7FFFFFFF, 1); // CHECK:STDOUT: %b.ref: %i32 = name_ref b, %b // CHECK:STDOUT: %Add.call: init %i32 = call %Add.ref(%a.ref, %b.ref) // CHECK:STDOUT: return %Add.call +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @__global_init() { // CHECK:STDOUT: !entry: // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/builtins/int/uadd_assign.carbon b/toolchain/check/testdata/builtins/int/uadd_assign.carbon index 97c3448676c8..9e5fa4008709 100644 --- a/toolchain/check/testdata/builtins/int/uadd_assign.carbon +++ b/toolchain/check/testdata/builtins/int/uadd_assign.carbon @@ -66,5 +66,7 @@ fn MixedTypes(ref a: i32, b: i64) = "int.uadd_assign"; // CHECK:STDOUT: %b.ref: %i32 = name_ref b, %b // CHECK:STDOUT: %Builtin.call: init %empty_tuple.type = call %Builtin.ref(%a.ref, %b.ref) // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/builtins/int/udiv.carbon b/toolchain/check/testdata/builtins/int/udiv.carbon index 51b2ade00427..adc798342b04 100644 --- a/toolchain/check/testdata/builtins/int/udiv.carbon +++ b/toolchain/check/testdata/builtins/int/udiv.carbon @@ -76,10 +76,14 @@ let b: i32 = Div(0, 0); // CHECK:STDOUT: %b.ref: %i32 = name_ref b, %b // CHECK:STDOUT: %Div.call: init %i32 = call %Div.ref(%a.ref, %b.ref) // CHECK:STDOUT: return %Div.call +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @__global_init() { // CHECK:STDOUT: !entry: // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/builtins/int/udiv_assign.carbon b/toolchain/check/testdata/builtins/int/udiv_assign.carbon index 1d6beefd5161..7cffa51dd107 100644 --- a/toolchain/check/testdata/builtins/int/udiv_assign.carbon +++ b/toolchain/check/testdata/builtins/int/udiv_assign.carbon @@ -66,5 +66,7 @@ fn MixedTypes(ref a: i32, b: i64) = "int.udiv_assign"; // CHECK:STDOUT: %b.ref: %i32 = name_ref b, %b // CHECK:STDOUT: %Builtin.call: init %empty_tuple.type = call %Builtin.ref(%a.ref, %b.ref) // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/builtins/int/umod.carbon b/toolchain/check/testdata/builtins/int/umod.carbon index 4a5d5955fb8d..e39f0c14c18e 100644 --- a/toolchain/check/testdata/builtins/int/umod.carbon +++ b/toolchain/check/testdata/builtins/int/umod.carbon @@ -78,10 +78,14 @@ let b: i32 = Mod(0, 0); // CHECK:STDOUT: %b.ref: %i32 = name_ref b, %b // CHECK:STDOUT: %Mod.call: init %i32 = call %Mod.ref(%a.ref, %b.ref) // CHECK:STDOUT: return %Mod.call +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @__global_init() { // CHECK:STDOUT: !entry: // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/builtins/int/umod_assign.carbon b/toolchain/check/testdata/builtins/int/umod_assign.carbon index 7bad94dafb7c..c6c4bab223b4 100644 --- a/toolchain/check/testdata/builtins/int/umod_assign.carbon +++ b/toolchain/check/testdata/builtins/int/umod_assign.carbon @@ -66,5 +66,7 @@ fn MixedTypes(ref a: i32, b: i64) = "int.umod_assign"; // CHECK:STDOUT: %b.ref: %i32 = name_ref b, %b // CHECK:STDOUT: %Builtin.call: init %empty_tuple.type = call %Builtin.ref(%a.ref, %b.ref) // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/builtins/int/umul.carbon b/toolchain/check/testdata/builtins/int/umul.carbon index df7191bf450c..2c3d0aeae03c 100644 --- a/toolchain/check/testdata/builtins/int/umul.carbon +++ b/toolchain/check/testdata/builtins/int/umul.carbon @@ -50,10 +50,14 @@ let b: i32 = Mul(0x8000, 0x10000); // CHECK:STDOUT: %b.ref: %i32 = name_ref b, %b // CHECK:STDOUT: %Mul.call: init %i32 = call %Mul.ref(%a.ref, %b.ref) // CHECK:STDOUT: return %Mul.call +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @__global_init() { // CHECK:STDOUT: !entry: // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/builtins/int/umul_assign.carbon b/toolchain/check/testdata/builtins/int/umul_assign.carbon index be4e538bf315..fe0c0b0c3455 100644 --- a/toolchain/check/testdata/builtins/int/umul_assign.carbon +++ b/toolchain/check/testdata/builtins/int/umul_assign.carbon @@ -66,5 +66,7 @@ fn MixedTypes(ref a: i32, b: i64) = "int.umul_assign"; // CHECK:STDOUT: %b.ref: %i32 = name_ref b, %b // CHECK:STDOUT: %Builtin.call: init %empty_tuple.type = call %Builtin.ref(%a.ref, %b.ref) // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/builtins/int/unegate.carbon b/toolchain/check/testdata/builtins/int/unegate.carbon index 1211adf186c3..a892d0837491 100644 --- a/toolchain/check/testdata/builtins/int/unegate.carbon +++ b/toolchain/check/testdata/builtins/int/unegate.carbon @@ -135,10 +135,14 @@ fn F() { // CHECK:STDOUT: %a.ref: %u32 = name_ref a, %a // CHECK:STDOUT: %Negate.call: init %u32 = call %Negate.ref(%a.ref) // CHECK:STDOUT: return %Negate.call +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @__global_init() { // CHECK:STDOUT: !entry: // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/builtins/int/usub.carbon b/toolchain/check/testdata/builtins/int/usub.carbon index 2132ccca455a..ecc4b82f1611 100644 --- a/toolchain/check/testdata/builtins/int/usub.carbon +++ b/toolchain/check/testdata/builtins/int/usub.carbon @@ -51,10 +51,14 @@ let c: i32 = Sub(Sub(0, 0x7FFFFFFF), 2); // CHECK:STDOUT: %b.ref: %i32 = name_ref b, %b // CHECK:STDOUT: %Sub.call: init %i32 = call %Sub.ref(%a.ref, %b.ref) // CHECK:STDOUT: return %Sub.call +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @__global_init() { // CHECK:STDOUT: !entry: // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/builtins/int/usub_assign.carbon b/toolchain/check/testdata/builtins/int/usub_assign.carbon index 03db09fb1d1a..c64dfc542b49 100644 --- a/toolchain/check/testdata/builtins/int/usub_assign.carbon +++ b/toolchain/check/testdata/builtins/int/usub_assign.carbon @@ -66,5 +66,7 @@ fn MixedTypes(ref a: i32, b: i64) = "int.usub_assign"; // CHECK:STDOUT: %b.ref: %i32 = name_ref b, %b // CHECK:STDOUT: %Builtin.call: init %empty_tuple.type = call %Builtin.ref(%a.ref, %b.ref) // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/builtins/int/xor.carbon b/toolchain/check/testdata/builtins/int/xor.carbon index 51b50056ba62..5b122bfdb4dc 100644 --- a/toolchain/check/testdata/builtins/int/xor.carbon +++ b/toolchain/check/testdata/builtins/int/xor.carbon @@ -39,10 +39,14 @@ fn RuntimeCallIsValid(a: i32, b: i32) -> i32 { // CHECK:STDOUT: %b.ref: %i32 = name_ref b, %b // CHECK:STDOUT: %Xor.call: init %i32 = call %Xor.ref(%a.ref, %b.ref) // CHECK:STDOUT: return %Xor.call +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @__global_init() { // CHECK:STDOUT: !entry: // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/builtins/int/xor_assign.carbon b/toolchain/check/testdata/builtins/int/xor_assign.carbon index 16d09eec4df6..a1a0c1e6328e 100644 --- a/toolchain/check/testdata/builtins/int/xor_assign.carbon +++ b/toolchain/check/testdata/builtins/int/xor_assign.carbon @@ -66,5 +66,7 @@ fn MixedTypes(ref a: i32, b: i64) = "int.xor_assign"; // CHECK:STDOUT: %b.ref: %i32 = name_ref b, %b // CHECK:STDOUT: %Builtin.call: init %empty_tuple.type = call %Builtin.ref(%a.ref, %b.ref) // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/builtins/maybe_unformed/make_type.carbon b/toolchain/check/testdata/builtins/maybe_unformed/make_type.carbon index 1a117289e63a..a6c4645abf57 100644 --- a/toolchain/check/testdata/builtins/maybe_unformed/make_type.carbon +++ b/toolchain/check/testdata/builtins/maybe_unformed/make_type.carbon @@ -98,6 +98,8 @@ fn ColonBangParam(T:! type) -> type = "maybe_unformed.make_type"; // CHECK:STDOUT: fn @F(%b.param: %.2ba) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- runtime_call.carbon @@ -139,5 +141,7 @@ fn ColonBangParam(T:! type) -> type = "maybe_unformed.make_type"; // CHECK:STDOUT: %t.ref: type = name_ref t, file.%t // CHECK:STDOUT: %Make.call: init type = call %Make.ref(%t.ref) // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/builtins/no_op.carbon b/toolchain/check/testdata/builtins/no_op.carbon index 9a65de49c7e5..688a181d717a 100644 --- a/toolchain/check/testdata/builtins/no_op.carbon +++ b/toolchain/check/testdata/builtins/no_op.carbon @@ -80,6 +80,8 @@ fn NoOp() -> {} = "no_op"; // CHECK:STDOUT: %NoOp.ref: %NoOp.type = name_ref NoOp, file.%NoOp.decl [concrete = constants.%NoOp] // CHECK:STDOUT: %NoOp.call: init %empty_tuple.type = call %NoOp.ref() [concrete = constants.%empty_tuple] // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- explicit_return.carbon @@ -96,6 +98,8 @@ fn NoOp() -> {} = "no_op"; // CHECK:STDOUT: %NoOp.ref: %NoOp.type = name_ref NoOp, file.%NoOp.decl [concrete = constants.%NoOp] // CHECK:STDOUT: %NoOp.call: init %empty_tuple.type = call %NoOp.ref() [concrete = constants.%empty_tuple] // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- ignore_args.carbon @@ -115,6 +119,8 @@ fn NoOp() -> {} = "no_op"; // CHECK:STDOUT: %.loc8_9.2: %empty_tuple.type = converted %.loc8_9.1, %empty_tuple [concrete = constants.%empty_tuple] // CHECK:STDOUT: %NoOp.call: init %empty_tuple.type = call %NoOp.ref(%.loc8_9.2) [concrete = constants.%empty_tuple] // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- assign.carbon @@ -148,5 +154,7 @@ fn NoOp() -> {} = "no_op"; // CHECK:STDOUT: %NoOp.call: init %empty_tuple.type = call %NoOp.ref() [concrete = constants.%empty_tuple] // CHECK:STDOUT: assign file.%x.var, %NoOp.call // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/builtins/pointer/is_null.carbon b/toolchain/check/testdata/builtins/pointer/is_null.carbon index 699aa8a4eafc..b49cb0a25faf 100644 --- a/toolchain/check/testdata/builtins/pointer/is_null.carbon +++ b/toolchain/check/testdata/builtins/pointer/is_null.carbon @@ -169,6 +169,8 @@ fn NotPointer(p: MakeUnformed({})) -> bool = "pointer.is_null"; // CHECK:STDOUT: %s.ref: %.b2d = name_ref s, %s // CHECK:STDOUT: %IsNullEmptyStruct.call: init bool = call %IsNullEmptyStruct.ref(%s.ref) // CHECK:STDOUT: return %IsNullEmptyStruct.call +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @TestC(%c.param: %.9e8) -> out %return.param: bool { @@ -177,6 +179,8 @@ fn NotPointer(p: MakeUnformed({})) -> bool = "pointer.is_null"; // CHECK:STDOUT: %c.ref: %.9e8 = name_ref c, %c // CHECK:STDOUT: %IsNullC.call: init bool = call %IsNullC.ref(%c.ref) // CHECK:STDOUT: return %IsNullC.call +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- call_generic.carbon @@ -264,6 +268,8 @@ fn NotPointer(p: MakeUnformed({})) -> bool = "pointer.is_null"; // CHECK:STDOUT: %IsNull.specific_fn: = specific_function %IsNull.ref, @IsNull(constants.%empty_struct_type) [concrete = constants.%IsNull.specific_fn.add] // CHECK:STDOUT: %IsNull.call: init bool = call %IsNull.specific_fn(%s.ref) // CHECK:STDOUT: return %IsNull.call +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @TestC(%c.param: %.9e8) -> out %return.param: bool { @@ -273,5 +279,7 @@ fn NotPointer(p: MakeUnformed({})) -> bool = "pointer.is_null"; // CHECK:STDOUT: %IsNull.specific_fn: = specific_function %IsNull.ref, @IsNull(constants.%C) [concrete = constants.%IsNull.specific_fn.5e3] // CHECK:STDOUT: %IsNull.call: init bool = call %IsNull.specific_fn(%c.ref) // CHECK:STDOUT: return %IsNull.call +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/builtins/pointer/make_null.carbon b/toolchain/check/testdata/builtins/pointer/make_null.carbon index a47a59011585..5d1c939ee0d0 100644 --- a/toolchain/check/testdata/builtins/pointer/make_null.carbon +++ b/toolchain/check/testdata/builtins/pointer/make_null.carbon @@ -124,6 +124,8 @@ fn NotPointer() -> MakeUnformed({}) = "pointer.make_null"; // CHECK:STDOUT: %MakeNullC.ref: %MakeNullC.type = name_ref MakeNullC, file.%MakeNullC.decl [concrete = constants.%MakeNullC] // CHECK:STDOUT: %MakeNullC.call: init %.9e8 = call %MakeNullC.ref() // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- call_generic.carbon @@ -192,5 +194,7 @@ fn NotPointer() -> MakeUnformed({}) = "pointer.make_null"; // CHECK:STDOUT: %MakeNull.specific_fn.loc11: = specific_function %MakeNull.ref.loc11, @MakeNull(constants.%C) [concrete = constants.%MakeNull.specific_fn.75f] // CHECK:STDOUT: %MakeNull.call.loc11: init %.9e8 = call %MakeNull.specific_fn.loc11() // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/builtins/print/char.carbon b/toolchain/check/testdata/builtins/print/char.carbon index 3840357d68e1..44fc84918629 100644 --- a/toolchain/check/testdata/builtins/print/char.carbon +++ b/toolchain/check/testdata/builtins/print/char.carbon @@ -88,5 +88,7 @@ fn Main() { // CHECK:STDOUT: %.loc20_18.3: %char = converted %.loc20_18.1, %.loc20_18.2 [concrete = constants.%int_50] // CHECK:STDOUT: %PrintChar.call.loc20: init %i32 = call %PrintChar.ref.loc20(%.loc20_18.3) // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/builtins/print/int.carbon b/toolchain/check/testdata/builtins/print/int.carbon index 676b7aaead4f..6a82e78a917f 100644 --- a/toolchain/check/testdata/builtins/print/int.carbon +++ b/toolchain/check/testdata/builtins/print/int.carbon @@ -96,5 +96,7 @@ fn Main() { // CHECK:STDOUT: %.loc20_14.2: %i32 = converted %int_2, %.loc20_14.1 [concrete = constants.%int_2.295] // CHECK:STDOUT: %Print.call.loc20: init %empty_tuple.type = call %Print.ref.loc20(%.loc20_14.2) // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/builtins/read/char.carbon b/toolchain/check/testdata/builtins/read/char.carbon index b75d9740025c..2ffb2a6fda05 100644 --- a/toolchain/check/testdata/builtins/read/char.carbon +++ b/toolchain/check/testdata/builtins/read/char.carbon @@ -73,5 +73,7 @@ fn Main() { // CHECK:STDOUT: %m.patt: %pattern_type.6b6 = value_binding_pattern m [concrete = constants.%m.patt] // CHECK:STDOUT: } // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/choice/basic.carbon b/toolchain/check/testdata/choice/basic.carbon index 5b9e6a5a2049..aefd4a64427a 100644 --- a/toolchain/check/testdata/choice/basic.carbon +++ b/toolchain/check/testdata/choice/basic.carbon @@ -130,6 +130,8 @@ let never: Never = {}; // CHECK:STDOUT: %Always.ref: type = name_ref Always, file.%Always.decl [concrete = constants.%Always] // CHECK:STDOUT: %Sunny.ref: %Always = name_ref Sunny, @Always.%Sunny // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- multiple_alternatives.carbon @@ -346,5 +348,7 @@ let never: Never = {}; // CHECK:STDOUT: %Ordering.ref.loc14: type = name_ref Ordering, file.%Ordering.decl [concrete = constants.%Ordering] // CHECK:STDOUT: %Incomparable.ref: %Ordering = name_ref Incomparable, @Ordering.%Incomparable // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/class/abstract/abstract.carbon b/toolchain/check/testdata/class/abstract/abstract.carbon index 9a724e4aeaed..88e8096888a0 100644 --- a/toolchain/check/testdata/class/abstract/abstract.carbon +++ b/toolchain/check/testdata/class/abstract/abstract.carbon @@ -335,6 +335,8 @@ fn Assign(ref a: Abstract) { // CHECK:STDOUT: %v.var_patt: = var_pattern %v.patt [concrete = ] // CHECK:STDOUT: } // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- fail_abstract_var_function_param.carbon @@ -383,6 +385,8 @@ fn Assign(ref a: Abstract) { // CHECK:STDOUT: fn @F(%_.param: ref ) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- abstract_let.carbon @@ -441,6 +445,8 @@ fn Assign(ref a: Abstract) { // CHECK:STDOUT: %l.patt: %pattern_type = value_binding_pattern l [concrete = constants.%l.patt] // CHECK:STDOUT: } // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- fail_abstract_adapter.carbon @@ -557,6 +563,8 @@ fn Assign(ref a: Abstract) { // CHECK:STDOUT: %p.ref: %Abstract = name_ref p, %p // CHECK:STDOUT: %Param.call: init %empty_tuple.type = call %Param.ref(%p.ref) // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- return_nonabstract_derived.carbon @@ -652,6 +660,8 @@ fn Assign(ref a: Abstract) { // CHECK:STDOUT: %.loc13_30.8: init %Derived to %return.param = class_init (%.loc13_30.4, %.loc13_30.7) [concrete = constants.%Derived.val] // CHECK:STDOUT: %.loc13_31: init %Derived = converted %.loc13_30.1, %.loc13_30.8 [concrete = constants.%Derived.val] // CHECK:STDOUT: return %.loc13_31 to %return.param +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- fail_return_abstract.carbon @@ -735,6 +745,8 @@ fn Assign(ref a: Abstract) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: %a.ref: %Abstract = name_ref a, %a // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- access_abstract_subobject.carbon @@ -853,6 +865,8 @@ fn Assign(ref a: Abstract) { // CHECK:STDOUT: %.loc14_16.3: init %empty_struct_type = struct_init () [concrete = constants.%empty_struct] // CHECK:STDOUT: %.loc14_18: init %empty_struct_type = converted %.loc14_16.2, %.loc14_16.3 [concrete = constants.%empty_struct] // CHECK:STDOUT: return %.loc14_18 +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Access(%d.param: %Derived) -> out %return.param: %empty_struct_type { @@ -866,6 +880,8 @@ fn Assign(ref a: Abstract) { // CHECK:STDOUT: %.loc18_11.5: init %empty_struct_type = struct_init () [concrete = constants.%empty_struct] // CHECK:STDOUT: %.loc18_13: init %empty_struct_type = converted %.loc18_11.4, %.loc18_11.5 [concrete = constants.%empty_struct] // CHECK:STDOUT: return %.loc18_13 +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- fail_abstract_let_temporary_struct_literal.carbon @@ -926,6 +942,8 @@ fn Assign(ref a: Abstract) { // CHECK:STDOUT: %l.patt: %pattern_type.169 = value_binding_pattern l [concrete = constants.%l.patt] // CHECK:STDOUT: } // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- fail_todo_abstract_let_temporary.carbon @@ -1021,6 +1039,8 @@ fn Assign(ref a: Abstract) { // CHECK:STDOUT: %l.patt: %pattern_type.169 = value_binding_pattern l [concrete = constants.%l.patt] // CHECK:STDOUT: } // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- fail_call_abstract_return.carbon @@ -1082,6 +1102,8 @@ fn Assign(ref a: Abstract) { // CHECK:STDOUT: %ReturnAbstract.ref: %ReturnAbstract.type = name_ref ReturnAbstract, file.%ReturnAbstract.decl [concrete = constants.%ReturnAbstract] // CHECK:STDOUT: %ReturnAbstract.call: init = call %ReturnAbstract.ref() // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- fail_assign_to_abstract_ref.carbon @@ -1140,5 +1162,7 @@ fn Assign(ref a: Abstract) { // CHECK:STDOUT: %.loc14: %Abstract = acquire_value %a.ref.loc14_7 // CHECK:STDOUT: assign %a.ref.loc14_3, // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/class/abstract/fail_abstract_in_struct.carbon b/toolchain/check/testdata/class/abstract/fail_abstract_in_struct.carbon index a88e4b775db5..ede6311ce2be 100644 --- a/toolchain/check/testdata/class/abstract/fail_abstract_in_struct.carbon +++ b/toolchain/check/testdata/class/abstract/fail_abstract_in_struct.carbon @@ -191,6 +191,8 @@ var v5: {.m: Abstract}; // CHECK:STDOUT: !entry: // CHECK:STDOUT: assign file.%v.var, // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- abstract_let.carbon @@ -248,6 +250,8 @@ var v5: {.m: Abstract}; // CHECK:STDOUT: %l.patt: %pattern_type.2be = value_binding_pattern l [concrete = constants.%l.patt] // CHECK:STDOUT: } // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- fail_abstract_twice.carbon @@ -301,6 +305,8 @@ var v5: {.m: Abstract}; // CHECK:STDOUT: !entry: // CHECK:STDOUT: assign file.%v2.var, // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- fail_abstract_first.carbon @@ -346,6 +352,8 @@ var v5: {.m: Abstract}; // CHECK:STDOUT: !entry: // CHECK:STDOUT: assign file.%v3.var, // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- fail_abstract_second.carbon @@ -391,6 +399,8 @@ var v5: {.m: Abstract}; // CHECK:STDOUT: !entry: // CHECK:STDOUT: assign file.%v4.var, // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- lib.carbon @@ -460,5 +470,7 @@ var v5: {.m: Abstract}; // CHECK:STDOUT: !entry: // CHECK:STDOUT: assign file.%v5.var, // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/class/abstract/fail_abstract_in_tuple.carbon b/toolchain/check/testdata/class/abstract/fail_abstract_in_tuple.carbon index 6a051a336fc3..a8efeef0c077 100644 --- a/toolchain/check/testdata/class/abstract/fail_abstract_in_tuple.carbon +++ b/toolchain/check/testdata/class/abstract/fail_abstract_in_tuple.carbon @@ -228,6 +228,8 @@ fn Var5() { // CHECK:STDOUT: %v.var_patt: = var_pattern %v.patt [concrete = ] // CHECK:STDOUT: } // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- abstract_let.carbon @@ -297,6 +299,8 @@ fn Var5() { // CHECK:STDOUT: %l.patt: %pattern_type.ac0 = value_binding_pattern l [concrete = constants.%l.patt] // CHECK:STDOUT: } // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- fail_abstract_twice.carbon @@ -368,6 +372,8 @@ fn Var5() { // CHECK:STDOUT: %v2.var_patt: = var_pattern %v2.patt [concrete = ] // CHECK:STDOUT: } // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- fail_abstract_first.carbon @@ -430,6 +436,8 @@ fn Var5() { // CHECK:STDOUT: %v3.var_patt: = var_pattern %v3.patt [concrete = ] // CHECK:STDOUT: } // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- fail_abstract_second.carbon @@ -492,6 +500,8 @@ fn Var5() { // CHECK:STDOUT: %v4.var_patt: = var_pattern %v4.patt [concrete = ] // CHECK:STDOUT: } // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- lib.carbon @@ -585,5 +595,7 @@ fn Var5() { // CHECK:STDOUT: %v5.var_patt: = var_pattern %v5.patt [concrete = ] // CHECK:STDOUT: } // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/class/access/access_modifers.carbon b/toolchain/check/testdata/class/access/access_modifers.carbon index 9c7cb01e40a8..85020cc0fe1f 100644 --- a/toolchain/check/testdata/class/access/access_modifers.carbon +++ b/toolchain/check/testdata/class/access/access_modifers.carbon @@ -289,6 +289,8 @@ class A { // CHECK:STDOUT: %Core.IntLiteral.as.ImplicitAs.impl.Convert.call: init %i32 = call %bound_method.loc9_13.2(%int_0) [concrete = constants.%int_0.3c0] // CHECK:STDOUT: %.loc9: init %i32 = converted %int_0, %Core.IntLiteral.as.ImplicitAs.impl.Convert.call [concrete = constants.%int_0.3c0] // CHECK:STDOUT: return %.loc9 +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Circle.Make() -> out %return.param: %Circle { @@ -306,6 +308,8 @@ class A { // CHECK:STDOUT: %.loc13_24.5: init %Circle to %return.param = class_init (%.loc13_24.4) [concrete = constants.%Circle.val] // CHECK:STDOUT: %.loc13_25: init %Circle = converted %.loc13_24.1, %.loc13_24.5 [concrete = constants.%Circle.val] // CHECK:STDOUT: return %.loc13_25 to %return.param +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Run() { @@ -339,6 +343,8 @@ class A { // CHECK:STDOUT: %Destroy.Op.bound: = bound_method %.loc18_36.2, constants.%Destroy.Op.1a2547.4 // CHECK:STDOUT: %Destroy.Op.call: init %empty_tuple.type = call %Destroy.Op.bound(%.loc18_36.2) // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Destroy.Op.loc18_36.1(%self.param: ref %i32.builtin) = "no_op"; @@ -346,16 +352,22 @@ class A { // CHECK:STDOUT: fn @Destroy.Op.loc18_36.2(%self.param: ref %i32) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Destroy.Op.loc18_36.3(%self.param: ref %struct_type.radius.c2c) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Destroy.Op.loc18_36.4(%self.param: ref %Circle) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- fail_protected_field_access.carbon @@ -415,6 +427,8 @@ class A { // CHECK:STDOUT: %x.patt: %pattern_type.6b6 = value_binding_pattern x [concrete = constants.%x.patt.939] // CHECK:STDOUT: } // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- instance_private_field_access_on_self.carbon @@ -559,6 +573,8 @@ class A { // CHECK:STDOUT: %bound_method.loc8_16.2: = bound_method %.loc8_16.2, %specific_fn // CHECK:STDOUT: %Int.as.Copy.impl.Op.call: init %i32 = call %bound_method.loc8_16.2(%.loc8_16.2) // CHECK:STDOUT: return %Int.as.Copy.impl.Op.call +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Circle.SomeInternalFunction() -> out %return.param: %i32 { @@ -571,6 +587,8 @@ class A { // CHECK:STDOUT: %Core.IntLiteral.as.ImplicitAs.impl.Convert.call: init %i32 = call %bound_method.loc12_13.2(%int_0) [concrete = constants.%int_0.3c0] // CHECK:STDOUT: %.loc12: init %i32 = converted %int_0, %Core.IntLiteral.as.ImplicitAs.impl.Convert.call [concrete = constants.%int_0.3c0] // CHECK:STDOUT: return %.loc12 +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Circle.Compute(%self.param: %Circle) -> out %return.param: %i32 { @@ -579,6 +597,8 @@ class A { // CHECK:STDOUT: %SomeInternalFunction.ref: %Circle.SomeInternalFunction.type = name_ref SomeInternalFunction, @Circle.%Circle.SomeInternalFunction.decl [concrete = constants.%Circle.SomeInternalFunction] // CHECK:STDOUT: %Circle.SomeInternalFunction.call: init %i32 = call %SomeInternalFunction.ref() // CHECK:STDOUT: return %Circle.SomeInternalFunction.call +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- public_global_access.carbon @@ -668,6 +688,8 @@ class A { // CHECK:STDOUT: %A.ref: type = name_ref A, file.%A.decl [concrete = constants.%A] // CHECK:STDOUT: %x.ref: %i32 = name_ref x, @A.%x // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- fail_global_access.carbon @@ -781,6 +803,8 @@ class A { // CHECK:STDOUT: %A.ref.loc24: type = name_ref A, file.%A.decl [concrete = constants.%A] // CHECK:STDOUT: %y.ref: = name_ref y, [concrete = ] // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- self_access.carbon @@ -827,6 +851,8 @@ class A { // CHECK:STDOUT: fn @A.F() { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @A.G() { @@ -835,5 +861,7 @@ class A { // CHECK:STDOUT: %F.ref: %A.F.type = name_ref F, @A.%A.F.decl [concrete = constants.%A.F] // CHECK:STDOUT: %A.F.call: init %empty_tuple.type = call %F.ref() // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/class/access/import_access.carbon b/toolchain/check/testdata/class/access/import_access.carbon index 0223676ca2d2..6cfd6d320529 100644 --- a/toolchain/check/testdata/class/access/import_access.carbon +++ b/toolchain/check/testdata/class/access/import_access.carbon @@ -251,6 +251,8 @@ private class Redecl {} // CHECK:STDOUT: %.loc4_1: init %Def = converted %.loc4_15.1, %.loc4_15.2 [concrete = constants.%Def.val] // CHECK:STDOUT: assign file.%c.var, %.loc4_1 // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- fail_local_def.carbon @@ -280,6 +282,8 @@ private class Redecl {} // CHECK:STDOUT: %.loc10: %empty_struct_type = struct_literal () [concrete = constants.%empty_struct] // CHECK:STDOUT: assign file.%c.var, // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- fail_other_def.carbon @@ -319,6 +323,8 @@ private class Redecl {} // CHECK:STDOUT: %.loc10: %empty_struct_type = struct_literal () [concrete = constants.%empty_struct] // CHECK:STDOUT: assign file.%c.var, // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- forward_with_def.impl.carbon @@ -370,6 +376,8 @@ private class Redecl {} // CHECK:STDOUT: %.loc4_1: init %ForwardWithDef = converted %.loc4_26.1, %.loc4_26.2 [concrete = constants.%ForwardWithDef.val] // CHECK:STDOUT: assign file.%c.var, %.loc4_1 // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- fail_local_forward_with_def.carbon @@ -399,6 +407,8 @@ private class Redecl {} // CHECK:STDOUT: %.loc10: %empty_struct_type = struct_literal () [concrete = constants.%empty_struct] // CHECK:STDOUT: assign file.%c.var, // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- fail_other_forward_with_def.carbon @@ -438,6 +448,8 @@ private class Redecl {} // CHECK:STDOUT: %.loc10: %empty_struct_type = struct_literal () [concrete = constants.%empty_struct] // CHECK:STDOUT: assign file.%c.var, // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- forward.impl.carbon @@ -490,6 +502,8 @@ private class Redecl {} // CHECK:STDOUT: fn @F(%c.param: %ptr) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- fail_local_forward.carbon @@ -521,6 +535,8 @@ private class Redecl {} // CHECK:STDOUT: fn @F(%c.param: ) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- fail_other_forward.carbon @@ -560,6 +576,8 @@ private class Redecl {} // CHECK:STDOUT: fn @F(%c.param: ) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- todo_fail_private_on_redecl.carbon diff --git a/toolchain/check/testdata/class/access/inheritance_access.carbon b/toolchain/check/testdata/class/access/inheritance_access.carbon index 439a44149799..945de3b7ace3 100644 --- a/toolchain/check/testdata/class/access/inheritance_access.carbon +++ b/toolchain/check/testdata/class/access/inheritance_access.carbon @@ -427,6 +427,8 @@ class B { // CHECK:STDOUT: %.loc13_27.4: init %tuple.type.e55 to %return.param = tuple_init (%.loc13_27.2, %.loc13_27.3) // CHECK:STDOUT: %.loc13_28: init %tuple.type.e55 = converted %.loc13_27.1, %.loc13_27.4 // CHECK:STDOUT: return %.loc13_28 to %return.param +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- shadowing_access.carbon @@ -563,6 +565,8 @@ class B { // CHECK:STDOUT: %F.ref: %A.F.type = name_ref F, @A.%A.F.decl [concrete = constants.%A.F] // CHECK:STDOUT: %A.F.call: init %empty_tuple.type = call %F.ref() // CHECK:STDOUT: return %A.F.call +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- inherited_member_access.carbon @@ -724,6 +728,8 @@ class B { // CHECK:STDOUT: %Core.IntLiteral.as.ImplicitAs.impl.Convert.call: init %i32 = call %bound_method.loc7_13.2(%int_5) [concrete = constants.%int_5.eef] // CHECK:STDOUT: %.loc7: init %i32 = converted %int_5, %Core.IntLiteral.as.ImplicitAs.impl.Convert.call [concrete = constants.%int_5.eef] // CHECK:STDOUT: return %.loc7 +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @B.G() -> out %return.param: %i32 { @@ -736,6 +742,8 @@ class B { // CHECK:STDOUT: %bound_method.loc15_13.2: = bound_method %SOME_CONSTANT.ref, %specific_fn // CHECK:STDOUT: %Int.as.Copy.impl.Op.call: init %i32 = call %bound_method.loc15_13.2(%SOME_CONSTANT.ref) // CHECK:STDOUT: return %Int.as.Copy.impl.Op.call +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @B.H() -> out %return.param: %i32 { @@ -744,6 +752,8 @@ class B { // CHECK:STDOUT: %SomeProtectedFunction.ref: %A.SomeProtectedFunction.type = name_ref SomeProtectedFunction, @A.%A.SomeProtectedFunction.decl [concrete = constants.%A.SomeProtectedFunction] // CHECK:STDOUT: %A.SomeProtectedFunction.call: init %i32 = call %SomeProtectedFunction.ref() // CHECK:STDOUT: return %A.SomeProtectedFunction.call +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- fail_inherited_private_field_access.carbon @@ -836,6 +846,8 @@ class B { // CHECK:STDOUT: %self.ref: %Square = name_ref self, %self // CHECK:STDOUT: %y.ref: = name_ref y, [concrete = ] // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- noninstance_private_on_self.carbon @@ -882,6 +894,8 @@ class B { // CHECK:STDOUT: fn @C.F() { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @C.G() { @@ -892,6 +906,8 @@ class B { // CHECK:STDOUT: %F.ref.loc8: %C.F.type = name_ref F, @C.%C.F.decl [concrete = constants.%C.F] // CHECK:STDOUT: %C.F.call.loc8: init %empty_tuple.type = call %F.ref.loc8() // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- noninstance_protected_on_self.carbon @@ -938,6 +954,8 @@ class B { // CHECK:STDOUT: fn @C.F() { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @C.G() { @@ -948,6 +966,8 @@ class B { // CHECK:STDOUT: %F.ref.loc8: %C.F.type = name_ref F, @C.%C.F.decl [concrete = constants.%C.F] // CHECK:STDOUT: %C.F.call.loc8: init %empty_tuple.type = call %F.ref.loc8() // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- fail_noninstance_private_on_parent_qualified.carbon @@ -1013,6 +1033,8 @@ class B { // CHECK:STDOUT: fn @B.F() { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @C.G() { @@ -1020,6 +1042,8 @@ class B { // CHECK:STDOUT: %Self.ref: type = name_ref Self, constants.%C [concrete = constants.%C] // CHECK:STDOUT: %F.ref: = name_ref F, [concrete = ] // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- fail_noninstance_private_on_parent_unqualified.carbon @@ -1175,29 +1199,39 @@ class B { // CHECK:STDOUT: fn @A.Fa() { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @B.Fb() { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @C.G1() -> out %return.param: %i32 { // CHECK:STDOUT: !entry: // CHECK:STDOUT: %SOME_PRIVATE_CONSTANT.ref: = name_ref SOME_PRIVATE_CONSTANT, [concrete = ] // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @C.G2() { // CHECK:STDOUT: !entry: // CHECK:STDOUT: %Fa.ref: = name_ref Fa, [concrete = ] // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @C.G3() { // CHECK:STDOUT: !entry: // CHECK:STDOUT: %Fb.ref: = name_ref Fb, [concrete = ] // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- noninstance_protected_on_parent.carbon @@ -1264,6 +1298,8 @@ class B { // CHECK:STDOUT: fn @B.F() { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @C.G() { @@ -1272,6 +1308,8 @@ class B { // CHECK:STDOUT: %F.ref: %B.F.type = name_ref F, @B.%B.F.decl [concrete = constants.%B.F] // CHECK:STDOUT: %B.F.call: init %empty_tuple.type = call %F.ref() // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- fail_non_inherited_access.carbon @@ -1450,6 +1488,8 @@ class B { // CHECK:STDOUT: %A.ref.loc33: type = name_ref A, file.%A.decl [concrete = constants.%A] // CHECK:STDOUT: %SOME_PROTECTED_CONSTANT.ref: = name_ref SOME_PROTECTED_CONSTANT, [concrete = ] // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @B.SomeFunc(%self.param: %B) -> out %return.param: %i32 { @@ -1460,6 +1500,8 @@ class B { // CHECK:STDOUT: %.loc44_16.2: %Internal = acquire_value %.loc44_16.1 // CHECK:STDOUT: %INTERNAL_CONSTANT.ref: = name_ref INTERNAL_CONSTANT, [concrete = ] // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- fail_compound_member_access.carbon @@ -1543,6 +1585,8 @@ class B { // CHECK:STDOUT: %A.ref: type = name_ref A, file.%A.decl [concrete = constants.%A] // CHECK:STDOUT: %x.ref: = name_ref x, [concrete = ] // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- inherited_compound_member_access.carbon @@ -1630,5 +1674,7 @@ class B { // CHECK:STDOUT: %.loc12_9.3: ref %A = converted %self.ref, %.loc12_9.2 // CHECK:STDOUT: %.loc12_9.4: ref %i32 = class_element_access %.loc12_9.3, element0 // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/class/access/method_access.carbon b/toolchain/check/testdata/class/access/method_access.carbon index 4ac0f696e66b..eb1cd7f946e4 100644 --- a/toolchain/check/testdata/class/access/method_access.carbon +++ b/toolchain/check/testdata/class/access/method_access.carbon @@ -88,5 +88,7 @@ fn G(x: X) { // CHECK:STDOUT: %X.F.bound: = bound_method %x.ref.loc12_6, %F.ref // CHECK:STDOUT: %X.F.call: init %empty_tuple.type = call %X.F.bound(%x.ref.loc12_6) // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/class/adapter/adapt.carbon b/toolchain/check/testdata/class/adapter/adapt.carbon index 78a304e8ce81..66fcf0d9e875 100644 --- a/toolchain/check/testdata/class/adapter/adapt.carbon +++ b/toolchain/check/testdata/class/adapter/adapt.carbon @@ -214,6 +214,8 @@ interface I { // CHECK:STDOUT: %a.ref: %AdaptNotExtend = name_ref a, %a // CHECK:STDOUT: %F.ref: = name_ref F, [concrete = ] // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- fail_misplaced.carbon @@ -261,12 +263,16 @@ interface I { // CHECK:STDOUT: witness = () // CHECK:STDOUT: // CHECK:STDOUT: !requires: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @F() { // CHECK:STDOUT: !entry: // CHECK:STDOUT: %i32: type = type_literal constants.%i32 [concrete = constants.%i32] // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: specific @I.WithSelf(constants.%Self) {} diff --git a/toolchain/check/testdata/class/adapter/adapt_copy.carbon b/toolchain/check/testdata/class/adapter/adapt_copy.carbon index 3aa5870e4e8e..2f29388cdc76 100644 --- a/toolchain/check/testdata/class/adapter/adapt_copy.carbon +++ b/toolchain/check/testdata/class/adapter/adapt_copy.carbon @@ -299,6 +299,8 @@ fn InTuple(c: (AdaptStruct, u32)) -> (AdaptStruct, u32) { // CHECK:STDOUT: %Destroy.Op.bound: = bound_method %d.var, constants.%Destroy.Op.1a2547.3 // CHECK:STDOUT: %Destroy.Op.call: init %empty_tuple.type = call %Destroy.Op.bound(%d.var) // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Destroy.Op.loc16_3.1(%self.param: ref %i32.builtin) = "no_op"; @@ -306,11 +308,15 @@ fn InTuple(c: (AdaptStruct, u32)) -> (AdaptStruct, u32) { // CHECK:STDOUT: fn @Destroy.Op.loc16_3.2(%self.param: ref %i32) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Destroy.Op.loc16_3.3(%self.param: ref %AdaptCopyable) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @InTuple(%c.param: %tuple.type.28f) -> out %return.param: %tuple.type.28f { @@ -336,6 +342,8 @@ fn InTuple(c: (AdaptStruct, u32)) -> (AdaptStruct, u32) { // CHECK:STDOUT: %Destroy.Op.bound: = bound_method %d.var, constants.%Destroy.Op.1a2547.6 // CHECK:STDOUT: %Destroy.Op.call: init %empty_tuple.type = call %Destroy.Op.bound(%d.var) // CHECK:STDOUT: return to %return.param +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Destroy.Op.loc35_3.1(%self.param: ref %u32.builtin) = "no_op"; @@ -343,11 +351,15 @@ fn InTuple(c: (AdaptStruct, u32)) -> (AdaptStruct, u32) { // CHECK:STDOUT: fn @Destroy.Op.loc35_3.2(%self.param: ref %u32) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Destroy.Op.loc35_3.3(%self.param: ref %tuple.type.28f) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- adapt_copyable_tuple.carbon @@ -555,6 +567,8 @@ fn InTuple(c: (AdaptStruct, u32)) -> (AdaptStruct, u32) { // CHECK:STDOUT: %Destroy.Op.bound: = bound_method %d.var, constants.%Destroy.Op.1a2547.4 // CHECK:STDOUT: %Destroy.Op.call: init %empty_tuple.type = call %Destroy.Op.bound(%d.var) // CHECK:STDOUT: return %.loc10_11.9 to %return.param +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Destroy.Op.loc9_3.1(%self.param: ref %i32.builtin) = "no_op"; @@ -562,16 +576,22 @@ fn InTuple(c: (AdaptStruct, u32)) -> (AdaptStruct, u32) { // CHECK:STDOUT: fn @Destroy.Op.loc9_3.2(%self.param: ref %i32) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Destroy.Op.loc9_3.3(%self.param: ref %tuple.type.e55) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Destroy.Op.loc9_3.4(%self.param: ref %AdaptTuple) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @InTuple(%c.param: %tuple.type.e88) -> out %return.param: %tuple.type.e88 { @@ -663,6 +683,8 @@ fn InTuple(c: (AdaptStruct, u32)) -> (AdaptStruct, u32) { // CHECK:STDOUT: %Destroy.Op.bound: = bound_method %d.var, constants.%Destroy.Op.1a2547.7 // CHECK:STDOUT: %Destroy.Op.call: init %empty_tuple.type = call %Destroy.Op.bound(%d.var) // CHECK:STDOUT: return %.loc15_11 to %return.param +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Destroy.Op.loc14_3.1(%self.param: ref %u32.builtin) = "no_op"; @@ -670,11 +692,15 @@ fn InTuple(c: (AdaptStruct, u32)) -> (AdaptStruct, u32) { // CHECK:STDOUT: fn @Destroy.Op.loc14_3.2(%self.param: ref %u32) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Destroy.Op.loc14_3.3(%self.param: ref %tuple.type.e88) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- fail_adapt_not_copyable.carbon @@ -773,6 +799,8 @@ fn InTuple(c: (AdaptStruct, u32)) -> (AdaptStruct, u32) { // CHECK:STDOUT: %Destroy.Op.bound: = bound_method %b.var, constants.%Destroy.Op.1a2547.3 // CHECK:STDOUT: %Destroy.Op.call: init %empty_tuple.type = call %Destroy.Op.bound(%b.var) // CHECK:STDOUT: return to %return.param +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Destroy.Op.loc20_3.1(%self.param: ref %empty_struct_type) = "no_op"; @@ -780,11 +808,15 @@ fn InTuple(c: (AdaptStruct, u32)) -> (AdaptStruct, u32) { // CHECK:STDOUT: fn @Destroy.Op.loc20_3.2(%self.param: ref %Noncopyable) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Destroy.Op.loc20_3.3(%self.param: ref %AdaptNoncopyable) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- fail_adapt_not_copyable_indirect.carbon @@ -933,6 +965,8 @@ fn InTuple(c: (AdaptStruct, u32)) -> (AdaptStruct, u32) { // CHECK:STDOUT: %Destroy.Op.bound: = bound_method %b.var, constants.%Destroy.Op.1a2547.6 // CHECK:STDOUT: %Destroy.Op.call: init %empty_tuple.type = call %Destroy.Op.bound(%b.var) // CHECK:STDOUT: return to %return.param +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Destroy.Op.loc23_3.1(%self.param: ref %i32.builtin) = "no_op"; @@ -940,6 +974,8 @@ fn InTuple(c: (AdaptStruct, u32)) -> (AdaptStruct, u32) { // CHECK:STDOUT: fn @Destroy.Op.loc23_3.2(%self.param: ref %i32) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Destroy.Op.loc23_3.3(%self.param: ref %empty_struct_type) = "no_op"; @@ -947,16 +983,22 @@ fn InTuple(c: (AdaptStruct, u32)) -> (AdaptStruct, u32) { // CHECK:STDOUT: fn @Destroy.Op.loc23_3.4(%self.param: ref %Noncopyable) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Destroy.Op.loc23_3.5(%self.param: ref %tuple.type.227) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Destroy.Op.loc23_3.6(%self.param: ref %AdaptNoncopyableIndirect) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- adapt_copyable_struct.carbon @@ -1162,6 +1204,8 @@ fn InTuple(c: (AdaptStruct, u32)) -> (AdaptStruct, u32) { // CHECK:STDOUT: %Destroy.Op.bound: = bound_method %h.var, constants.%Destroy.Op.1a2547.4 // CHECK:STDOUT: %Destroy.Op.call: init %empty_tuple.type = call %Destroy.Op.bound(%h.var) // CHECK:STDOUT: return %.loc10_11.13 to %return.param +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Destroy.Op.loc9_3.1(%self.param: ref %i32.builtin) = "no_op"; @@ -1169,16 +1213,22 @@ fn InTuple(c: (AdaptStruct, u32)) -> (AdaptStruct, u32) { // CHECK:STDOUT: fn @Destroy.Op.loc9_3.2(%self.param: ref %i32) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Destroy.Op.loc9_3.3(%self.param: ref %struct_type.e.f) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Destroy.Op.loc9_3.4(%self.param: ref %AdaptStruct) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @InTuple(%c.param: %tuple.type.e00) -> out %return.param: %tuple.type.e00 { @@ -1270,6 +1320,8 @@ fn InTuple(c: (AdaptStruct, u32)) -> (AdaptStruct, u32) { // CHECK:STDOUT: %Destroy.Op.bound: = bound_method %d.var, constants.%Destroy.Op.1a2547.7 // CHECK:STDOUT: %Destroy.Op.call: init %empty_tuple.type = call %Destroy.Op.bound(%d.var) // CHECK:STDOUT: return %.loc15_11 to %return.param +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Destroy.Op.loc14_3.1(%self.param: ref %u32.builtin) = "no_op"; @@ -1277,10 +1329,14 @@ fn InTuple(c: (AdaptStruct, u32)) -> (AdaptStruct, u32) { // CHECK:STDOUT: fn @Destroy.Op.loc14_3.2(%self.param: ref %u32) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Destroy.Op.loc14_3.3(%self.param: ref %tuple.type.e00) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/class/adapter/extend_adapt.carbon b/toolchain/check/testdata/class/adapter/extend_adapt.carbon index 1bc214eb85a5..a0e2eeb38b73 100644 --- a/toolchain/check/testdata/class/adapter/extend_adapt.carbon +++ b/toolchain/check/testdata/class/adapter/extend_adapt.carbon @@ -257,6 +257,8 @@ fn F(a: IntAdapter) -> i32 { // CHECK:STDOUT: %StaticMemberFunction.ref: %SomeClass.StaticMemberFunction.type = name_ref StaticMemberFunction, @SomeClass.%SomeClass.StaticMemberFunction.decl [concrete = constants.%SomeClass.StaticMemberFunction] // CHECK:STDOUT: %SomeClass.StaticMemberFunction.call: init %empty_tuple.type = call %StaticMemberFunction.ref() // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @TestAdapterMethod(%a.param: %SomeClassAdapter) { @@ -266,6 +268,8 @@ fn F(a: IntAdapter) -> i32 { // CHECK:STDOUT: %SomeClass.AdapterMethod.bound: = bound_method %a.ref, %AdapterMethod.ref // CHECK:STDOUT: %SomeClass.AdapterMethod.call: init %empty_tuple.type = call %SomeClass.AdapterMethod.bound(%a.ref) // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- fail_todo_method_access.carbon @@ -359,6 +363,8 @@ fn F(a: IntAdapter) -> i32 { // CHECK:STDOUT: %.loc23: %SomeClass = converted %a.ref, [concrete = ] // CHECK:STDOUT: %SomeClass.F.call: init %empty_tuple.type = call %SomeClass.F.bound() // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- fail_todo_field_access.carbon @@ -455,6 +461,8 @@ fn F(a: IntAdapter) -> i32 { // CHECK:STDOUT: %.loc21_11.1: %SomeClass = converted %a.ref, [concrete = ] // CHECK:STDOUT: %.loc21_11.2: %i32 = class_element_access , element1 [concrete = ] // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- fail_todo_adapt_struct.carbon @@ -530,6 +538,8 @@ fn F(a: IntAdapter) -> i32 { // CHECK:STDOUT: %a.ref: %StructAdapter = name_ref a, %a // CHECK:STDOUT: %b.ref: = name_ref b, [concrete = ] // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- fail_todo_adapt_tuple.carbon @@ -608,6 +618,8 @@ fn F(a: IntAdapter) -> i32 { // CHECK:STDOUT: %a.ref: %TupleAdapter = name_ref a, %a // CHECK:STDOUT: %int_1: Core.IntLiteral = int_value 1 [concrete = constants.%int_1] // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- fail_adapt_builtin.carbon @@ -717,5 +729,7 @@ fn F(a: IntAdapter) -> i32 { // CHECK:STDOUT: %a.ref: %IntAdapter = name_ref a, %a // CHECK:STDOUT: %foo.ref: = name_ref foo, [concrete = ] // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/class/adapter/init_adapt.carbon b/toolchain/check/testdata/class/adapter/init_adapt.carbon index 8825335e390d..9957fe2b2ac5 100644 --- a/toolchain/check/testdata/class/adapter/init_adapt.carbon +++ b/toolchain/check/testdata/class/adapter/init_adapt.carbon @@ -308,6 +308,8 @@ var e: C = MakeAdaptC(); // CHECK:STDOUT: %.loc25_25.2: init %C = converted %MakeAdaptC.call, %.loc25_25.1 // CHECK:STDOUT: assign file.%e.var, %.loc25_25.2 // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- fail_not_implicit.carbon @@ -514,5 +516,7 @@ var e: C = MakeAdaptC(); // CHECK:STDOUT: %.loc55_1: %C = converted %MakeAdaptC.call, [concrete = ] // CHECK:STDOUT: assign file.%e.var, // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/class/basic.carbon b/toolchain/check/testdata/class/basic.carbon index 875d4cc13e54..e133e7582c40 100644 --- a/toolchain/check/testdata/class/basic.carbon +++ b/toolchain/check/testdata/class/basic.carbon @@ -182,6 +182,8 @@ fn Run() -> i32 { // CHECK:STDOUT: %bound_method.loc17_12.2: = bound_method %n.ref, %specific_fn // CHECK:STDOUT: %Int.as.Copy.impl.Op.call: init %i32 = call %bound_method.loc17_12.2(%n.ref) // CHECK:STDOUT: return %Int.as.Copy.impl.Op.call +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Class.G(%n.param.loc25: %i32) -> out %return.param.loc25: %i32 { @@ -193,6 +195,8 @@ fn Run() -> i32 { // CHECK:STDOUT: %bound_method.loc26_10.2: = bound_method %n.ref, %specific_fn // CHECK:STDOUT: %Int.as.Copy.impl.Op.call: init %i32 = call %bound_method.loc26_10.2(%n.ref) // CHECK:STDOUT: return %Int.as.Copy.impl.Op.call +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Run() -> out %return.param: %i32 { @@ -209,5 +213,7 @@ fn Run() -> i32 { // CHECK:STDOUT: %.loc30_18.2: %i32 = converted %int_4, %.loc30_18.1 [concrete = constants.%int_4.4eb] // CHECK:STDOUT: %Class.F.call: init %i32 = call %F.ref(%.loc30_18.2) // CHECK:STDOUT: return %Class.F.call +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/class/complete_in_member_fn.carbon b/toolchain/check/testdata/class/complete_in_member_fn.carbon index 63781aaceb4b..00aee31a6331 100644 --- a/toolchain/check/testdata/class/complete_in_member_fn.carbon +++ b/toolchain/check/testdata/class/complete_in_member_fn.carbon @@ -111,5 +111,7 @@ class C { // CHECK:STDOUT: %bound_method.loc16_31.2: = bound_method %.loc16_31.2, %specific_fn // CHECK:STDOUT: %Int.as.Copy.impl.Op.call: init %i32 = call %bound_method.loc16_31.2(%.loc16_31.2) // CHECK:STDOUT: return %Int.as.Copy.impl.Op.call +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/class/cross_package_import.carbon b/toolchain/check/testdata/class/cross_package_import.carbon index 45d5b9edec83..aadb3dcd774f 100644 --- a/toolchain/check/testdata/class/cross_package_import.carbon +++ b/toolchain/check/testdata/class/cross_package_import.carbon @@ -186,6 +186,8 @@ var c: Other.C = {}; // CHECK:STDOUT: fn @C() { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- define.carbon @@ -249,6 +251,8 @@ var c: Other.C = {}; // CHECK:STDOUT: %.loc6_1: init %C = converted %.loc6_19.1, %.loc6_19.2 [concrete = constants.%C.val] // CHECK:STDOUT: assign file.%c.var, %.loc6_1 // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- fail_extern.carbon @@ -298,6 +302,8 @@ var c: Other.C = {}; // CHECK:STDOUT: %.loc14: %empty_struct_type = struct_literal () [concrete = constants.%empty_struct] // CHECK:STDOUT: assign file.%c.var, // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- fail_todo_merge_define_extern.carbon @@ -362,6 +368,8 @@ var c: Other.C = {}; // CHECK:STDOUT: %.loc19_1: init %C = converted %.loc19_19.1, %.loc19_19.2 [concrete = constants.%C.val] // CHECK:STDOUT: assign file.%c.var, %.loc19_1 // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- fail_conflict.carbon @@ -426,5 +434,7 @@ var c: Other.C = {}; // CHECK:STDOUT: %.loc19_1: init %C = converted %.loc19_19.1, %.loc19_19.2 [concrete = constants.%C.val] // CHECK:STDOUT: assign file.%c.var, %.loc19_1 // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/class/destroy_calls.carbon b/toolchain/check/testdata/class/destroy_calls.carbon index 26bea52e4a8f..2af1f8cf86f4 100644 --- a/toolchain/check/testdata/class/destroy_calls.carbon +++ b/toolchain/check/testdata/class/destroy_calls.carbon @@ -166,6 +166,8 @@ fn G() { F({}); } // CHECK:STDOUT: %Destroy.Op.bound.loc10: = bound_method %a.var, constants.%Destroy.Op.1a2547.4 // CHECK:STDOUT: %Destroy.Op.call.loc10: init %empty_tuple.type = call %Destroy.Op.bound.loc10(%a.var) // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Destroy.Op.loc12_3.1(%self.param: ref %empty_struct_type) = "no_op"; @@ -173,16 +175,22 @@ fn G() { F({}); } // CHECK:STDOUT: fn @Destroy.Op.loc12_3.2(%self.param: ref %C) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Destroy.Op.loc11(%self.param: ref %B) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Destroy.Op.loc10(%self.param: ref %A) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- nested_scope.carbon @@ -270,6 +278,8 @@ fn G() { F({}); } // CHECK:STDOUT: %Destroy.Op.bound.loc10: = bound_method %a.var, constants.%Destroy.Op.1a2547.4 // CHECK:STDOUT: %Destroy.Op.call.loc10: init %empty_tuple.type = call %Destroy.Op.bound.loc10(%a.var) // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Destroy.Op.loc13_5.1(%self.param: ref %empty_struct_type) = "no_op"; @@ -277,16 +287,22 @@ fn G() { F({}); } // CHECK:STDOUT: fn @Destroy.Op.loc13_5.2(%self.param: ref %C) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Destroy.Op.loc11(%self.param: ref %B) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Destroy.Op.loc10(%self.param: ref %A) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- temp.carbon @@ -341,6 +357,8 @@ fn G() { F({}); } // CHECK:STDOUT: %Destroy.Op.bound.loc12: = bound_method %.loc12_10.2, constants.%Destroy.Op.1a2547.4 // CHECK:STDOUT: %Destroy.Op.call.loc12: init %empty_tuple.type = call %Destroy.Op.bound.loc12(%.loc12_10.2) // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Destroy.Op.loc14_10.1(%self.param: ref %empty_struct_type) = "no_op"; @@ -348,16 +366,22 @@ fn G() { F({}); } // CHECK:STDOUT: fn @Destroy.Op.loc14_10.2(%self.param: ref %C) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Destroy.Op.loc13(%self.param: ref %B) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Destroy.Op.loc12(%self.param: ref %A) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- generic_class.carbon @@ -404,6 +428,8 @@ fn G() { F({}); } // CHECK:STDOUT: %Destroy.Op.bound: = bound_method %a.var, constants.%Destroy.Op.1a2547.2 // CHECK:STDOUT: %Destroy.Op.call: init %empty_tuple.type = call %Destroy.Op.bound(%a.var) // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Destroy.Op.loc9_3.1(%self.param: ref %empty_struct_type) = "no_op"; @@ -411,6 +437,8 @@ fn G() { F({}); } // CHECK:STDOUT: fn @Destroy.Op.loc9_3.2(%self.param: ref %D.dee) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- generic_use_inside_generic.carbon @@ -512,6 +540,8 @@ fn G() { F({}); } // CHECK:STDOUT: %bound_method.loc7_3.2: = bound_method %v.var, %specific_impl_fn.loc7_3.1 // CHECK:STDOUT: %Destroy.WithSelf.Op.call: init %empty_tuple.type = call %bound_method.loc7_3.2(%v.var) // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: @@ -520,6 +550,8 @@ fn G() { F({}); } // CHECK:STDOUT: fn @Destroy.Op.loc7_3.2(%self.param: ref %C.d8e) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: specific @F(constants.%T) { diff --git a/toolchain/check/testdata/class/export_name.carbon b/toolchain/check/testdata/class/export_name.carbon index 8ce67c89cab9..3c5bae1920d9 100644 --- a/toolchain/check/testdata/class/export_name.carbon +++ b/toolchain/check/testdata/class/export_name.carbon @@ -142,5 +142,7 @@ var c: C = {}; // CHECK:STDOUT: %.loc6_1: init %C = converted %.loc6_13.1, %.loc6_13.2 [concrete = constants.%C.val] // CHECK:STDOUT: assign file.%c.var, %.loc6_1 // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/class/field/compound_field.carbon b/toolchain/check/testdata/class/field/compound_field.carbon index a6abefc45ea5..1df1dcb90cd3 100644 --- a/toolchain/check/testdata/class/field/compound_field.carbon +++ b/toolchain/check/testdata/class/field/compound_field.carbon @@ -242,6 +242,8 @@ fn AccessBaseIndirect(p: Derived*) -> i32* { // CHECK:STDOUT: %bound_method.loc29_11.2: = bound_method %.loc29_11.2, %specific_fn // CHECK:STDOUT: %Int.as.Copy.impl.Op.call: init %i32 = call %bound_method.loc29_11.2(%.loc29_11.2) // CHECK:STDOUT: return %Int.as.Copy.impl.Op.call +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @AccessBase(%d.param: %Derived) -> out %return.param: %i32 { @@ -260,6 +262,8 @@ fn AccessBaseIndirect(p: Derived*) -> i32* { // CHECK:STDOUT: %bound_method.loc33_11.2: = bound_method %.loc33_11.5, %specific_fn // CHECK:STDOUT: %Int.as.Copy.impl.Op.call: init %i32 = call %bound_method.loc33_11.2(%.loc33_11.5) // CHECK:STDOUT: return %Int.as.Copy.impl.Op.call +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @AccessDerivedIndirect(%p.param: %ptr.64c) -> out %return.param: %ptr.d08 { @@ -276,6 +280,8 @@ fn AccessBaseIndirect(p: Derived*) -> i32* { // CHECK:STDOUT: %bound_method.loc37_10.2: = bound_method %addr, %specific_fn // CHECK:STDOUT: %ptr.as.Copy.impl.Op.call: init %ptr.d08 = call %bound_method.loc37_10.2(%addr) // CHECK:STDOUT: return %ptr.as.Copy.impl.Op.call +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @AccessBaseIndirect(%p.param: %ptr.64c) -> out %return.param: %ptr.d08 { @@ -295,5 +301,7 @@ fn AccessBaseIndirect(p: Derived*) -> i32* { // CHECK:STDOUT: %bound_method.loc41_10.2: = bound_method %addr, %specific_fn // CHECK:STDOUT: %ptr.as.Copy.impl.Op.call: init %ptr.d08 = call %bound_method.loc41_10.2(%addr) // CHECK:STDOUT: return %ptr.as.Copy.impl.Op.call +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/class/field/field_access.carbon b/toolchain/check/testdata/class/field/field_access.carbon index 546347b83b60..4f9eb73894d5 100644 --- a/toolchain/check/testdata/class/field/field_access.carbon +++ b/toolchain/check/testdata/class/field/field_access.carbon @@ -222,6 +222,8 @@ fn Run() { // CHECK:STDOUT: %Destroy.Op.bound.loc21: = bound_method %c.var, constants.%Destroy.Op.1a2547.4 // CHECK:STDOUT: %Destroy.Op.call.loc21: init %empty_tuple.type = call %Destroy.Op.bound.loc21(%c.var) // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Destroy.Op.loc25_3.1(%self.param: ref %i32.builtin) = "no_op"; @@ -229,15 +231,21 @@ fn Run() { // CHECK:STDOUT: fn @Destroy.Op.loc25_3.2(%self.param: ref %i32) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Destroy.Op.loc21_3.1(%self.param: ref %struct_type.j.k) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Destroy.Op.loc21_3.2(%self.param: ref %Class) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/class/field/field_access_in_value.carbon b/toolchain/check/testdata/class/field/field_access_in_value.carbon index 507da156021c..69ca358022ad 100644 --- a/toolchain/check/testdata/class/field/field_access_in_value.carbon +++ b/toolchain/check/testdata/class/field/field_access_in_value.carbon @@ -231,6 +231,8 @@ fn Test() { // CHECK:STDOUT: %Destroy.Op.bound.loc21: = bound_method %cv.var, constants.%Destroy.Op.1a2547.4 // CHECK:STDOUT: %Destroy.Op.call.loc21: init %empty_tuple.type = call %Destroy.Op.bound.loc21(%cv.var) // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Destroy.Op.loc26_3.1(%self.param: ref %i32.builtin) = "no_op"; @@ -238,15 +240,21 @@ fn Test() { // CHECK:STDOUT: fn @Destroy.Op.loc26_3.2(%self.param: ref %i32) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Destroy.Op.loc21_3.1(%self.param: ref %struct_type.j.k) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Destroy.Op.loc21_3.2(%self.param: ref %Class) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/class/field/field_initializer.carbon b/toolchain/check/testdata/class/field/field_initializer.carbon index a90bdd640ca6..cbe996834108 100644 --- a/toolchain/check/testdata/class/field/field_initializer.carbon +++ b/toolchain/check/testdata/class/field/field_initializer.carbon @@ -157,5 +157,7 @@ var C: Class = {}; // CHECK:STDOUT: %.loc8_1: init %Class = converted %.loc8_17.1, %.loc8_17.2 [concrete = constants.%Class.val] // CHECK:STDOUT: assign file.%C.var, %.loc8_1 // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/class/field/static.carbon b/toolchain/check/testdata/class/field/static.carbon index 6fa7ab4bb953..b4ee405486bd 100644 --- a/toolchain/check/testdata/class/field/static.carbon +++ b/toolchain/check/testdata/class/field/static.carbon @@ -144,6 +144,8 @@ fn F() { // CHECK:STDOUT: %.loc10: init %i32 = converted %int_456, %Core.IntLiteral.as.ImplicitAs.impl.Convert.call [concrete = constants.%int_456.8dd] // CHECK:STDOUT: assign %static_field.ref, %.loc10 // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @__global_init() { @@ -164,5 +166,7 @@ fn F() { // CHECK:STDOUT: %.loc6: init %i32 = converted %int_123, %Core.IntLiteral.as.ImplicitAs.impl.Convert.call [concrete = constants.%int_123.2bf] // CHECK:STDOUT: assign @C.%static_field_with_init.var, %.loc6 // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/class/forward_declared.carbon b/toolchain/check/testdata/class/forward_declared.carbon index c92c0e6bcce0..0dde4cac793d 100644 --- a/toolchain/check/testdata/class/forward_declared.carbon +++ b/toolchain/check/testdata/class/forward_declared.carbon @@ -92,5 +92,7 @@ fn F(p: Class*) -> Class* { return p; } // CHECK:STDOUT: %bound_method.loc17_36.2: = bound_method %p.ref, %specific_fn // CHECK:STDOUT: %ptr.as.Copy.impl.Op.call: init %ptr.7ee = call %bound_method.loc17_36.2(%p.ref) // CHECK:STDOUT: return %ptr.as.Copy.impl.Op.call +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/class/generic/adapt.carbon b/toolchain/check/testdata/class/generic/adapt.carbon index 80c1179d6294..8a560ecda6fa 100644 --- a/toolchain/check/testdata/class/generic/adapt.carbon +++ b/toolchain/check/testdata/class/generic/adapt.carbon @@ -278,6 +278,8 @@ fn ImportedConvertLocal(a: Adapter(C)) -> i32 { // CHECK:STDOUT: %bound_method.loc13_23.2: = bound_method %.loc13_23.2, %specific_fn // CHECK:STDOUT: %Int.as.Copy.impl.Op.call: init %i32 = call %bound_method.loc13_23.2(%.loc13_23.2) // CHECK:STDOUT: return %Int.as.Copy.impl.Op.call +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: specific @C(constants.%T.67d) { @@ -443,6 +445,8 @@ fn ImportedConvertLocal(a: Adapter(C)) -> i32 { // CHECK:STDOUT: %bound_method.loc7_23.2: = bound_method %.loc7_23.2, %specific_fn // CHECK:STDOUT: %Int.as.Copy.impl.Op.call: init %i32 = call %bound_method.loc7_23.2(%.loc7_23.2) // CHECK:STDOUT: return %Int.as.Copy.impl.Op.call +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: specific @C(constants.%T.67d) { @@ -598,6 +602,8 @@ fn ImportedConvertLocal(a: Adapter(C)) -> i32 { // CHECK:STDOUT: %.loc21_11.1: %C.3b7 = converted %a.ref, [concrete = ] // CHECK:STDOUT: %.loc21_11.2: %i32 = class_element_access , element0 [concrete = ] // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: specific @C(constants.%T) { @@ -859,6 +865,8 @@ fn ImportedConvertLocal(a: Adapter(C)) -> i32 { // CHECK:STDOUT: %.loc15_11.1: %C.3b7 = converted %a.ref, [concrete = ] // CHECK:STDOUT: %.loc15_11.2: %i32 = class_element_access , element0 [concrete = ] // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: specific @C(constants.%T) { @@ -1004,6 +1012,8 @@ fn ImportedConvertLocal(a: Adapter(C)) -> i32 { // CHECK:STDOUT: %bound_method.loc9_12.2: = bound_method %.loc9_12.2, %specific_fn // CHECK:STDOUT: %Int.as.Copy.impl.Op.call: init %i32 = call %bound_method.loc9_12.2(%.loc9_12.2) // CHECK:STDOUT: return %Int.as.Copy.impl.Op.call +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: specific @Adapter(constants.%T.67d) { @@ -1177,6 +1187,8 @@ fn ImportedConvertLocal(a: Adapter(C)) -> i32 { // CHECK:STDOUT: %bound_method.loc7_12.2: = bound_method %.loc7_12.2, %specific_fn // CHECK:STDOUT: %Int.as.Copy.impl.Op.call: init %i32 = call %bound_method.loc7_12.2(%.loc7_12.2) // CHECK:STDOUT: return %Int.as.Copy.impl.Op.call +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @ImportedConvertLocal(%a.param: %Adapter.347) -> out %return.param: %i32 { @@ -1194,6 +1206,8 @@ fn ImportedConvertLocal(a: Adapter(C)) -> i32 { // CHECK:STDOUT: %bound_method.loc15_18.2: = bound_method %.loc15_18.2, %specific_fn // CHECK:STDOUT: %Int.as.Copy.impl.Op.call: init %i32 = call %bound_method.loc15_18.2(%.loc15_18.2) // CHECK:STDOUT: return %Int.as.Copy.impl.Op.call +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: specific @Adapter(constants.%T.67d) { diff --git a/toolchain/check/testdata/class/generic/base_is_generic.carbon b/toolchain/check/testdata/class/generic/base_is_generic.carbon index 5bbafeebd130..403ffdb3e634 100644 --- a/toolchain/check/testdata/class/generic/base_is_generic.carbon +++ b/toolchain/check/testdata/class/generic/base_is_generic.carbon @@ -264,6 +264,8 @@ fn H() { // CHECK:STDOUT: %bound_method.loc17_13.2: = bound_method %.loc17_13.2, %specific_fn // CHECK:STDOUT: %Int.as.Copy.impl.Op.call: init %i32 = call %bound_method.loc17_13.2(%.loc17_13.2) // CHECK:STDOUT: return %Int.as.Copy.impl.Op.call +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: specific @Base(constants.%T.67d) { @@ -451,6 +453,8 @@ fn H() { // CHECK:STDOUT: %bound_method.loc7_13.2: = bound_method %.loc7_13.2, %specific_fn // CHECK:STDOUT: %Int.as.Copy.impl.Op.call: init %i32 = call %bound_method.loc7_13.2(%.loc7_13.2) // CHECK:STDOUT: return %Int.as.Copy.impl.Op.call +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: specific @Base(constants.%T.67d) { @@ -557,6 +561,8 @@ fn H() { // CHECK:STDOUT: fn @X.G() { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @F() { @@ -566,6 +572,8 @@ fn H() { // CHECK:STDOUT: %C: type = class_type @C, @C(constants.%X) [concrete = constants.%C.a43] // CHECK:STDOUT: %G.ref: = name_ref G, [concrete = ] // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: specific @C(constants.%T) { @@ -754,6 +762,8 @@ fn H() { // CHECK:STDOUT: %.loc5_13.1: ref @X.G.%U (%U) = splice_block %return.param {} // CHECK:STDOUT: %X.G.call: init @X.G.%U (%U) to %.loc5_13.1 = call %X.G.specific_fn.loc5_24.1() // CHECK:STDOUT: return %X.G.call to %return.param +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: @@ -774,6 +784,8 @@ fn H() { // CHECK:STDOUT: %i.patt: %pattern_type.6b6 = value_binding_pattern i [concrete = constants.%i.patt] // CHECK:STDOUT: } // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: specific @X(constants.%U) { @@ -992,6 +1004,8 @@ fn H() { // CHECK:STDOUT: %j.patt: %pattern_type.6b6 = value_binding_pattern j [concrete = constants.%j.patt] // CHECK:STDOUT: } // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: generic fn @X.G(imports.%Main.import_ref.b3bc94.1: type) [from "extend_generic_symbolic_base.carbon"] { diff --git a/toolchain/check/testdata/class/generic/basic.carbon b/toolchain/check/testdata/class/generic/basic.carbon index 05432a1abf66..00a46b0b42b3 100644 --- a/toolchain/check/testdata/class/generic/basic.carbon +++ b/toolchain/check/testdata/class/generic/basic.carbon @@ -238,6 +238,8 @@ class Declaration(T:! type); // CHECK:STDOUT: %bound_method.loc7_12.2: = bound_method %addr, %specific_impl_fn.loc7_12.1 // CHECK:STDOUT: %Copy.WithSelf.Op.call: init @Class.GetAddr.%ptr.loc6_28.1 (%ptr.215) = call %bound_method.loc7_12.2(%addr) // CHECK:STDOUT: return %Copy.WithSelf.Op.call +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: @@ -278,6 +280,8 @@ class Declaration(T:! type); // CHECK:STDOUT: %.loc10_24.1: ref @Class.GetValue.%T.as_type.loc10_24.1 (%T.as_type) = splice_block %return.param {} // CHECK:STDOUT: %Copy.WithSelf.Op.call: init @Class.GetValue.%T.as_type.loc10_24.1 (%T.as_type) to %.loc10_24.1 = call %bound_method.loc11_16.2(%.loc11_16.2) // CHECK:STDOUT: return %Copy.WithSelf.Op.call to %return.param +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/class/generic/call.carbon b/toolchain/check/testdata/class/generic/call.carbon index cb0f11486a20..29416cd653be 100644 --- a/toolchain/check/testdata/class/generic/call.carbon +++ b/toolchain/check/testdata/class/generic/call.carbon @@ -275,6 +275,8 @@ class Outer(T:! type) { // CHECK:STDOUT: %T.as.DefaultOrUnformed.impl.Op.call.loc9: init %Class.958 to %.loc9_1 = call %T.as.DefaultOrUnformed.impl.Op.specific_fn.2() // CHECK:STDOUT: assign file.%b.var, %T.as.DefaultOrUnformed.impl.Op.call.loc9 // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: specific @Class(constants.%T.67d, constants.%N.ce9) { @@ -390,6 +392,8 @@ class Outer(T:! type) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: assign file.%a.var, // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: specific @Class(constants.%T, constants.%N.ce9) { @@ -491,6 +495,8 @@ class Outer(T:! type) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: assign file.%a.var, // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: specific @Class(constants.%T, constants.%N.ce9) { @@ -595,6 +601,8 @@ class Outer(T:! type) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: assign file.%a.var, // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: specific @Class(constants.%T, constants.%N.ce9) { @@ -818,6 +826,8 @@ class Outer(T:! type) { // CHECK:STDOUT: %.loc5_15.2: init @Inner.A.%Outer.loc4_22.1 (%Outer.dee) to %return.param = class_init () [symbolic = %Outer.val (constants.%Outer.val.1e6)] // CHECK:STDOUT: %.loc5_16: init @Inner.A.%Outer.loc4_22.1 (%Outer.dee) = converted %.loc5_15.1, %.loc5_15.2 [symbolic = %Outer.val (constants.%Outer.val.1e6)] // CHECK:STDOUT: return %.loc5_16 to %return.param +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: @@ -839,6 +849,8 @@ class Outer(T:! type) { // CHECK:STDOUT: %.loc8_15.2: init @Inner.B.%Outer.loc7_22.1 (%Outer.20b) to %return.param = class_init () [symbolic = %Outer.val (constants.%Outer.val.8e5)] // CHECK:STDOUT: %.loc8_16: init @Inner.B.%Outer.loc7_22.1 (%Outer.20b) = converted %.loc8_15.1, %.loc8_15.2 [symbolic = %Outer.val (constants.%Outer.val.8e5)] // CHECK:STDOUT: return %.loc8_16 to %return.param +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: @@ -862,6 +874,8 @@ class Outer(T:! type) { // CHECK:STDOUT: %.loc11_15.2: init @Inner.C.%Inner.loc10_22.1 (%Inner.61d) to %return.param = class_init () [symbolic = %Inner.val (constants.%Inner.val.284)] // CHECK:STDOUT: %.loc11_16: init @Inner.C.%Inner.loc10_22.1 (%Inner.61d) = converted %.loc11_15.1, %.loc11_15.2 [symbolic = %Inner.val (constants.%Inner.val.284)] // CHECK:STDOUT: return %.loc11_16 to %return.param +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: @@ -886,6 +900,8 @@ class Outer(T:! type) { // CHECK:STDOUT: %.loc14_15.2: init @Inner.D.%Inner.loc13_22.1 (%Inner.34b) to %return.param = class_init () [symbolic = %Inner.val (constants.%Inner.val.9fd)] // CHECK:STDOUT: %.loc14_16: init @Inner.D.%Inner.loc13_22.1 (%Inner.34b) = converted %.loc14_15.1, %.loc14_15.2 [symbolic = %Inner.val (constants.%Inner.val.9fd)] // CHECK:STDOUT: return %.loc14_16 to %return.param +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/class/generic/complete_in_conversion.carbon b/toolchain/check/testdata/class/generic/complete_in_conversion.carbon index 5f7083014360..ec986fcfdba8 100644 --- a/toolchain/check/testdata/class/generic/complete_in_conversion.carbon +++ b/toolchain/check/testdata/class/generic/complete_in_conversion.carbon @@ -245,6 +245,8 @@ fn F(a: A(0)*) { // CHECK:STDOUT: %b.patt: %pattern_type.3c8 = value_binding_pattern b [concrete = constants.%b.patt] // CHECK:STDOUT: } // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: specific @A(constants.%N.37f) { diff --git a/toolchain/check/testdata/class/generic/field.carbon b/toolchain/check/testdata/class/generic/field.carbon index 01e5b83a9111..04d859e9e370 100644 --- a/toolchain/check/testdata/class/generic/field.carbon +++ b/toolchain/check/testdata/class/generic/field.carbon @@ -270,6 +270,8 @@ fn H(U:! Core.Copy, c: Class(U)) -> U { // CHECK:STDOUT: %bound_method.loc10_11.2: = bound_method %.loc10_11.2, %specific_fn // CHECK:STDOUT: %Int.as.Copy.impl.Op.call: init %i32 = call %bound_method.loc10_11.2(%.loc10_11.2) // CHECK:STDOUT: return %Int.as.Copy.impl.Op.call +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: generic fn @G(%T.loc13_7.2: %Copy.type) { @@ -310,6 +312,8 @@ fn H(U:! Core.Copy, c: Class(U)) -> U { // CHECK:STDOUT: %.loc13_37.1: ref @G.%T.as_type.loc13_31.1 (%T.as_type) = splice_block %return.param {} // CHECK:STDOUT: %Copy.WithSelf.Op.call: init @G.%T.as_type.loc13_31.1 (%T.as_type) to %.loc13_37.1 = call %bound_method.loc14_11.2(%.loc14_11.2) // CHECK:STDOUT: return %Copy.WithSelf.Op.call to %return.param +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: @@ -351,6 +355,8 @@ fn H(U:! Core.Copy, c: Class(U)) -> U { // CHECK:STDOUT: %.loc17_37.1: ref @H.%U.as_type.loc17_31.1 (%U.as_type.c1c) = splice_block %return.param {} // CHECK:STDOUT: %Copy.WithSelf.Op.call: init @H.%U.as_type.loc17_31.1 (%U.as_type.c1c) to %.loc17_37.1 = call %bound_method.loc18_11.2(%.loc18_11.2) // CHECK:STDOUT: return %Copy.WithSelf.Op.call to %return.param +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/class/generic/generic_vs_params.carbon b/toolchain/check/testdata/class/generic/generic_vs_params.carbon index 37f5c08e1b36..cd41e3ab3154 100644 --- a/toolchain/check/testdata/class/generic/generic_vs_params.carbon +++ b/toolchain/check/testdata/class/generic/generic_vs_params.carbon @@ -345,6 +345,8 @@ class Foo[T:! type]; // CHECK:STDOUT: %.loc19_1: init %GenericAndParams.353 = converted %.loc19_36.1, %.loc19_36.2 [concrete = constants.%GenericAndParams.val.150] // CHECK:STDOUT: assign file.%e.var, %.loc19_1 // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: specific @GenericAndParams.loc6(constants.%T) { @@ -471,6 +473,8 @@ class Foo[T:! type]; // CHECK:STDOUT: %T.ref: type = name_ref T, %T.loc11_7.2 [symbolic = %T.loc11_7.1 (constants.%T)] // CHECK:STDOUT: %A: type = class_type @A [concrete = constants.%A] // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/class/generic/import.carbon b/toolchain/check/testdata/class/generic/import.carbon index dc1f7c11818a..988b0fe6a881 100644 --- a/toolchain/check/testdata/class/generic/import.carbon +++ b/toolchain/check/testdata/class/generic/import.carbon @@ -243,6 +243,8 @@ class Class(U:! type) { // CHECK:STDOUT: %Core.IntLiteral.as.ImplicitAs.impl.Convert.call: init %i32 = call %bound_method.loc8_27.2(%int_0) [concrete = constants.%int_0.3c0] // CHECK:STDOUT: %.loc8_27: init %i32 = converted %int_0, %Core.IntLiteral.as.ImplicitAs.impl.Convert.call [concrete = constants.%int_0.3c0] // CHECK:STDOUT: return %.loc8_27 +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: @@ -451,6 +453,8 @@ class Class(U:! type) { // CHECK:STDOUT: %.loc9_17.5: init %CompleteClass.d55 to %return.param = class_init (%.loc9_17.4) [concrete = constants.%CompleteClass.val] // CHECK:STDOUT: %.loc9_18: init %CompleteClass.d55 = converted %.loc9_17.1, %.loc9_17.5 [concrete = constants.%CompleteClass.val] // CHECK:STDOUT: return %.loc9_18 to %return.param +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: specific @Class(constants.%T) { @@ -637,6 +641,8 @@ class Class(U:! type) { // CHECK:STDOUT: %Destroy.Op.bound: = bound_method %v.var, constants.%Destroy.Op.1a2547.4 // CHECK:STDOUT: %Destroy.Op.call: init %empty_tuple.type = call %Destroy.Op.bound(%v.var) // CHECK:STDOUT: return %CompleteClass.F.call +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: generic fn @CompleteClass.F(imports.%Main.import_ref.b3bc94.1: type) [from "foo.carbon"] { @@ -652,16 +658,22 @@ class Class(U:! type) { // CHECK:STDOUT: fn @Destroy.Op.loc6_3.2(%self.param: ref %i32) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Destroy.Op.loc6_3.3(%self.param: ref %struct_type.n) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Destroy.Op.loc6_3.4(%self.param: ref %CompleteClass.d55) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @UseField() -> out %return.param: %i32 { @@ -693,6 +705,8 @@ class Class(U:! type) { // CHECK:STDOUT: %Destroy.Op.bound: = bound_method %v.var, constants.%Destroy.Op.1a2547.4 // CHECK:STDOUT: %Destroy.Op.call: init %empty_tuple.type = call %Destroy.Op.bound(%v.var) // CHECK:STDOUT: return %Int.as.Copy.impl.Op.call +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: specific @CompleteClass(constants.%T.67d) { @@ -843,6 +857,8 @@ class Class(U:! type) { // CHECK:STDOUT: %Destroy.Op.bound: = bound_method %v.var, constants.%Destroy.Op.1a2547.4 // CHECK:STDOUT: %Destroy.Op.call: init %empty_tuple.type = call %Destroy.Op.bound(%v.var) // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: generic fn @CompleteClass.F(imports.%Main.import_ref.b3bc94.1: type) [from "foo.carbon"] { @@ -858,16 +874,22 @@ class Class(U:! type) { // CHECK:STDOUT: fn @Destroy.Op.loc13_3.2(%self.param: ref %i32) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Destroy.Op.loc13_3.3(%self.param: ref %struct_type.n) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Destroy.Op.loc13_3.4(%self.param: ref %CompleteClass.22b) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: specific @CompleteClass(constants.%T) { diff --git a/toolchain/check/testdata/class/generic/init.carbon b/toolchain/check/testdata/class/generic/init.carbon index 1409b09ca0a7..d31740606012 100644 --- a/toolchain/check/testdata/class/generic/init.carbon +++ b/toolchain/check/testdata/class/generic/init.carbon @@ -302,6 +302,8 @@ fn InitFromAdaptedSpecific(x: i32) -> i32 { // CHECK:STDOUT: %bound_method.loc10_3.2: = bound_method %v.var, %specific_impl_fn.loc10_3.1 // CHECK:STDOUT: %Destroy.WithSelf.Op.call: init %empty_tuple.type = call %bound_method.loc10_3.2(%v.var) // CHECK:STDOUT: return %Copy.WithSelf.Op.call.loc11 to %return.param +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: @@ -344,6 +346,8 @@ fn InitFromAdaptedSpecific(x: i32) -> i32 { // CHECK:STDOUT: %Destroy.Op.bound: = bound_method %v.var, constants.%Destroy.Op.1a2547.4 // CHECK:STDOUT: %Destroy.Op.call: init %empty_tuple.type = call %Destroy.Op.bound(%v.var) // CHECK:STDOUT: return %Int.as.Copy.impl.Op.call.loc16 +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Destroy.Op.loc15_19.1(%self.param: ref %i32.builtin) = "no_op"; @@ -351,16 +355,22 @@ fn InitFromAdaptedSpecific(x: i32) -> i32 { // CHECK:STDOUT: fn @Destroy.Op.loc15_19.2(%self.param: ref %i32) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Destroy.Op.loc15_3.1(%self.param: ref %struct_type.k.e7c) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Destroy.Op.loc15_3.2(%self.param: ref %Class.a32) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: specific @InitFromStructGeneric(constants.%T.283) { @@ -530,6 +540,8 @@ fn InitFromAdaptedSpecific(x: i32) -> i32 { // CHECK:STDOUT: %.loc9_51.1: ref @InitFromAdaptedGeneric.%T.as_type.loc9_45.1 (%T.as_type) = splice_block %return.param {} // CHECK:STDOUT: %Copy.WithSelf.Op.call: init @InitFromAdaptedGeneric.%T.as_type.loc9_45.1 (%T.as_type) to %.loc9_51.1 = call %bound_method.loc10_26.2(%.loc10_26.2) // CHECK:STDOUT: return %Copy.WithSelf.Op.call to %return.param +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: @@ -550,6 +562,8 @@ fn InitFromAdaptedSpecific(x: i32) -> i32 { // CHECK:STDOUT: %bound_method.loc14_28.2: = bound_method %.loc14_28.2, %specific_fn // CHECK:STDOUT: %Int.as.Copy.impl.Op.call: init %i32 = call %bound_method.loc14_28.2(%.loc14_28.2) // CHECK:STDOUT: return %Int.as.Copy.impl.Op.call +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: specific @InitFromAdaptedGeneric(constants.%T.f84) { diff --git a/toolchain/check/testdata/class/generic/member_access.carbon b/toolchain/check/testdata/class/generic/member_access.carbon index 9211f7bd6061..047f098351ab 100644 --- a/toolchain/check/testdata/class/generic/member_access.carbon +++ b/toolchain/check/testdata/class/generic/member_access.carbon @@ -215,6 +215,8 @@ fn StaticMemberFunctionCall(T:! type) -> Class(T) { // CHECK:STDOUT: // CHECK:STDOUT: %Copy.WithSelf.Op.call: init @Class.Get.%T.as_type.loc7_19.1 (%T.as_type) to %.loc7_19.1 = call %bound_method.loc9_16.2(%.loc9_16.2) // CHECK:STDOUT: return %Copy.WithSelf.Op.call to %return.param +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: @@ -248,6 +250,8 @@ fn StaticMemberFunctionCall(T:! type) -> Class(T) { // CHECK:STDOUT: %bound_method.loc15_12.2: = bound_method %addr, %specific_impl_fn.loc15_12.1 // CHECK:STDOUT: %Copy.WithSelf.Op.call: init @Class.GetAddr.%ptr.loc13_28.1 (%ptr.215) = call %bound_method.loc15_12.2(%addr) // CHECK:STDOUT: return %Copy.WithSelf.Op.call +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: @@ -263,6 +267,8 @@ fn StaticMemberFunctionCall(T:! type) -> Class(T) { // CHECK:STDOUT: %bound_method.loc22_11.2: = bound_method %.loc22_11.2, %specific_fn // CHECK:STDOUT: %Int.as.Copy.impl.Op.call: init %i32 = call %bound_method.loc22_11.2(%.loc22_11.2) // CHECK:STDOUT: return %Int.as.Copy.impl.Op.call +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @MethodCall(%x.param: %Class.ce6) -> out %return.param: %i32 { @@ -275,6 +281,8 @@ fn StaticMemberFunctionCall(T:! type) -> Class(T) { // CHECK:STDOUT: %bound_method: = bound_method %x.ref, %Class.Get.specific_fn // CHECK:STDOUT: %Class.Get.call: init %i32 = call %bound_method(%x.ref) // CHECK:STDOUT: return %Class.Get.call +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @AddrMethodCall(%p.param: %ptr.57b) -> out %return.param: %i32 { @@ -297,6 +305,8 @@ fn StaticMemberFunctionCall(T:! type) -> Class(T) { // CHECK:STDOUT: %bound_method.loc34_10.2: = bound_method %.loc34_10.2, %specific_fn // CHECK:STDOUT: %Int.as.Copy.impl.Op.call: init %i32 = call %bound_method.loc34_10.2(%.loc34_10.2) // CHECK:STDOUT: return %Int.as.Copy.impl.Op.call +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: specific @Class(constants.%T.f84) { @@ -452,6 +462,8 @@ fn StaticMemberFunctionCall(T:! type) -> Class(T) { // CHECK:STDOUT: // CHECK:STDOUT: %Class.Make.call: init @StaticMemberFunctionCall.%Class.loc8_49.1 (%Class) to %.loc8_49.1 = call %Class.Make.specific_fn.loc10_18.1() // CHECK:STDOUT: return %Class.Make.call to %return.param +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/class/generic/member_inline.carbon b/toolchain/check/testdata/class/generic/member_inline.carbon index 537eb69ad58d..2563f805c0d6 100644 --- a/toolchain/check/testdata/class/generic/member_inline.carbon +++ b/toolchain/check/testdata/class/generic/member_inline.carbon @@ -208,6 +208,8 @@ class C(T:! Core.Copy) { // CHECK:STDOUT: %.loc6_17.1: ref @Class.F.%T.as_type.loc6_11.1 (%T.as_type) = splice_block %return.param {} // CHECK:STDOUT: %Copy.WithSelf.Op.call: init @Class.F.%T.as_type.loc6_11.1 (%T.as_type) to %.loc6_17.1 = call %bound_method.loc7_12.2(%n.ref) // CHECK:STDOUT: return %Copy.WithSelf.Op.call to %return.param +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: @@ -248,6 +250,8 @@ class C(T:! Core.Copy) { // CHECK:STDOUT: %.loc10_17.1: ref @Class.G.%T.as_type.loc10_17.1 (%T.as_type) = splice_block %return.param {} // CHECK:STDOUT: %Copy.WithSelf.Op.call: init @Class.G.%T.as_type.loc10_17.1 (%T.as_type) to %.loc10_17.1 = call %bound_method.loc11_16.2(%.loc11_16.2) // CHECK:STDOUT: return %Copy.WithSelf.Op.call to %return.param +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: @@ -369,6 +373,8 @@ class C(T:! Core.Copy) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: %data.ref: @C.F.%C.elem (%C.elem) = name_ref data, @C.%.loc13 [concrete = @C.%.loc13] // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/class/generic/member_lookup.carbon b/toolchain/check/testdata/class/generic/member_lookup.carbon index 51b542582682..cca2c9151976 100644 --- a/toolchain/check/testdata/class/generic/member_lookup.carbon +++ b/toolchain/check/testdata/class/generic/member_lookup.carbon @@ -133,6 +133,8 @@ fn AccessMissingConcrete(x: Derived(i32)) -> i32 { // CHECK:STDOUT: // CHECK:STDOUT: %Copy.WithSelf.Op.call: init @AccessDerived.%T.as_type.loc13_45.1 (%T.as_type) to %.loc13_51.1 = call %bound_method.loc15_11.2(%.loc15_11.2) // CHECK:STDOUT: return %Copy.WithSelf.Op.call to %return.param +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: @@ -169,6 +171,8 @@ fn AccessMissingConcrete(x: Derived(i32)) -> i32 { // CHECK:STDOUT: // CHECK:STDOUT: %Copy.WithSelf.Op.call: init @AccessBase.%T.as_type.loc19_42.1 (%T.as_type) to %.loc19_48.1 = call %bound_method.loc21_11.2(%.loc21_11.5) // CHECK:STDOUT: return %Copy.WithSelf.Op.call to %return.param +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/class/generic/member_out_of_line.carbon b/toolchain/check/testdata/class/generic/member_out_of_line.carbon index e2be35915fb6..2c5d9adecc5f 100644 --- a/toolchain/check/testdata/class/generic/member_out_of_line.carbon +++ b/toolchain/check/testdata/class/generic/member_out_of_line.carbon @@ -326,6 +326,8 @@ fn Generic(unused T:! ()).WrongType() {} // CHECK:STDOUT: %.loc11_36.1: ref @Class.F.%T.as_type.loc6_11.1 (%T.as_type) = splice_block %return.param.loc11 {} // CHECK:STDOUT: %Copy.WithSelf.Op.call: init @Class.F.%T.as_type.loc6_11.1 (%T.as_type) to %.loc11_36.1 = call %bound_method.loc12_10.2(%n.ref) // CHECK:STDOUT: return %Copy.WithSelf.Op.call to %return.param.loc11 +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: @@ -366,6 +368,8 @@ fn Generic(unused T:! ()).WrongType() {} // CHECK:STDOUT: %.loc15_36.1: ref @Class.G.%T.as_type.loc7_17.1 (%T.as_type) = splice_block %return.param.loc15 {} // CHECK:STDOUT: %Copy.WithSelf.Op.call: init @Class.G.%T.as_type.loc7_17.1 (%T.as_type) to %.loc15_36.1 = call %bound_method.loc16_14.2(%.loc16_14.2) // CHECK:STDOUT: return %Copy.WithSelf.Op.call to %return.param.loc15 +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: @@ -563,6 +567,8 @@ fn Generic(unused T:! ()).WrongType() {} // CHECK:STDOUT: fn(%self.param.loc11: @B.F.%B (%B), %a.param.loc11: @B.F.%T.loc7 (%T)) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/class/generic/member_type.carbon b/toolchain/check/testdata/class/generic/member_type.carbon index c1a0d5e52e56..038cf8253113 100644 --- a/toolchain/check/testdata/class/generic/member_type.carbon +++ b/toolchain/check/testdata/class/generic/member_type.carbon @@ -309,6 +309,8 @@ fn Test() -> i32 { // CHECK:STDOUT: %.loc9_39.4: init @Outer.F.%Inner (%Inner.06b) to %return.param = class_init (%.loc9_39.3) // CHECK:STDOUT: %.loc9_40: init @Outer.F.%Inner (%Inner.06b) = converted %.loc9_39.1, %.loc9_39.4 // CHECK:STDOUT: return %.loc9_40 to %return.param +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: @@ -364,6 +366,8 @@ fn Test() -> i32 { // CHECK:STDOUT: %Destroy.Op.bound: = bound_method %c.var, constants.%Destroy.Op.1a2547.4 // CHECK:STDOUT: %Destroy.Op.call: init %empty_tuple.type = call %Destroy.Op.bound(%c.var) // CHECK:STDOUT: return %Int.as.Copy.impl.Op.call +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Destroy.Op.loc13_3.1(%self.param: ref %i32.builtin) = "no_op"; @@ -371,16 +375,22 @@ fn Test() -> i32 { // CHECK:STDOUT: fn @Destroy.Op.loc13_3.2(%self.param: ref %i32) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Destroy.Op.loc13_3.3(%self.param: ref %struct_type.n.9ed) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Destroy.Op.loc13_3.4(%self.param: ref %Inner.096) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: specific @Outer(constants.%T.f84) { @@ -649,6 +659,8 @@ fn Test() -> i32 { // CHECK:STDOUT: witness = (@Inner.WithSelf.%Inner.WithSelf.F.decl) // CHECK:STDOUT: // CHECK:STDOUT: !requires: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: @@ -835,6 +847,8 @@ fn Test() -> i32 { // CHECK:STDOUT: %.loc11_24.1: ref @C.as.Inner.impl.F.%T (%T) = splice_block %return.param {} // CHECK:STDOUT: %Inner.WithSelf.F.call: init @C.as.Inner.impl.F.%T (%T) to %.loc11_24.1 = call %bound_method.loc11_50(%self.ref) // CHECK:STDOUT: return %Inner.WithSelf.F.call to %return.param +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: @@ -876,6 +890,8 @@ fn Test() -> i32 { // CHECK:STDOUT: %Destroy.Op.bound: = bound_method %c.var, constants.%Destroy.Op.1a2547.2 // CHECK:STDOUT: %Destroy.Op.call: init %empty_tuple.type = call %Destroy.Op.bound(%c.var) // CHECK:STDOUT: return %C.as.Inner.impl.F.call +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Destroy.Op.loc23_3.1(%self.param: ref %empty_struct_type) = "no_op"; @@ -883,6 +899,8 @@ fn Test() -> i32 { // CHECK:STDOUT: fn @Destroy.Op.loc23_3.2(%self.param: ref %C.b7f) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: specific @Outer(constants.%T) { diff --git a/toolchain/check/testdata/class/generic/method_deduce.carbon b/toolchain/check/testdata/class/generic/method_deduce.carbon index beda71e6c07c..bdedd81e29f6 100644 --- a/toolchain/check/testdata/class/generic/method_deduce.carbon +++ b/toolchain/check/testdata/class/generic/method_deduce.carbon @@ -357,6 +357,8 @@ fn CallMethodSelfDeduce(c: Class(A)) -> A { // CHECK:STDOUT: %.loc19_28.1: ref @Class.Get.%tuple.type (%tuple.type.a5e) = splice_block %return.param {} // CHECK:STDOUT: %Class.Get.call: init @Class.Get.%tuple.type (%tuple.type.a5e) to %.loc19_28.1 = call %Class.Get.specific_fn.loc19_39.1() // CHECK:STDOUT: return %Class.Get.call to %return.param +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: @@ -390,6 +392,8 @@ fn CallMethodSelfDeduce(c: Class(A)) -> A { // CHECK:STDOUT: %.loc20_42.1: ref @Class.GetNoDeduce.%tuple.type (%tuple.type.a5e) = splice_block %return.param {} // CHECK:STDOUT: %Class.GetNoDeduce.call: init @Class.GetNoDeduce.%tuple.type (%tuple.type.a5e) to %.loc20_42.1 = call %Class.GetNoDeduce.specific_fn.loc20_53.1(%x.ref) // CHECK:STDOUT: return %Class.GetNoDeduce.call to %return.param +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: @@ -422,6 +426,8 @@ fn CallMethodSelfDeduce(c: Class(A)) -> A { // CHECK:STDOUT: %.loc21_37.1: ref @Class.F.%U.loc21_9.1 (%U) = splice_block %return.param {} // CHECK:STDOUT: %Class.F.call: init @Class.F.%U.loc21_9.1 (%U) to %.loc21_37.1 = call %bound_method(%self.ref) // CHECK:STDOUT: return %Class.F.call to %return.param +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: @@ -435,6 +441,8 @@ fn CallMethodSelfDeduce(c: Class(A)) -> A { // CHECK:STDOUT: %.loc24_43.1: ref %tuple.type.1e7 = splice_block %return.param {} // CHECK:STDOUT: %Class.Get.call: init %tuple.type.1e7 to %.loc24_43.1 = call %Class.Get.specific_fn() // CHECK:STDOUT: return %Class.Get.call to %return.param +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @CallGenericMethodWithNonDeducedParam(%c.param: %Class.30a) -> out %return.param: %tuple.type.1e7 { @@ -454,6 +462,8 @@ fn CallMethodSelfDeduce(c: Class(A)) -> A { // CHECK:STDOUT: %Class.GetNoDeduce.call: init %tuple.type.1e7 to %.loc28_62.1 = call %Class.GetNoDeduce.specific_fn(%.loc29_25.6) // CHECK:STDOUT: %Destroy.Op.call: init %empty_tuple.type = call constants.%Destroy.Op.bound(constants.%.367) // CHECK:STDOUT: return %Class.GetNoDeduce.call to %return.param +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Destroy.Op.loc29_25.1(%self.param: ref %empty_struct_type) = "no_op"; @@ -461,6 +471,8 @@ fn CallMethodSelfDeduce(c: Class(A)) -> A { // CHECK:STDOUT: fn @Destroy.Op.loc29_25.2(%self.param: ref %A) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @CallMethodSelfDeduce(%c.param: %Class.30a) -> out %return.param: %A { @@ -474,6 +486,8 @@ fn CallMethodSelfDeduce(c: Class(A)) -> A { // CHECK:STDOUT: %.loc32_41.1: ref %A = splice_block %return.param {} // CHECK:STDOUT: %Class.F.call: init %A to %.loc32_41.1 = call %bound_method(%c.ref) // CHECK:STDOUT: return %Class.F.call to %return.param +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: specific @Class(constants.%T) { diff --git a/toolchain/check/testdata/class/generic/self.carbon b/toolchain/check/testdata/class/generic/self.carbon index 7225e416df7e..4e9f22b27a2d 100644 --- a/toolchain/check/testdata/class/generic/self.carbon +++ b/toolchain/check/testdata/class/generic/self.carbon @@ -158,6 +158,8 @@ class Class(T:! type) { // CHECK:STDOUT: %.loc18_35.2: init @Class.MakeSelf.%Class (%Class) to %return.param = class_init () [symbolic = %Class.val (constants.%Class.val)] // CHECK:STDOUT: %.loc18_36: init @Class.MakeSelf.%Class (%Class) = converted %.loc18_35.1, %.loc18_35.2 [symbolic = %Class.val (constants.%Class.val)] // CHECK:STDOUT: return %.loc18_36 to %return.param +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: @@ -179,6 +181,8 @@ class Class(T:! type) { // CHECK:STDOUT: %.loc19_40.2: init @Class.MakeClass.%Class.loc19_28.1 (%Class) to %return.param = class_init () [symbolic = %Class.val (constants.%Class.val)] // CHECK:STDOUT: %.loc19_41: init @Class.MakeClass.%Class.loc19_28.1 (%Class) = converted %.loc19_40.1, %.loc19_40.2 [symbolic = %Class.val (constants.%Class.val)] // CHECK:STDOUT: return %.loc19_41 to %return.param +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: @@ -259,6 +263,8 @@ class Class(T:! type) { // CHECK:STDOUT: %bound_method.loc21_5.2: = bound_method %c.var, %specific_impl_fn.loc21 // CHECK:STDOUT: %Destroy.WithSelf.Op.call.loc21: init %empty_tuple.type = call %bound_method.loc21_5.2(%c.var) // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/class/generic/stringify.carbon b/toolchain/check/testdata/class/generic/stringify.carbon index a69130332520..d47ac5cecadd 100644 --- a/toolchain/check/testdata/class/generic/stringify.carbon +++ b/toolchain/check/testdata/class/generic/stringify.carbon @@ -186,6 +186,8 @@ var g: E({.a = 1, .b = 2}) = {} as E({.a = 3, .b = 4} as D); // CHECK:STDOUT: %.loc15: %EmptyParams = converted %v.ref, [concrete = ] // CHECK:STDOUT: assign file.%w.var, // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- fail_nested.carbon @@ -358,6 +360,8 @@ var g: E({.a = 1, .b = 2}) = {} as E({.a = 3, .b = 4} as D); // CHECK:STDOUT: %.loc19: %Inner.61f = converted %v.ref, [concrete = ] // CHECK:STDOUT: assign file.%w.var, // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: specific @Outer(constants.%T.67d) { @@ -498,6 +502,8 @@ var g: E({.a = 1, .b = 2}) = {} as E({.a = 3, .b = 4} as D); // CHECK:STDOUT: %.loc13_1: %C.ece = converted %.loc13_18, [concrete = ] // CHECK:STDOUT: assign file.%v.var, // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: specific @C(constants.%N.37f) { @@ -708,6 +714,8 @@ var g: E({.a = 1, .b = 2}) = {} as E({.a = 3, .b = 4} as D); // CHECK:STDOUT: %.loc18_1: %E.7b7 = converted %.loc18_33, [concrete = ] // CHECK:STDOUT: assign file.%g.var, // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: specific @E(constants.%F) { diff --git a/toolchain/check/testdata/class/import.carbon b/toolchain/check/testdata/class/import.carbon index 673a00d1e919..99754c3a4305 100644 --- a/toolchain/check/testdata/class/import.carbon +++ b/toolchain/check/testdata/class/import.carbon @@ -452,6 +452,8 @@ fn Run() { // CHECK:STDOUT: %Destroy.Op.bound.loc7: = bound_method %a.var, constants.%Destroy.Op.1a2547.9 // CHECK:STDOUT: %Destroy.Op.call.loc7: init %empty_tuple.type = call %Destroy.Op.bound.loc7(%a.var) // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @ForwardDeclared.F [from "a.carbon"]; @@ -467,6 +469,8 @@ fn Run() { // CHECK:STDOUT: fn @Destroy.Op.loc12_3.2(%self.param: ref %ForwardDeclared.08bd4c.1) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Destroy.Op.loc9_3.1(%self.param: ref %i32.builtin) = "no_op"; @@ -474,20 +478,28 @@ fn Run() { // CHECK:STDOUT: fn @Destroy.Op.loc9_3.2(%self.param: ref %i32) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Destroy.Op.loc9_3.3(%self.param: ref %struct_type.x.a15) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Destroy.Op.loc9_3.4(%self.param: ref %Field) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Destroy.Op.loc7(%self.param: ref %Empty) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/class/import_indirect.carbon b/toolchain/check/testdata/class/import_indirect.carbon index a0da1d6ed4e2..c8bcd6120ba9 100644 --- a/toolchain/check/testdata/class/import_indirect.carbon +++ b/toolchain/check/testdata/class/import_indirect.carbon @@ -234,6 +234,8 @@ var ptr: E* = &value; // CHECK:STDOUT: %ptr.as.Copy.impl.Op.call: init %ptr.6b6 = call %bound_method.loc9_17.2(%addr) [concrete = constants.%addr] // CHECK:STDOUT: assign file.%b_ptr.var, %ptr.as.Copy.impl.Op.call // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- c.carbon @@ -334,6 +336,8 @@ var ptr: E* = &value; // CHECK:STDOUT: %ptr.as.Copy.impl.Op.call: init %ptr.6b6 = call %bound_method.loc9_17.2(%addr) [concrete = constants.%addr] // CHECK:STDOUT: assign file.%c_ptr.var, %ptr.as.Copy.impl.Op.call // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- triangle.carbon @@ -437,6 +441,8 @@ var ptr: E* = &value; // CHECK:STDOUT: %ptr.as.Copy.impl.Op.call: init %ptr.6b6 = call %bound_method.loc8_15.2(%addr) [concrete = constants.%addr] // CHECK:STDOUT: assign file.%ptr.var, %ptr.as.Copy.impl.Op.call // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- triangle_reverse.carbon @@ -540,6 +546,8 @@ var ptr: E* = &value; // CHECK:STDOUT: %ptr.as.Copy.impl.Op.call: init %ptr.6b6 = call %bound_method.loc8_15.2(%addr) [concrete = constants.%addr] // CHECK:STDOUT: assign file.%ptr.var, %ptr.as.Copy.impl.Op.call // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- diamond.carbon @@ -647,6 +655,8 @@ var ptr: E* = &value; // CHECK:STDOUT: %ptr.as.Copy.impl.Op.call: init %ptr.6b6 = call %bound_method.loc8_15.2(%addr) [concrete = constants.%addr] // CHECK:STDOUT: assign file.%ptr.var, %ptr.as.Copy.impl.Op.call // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- diamond_reverse.carbon @@ -754,5 +764,7 @@ var ptr: E* = &value; // CHECK:STDOUT: %ptr.as.Copy.impl.Op.call: init %ptr.6b6 = call %bound_method.loc8_15.2(%addr) [concrete = constants.%addr] // CHECK:STDOUT: assign file.%ptr.var, %ptr.as.Copy.impl.Op.call // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/class/import_member_cycle.carbon b/toolchain/check/testdata/class/import_member_cycle.carbon index affc95901c1a..8f24e903b9bf 100644 --- a/toolchain/check/testdata/class/import_member_cycle.carbon +++ b/toolchain/check/testdata/class/import_member_cycle.carbon @@ -152,6 +152,8 @@ fn Run() { // CHECK:STDOUT: %Destroy.Op.bound: = bound_method %a.var, constants.%Destroy.Op // CHECK:STDOUT: %Destroy.Op.call: init %empty_tuple.type = call %Destroy.Op.bound(%a.var) // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Destroy.Op(%self.param: ref %ptr) = "no_op"; diff --git a/toolchain/check/testdata/class/import_struct_cycle.carbon b/toolchain/check/testdata/class/import_struct_cycle.carbon index ccf723a222c6..f3fc2aca56e8 100644 --- a/toolchain/check/testdata/class/import_struct_cycle.carbon +++ b/toolchain/check/testdata/class/import_struct_cycle.carbon @@ -112,6 +112,8 @@ fn Run() { // CHECK:STDOUT: %T.as.DefaultOrUnformed.impl.Op.call: init %struct_type.b = call %T.as.DefaultOrUnformed.impl.Op.specific_fn() // CHECK:STDOUT: assign file.%a.var, %T.as.DefaultOrUnformed.impl.Op.call // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- b.carbon @@ -199,5 +201,7 @@ fn Run() { // CHECK:STDOUT: %ptr.as.Copy.impl.Op.call: init %ptr.5cd = call %bound_method.loc7_17.2(%.loc7_17.2) // CHECK:STDOUT: assign %.loc7_4, %ptr.as.Copy.impl.Op.call // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/class/indirect_import_member.carbon b/toolchain/check/testdata/class/indirect_import_member.carbon index 7b43477e5429..82500f1816d0 100644 --- a/toolchain/check/testdata/class/indirect_import_member.carbon +++ b/toolchain/check/testdata/class/indirect_import_member.carbon @@ -134,6 +134,8 @@ var x: () = D.C.F(); // CHECK:STDOUT: fn @C.F() { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- b.carbon @@ -308,6 +310,8 @@ var x: () = D.C.F(); // CHECK:STDOUT: %C.F.call: init %empty_tuple.type = call %F.ref() // CHECK:STDOUT: assign file.%x.var, %C.F.call // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- use_c.carbon @@ -367,6 +371,8 @@ var x: () = D.C.F(); // CHECK:STDOUT: %C.F.call: init %empty_tuple.type = call %F.ref() // CHECK:STDOUT: assign file.%x.var, %C.F.call // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- use_d.carbon @@ -426,6 +432,8 @@ var x: () = D.C.F(); // CHECK:STDOUT: %C.F.call: init %empty_tuple.type = call %F.ref() // CHECK:STDOUT: assign file.%x.var, %C.F.call // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- use_e.carbon @@ -498,6 +506,8 @@ var x: () = D.C.F(); // CHECK:STDOUT: %C.F.call: init %empty_tuple.type = call %F.ref() // CHECK:STDOUT: assign file.%x.var, %C.F.call // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- use_f.carbon @@ -570,5 +580,7 @@ var x: () = D.C.F(); // CHECK:STDOUT: %C.F.call: init %empty_tuple.type = call %F.ref() // CHECK:STDOUT: assign file.%x.var, %C.F.call // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/class/inheritance/base.carbon b/toolchain/check/testdata/class/inheritance/base.carbon index 143fd09a1912..b4dafd278a69 100644 --- a/toolchain/check/testdata/class/inheritance/base.carbon +++ b/toolchain/check/testdata/class/inheritance/base.carbon @@ -234,6 +234,8 @@ class Derived { // CHECK:STDOUT: %.loc14_35.8: init %Derived to %return.param = class_init (%.loc14_35.4, %.loc14_35.7) [concrete = constants.%Derived.val] // CHECK:STDOUT: %.loc14_36: init %Derived = converted %.loc14_35.1, %.loc14_35.8 [concrete = constants.%Derived.val] // CHECK:STDOUT: return %.loc14_36 to %return.param +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Access(%d.param: %Derived) -> out %return.param: %tuple.type.e55 { @@ -267,6 +269,8 @@ class Derived { // CHECK:STDOUT: %.loc18_24.4: init %tuple.type.e55 to %return.param = tuple_init (%.loc18_24.2, %.loc18_24.3) // CHECK:STDOUT: %.loc18_25: init %tuple.type.e55 = converted %.loc18_24.1, %.loc18_24.4 // CHECK:STDOUT: return %.loc18_25 to %return.param +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- fail_base_after_field.carbon diff --git a/toolchain/check/testdata/class/inheritance/base_field.carbon b/toolchain/check/testdata/class/inheritance/base_field.carbon index 4cf00f298309..aec54efb636a 100644 --- a/toolchain/check/testdata/class/inheritance/base_field.carbon +++ b/toolchain/check/testdata/class/inheritance/base_field.carbon @@ -160,5 +160,7 @@ fn Access(p: Derived*) -> i32* { // CHECK:STDOUT: %bound_method.loc29_10.2: = bound_method %addr, %specific_fn // CHECK:STDOUT: %ptr.as.Copy.impl.Op.call: init %ptr.d08 = call %bound_method.loc29_10.2(%addr) // CHECK:STDOUT: return %ptr.as.Copy.impl.Op.call +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/class/inheritance/base_function_unqualified.carbon b/toolchain/check/testdata/class/inheritance/base_function_unqualified.carbon index 51271b25d5a7..f1695f35671e 100644 --- a/toolchain/check/testdata/class/inheritance/base_function_unqualified.carbon +++ b/toolchain/check/testdata/class/inheritance/base_function_unqualified.carbon @@ -100,6 +100,8 @@ fn Derived.H() { // CHECK:STDOUT: %F.ref: %Base.F.type = name_ref F, @Base.%Base.F.decl [concrete = constants.%Base.F] // CHECK:STDOUT: %Base.F.call: init %empty_tuple.type = call %F.ref() // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Derived.H() { @@ -107,5 +109,7 @@ fn Derived.H() { // CHECK:STDOUT: %F.ref: %Base.F.type = name_ref F, @Base.%Base.F.decl [concrete = constants.%Base.F] // CHECK:STDOUT: %Base.F.call: init %empty_tuple.type = call %F.ref() // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/class/inheritance/base_method.carbon b/toolchain/check/testdata/class/inheritance/base_method.carbon index 73f95b38bb1e..095bd6ba725a 100644 --- a/toolchain/check/testdata/class/inheritance/base_method.carbon +++ b/toolchain/check/testdata/class/inheritance/base_method.carbon @@ -167,6 +167,8 @@ fn Call(p: Derived*) { // CHECK:STDOUT: %.loc22_10: init %i32 = converted %int_1, %Core.IntLiteral.as.ImplicitAs.impl.Convert.call [concrete = constants.%int_1.0c6] // CHECK:STDOUT: assign %.loc22_7, %.loc22_10 // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Call(%p.param: %ptr.64c) { @@ -180,5 +182,7 @@ fn Call(p: Derived*) { // CHECK:STDOUT: %.loc30_4.4: ref %Base = converted %.loc30_4.1, %.loc30_4.3 // CHECK:STDOUT: %Base.F.call: init %empty_tuple.type = call %Base.F.bound(%.loc30_4.4) // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/class/inheritance/base_method_qualified.carbon b/toolchain/check/testdata/class/inheritance/base_method_qualified.carbon index ccd5d04e797b..de098fce80a9 100644 --- a/toolchain/check/testdata/class/inheritance/base_method_qualified.carbon +++ b/toolchain/check/testdata/class/inheritance/base_method_qualified.carbon @@ -267,6 +267,8 @@ fn PassDerivedToBaseIndirect(p: Derived*) -> i32 { // CHECK:STDOUT: %.loc30_10.4: %Base = acquire_value %.loc30_10.3 // CHECK:STDOUT: %Base.F.call: init %i32 = call %Base.F.bound(%.loc30_10.4) // CHECK:STDOUT: return %Base.F.call +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @CallIndirect(%p.param: %ptr.64c) -> out %return.param: %i32 { @@ -282,6 +284,8 @@ fn PassDerivedToBaseIndirect(p: Derived*) -> i32 { // CHECK:STDOUT: %.loc34_11.5: %Base = acquire_value %.loc34_11.4 // CHECK:STDOUT: %Base.F.call: init %i32 = call %Base.F.bound(%.loc34_11.5) // CHECK:STDOUT: return %Base.F.call +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @PassDerivedToBase(%a.param: %Derived) -> out %return.param: %i32 { @@ -292,6 +296,8 @@ fn PassDerivedToBaseIndirect(p: Derived*) -> i32 { // CHECK:STDOUT: %Base.G.bound: = bound_method %a.ref, %G.ref // CHECK:STDOUT: %Base.G.call: init %i32 = call %Base.G.bound(%a.ref) // CHECK:STDOUT: return %Base.G.call +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @PassDerivedToBaseIndirect(%p.param: %ptr.64c) -> out %return.param: %i32 { @@ -304,5 +310,7 @@ fn PassDerivedToBaseIndirect(p: Derived*) -> i32 { // CHECK:STDOUT: %.loc42_11.2: %Derived = acquire_value %.loc42_11.1 // CHECK:STDOUT: %Base.G.call: init %i32 = call %Base.G.bound(%.loc42_11.2) // CHECK:STDOUT: return %Base.G.call +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/class/inheritance/base_method_shadow.carbon b/toolchain/check/testdata/class/inheritance/base_method_shadow.carbon index 8c0f3c32b91a..25d6ee633a96 100644 --- a/toolchain/check/testdata/class/inheritance/base_method_shadow.carbon +++ b/toolchain/check/testdata/class/inheritance/base_method_shadow.carbon @@ -254,5 +254,7 @@ fn Call(a: A*, b: B*, c: C*, d: D*) { // CHECK:STDOUT: %.loc37_4.4: ref %B = converted %.loc37_4.1, %.loc37_4.3 // CHECK:STDOUT: %B.F.call.loc37: init %empty_tuple.type = call %B.F.bound.loc37(%.loc37_4.4) // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/class/inheritance/derived_to_base.carbon b/toolchain/check/testdata/class/inheritance/derived_to_base.carbon index 57c210658125..62380044b011 100644 --- a/toolchain/check/testdata/class/inheritance/derived_to_base.carbon +++ b/toolchain/check/testdata/class/inheritance/derived_to_base.carbon @@ -335,6 +335,8 @@ fn PassPartialB(b: partial B) { // CHECK:STDOUT: %bound_method.loc19_39.2: = bound_method %.loc19_39.3, %specific_fn // CHECK:STDOUT: %ptr.as.Copy.impl.Op.call: init %ptr.432 = call %bound_method.loc19_39.2(%.loc19_39.3) // CHECK:STDOUT: return %ptr.as.Copy.impl.Op.call +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @ConvertBToA(%p.param: %ptr.432) -> out %return.param: %ptr.d43 { @@ -350,6 +352,8 @@ fn PassPartialB(b: partial B) { // CHECK:STDOUT: %bound_method.loc20_39.2: = bound_method %.loc20_39.3, %specific_fn // CHECK:STDOUT: %ptr.as.Copy.impl.Op.call: init %ptr.d43 = call %bound_method.loc20_39.2(%.loc20_39.3) // CHECK:STDOUT: return %ptr.as.Copy.impl.Op.call +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @ConvertCToA(%p.param: %ptr.6b6) -> out %return.param: %ptr.d43 { @@ -366,6 +370,8 @@ fn PassPartialB(b: partial B) { // CHECK:STDOUT: %bound_method.loc21_39.2: = bound_method %.loc21_39.4, %specific_fn // CHECK:STDOUT: %ptr.as.Copy.impl.Op.call: init %ptr.d43 = call %bound_method.loc21_39.2(%.loc21_39.4) // CHECK:STDOUT: return %ptr.as.Copy.impl.Op.call +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @ConvertValue(%c.param: %C) { @@ -382,6 +388,8 @@ fn PassPartialB(b: partial B) { // CHECK:STDOUT: %a.patt: %pattern_type.9ef = value_binding_pattern a [concrete = constants.%a.patt.bb7b23.1] // CHECK:STDOUT: } // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @ConvertRef(%c.param: %ptr.6b6) -> out %return.param: %ptr.d43 { @@ -400,6 +408,8 @@ fn PassPartialB(b: partial B) { // CHECK:STDOUT: %bound_method.loc28_10.2: = bound_method %addr, %specific_fn // CHECK:STDOUT: %ptr.as.Copy.impl.Op.call: init %ptr.d43 = call %bound_method.loc28_10.2(%addr) // CHECK:STDOUT: return %ptr.as.Copy.impl.Op.call +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @ConvertInit() { @@ -459,6 +469,8 @@ fn PassPartialB(b: partial B) { // CHECK:STDOUT: } // CHECK:STDOUT: %Destroy.Op.call: init %empty_tuple.type = call constants.%Destroy.Op.bound(constants.%.320) // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Destroy.Op.loc32_66.1(%self.param: ref %i32.builtin) = "no_op"; @@ -466,16 +478,22 @@ fn PassPartialB(b: partial B) { // CHECK:STDOUT: fn @Destroy.Op.loc32_66.2(%self.param: ref %i32) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Destroy.Op.loc32_66.3(%self.param: ref %struct_type.a.a92) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Destroy.Op.loc32_66.4(%self.param: ref %A) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- qualified.carbon @@ -504,6 +522,8 @@ fn PassPartialB(b: partial B) { // CHECK:STDOUT: %.loc15_17.4: %ptr.903 = converted %p.ref, %.loc15_17.3 // CHECK:STDOUT: %TakeConstAPtr.call: init %empty_tuple.type = call %TakeConstAPtr.ref(%.loc15_17.4) // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @PassConstBPtr(%p.param: %ptr.c09) { @@ -516,6 +536,8 @@ fn PassPartialB(b: partial B) { // CHECK:STDOUT: %.loc21_17.3: %ptr.903 = converted %p.ref, %addr // CHECK:STDOUT: %TakeConstAPtr.call: init %empty_tuple.type = call %TakeConstAPtr.ref(%.loc21_17.3) // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- const_qualified_non_ptr.carbon @@ -540,6 +562,8 @@ fn PassPartialB(b: partial B) { // CHECK:STDOUT: %.loc15_14.4: %const.b97 = acquire_value %.loc15_14.3 // CHECK:STDOUT: %TakeConstA.call: init %empty_tuple.type = call %TakeConstA.ref(%.loc15_14.4) // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @PassConstB(%p.param: %const.825) { @@ -552,6 +576,8 @@ fn PassPartialB(b: partial B) { // CHECK:STDOUT: %.loc21_14.4: %const.b97 = acquire_value %.loc21_14.3 // CHECK:STDOUT: %TakeConstA.call: init %empty_tuple.type = call %TakeConstA.ref(%.loc21_14.4) // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- partial_qualified_non_ptr.carbon @@ -576,6 +602,8 @@ fn PassPartialB(b: partial B) { // CHECK:STDOUT: %.loc15_16.4: %.3d6 = acquire_value %.loc15_16.3 // CHECK:STDOUT: %TakePartialA.call: init %empty_tuple.type = call %TakePartialA.ref(%.loc15_16.4) // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @PassPartialB(%b.param: %.640) { @@ -588,5 +616,7 @@ fn PassPartialB(b: partial B) { // CHECK:STDOUT: %.loc21_16.4: %.3d6 = acquire_value %.loc21_16.3 // CHECK:STDOUT: %TakePartialA.call: init %empty_tuple.type = call %TakePartialA.ref(%.loc21_16.4) // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/class/inheritance/import_base.carbon b/toolchain/check/testdata/class/inheritance/import_base.carbon index 694448304792..827393d121b3 100644 --- a/toolchain/check/testdata/class/inheritance/import_base.carbon +++ b/toolchain/check/testdata/class/inheritance/import_base.carbon @@ -312,6 +312,8 @@ fn Run() { // CHECK:STDOUT: %Destroy.Op.bound: = bound_method %a.var, constants.%Destroy.Op.1a2547.6 // CHECK:STDOUT: %Destroy.Op.call: init %empty_tuple.type = call %Destroy.Op.bound(%a.var) // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Base.F [from "a.carbon"]; @@ -321,25 +323,35 @@ fn Run() { // CHECK:STDOUT: fn @Destroy.Op.loc7_3.2(%self.param: ref %i32) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Destroy.Op.loc7_3.3(%self.param: ref %struct_type.x.unused_y.258) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Destroy.Op.loc7_3.4(%self.param: ref %Base) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Destroy.Op.loc7_3.5(%self.param: ref %struct_type.base.cae) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Destroy.Op.loc7_3.6(%self.param: ref %Child) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/class/inheritance/self_conversion.carbon b/toolchain/check/testdata/class/inheritance/self_conversion.carbon index 017acdb8e62d..4c96b6f64b9b 100644 --- a/toolchain/check/testdata/class/inheritance/self_conversion.carbon +++ b/toolchain/check/testdata/class/inheritance/self_conversion.carbon @@ -229,6 +229,8 @@ fn Call(p: Derived*) -> i32 { // CHECK:STDOUT: %bound_method.loc27_14.2: = bound_method %.loc27_14.2, %specific_fn // CHECK:STDOUT: %Int.as.Copy.impl.Op.call: init %i32 = call %bound_method.loc27_14.2(%.loc27_14.2) // CHECK:STDOUT: return %Int.as.Copy.impl.Op.call +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Derived.RefSelfBase(%self.param.loc30: ref %Base) { @@ -245,6 +247,8 @@ fn Call(p: Derived*) -> i32 { // CHECK:STDOUT: %.loc31_10: init %i32 = converted %int_1, %Core.IntLiteral.as.ImplicitAs.impl.Convert.call [concrete = constants.%int_1.0c6] // CHECK:STDOUT: assign %.loc31_7, %.loc31_10 // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Call(%p.param: %ptr.64c) -> out %return.param: %i32 { @@ -267,5 +271,7 @@ fn Call(p: Derived*) -> i32 { // CHECK:STDOUT: %.loc36_11.5: %Base = acquire_value %.loc36_11.4 // CHECK:STDOUT: %Derived.SelfBase.call: init %i32 = call %Derived.SelfBase.bound(%.loc36_11.5) // CHECK:STDOUT: return %Derived.SelfBase.call +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/class/init.carbon b/toolchain/check/testdata/class/init.carbon index 6b8adad48daa..02aa3a9484b4 100644 --- a/toolchain/check/testdata/class/init.carbon +++ b/toolchain/check/testdata/class/init.carbon @@ -181,6 +181,8 @@ fn MakeReorder(n: i32, next: Class*) -> Class { // CHECK:STDOUT: %.loc21_31.6: init %Class to %return.param = class_init (%.loc21_31.3, %.loc21_31.5) // CHECK:STDOUT: %.loc21_32: init %Class = converted %.loc21_31.1, %.loc21_31.6 // CHECK:STDOUT: return %.loc21_32 to %return.param +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @MakeReorder(%n.param: %i32, %next.param: %ptr.7ee) -> out %return.param: %Class { @@ -205,5 +207,7 @@ fn MakeReorder(n: i32, next: Class*) -> Class { // CHECK:STDOUT: %.loc25_31.6: init %Class to %return.param = class_init (%.loc25_31.3, %.loc25_31.5) // CHECK:STDOUT: %.loc25_32: init %Class = converted %.loc25_31.1, %.loc25_31.6 // CHECK:STDOUT: return %.loc25_32 to %return.param +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/class/init_as.carbon b/toolchain/check/testdata/class/init_as.carbon index 8ca1b4678aeb..00b2866ca79e 100644 --- a/toolchain/check/testdata/class/init_as.carbon +++ b/toolchain/check/testdata/class/init_as.carbon @@ -124,6 +124,8 @@ fn G() -> i32 { // CHECK:STDOUT: %Int.as.Copy.impl.Op.call: init %i32 = call %bound_method.loc20_37.2(%.loc20_37.2) // CHECK:STDOUT: %Destroy.Op.call: init %empty_tuple.type = call constants.%Destroy.Op.bound(constants.%.0e3) // CHECK:STDOUT: return %Int.as.Copy.impl.Op.call +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Destroy.Op.loc20_28.1(%self.param: ref %i32.builtin) = "no_op"; @@ -131,16 +133,22 @@ fn G() -> i32 { // CHECK:STDOUT: fn @Destroy.Op.loc20_28.2(%self.param: ref %i32) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Destroy.Op.loc20_28.3(%self.param: ref %struct_type.a.b.b4c) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Destroy.Op.loc20_28.4(%self.param: ref %Class) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @G() -> out %return.param: %i32 { @@ -180,5 +188,7 @@ fn G() -> i32 { // CHECK:STDOUT: %Destroy.Op.bound: = bound_method %v.var, constants.%Destroy.Op.1a2547.4 // CHECK:STDOUT: %Destroy.Op.call: init %empty_tuple.type = call %Destroy.Op.bound(%v.var) // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/class/init_nested.carbon b/toolchain/check/testdata/class/init_nested.carbon index 9471b7c8d7ea..6da65d7a34b3 100644 --- a/toolchain/check/testdata/class/init_nested.carbon +++ b/toolchain/check/testdata/class/init_nested.carbon @@ -136,5 +136,7 @@ fn MakeOuter() -> Outer { // CHECK:STDOUT: %.loc28_45.4: init %Outer to %return.param = class_init (%MakeInner.call.loc28_26, %MakeInner.call.loc28_44) // CHECK:STDOUT: %.loc28_46: init %Outer = converted %.loc28_45.3, %.loc28_45.4 // CHECK:STDOUT: return %.loc28_46 to %return.param +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/class/local.carbon b/toolchain/check/testdata/class/local.carbon index e4f4b9b8cc40..0d68234e5af7 100644 --- a/toolchain/check/testdata/class/local.carbon +++ b/toolchain/check/testdata/class/local.carbon @@ -178,6 +178,8 @@ class A { // CHECK:STDOUT: %Destroy.Op.bound: = bound_method %.loc26_19.2, constants.%Destroy.Op.1a2547.4 // CHECK:STDOUT: %Destroy.Op.call: init %empty_tuple.type = call %Destroy.Op.bound(%.loc26_19.2) // CHECK:STDOUT: return %Int.as.Copy.impl.Op.call +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @B.Make() -> out %return.param: %B { @@ -203,6 +205,8 @@ class A { // CHECK:STDOUT: } // CHECK:STDOUT: %.loc19_23: %B = acquire_value %b // CHECK:STDOUT: return %.loc19_23 to %return.param +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Destroy.Op.loc26_19.1(%self.param: ref %i32.builtin) = "no_op"; @@ -210,15 +214,21 @@ class A { // CHECK:STDOUT: fn @Destroy.Op.loc26_19.2(%self.param: ref %i32) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Destroy.Op.loc26_19.3(%self.param: ref %struct_type.n.9ed) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Destroy.Op.loc26_19.4(%self.param: ref %B) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/class/method/call_without_method_syntax.carbon b/toolchain/check/testdata/class/method/call_without_method_syntax.carbon index f9c63dd2db26..0c23ce52bbc9 100644 --- a/toolchain/check/testdata/class/method/call_without_method_syntax.carbon +++ b/toolchain/check/testdata/class/method/call_without_method_syntax.carbon @@ -217,6 +217,8 @@ fn CallViaAlias(p: Point) -> i32 { // CHECK:STDOUT: %bound_method.loc4_36.2: = bound_method %.loc4_36.2, %specific_fn // CHECK:STDOUT: %Int.as.Copy.impl.Op.call: init %i32 = call %bound_method.loc4_36.2(%.loc4_36.2) // CHECK:STDOUT: return %Int.as.Copy.impl.Op.call +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Point.First(%self.param: %Point, %other.param: %Point) -> out %return.param: %i32 { @@ -231,6 +233,8 @@ fn CallViaAlias(p: Point) -> i32 { // CHECK:STDOUT: %bound_method.loc5_59.2: = bound_method %.loc5_59.2, %specific_fn // CHECK:STDOUT: %Int.as.Copy.impl.Op.call: init %i32 = call %bound_method.loc5_59.2(%.loc5_59.2) // CHECK:STDOUT: return %Int.as.Copy.impl.Op.call +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @CallGet(%p.param: %Point) -> out %return.param: %i32 { @@ -240,6 +244,8 @@ fn CallViaAlias(p: Point) -> i32 { // CHECK:STDOUT: %p.ref: %Point = name_ref p, %p // CHECK:STDOUT: %Point.Get.call: init %i32 = call %Get.ref(%p.ref) // CHECK:STDOUT: return %Point.Get.call +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @CallFirst(%p.param: %Point, %q.param: %Point) -> out %return.param: %i32 { @@ -250,6 +256,8 @@ fn CallViaAlias(p: Point) -> i32 { // CHECK:STDOUT: %q.ref: %Point = name_ref q, %q // CHECK:STDOUT: %Point.First.call: init %i32 = call %First.ref(%p.ref, %q.ref) // CHECK:STDOUT: return %Point.First.call +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @CallViaAlias(%p.param: %Point) -> out %return.param: %i32 { @@ -261,5 +269,7 @@ fn CallViaAlias(p: Point) -> i32 { // CHECK:STDOUT: %p.ref: %Point = name_ref p, %p // CHECK:STDOUT: %Point.Get.call: init %i32 = call %A.ref(%p.ref) // CHECK:STDOUT: return %Point.Get.call +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/class/method/generic_method.carbon b/toolchain/check/testdata/class/method/generic_method.carbon index 3215aa7ae367..5fb1a5630df9 100644 --- a/toolchain/check/testdata/class/method/generic_method.carbon +++ b/toolchain/check/testdata/class/method/generic_method.carbon @@ -153,6 +153,8 @@ fn Class(T:! type).F(unused self, unused n: T) {} // CHECK:STDOUT: fn(%self.param.loc20: @Class.F.%Class (%Class), %n.param.loc20: @Class.F.%T.loc17 (%T)) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/class/method/method.carbon b/toolchain/check/testdata/class/method/method.carbon index 46b0f401461e..9c4af2d6e680 100644 --- a/toolchain/check/testdata/class/method/method.carbon +++ b/toolchain/check/testdata/class/method/method.carbon @@ -382,6 +382,8 @@ fn CallGOnInitializingExpr() -> i32 { // CHECK:STDOUT: %bound_method.loc25_14.2: = bound_method %.loc25_14.2, %specific_fn // CHECK:STDOUT: %Int.as.Copy.impl.Op.call: init %i32 = call %bound_method.loc25_14.2(%.loc25_14.2) // CHECK:STDOUT: return %Int.as.Copy.impl.Op.call +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Class.G(%self.param: ref %Class) -> out %return.param: %i32; @@ -393,6 +395,8 @@ fn CallGOnInitializingExpr() -> i32 { // CHECK:STDOUT: %Class.F.bound: = bound_method %c.ref, %F.ref // CHECK:STDOUT: %Class.F.call: init %i32 = call %Class.F.bound(%c.ref) // CHECK:STDOUT: return %Class.F.call +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @CallAlias(%c.param: %Class) -> out %return.param: %i32 { @@ -402,6 +406,8 @@ fn CallGOnInitializingExpr() -> i32 { // CHECK:STDOUT: %Class.F.bound: = bound_method %c.ref, %A.ref // CHECK:STDOUT: %Class.F.call: init %i32 = call %Class.F.bound(%c.ref) // CHECK:STDOUT: return %Class.F.call +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @CallOnConstBoundMethod() -> out %return.param: %i32 { @@ -427,6 +433,8 @@ fn CallGOnInitializingExpr() -> i32 { // CHECK:STDOUT: %Class.F.call: init %i32 = call %Class.F.bound(%.loc39_20.3) // CHECK:STDOUT: %Destroy.Op.call: init %empty_tuple.type = call constants.%Destroy.Op.bound(constants.%.a72) // CHECK:STDOUT: return %Class.F.call +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Destroy.Op.loc39_20.1(%self.param: ref %i32.builtin) = "no_op"; @@ -434,16 +442,22 @@ fn CallGOnInitializingExpr() -> i32 { // CHECK:STDOUT: fn @Destroy.Op.loc39_20.2(%self.param: ref %i32) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Destroy.Op.loc39_20.3(%self.param: ref %struct_type.k.e7c) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Destroy.Op.loc39_20.4(%self.param: ref %Class) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @CallWithRef() -> out %return.param: %i32 { @@ -470,6 +484,8 @@ fn CallGOnInitializingExpr() -> i32 { // CHECK:STDOUT: %Destroy.Op.bound: = bound_method %c.var, constants.%Destroy.Op.1a2547.4 // CHECK:STDOUT: %Destroy.Op.call: init %empty_tuple.type = call %Destroy.Op.bound(%c.var) // CHECK:STDOUT: return %Class.G.call +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @CallFThroughPointer(%p.param: %ptr.7ee) -> out %return.param: %i32 { @@ -481,6 +497,8 @@ fn CallGOnInitializingExpr() -> i32 { // CHECK:STDOUT: %.loc48_11.2: %Class = acquire_value %.loc48_11.1 // CHECK:STDOUT: %Class.F.call: init %i32 = call %Class.F.bound(%.loc48_11.2) // CHECK:STDOUT: return %Class.F.call +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @CallGThroughPointer(%p.param: %ptr.7ee) -> out %return.param: %i32 { @@ -491,6 +509,8 @@ fn CallGOnInitializingExpr() -> i32 { // CHECK:STDOUT: %Class.G.bound: = bound_method %.loc52, %G.ref // CHECK:STDOUT: %Class.G.call: init %i32 = call %Class.G.bound(%.loc52) // CHECK:STDOUT: return %Class.G.call +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Make() -> out %return.param: %Class; @@ -508,6 +528,8 @@ fn CallGOnInitializingExpr() -> i32 { // CHECK:STDOUT: %Destroy.Op.bound: = bound_method %.loc58_15.2, constants.%Destroy.Op.1a2547.4 // CHECK:STDOUT: %Destroy.Op.call: init %empty_tuple.type = call %Destroy.Op.bound(%.loc58_15.2) // CHECK:STDOUT: return %Class.F.call +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @CallGOnInitializingExpr() -> out %return.param: %i32 { @@ -522,5 +544,7 @@ fn CallGOnInitializingExpr() -> i32 { // CHECK:STDOUT: %Destroy.Op.bound: = bound_method %.loc62_15.2, constants.%Destroy.Op.1a2547.4 // CHECK:STDOUT: %Destroy.Op.call: init %empty_tuple.type = call %Destroy.Op.bound(%.loc62_15.2) // CHECK:STDOUT: return %Class.G.call +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/class/method/static_method.carbon b/toolchain/check/testdata/class/method/static_method.carbon index a89f0bb0adc6..2fe6de05eb84 100644 --- a/toolchain/check/testdata/class/method/static_method.carbon +++ b/toolchain/check/testdata/class/method/static_method.carbon @@ -134,6 +134,8 @@ fn Run() -> i32 { // CHECK:STDOUT: %Destroy.Op.bound: = bound_method %c.var, constants.%Destroy.Op.1a2547.2 // CHECK:STDOUT: %Destroy.Op.call: init %empty_tuple.type = call %Destroy.Op.bound(%c.var) // CHECK:STDOUT: return %Class.F.call +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Destroy.Op.loc20_3.1(%self.param: ref %empty_struct_type) = "no_op"; @@ -141,5 +143,7 @@ fn Run() -> i32 { // CHECK:STDOUT: fn @Destroy.Op.loc20_3.2(%self.param: ref %Class) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/class/method/virtual.carbon b/toolchain/check/testdata/class/method/virtual.carbon index 81d39a3a9bd7..1d1283cb6130 100644 --- a/toolchain/check/testdata/class/method/virtual.carbon +++ b/toolchain/check/testdata/class/method/virtual.carbon @@ -732,6 +732,8 @@ class T2(G2:! type) { // CHECK:STDOUT: %Derived.H.bound: = bound_method %.loc9_22.2, %H.ref // CHECK:STDOUT: %Derived.H.call: init %empty_tuple.type = call %Derived.H.bound(%.loc9_22.2) // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Use() { @@ -763,6 +765,8 @@ class T2(G2:! type) { // CHECK:STDOUT: %Destroy.Op.bound: = bound_method %d.var, constants.%Destroy.Op.1a2547.5 // CHECK:STDOUT: %Destroy.Op.call: init %empty_tuple.type = call %Destroy.Op.bound(%d.var) // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Destroy.Op.loc15_3.1(%self.param: ref %ptr.454) = "no_op"; @@ -770,21 +774,29 @@ class T2(G2:! type) { // CHECK:STDOUT: fn @Destroy.Op.loc15_3.2(%self.param: ref %struct_type.vptr) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Destroy.Op.loc15_3.3(%self.param: ref %Base) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Destroy.Op.loc15_3.4(%self.param: ref %struct_type.base.507) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Destroy.Op.loc15_3.5(%self.param: ref %Derived) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- init.carbon @@ -841,6 +853,8 @@ class T2(G2:! type) { // CHECK:STDOUT: %Destroy.Op.bound: = bound_method %v.var, constants.%Destroy.Op.1a2547.3 // CHECK:STDOUT: %Destroy.Op.call: init %empty_tuple.type = call %Destroy.Op.bound(%v.var) // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Destroy.Op.loc8_3.1(%self.param: ref %ptr.454) = "no_op"; @@ -848,11 +862,15 @@ class T2(G2:! type) { // CHECK:STDOUT: fn @Destroy.Op.loc8_3.2(%self.param: ref %struct_type.vptr) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Destroy.Op.loc8_3.3(%self.param: ref %Base) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- init_members.carbon @@ -993,6 +1011,8 @@ class T2(G2:! type) { // CHECK:STDOUT: %Destroy.Op.bound.loc14: = bound_method %b1.var, constants.%Destroy.Op.1a2547.5 // CHECK:STDOUT: %Destroy.Op.call.loc14: init %empty_tuple.type = call %Destroy.Op.bound.loc14(%b1.var) // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Destroy.Op.loc15_3.1(%self.param: ref %ptr.454) = "no_op"; @@ -1002,16 +1022,22 @@ class T2(G2:! type) { // CHECK:STDOUT: fn @Destroy.Op.loc15_3.3(%self.param: ref %i32) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Destroy.Op.loc15_3.4(%self.param: ref %struct_type.vptr.m1.m2) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Destroy.Op.loc15_3.5(%self.param: ref %Base) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- abstract_impl.carbon @@ -1083,6 +1109,8 @@ class T2(G2:! type) { // CHECK:STDOUT: %Derived.F.bound: = bound_method %.loc15_22.3, %F.ref // CHECK:STDOUT: %Derived.F.call: init %empty_tuple.type = call %Derived.F.bound(%.loc15_22.3) // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- virtual_impl.carbon @@ -1154,6 +1182,8 @@ class T2(G2:! type) { // CHECK:STDOUT: %Derived.F.bound: = bound_method %.loc15_22.3, %F.ref // CHECK:STDOUT: %Derived.F.call: init %empty_tuple.type = call %Derived.F.bound(%.loc15_22.3) // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- impl_conversion.carbon @@ -1240,6 +1270,8 @@ class T2(G2:! type) { // CHECK:STDOUT: %Destroy.Op.bound: = bound_method %.loc23_28.4, constants.%Destroy.Op.1a2547.2 // CHECK:STDOUT: %Destroy.Op.call: init %empty_tuple.type = call %Destroy.Op.bound(%.loc23_28.4) // CHECK:STDOUT: return %.loc23_28.6 to %return.param +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Destroy.Op.loc23_28.1(%self.param: ref %empty_struct_type) = "no_op"; @@ -1247,6 +1279,8 @@ class T2(G2:! type) { // CHECK:STDOUT: fn @Destroy.Op.loc23_28.2(%self.param: ref %T2) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- generic_with_virtual.carbon @@ -1312,6 +1346,8 @@ class T2(G2:! type) { // CHECK:STDOUT: virtual fn(%self.param: @T1.F.%T1 (%T1)) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: @@ -1413,6 +1449,8 @@ class T2(G2:! type) { // CHECK:STDOUT: virtual fn(%self.param: @T1.F.%T1 (%T1), %t.param: @T1.F.%T (%T)) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: @@ -1512,6 +1550,8 @@ class T2(G2:! type) { // CHECK:STDOUT: override fn @D1.F.loc11_51.1(%self.param: %D1, %t.param: %ptr.2ee) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: override fn @D1.F.loc11_51.2(%self.param: %Base.5b2, %t.param: %ptr.2ee) [thunk @D1.%D1.F.decl.loc11_51.1 for @Base.%Base.F.decl, @Base.F(constants.%T1)] { @@ -1523,6 +1563,8 @@ class T2(G2:! type) { // CHECK:STDOUT: %D1.F.bound: = bound_method %.loc11_51.2, %F.ref // CHECK:STDOUT: %D1.F.call: init %empty_tuple.type = call %D1.F.bound(%.loc11_51.2, %t.param) // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- impl_generic_generic.carbon @@ -1637,6 +1679,8 @@ class T2(G2:! type) { // CHECK:STDOUT: override fn(%self.param: @Derived.F.loc10_44.1.%Derived (%Derived), %t.param: @Derived.F.loc10_44.1.%ptr.loc10_41.1 (%ptr.e8f)) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: @@ -1662,6 +1706,8 @@ class T2(G2:! type) { // CHECK:STDOUT: %bound_method: = bound_method %.loc10_44.3, %Derived.F.specific_fn.loc10_44.1 // CHECK:STDOUT: %Derived.F.call: init %empty_tuple.type = call %bound_method(%.loc10_44.3, %t.param) // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/class/nested.carbon b/toolchain/check/testdata/class/nested.carbon index 9894f47b60d9..e99f195ca681 100644 --- a/toolchain/check/testdata/class/nested.carbon +++ b/toolchain/check/testdata/class/nested.carbon @@ -248,6 +248,8 @@ fn F(a: Outer*) { // CHECK:STDOUT: %Destroy.Op.bound.loc18: = bound_method %o.var, constants.%Destroy.Op.1a2547.6 // CHECK:STDOUT: %Destroy.Op.call.loc18: init %empty_tuple.type = call %Destroy.Op.bound.loc18(%o.var) // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Inner.G() { @@ -287,6 +289,8 @@ fn F(a: Outer*) { // CHECK:STDOUT: %Destroy.Op.bound.loc29: = bound_method %o.var, constants.%Destroy.Op.1a2547.6 // CHECK:STDOUT: %Destroy.Op.call.loc29: init %empty_tuple.type = call %Destroy.Op.bound.loc29(%o.var) // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Outer.H() { @@ -326,6 +330,8 @@ fn F(a: Outer*) { // CHECK:STDOUT: %Destroy.Op.bound.loc36: = bound_method %o.var, constants.%Destroy.Op.1a2547.6 // CHECK:STDOUT: %Destroy.Op.call.loc36: init %empty_tuple.type = call %Destroy.Op.bound.loc36(%o.var) // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Destroy.Op.loc19_5.1(%self.param: ref %ptr.001) = "no_op"; @@ -335,21 +341,29 @@ fn F(a: Outer*) { // CHECK:STDOUT: fn @Destroy.Op.loc19_5.3(%self.param: ref %struct_type.pi.po.qi) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Destroy.Op.loc19_5.4(%self.param: ref %Inner) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Destroy.Op.loc18_5.1(%self.param: ref %struct_type.po.qo.pi) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Destroy.Op.loc18_5.2(%self.param: ref %Outer) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @F(%a.param: %ptr.286) { @@ -447,5 +461,7 @@ fn F(a: Outer*) { // CHECK:STDOUT: %ptr.as.Copy.impl.Op.call.loc53: init %ptr.001 = call %bound_method.loc53_12.2(%.loc53_12.3) // CHECK:STDOUT: assign %.loc53_4.2, %ptr.as.Copy.impl.Op.call.loc53 // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/class/nested_name.carbon b/toolchain/check/testdata/class/nested_name.carbon index 5708aaa0b4d3..3bb46b77c2a8 100644 --- a/toolchain/check/testdata/class/nested_name.carbon +++ b/toolchain/check/testdata/class/nested_name.carbon @@ -170,6 +170,8 @@ fn G(o: Outer) { // CHECK:STDOUT: %bound_method.loc22_12.2: = bound_method %.loc22_12.2, %specific_fn // CHECK:STDOUT: %Int.as.Copy.impl.Op.call: init %i32 = call %bound_method.loc22_12.2(%.loc22_12.2) // CHECK:STDOUT: return %Int.as.Copy.impl.Op.call +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @G(%o.param: %Outer) { @@ -195,6 +197,8 @@ fn G(o: Outer) { // CHECK:STDOUT: %Destroy.Op.bound: = bound_method %i.var, constants.%Destroy.Op.1a2547.4 // CHECK:STDOUT: %Destroy.Op.call: init %empty_tuple.type = call %Destroy.Op.bound(%i.var) // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Destroy.Op.loc26_3.1(%self.param: ref %i32.builtin) = "no_op"; @@ -202,15 +206,21 @@ fn G(o: Outer) { // CHECK:STDOUT: fn @Destroy.Op.loc26_3.2(%self.param: ref %i32) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Destroy.Op.loc26_3.3(%self.param: ref %struct_type.n) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Destroy.Op.loc26_3.4(%self.param: ref %Inner) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/class/partial/init.carbon b/toolchain/check/testdata/class/partial/init.carbon index 2e7ad64af705..41b866d50829 100644 --- a/toolchain/check/testdata/class/partial/init.carbon +++ b/toolchain/check/testdata/class/partial/init.carbon @@ -63,5 +63,7 @@ class Derived { // CHECK:STDOUT: %.loc14_32.4: init %Derived to %return.param = class_init (%.loc14_32.3) // CHECK:STDOUT: %.loc14_33: init %Derived = converted %.loc14_32.2, %.loc14_32.4 // CHECK:STDOUT: return %.loc14_33 to %return.param +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/class/redeclaration.carbon b/toolchain/check/testdata/class/redeclaration.carbon index 021c67711942..7741b83c3a00 100644 --- a/toolchain/check/testdata/class/redeclaration.carbon +++ b/toolchain/check/testdata/class/redeclaration.carbon @@ -99,5 +99,7 @@ fn Class.F(unused self, unused b: ()) {} // CHECK:STDOUT: fn @Class.F(%self.param.loc21: %Class, %b.param.loc21: %empty_tuple.type) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/class/reenter_scope.carbon b/toolchain/check/testdata/class/reenter_scope.carbon index 28a79e81296c..5900899a0ea5 100644 --- a/toolchain/check/testdata/class/reenter_scope.carbon +++ b/toolchain/check/testdata/class/reenter_scope.carbon @@ -105,6 +105,8 @@ fn Class.F() -> i32 { // CHECK:STDOUT: %G.ref.loc22: %Class.G.type = name_ref G, @Class.%Class.G.decl [concrete = constants.%Class.G] // CHECK:STDOUT: %Class.G.call.loc22: init %i32 = call %G.ref.loc22() // CHECK:STDOUT: return %Class.G.call.loc22 +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Class.G() -> out %return.param: %i32; diff --git a/toolchain/check/testdata/class/reorder.carbon b/toolchain/check/testdata/class/reorder.carbon index a5472fe6113e..455fac356e47 100644 --- a/toolchain/check/testdata/class/reorder.carbon +++ b/toolchain/check/testdata/class/reorder.carbon @@ -116,6 +116,8 @@ class Class { // CHECK:STDOUT: %F.ref: %Class.F.type = name_ref F, @Class.%Class.F.decl [concrete = constants.%Class.F] // CHECK:STDOUT: %Class.F.call: init %i32 = call %F.ref() // CHECK:STDOUT: return %Class.F.call +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Class.F() -> out %return.param: %i32 { @@ -128,5 +130,7 @@ class Class { // CHECK:STDOUT: %Core.IntLiteral.as.ImplicitAs.impl.Convert.call: init %i32 = call %bound_method.loc21_13.2(%int_1) [concrete = constants.%int_1.0c6] // CHECK:STDOUT: %.loc21: init %i32 = converted %int_1, %Core.IntLiteral.as.ImplicitAs.impl.Convert.call [concrete = constants.%int_1.0c6] // CHECK:STDOUT: return %.loc21 +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/class/reorder_qualified.carbon b/toolchain/check/testdata/class/reorder_qualified.carbon index 5b86128ede89..5fbd74374f8c 100644 --- a/toolchain/check/testdata/class/reorder_qualified.carbon +++ b/toolchain/check/testdata/class/reorder_qualified.carbon @@ -350,6 +350,8 @@ class A { // CHECK:STDOUT: %Destroy.Op.bound.loc33: = bound_method %a.var, constants.%Destroy.Op.1a2547.10 // CHECK:STDOUT: %Destroy.Op.call.loc33: init %empty_tuple.type = call %Destroy.Op.bound.loc33(%a.var) // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @C.CF(); @@ -361,45 +363,63 @@ class A { // CHECK:STDOUT: fn @Destroy.Op.loc36_7.2(%self.param: ref %i32) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Destroy.Op.loc36_7.3(%self.param: ref %struct_type.d.bde) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Destroy.Op.loc36_7.4(%self.param: ref %D) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Destroy.Op.loc35_7.1(%self.param: ref %struct_type.c.73d) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Destroy.Op.loc35_7.2(%self.param: ref %C) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Destroy.Op.loc34_7.1(%self.param: ref %struct_type.b.0bf) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Destroy.Op.loc34_7.2(%self.param: ref %B) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Destroy.Op.loc33_7.1(%self.param: ref %struct_type.a.a92) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Destroy.Op.loc33_7.2(%self.param: ref %A) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/class/scope.carbon b/toolchain/check/testdata/class/scope.carbon index 3ecfd82568b7..222965dab804 100644 --- a/toolchain/check/testdata/class/scope.carbon +++ b/toolchain/check/testdata/class/scope.carbon @@ -159,6 +159,8 @@ fn Run() { // CHECK:STDOUT: %Core.IntLiteral.as.ImplicitAs.impl.Convert.call: init %i32 = call %bound_method.loc17_13.2(%int_1) [concrete = constants.%int_1.0c6] // CHECK:STDOUT: %.loc17: init %i32 = converted %int_1, %Core.IntLiteral.as.ImplicitAs.impl.Convert.call [concrete = constants.%int_1.0c6] // CHECK:STDOUT: return %.loc17 +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Class.G() -> out %return.param: %i32 { @@ -166,6 +168,8 @@ fn Run() { // CHECK:STDOUT: %F.ref: %Class.F.type = name_ref F, @Class.%Class.F.decl [concrete = constants.%Class.F] // CHECK:STDOUT: %Class.F.call: init %i32 = call %F.ref() // CHECK:STDOUT: return %Class.F.call +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @F() -> out %return.param: %i32 { @@ -178,6 +182,8 @@ fn Run() { // CHECK:STDOUT: %Core.IntLiteral.as.ImplicitAs.impl.Convert.call: init %i32 = call %bound_method.loc26_11.2(%int_2) [concrete = constants.%int_2.295] // CHECK:STDOUT: %.loc26: init %i32 = converted %int_2, %Core.IntLiteral.as.ImplicitAs.impl.Convert.call [concrete = constants.%int_2.295] // CHECK:STDOUT: return %.loc26 +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Run() { @@ -208,6 +214,8 @@ fn Run() { // CHECK:STDOUT: %Destroy.Op.bound.loc30: = bound_method %a.var, constants.%Destroy.Op.1a2547.2 // CHECK:STDOUT: %Destroy.Op.call.loc30: init %empty_tuple.type = call %Destroy.Op.bound.loc30(%a.var) // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Destroy.Op.loc31_3.1(%self.param: ref %i32.builtin) = "no_op"; @@ -215,5 +223,7 @@ fn Run() { // CHECK:STDOUT: fn @Destroy.Op.loc31_3.2(%self.param: ref %i32) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/class/self/fail_ref_self.carbon b/toolchain/check/testdata/class/self/fail_ref_self.carbon index ffe691c3176a..5f0c5005b1e5 100644 --- a/toolchain/check/testdata/class/self/fail_ref_self.carbon +++ b/toolchain/check/testdata/class/self/fail_ref_self.carbon @@ -152,6 +152,8 @@ fn F(c: Class, p: Class*) { // CHECK:STDOUT: %Destroy.Op.bound: = bound_method %.loc35_8.2, constants.%Destroy.Op.1a2547.2 // CHECK:STDOUT: %Destroy.Op.call: init %empty_tuple.type = call %Destroy.Op.bound(%.loc35_8.2) // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Destroy.Op.loc35_8.1(%self.param: ref %empty_struct_type) = "no_op"; @@ -159,5 +161,7 @@ fn F(c: Class, p: Class*) { // CHECK:STDOUT: fn @Destroy.Op.loc35_8.2(%self.param: ref %Class) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/class/self/raw_self.carbon b/toolchain/check/testdata/class/self/raw_self.carbon index bc4e212c4f65..dc90ffdf6ee6 100644 --- a/toolchain/check/testdata/class/self/raw_self.carbon +++ b/toolchain/check/testdata/class/self/raw_self.carbon @@ -187,6 +187,8 @@ fn Class.G(self, r#self: i32) -> (i32, i32) { // CHECK:STDOUT: %Int.as.Copy.impl.Op.call: init %i32 = call %bound_method.loc22_12.2(%self.ref.loc22_12) // CHECK:STDOUT: assign %.loc22, %Int.as.Copy.impl.Op.call // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Class.G(%self.param.loc25_12: %Class, %self.param.loc25_24: %i32) -> out %return.param.loc25: %tuple.type.e55 { @@ -214,5 +216,7 @@ fn Class.G(self, r#self: i32) -> (i32, i32) { // CHECK:STDOUT: %.loc26_25.4: init %tuple.type.e55 to %return.param.loc25 = tuple_init (%.loc26_25.2, %.loc26_25.3) // CHECK:STDOUT: %.loc26_26: init %tuple.type.e55 = converted %.loc26_25.1, %.loc26_25.4 // CHECK:STDOUT: return %.loc26_26 to %return.param.loc25 +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/class/self/raw_self_type.carbon b/toolchain/check/testdata/class/self/raw_self_type.carbon index 7c5f710bf8e9..10e75c0561d2 100644 --- a/toolchain/check/testdata/class/self/raw_self_type.carbon +++ b/toolchain/check/testdata/class/self/raw_self_type.carbon @@ -201,6 +201,8 @@ fn MemberNamedSelf.F(unused x: Self, unused y: r#Self) {} // CHECK:STDOUT: %Destroy.Op.bound.loc17: = bound_method %Self.var, constants.%Destroy.Op // CHECK:STDOUT: %Destroy.Op.call.loc17: init %empty_tuple.type = call %Destroy.Op.bound.loc17(%Self.var) // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Destroy.Op(%self.param: ref %ptr.7ee) = "no_op"; @@ -208,5 +210,7 @@ fn MemberNamedSelf.F(unused x: Self, unused y: r#Self) {} // CHECK:STDOUT: fn @MemberNamedSelf.F(%x.param.loc28: %MemberNamedSelf, %y.param.loc28: %Self.7fc) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/class/self/self.carbon b/toolchain/check/testdata/class/self/self.carbon index e00d61435bea..57c7f9059ebf 100644 --- a/toolchain/check/testdata/class/self/self.carbon +++ b/toolchain/check/testdata/class/self/self.carbon @@ -232,6 +232,8 @@ class Class { // CHECK:STDOUT: %bound_method.loc14_14.2: = bound_method %.loc14_14.2, %specific_fn // CHECK:STDOUT: %Int.as.Copy.impl.Op.call: init %i32 = call %bound_method.loc14_14.2(%.loc14_14.2) // CHECK:STDOUT: return %Int.as.Copy.impl.Op.call +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Class.G(%self.param.loc17: ref %Class) -> out %return.param.loc17: %i32 { @@ -246,6 +248,8 @@ class Class { // CHECK:STDOUT: %bound_method.loc18_14.2: = bound_method %.loc18_14.2, %specific_fn // CHECK:STDOUT: %Int.as.Copy.impl.Op.call: init %i32 = call %bound_method.loc18_14.2(%.loc18_14.2) // CHECK:STDOUT: return %Int.as.Copy.impl.Op.call +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- fail_self_syntax_mismatch.carbon @@ -332,11 +336,15 @@ class Class { // CHECK:STDOUT: fn @Class.F.loc16(%self.param: %Class) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Class.G.loc25(%self.param: %Class) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- fail_self_type_mismatch.carbon @@ -401,6 +409,8 @@ class Class { // CHECK:STDOUT: fn @Class.F.loc16(%self.param: %Class) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- fail_return_self_value.carbon diff --git a/toolchain/check/testdata/class/self/self_type.carbon b/toolchain/check/testdata/class/self/self_type.carbon index 6338daf0a48c..4645ba529c5e 100644 --- a/toolchain/check/testdata/class/self/self_type.carbon +++ b/toolchain/check/testdata/class/self/self_type.carbon @@ -162,6 +162,8 @@ fn Class.F(self) -> i32 { // CHECK:STDOUT: %.loc26_11.2: %Class = acquire_value %.loc26_11.1 // CHECK:STDOUT: %Class.F.call: init %i32 = call %Class.F.bound(%.loc26_11.2) // CHECK:STDOUT: return %Class.F.call +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Class.Make() -> out %return.param: %Class { @@ -196,5 +198,7 @@ fn Class.F(self) -> i32 { // CHECK:STDOUT: assign %s.ref.loc19_5, %.loc19_7 // CHECK:STDOUT: %.loc18_19: %Class = acquire_value %s // CHECK:STDOUT: return %.loc18_19 to %return.param +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/class/syntactic_merge.carbon b/toolchain/check/testdata/class/syntactic_merge.carbon index 5db12d1dff4a..6e919ec67003 100644 --- a/toolchain/check/testdata/class/syntactic_merge.carbon +++ b/toolchain/check/testdata/class/syntactic_merge.carbon @@ -1266,5 +1266,7 @@ fn Base.F(ref self: Base) { // CHECK:STDOUT: %.loc18_10: init %empty_tuple.type = converted %.loc18_13.1, %.loc18_13.2 [concrete = constants.%empty_tuple] // CHECK:STDOUT: assign %.loc18_7, %.loc18_10 // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/const/basics.carbon b/toolchain/check/testdata/const/basics.carbon index 449266dc0d3e..e5730f9e240e 100644 --- a/toolchain/check/testdata/const/basics.carbon +++ b/toolchain/check/testdata/const/basics.carbon @@ -239,6 +239,8 @@ fn PassConstReferenceToReference(p: const X*) { // CHECK:STDOUT: %bound_method.loc7_10.2: = bound_method %p.ref, %specific_fn // CHECK:STDOUT: %ptr.as.Copy.impl.Op.call: init %ptr.0c8 = call %bound_method.loc7_10.2(%p.ref) // CHECK:STDOUT: return %ptr.as.Copy.impl.Op.call +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @B(%p.param: %const.0f8) -> out %return.param: %const.0f8 { @@ -254,6 +256,8 @@ fn PassConstReferenceToReference(p: const X*) { // CHECK:STDOUT: %bound_method.loc11_10.2: = bound_method %p.ref, %specific_fn // CHECK:STDOUT: %const.as.Copy.impl.Op.call: init %const.0f8 = call %bound_method.loc11_10.2(%p.ref) // CHECK:STDOUT: return %const.as.Copy.impl.Op.call +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- collapse.carbon @@ -324,5 +328,7 @@ fn PassConstReferenceToReference(p: const X*) { // CHECK:STDOUT: %bound_method.loc12_10.2: = bound_method %p.ref, %specific_fn // CHECK:STDOUT: %ptr.as.Copy.impl.Op.call: init %ptr.0c8 = call %bound_method.loc12_10.2(%p.ref) // CHECK:STDOUT: return %ptr.as.Copy.impl.Op.call +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/const/import.carbon b/toolchain/check/testdata/const/import.carbon index 9c1a59b44475..4b00c21a6737 100644 --- a/toolchain/check/testdata/const/import.carbon +++ b/toolchain/check/testdata/const/import.carbon @@ -116,5 +116,7 @@ var a_ptr: const C* = a_ptr_ref; // CHECK:STDOUT: %ptr.as.Copy.impl.Op.call.loc7: init %ptr.77f = call %bound_method.loc7_23.2(%.loc7) // CHECK:STDOUT: assign file.%a_ptr.var, %ptr.as.Copy.impl.Op.call.loc7 // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/deduce/array.carbon b/toolchain/check/testdata/deduce/array.carbon index bece2be27246..1bedcbd3f993 100644 --- a/toolchain/check/testdata/deduce/array.carbon +++ b/toolchain/check/testdata/deduce/array.carbon @@ -282,6 +282,8 @@ fn G() { // CHECK:STDOUT: %.loc6_35.1: ref @F.%T.loc6_7.1 (%T) = splice_block %return.param {} // CHECK:STDOUT: %F.call: init @F.%T.loc6_7.1 (%T) to %.loc6_35.1 = call %F.specific_fn.loc6_46.1(%a.ref) // CHECK:STDOUT: return %F.call to %return.param +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: @@ -326,6 +328,8 @@ fn G() { // CHECK:STDOUT: %Destroy.Op.bound: = bound_method %a.var, constants.%Destroy.Op.1a2547.3 // CHECK:STDOUT: %Destroy.Op.call: init %empty_tuple.type = call %Destroy.Op.bound(%a.var) // CHECK:STDOUT: return %F.call to %return.param +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Destroy.Op.loc9_3.1(%self.param: ref %empty_struct_type) = "no_op"; @@ -333,11 +337,15 @@ fn G() { // CHECK:STDOUT: fn @Destroy.Op.loc9_3.2(%self.param: ref %C) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Destroy.Op.loc9_3.3(%self.param: ref %array_type.9a3) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: specific @F(constants.%T) { @@ -538,6 +546,8 @@ fn G() { // CHECK:STDOUT: %Core.IntLiteral.as.ImplicitAs.impl.Convert.call.loc6_67.1: init %i32 = call %bound_method.loc6_67.2(%N.ref.loc6_66) [symbolic = %Core.IntLiteral.as.ImplicitAs.impl.Convert.call.loc6_67.2 (constants.%Core.IntLiteral.as.ImplicitAs.impl.Convert.call)] // CHECK:STDOUT: %.loc6_67: init %i32 = converted %N.ref.loc6_66, %Core.IntLiteral.as.ImplicitAs.impl.Convert.call.loc6_67.1 [symbolic = %Core.IntLiteral.as.ImplicitAs.impl.Convert.call.loc6_67.2 (constants.%Core.IntLiteral.as.ImplicitAs.impl.Convert.call)] // CHECK:STDOUT: return %.loc6_67 +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: @@ -581,6 +591,8 @@ fn G() { // CHECK:STDOUT: %Destroy.Op.bound: = bound_method %a.var, constants.%Destroy.Op.1a2547.3 // CHECK:STDOUT: %Destroy.Op.call: init %empty_tuple.type = call %Destroy.Op.bound(%a.var) // CHECK:STDOUT: return %F.call +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Destroy.Op.loc9_3.1(%self.param: ref %empty_struct_type) = "no_op"; @@ -588,11 +600,15 @@ fn G() { // CHECK:STDOUT: fn @Destroy.Op.loc9_3.2(%self.param: ref %C) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Destroy.Op.loc9_3.3(%self.param: ref %array_type.9a3) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: specific @F(constants.%N) { @@ -737,6 +753,8 @@ fn G() { // CHECK:STDOUT: fn(%a.param: @F.%array_type.loc6_57.1 (%array_type.6d2)) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: @@ -780,6 +798,8 @@ fn G() { // CHECK:STDOUT: %Destroy.Op.bound: = bound_method %a.var, constants.%Destroy.Op.1a2547.3 // CHECK:STDOUT: %Destroy.Op.call: init %empty_tuple.type = call %Destroy.Op.bound(%a.var) // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Destroy.Op.loc9_3.1(%self.param: ref %empty_struct_type) = "no_op"; @@ -787,11 +807,15 @@ fn G() { // CHECK:STDOUT: fn @Destroy.Op.loc9_3.2(%self.param: ref %C) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Destroy.Op.loc9_3.3(%self.param: ref %array_type.9a3) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: specific @F(constants.%T, constants.%N) { @@ -962,6 +986,8 @@ fn G() { // CHECK:STDOUT: %.loc6_35.1: ref @F.%T.loc6_7.1 (%T) = splice_block %return.param {} // CHECK:STDOUT: %F.call: init @F.%T.loc6_7.1 (%T) to %.loc6_35.1 = call %F.specific_fn.loc6_46.1(%a.ref) // CHECK:STDOUT: return %F.call to %return.param +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: @@ -1006,6 +1032,8 @@ fn G() { // CHECK:STDOUT: %Destroy.Op.bound: = bound_method %a.var, constants.%Destroy.Op.1a2547.3 // CHECK:STDOUT: %Destroy.Op.call: init %empty_tuple.type = call %Destroy.Op.bound(%a.var) // CHECK:STDOUT: return %F.call to %return.param +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Destroy.Op.loc10_3.1(%self.param: ref %empty_struct_type) = "no_op"; @@ -1013,11 +1041,15 @@ fn G() { // CHECK:STDOUT: fn @Destroy.Op.loc10_3.2(%self.param: ref %C) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Destroy.Op.loc10_3.3(%self.param: ref %array_type.9a3) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: specific @F(constants.%T) { @@ -1231,6 +1263,8 @@ fn G() { // CHECK:STDOUT: %Core.IntLiteral.as.ImplicitAs.impl.Convert.call.loc7_67.1: init %i32 = call %bound_method.loc7_67.2(%N.ref.loc7_66) [symbolic = %Core.IntLiteral.as.ImplicitAs.impl.Convert.call.loc7_67.2 (constants.%Core.IntLiteral.as.ImplicitAs.impl.Convert.call)] // CHECK:STDOUT: %.loc7_67: init %i32 = converted %N.ref.loc7_66, %Core.IntLiteral.as.ImplicitAs.impl.Convert.call.loc7_67.1 [symbolic = %Core.IntLiteral.as.ImplicitAs.impl.Convert.call.loc7_67.2 (constants.%Core.IntLiteral.as.ImplicitAs.impl.Convert.call)] // CHECK:STDOUT: return %.loc7_67 +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: @@ -1274,6 +1308,8 @@ fn G() { // CHECK:STDOUT: %Destroy.Op.bound: = bound_method %a.var, constants.%Destroy.Op.1a2547.3 // CHECK:STDOUT: %Destroy.Op.call: init %empty_tuple.type = call %Destroy.Op.bound(%a.var) // CHECK:STDOUT: return %F.call +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Destroy.Op.loc11_3.1(%self.param: ref %empty_struct_type) = "no_op"; @@ -1281,11 +1317,15 @@ fn G() { // CHECK:STDOUT: fn @Destroy.Op.loc11_3.2(%self.param: ref %D) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Destroy.Op.loc11_3.3(%self.param: ref %array_type.cec) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: specific @F(constants.%N) { @@ -1490,6 +1530,8 @@ fn G() { // CHECK:STDOUT: %bound_method.loc6_54.2: = bound_method %N.ref.loc6_54, %specific_fn.loc6_54 [symbolic = %bound_method.loc6_54.3 (constants.%bound_method.d86)] // CHECK:STDOUT: %Int.as.Copy.impl.Op.call: init %i32 = call %bound_method.loc6_54.2(%N.ref.loc6_54) [symbolic = %N.loc6_7.1 (constants.%N.37f)] // CHECK:STDOUT: return %Int.as.Copy.impl.Op.call +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: @@ -1530,6 +1572,8 @@ fn G() { // CHECK:STDOUT: %Destroy.Op.bound: = bound_method %a.var, constants.%Destroy.Op.1a2547.3 // CHECK:STDOUT: %Destroy.Op.call: init %empty_tuple.type = call %Destroy.Op.bound(%a.var) // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Destroy.Op.loc9_3.1(%self.param: ref %empty_struct_type) = "no_op"; @@ -1537,11 +1581,15 @@ fn G() { // CHECK:STDOUT: fn @Destroy.Op.loc9_3.2(%self.param: ref %C) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Destroy.Op.loc9_3.3(%self.param: ref %array_type.9a3) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: specific @F(constants.%N.37f) { @@ -1676,6 +1724,8 @@ fn G() { // CHECK:STDOUT: fn(%a.param: @F.%array_type.loc5_35.1 (%array_type)) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: @@ -1687,6 +1737,8 @@ fn G() { // CHECK:STDOUT: %.loc17_15: %empty_struct_type = struct_literal () [concrete = constants.%empty_struct] // CHECK:STDOUT: %.loc17_16: %tuple.type = tuple_literal (%.loc17_7, %.loc17_11, %.loc17_15) [concrete = constants.%tuple] // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: specific @F(constants.%N.37f) { diff --git a/toolchain/check/testdata/deduce/conversion.carbon b/toolchain/check/testdata/deduce/conversion.carbon index 050a6f0340fc..bde4f822c798 100644 --- a/toolchain/check/testdata/deduce/conversion.carbon +++ b/toolchain/check/testdata/deduce/conversion.carbon @@ -91,6 +91,8 @@ fn G(a: A) { // CHECK:STDOUT: %F.specific_fn: = specific_function %F.ref, @F(constants.%tuple.type.1e7) [concrete = constants.%F.specific_fn] // CHECK:STDOUT: %F.call: init %empty_tuple.type = call %F.specific_fn() // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- need_user_conversion.carbon @@ -143,6 +145,8 @@ fn G(a: A) { // CHECK:STDOUT: %F.call: init %empty_tuple.type = call %F.specific_fn() // CHECK:STDOUT: %Destroy.Op.call: init %empty_tuple.type = call constants.%Destroy.Op.bound(constants.%.367) // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Destroy.Op.loc16_8.1(%self.param: ref %empty_struct_type) = "no_op"; @@ -150,6 +154,8 @@ fn G(a: A) { // CHECK:STDOUT: fn @Destroy.Op.loc16_8.2(%self.param: ref %A) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- no_conversion_during_deduction.carbon @@ -192,6 +198,8 @@ fn G(a: A) { // CHECK:STDOUT: %Destroy.Op.bound: = bound_method %.loc16_9.3, constants.%Destroy.Op.1a2547.2 // CHECK:STDOUT: %Destroy.Op.call: init %empty_tuple.type = call %Destroy.Op.bound(%.loc16_9.3) // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Destroy.Op.loc16_9.1(%self.param: ref %empty_struct_type) = "no_op"; @@ -199,5 +207,7 @@ fn G(a: A) { // CHECK:STDOUT: fn @Destroy.Op.loc16_9.2(%self.param: ref %B) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/deduce/generic_type.carbon b/toolchain/check/testdata/deduce/generic_type.carbon index 8d809eb26153..ea13b8e195d1 100644 --- a/toolchain/check/testdata/deduce/generic_type.carbon +++ b/toolchain/check/testdata/deduce/generic_type.carbon @@ -226,6 +226,8 @@ fn G() -> i32 { // CHECK:STDOUT: %.loc7_28.1: ref @F.%T.loc7_7.1 (%T) = splice_block %return.param {} // CHECK:STDOUT: %F.call: init @F.%T.loc7_7.1 (%T) to %.loc7_28.1 = call %F.specific_fn.loc7_39.1(%p.ref) // CHECK:STDOUT: return %F.call to %return.param +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: @@ -237,6 +239,8 @@ fn G() -> i32 { // CHECK:STDOUT: %.loc9_18.1: ref %D = splice_block %return.param {} // CHECK:STDOUT: %F.call: init %D to %.loc9_18.1 = call %F.specific_fn(%p.ref) // CHECK:STDOUT: return %F.call to %return.param +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: specific @C(constants.%T) { @@ -436,6 +440,8 @@ fn G() -> i32 { // CHECK:STDOUT: %.loc7_28.1: ref %C = splice_block %return.param {} // CHECK:STDOUT: %F.call: init %C to %.loc7_28.1 = call %F.specific_fn.loc7_39.1(%p.ref) // CHECK:STDOUT: return %F.call to %return.param +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: @@ -447,6 +453,8 @@ fn G() -> i32 { // CHECK:STDOUT: %.loc9_18.1: ref %C = splice_block %return.param {} // CHECK:STDOUT: %F.call: init %C to %.loc9_18.1 = call %F.specific_fn(%p.ref) // CHECK:STDOUT: return %F.call to %return.param +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: specific @I(constants.%T) { @@ -727,6 +735,8 @@ fn G() -> i32 { // CHECK:STDOUT: %.loc13_56.1: ref @F.%tuple.type (%tuple.type.a5e) = splice_block %return.param {} // CHECK:STDOUT: %F.call: init @F.%tuple.type (%tuple.type.a5e) to %.loc13_56.1 = call %F.specific_fn.loc13_67.1(%p.ref) // CHECK:STDOUT: return %F.call to %return.param +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: @@ -738,6 +748,8 @@ fn G() -> i32 { // CHECK:STDOUT: %.loc15_36.1: ref %tuple.type.af1 = splice_block %return.param {} // CHECK:STDOUT: %F.call: init %tuple.type.af1 to %.loc15_36.1 = call %F.specific_fn(%p.ref) // CHECK:STDOUT: return %F.call to %return.param +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: specific @Outer(constants.%T) { @@ -1007,6 +1019,8 @@ fn G() -> i32 { // CHECK:STDOUT: %bound_method.loc6_57.2: = bound_method %N.ref.loc6_57, %specific_fn [symbolic = %bound_method.loc6_57.3 (constants.%bound_method.d86)] // CHECK:STDOUT: %Int.as.Copy.impl.Op.call: init %i32 = call %bound_method.loc6_57.2(%N.ref.loc6_57) [symbolic = %N.loc6_7.1 (constants.%N.37f)] // CHECK:STDOUT: return %Int.as.Copy.impl.Op.call +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: @@ -1033,6 +1047,8 @@ fn G() -> i32 { // CHECK:STDOUT: %F.call: init %i32 = call %F.specific_fn(%.loc9_15.3) // CHECK:STDOUT: %Destroy.Op.call: init %empty_tuple.type = call constants.%Destroy.Op.bound(constants.%.0e2) // CHECK:STDOUT: return %F.call +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Destroy.Op.loc9_15.1(%self.param: ref %empty_struct_type) = "no_op"; @@ -1040,6 +1056,8 @@ fn G() -> i32 { // CHECK:STDOUT: fn @Destroy.Op.loc9_15.2(%self.param: ref %WithNontype.888) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: specific @WithNontype(constants.%N.37f) { diff --git a/toolchain/check/testdata/deduce/int_float.carbon b/toolchain/check/testdata/deduce/int_float.carbon index 885311f85569..fb8b2c1ade50 100644 --- a/toolchain/check/testdata/deduce/int_float.carbon +++ b/toolchain/check/testdata/deduce/int_float.carbon @@ -164,6 +164,8 @@ fn G(a: f64) -> Core.IntLiteral { // CHECK:STDOUT: %bound_method: = bound_method %N.ref.loc5, %impl.elem0 [symbolic = %Core.IntLiteral.as.Copy.impl.Op.bound (constants.%Core.IntLiteral.as.Copy.impl.Op.bound.3c6)] // CHECK:STDOUT: %Core.IntLiteral.as.Copy.impl.Op.call: init Core.IntLiteral = call %bound_method(%N.ref.loc5) [symbolic = %N.loc4_7.1 (constants.%N)] // CHECK:STDOUT: return %Core.IntLiteral.as.Copy.impl.Op.call +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: @@ -174,6 +176,8 @@ fn G(a: f64) -> Core.IntLiteral { // CHECK:STDOUT: %F.specific_fn: = specific_function %F.ref, @F(constants.%int_64) [concrete = constants.%F.specific_fn] // CHECK:STDOUT: %F.call: init Core.IntLiteral = call %F.specific_fn(%a.ref) // CHECK:STDOUT: return %F.call +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: specific @F(constants.%N) { @@ -326,6 +330,8 @@ fn G(a: f64) -> Core.IntLiteral { // CHECK:STDOUT: %bound_method: = bound_method %N.ref.loc5, %impl.elem0 [symbolic = %Core.IntLiteral.as.Copy.impl.Op.bound (constants.%Core.IntLiteral.as.Copy.impl.Op.bound.3c6)] // CHECK:STDOUT: %Core.IntLiteral.as.Copy.impl.Op.call: init Core.IntLiteral = call %bound_method(%N.ref.loc5) [symbolic = %N.loc4_7.1 (constants.%N)] // CHECK:STDOUT: return %Core.IntLiteral.as.Copy.impl.Op.call +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: @@ -336,6 +342,8 @@ fn G(a: f64) -> Core.IntLiteral { // CHECK:STDOUT: %F.specific_fn: = specific_function %F.ref, @F(constants.%int_64) [concrete = constants.%F.specific_fn] // CHECK:STDOUT: %F.call: init Core.IntLiteral = call %F.specific_fn(%a.ref) // CHECK:STDOUT: return %F.call +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: specific @F(constants.%N) { diff --git a/toolchain/check/testdata/deduce/tuple.carbon b/toolchain/check/testdata/deduce/tuple.carbon index a6069ac3c20c..41bba14b68f9 100644 --- a/toolchain/check/testdata/deduce/tuple.carbon +++ b/toolchain/check/testdata/deduce/tuple.carbon @@ -213,6 +213,8 @@ fn G(pair: (C, D)) -> D { // CHECK:STDOUT: %.loc7_43.1: ref @F.%U.loc7_17.1 (%U) = splice_block %return.param {} // CHECK:STDOUT: %F.call: init @F.%U.loc7_17.1 (%U) to %.loc7_43.1 = call %F.specific_fn.loc7_54.1(%pair.ref) // CHECK:STDOUT: return %F.call to %return.param +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: @@ -224,6 +226,8 @@ fn G(pair: (C, D)) -> D { // CHECK:STDOUT: %.loc9_23.1: ref %D = splice_block %return.param {} // CHECK:STDOUT: %F.call: init %D to %.loc9_23.1 = call %F.specific_fn(%pair.ref) // CHECK:STDOUT: return %F.call to %return.param +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: specific @F(constants.%T, constants.%U) { @@ -500,6 +504,8 @@ fn G(pair: (C, D)) -> D { // CHECK:STDOUT: %bound_method.loc6_67.2: = bound_method %B.ref.loc6_67, %specific_fn [symbolic = %bound_method.loc6_67.3 (constants.%bound_method.523)] // CHECK:STDOUT: %Int.as.Copy.impl.Op.call: init %i32 = call %bound_method.loc6_67.2(%B.ref.loc6_67) [symbolic = %B.loc6_16.1 (constants.%B)] // CHECK:STDOUT: return %Int.as.Copy.impl.Op.call +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: @@ -510,6 +516,8 @@ fn G(pair: (C, D)) -> D { // CHECK:STDOUT: %F.specific_fn: = specific_function %F.ref, @F(constants.%int_1.0c6, constants.%int_2.295) [concrete = constants.%F.specific_fn] // CHECK:STDOUT: %F.call: init %i32 = call %F.specific_fn(%h.ref) // CHECK:STDOUT: return %F.call +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: specific @HasPair(constants.%Pair) { @@ -698,6 +706,8 @@ fn G(pair: (C, D)) -> D { // CHECK:STDOUT: %F.ref: %F.type = name_ref F, file.%F.decl [concrete = constants.%F] // CHECK:STDOUT: %pair.ref: %tuple.type.af1 = name_ref pair, %pair // CHECK:STDOUT: return to %return.param +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: specific @F(constants.%T) { diff --git a/toolchain/check/testdata/deduce/type_operator.carbon b/toolchain/check/testdata/deduce/type_operator.carbon index 19b9dd646730..cfec77fa8a44 100644 --- a/toolchain/check/testdata/deduce/type_operator.carbon +++ b/toolchain/check/testdata/deduce/type_operator.carbon @@ -196,6 +196,8 @@ fn G(p: C*) -> const C { // CHECK:STDOUT: %.loc6_26.1: ref @F.%T.loc6_7.1 (%T) = splice_block %return.param {} // CHECK:STDOUT: %F.call: init @F.%T.loc6_7.1 (%T) to %.loc6_26.1 = call %F.specific_fn.loc6_37.1(%p.ref) // CHECK:STDOUT: return %F.call to %return.param +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: @@ -207,6 +209,8 @@ fn G(p: C*) -> const C { // CHECK:STDOUT: %.loc8_16.1: ref %C = splice_block %return.param {} // CHECK:STDOUT: %F.call: init %C to %.loc8_16.1 = call %F.specific_fn(%p.ref) // CHECK:STDOUT: return %F.call to %return.param +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: specific @F(constants.%T) { @@ -379,6 +383,8 @@ fn G(p: C*) -> const C { // CHECK:STDOUT: %.loc6_32.1: ref @F.%T.loc6_7.1 (%T) = splice_block %return.param {} // CHECK:STDOUT: %F.call: init @F.%T.loc6_7.1 (%T) to %.loc6_32.1 = call %F.specific_fn.loc6_43.1(%p.ref) // CHECK:STDOUT: return %F.call to %return.param +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: @@ -390,6 +396,8 @@ fn G(p: C*) -> const C { // CHECK:STDOUT: %.loc8_22.1: ref %C = splice_block %return.param {} // CHECK:STDOUT: %F.call: init %C to %.loc8_22.1 = call %F.specific_fn(%p.ref) // CHECK:STDOUT: return %F.call to %return.param +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: specific @F(constants.%T) { @@ -562,6 +570,8 @@ fn G(p: C*) -> const C { // CHECK:STDOUT: %.loc6_26.1: ref @F.%T.loc6_7.1 (%T) = splice_block %return.param {} // CHECK:STDOUT: %F.call: init @F.%T.loc6_7.1 (%T) to %.loc6_26.1 = call %F.specific_fn.loc6_37.1(%p.ref) // CHECK:STDOUT: return %F.call to %return.param +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: @@ -573,6 +583,8 @@ fn G(p: C*) -> const C { // CHECK:STDOUT: %.loc8_22.1: ref %const = splice_block %return.param {} // CHECK:STDOUT: %F.call: init %const to %.loc8_22.1 = call %F.specific_fn(%p.ref) // CHECK:STDOUT: return %F.call to %return.param +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: specific @F(constants.%T) { @@ -743,6 +755,8 @@ fn G(p: C*) -> const C { // CHECK:STDOUT: %.loc6_32.1: ref @F.%T.loc6_7.1 (%T) = splice_block %return.param {} // CHECK:STDOUT: %F.call: init @F.%T.loc6_7.1 (%T) to %.loc6_32.1 = call %F.specific_fn.loc6_43.1(%p.ref) // CHECK:STDOUT: return %F.call to %return.param +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: @@ -751,6 +765,8 @@ fn G(p: C*) -> const C { // CHECK:STDOUT: %F.ref: %F.type = name_ref F, file.%F.decl [concrete = constants.%F] // CHECK:STDOUT: %p.ref: %ptr.6b6 = name_ref p, %p // CHECK:STDOUT: return to %return.param +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: specific @F(constants.%T) { diff --git a/toolchain/check/testdata/deduce/value_with_type_through_access.carbon b/toolchain/check/testdata/deduce/value_with_type_through_access.carbon index 01ff05c0f55f..32b8fafd6bd3 100644 --- a/toolchain/check/testdata/deduce/value_with_type_through_access.carbon +++ b/toolchain/check/testdata/deduce/value_with_type_through_access.carbon @@ -257,6 +257,8 @@ fn G() { // CHECK:STDOUT: fn(%x.param: @F.%HoldsType.loc8_41.1 (%HoldsType.a83), %a.param: @F.%tuple.elem0.loc8_55.1 (%tuple.elem0)) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: @@ -286,6 +288,8 @@ fn G() { // CHECK:STDOUT: %Destroy.Op.call.loc13_30: init %empty_tuple.type = call constants.%Destroy.Op.bound.72d(constants.%.115) // CHECK:STDOUT: %Destroy.Op.call.loc13_8: init %empty_tuple.type = call constants.%Destroy.Op.bound.bc7(constants.%.eb0) // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Destroy.Op.loc13_30.1(%self.param: ref %empty_struct_type) = "no_op"; @@ -293,11 +297,15 @@ fn G() { // CHECK:STDOUT: fn @Destroy.Op.loc13_30.2(%self.param: ref %C) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Destroy.Op.loc13_8(%self.param: ref %HoldsType.30f) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: specific @HoldsType(constants.%T) { @@ -497,6 +505,8 @@ fn G() { // CHECK:STDOUT: fn(%x.param: @F.%HoldsType.loc8_43.1 (%HoldsType.07e), %a.param: @F.%.loc8_57.1 (%.424)) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: @@ -526,6 +536,8 @@ fn G() { // CHECK:STDOUT: %Destroy.Op.call.loc13_33: init %empty_tuple.type = call constants.%Destroy.Op.bound.72d(constants.%.115) // CHECK:STDOUT: %Destroy.Op.call.loc13_8: init %empty_tuple.type = call constants.%Destroy.Op.bound.e30(constants.%.344) // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Destroy.Op.loc13_33.1(%self.param: ref %empty_struct_type) = "no_op"; @@ -533,11 +545,15 @@ fn G() { // CHECK:STDOUT: fn @Destroy.Op.loc13_33.2(%self.param: ref %C) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Destroy.Op.loc13_8(%self.param: ref %HoldsType.53c) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: specific @HoldsType(constants.%T) { @@ -763,6 +779,8 @@ fn G() { // CHECK:STDOUT: fn(%x.param: @F.%HoldsType.loc21_38.1 (%HoldsType.3500da.1), %a.param: ) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: @@ -787,6 +805,8 @@ fn G() { // CHECK:STDOUT: %.loc26_8: init @G.%HoldsType.loc26_22.2 (%HoldsType.3500da.2) = converted %.loc26_6.1, %.loc26_6.3 [symbolic = %HoldsType.val (constants.%HoldsType.val.7f1)] // CHECK:STDOUT: %.loc26_26: %empty_struct_type = struct_literal () [concrete = constants.%empty_struct] // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: @@ -809,6 +829,8 @@ fn G() { // CHECK:STDOUT: %G.call: init %empty_tuple.type = call %G.specific_fn() // CHECK:STDOUT: %Destroy.Op.call: init %empty_tuple.type = call constants.%Destroy.Op.bound(constants.%.0de) // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Destroy.Op.loc30_13.1(%self.param: ref type) = "no_op"; @@ -816,11 +838,15 @@ fn G() { // CHECK:STDOUT: fn @Destroy.Op.loc30_13.2(%self.param: ref %struct_type.t) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Destroy.Op.loc30_13.3(%self.param: ref %Class) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: specific @HoldsType(constants.%T.f25) { @@ -1054,6 +1080,8 @@ fn G() { // CHECK:STDOUT: fn(%x.param: @F.%HoldsType.loc12_47.1 (%HoldsType.881), %a.param: ) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: @@ -1085,6 +1113,8 @@ fn G() { // CHECK:STDOUT: %.loc17_48: %empty_struct_type = struct_literal () [concrete = constants.%empty_struct] // CHECK:STDOUT: %Destroy.Op.call: init %empty_tuple.type = call constants.%Destroy.Op.bound(constants.%.1c6) // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Destroy.Op.loc17_27.1(%self.param: ref type) = "no_op"; @@ -1092,6 +1122,8 @@ fn G() { // CHECK:STDOUT: fn @Destroy.Op.loc17_27.2(%self.param: ref %array_type) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: specific @HoldsType(constants.%T.9b7) { diff --git a/toolchain/check/testdata/eval/aggregates.carbon b/toolchain/check/testdata/eval/aggregates.carbon index d33931ca8264..3c9abc226d84 100644 --- a/toolchain/check/testdata/eval/aggregates.carbon +++ b/toolchain/check/testdata/eval/aggregates.carbon @@ -352,6 +352,8 @@ fn G(N:! i32) { // CHECK:STDOUT: %.loc10_41: init %array_type = converted %.loc10_39.1, %.loc10_39.5 [concrete = constants.%array] // CHECK:STDOUT: assign file.%struct_access.var, %.loc10_41 // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- fail_todo_array_temporary.carbon @@ -490,6 +492,8 @@ fn G(N:! i32) { // CHECK:STDOUT: %.loc9_86.2: %i32 = acquire_value %.loc9_86.1 // CHECK:STDOUT: assign file.%array_index.var, // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- symbolic.carbon @@ -767,6 +771,8 @@ fn G(N:! i32) { // CHECK:STDOUT: %bound_method.loc6_3.2: = bound_method %u.var, %specific_impl_fn.loc6_3.1 // CHECK:STDOUT: %Destroy.WithSelf.Op.call.loc6: init %empty_tuple.type = call %bound_method.loc6_3.2(%u.var) // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: @@ -835,6 +841,8 @@ fn G(N:! i32) { // CHECK:STDOUT: %bound_method.loc14_3.2: = bound_method %k.var, %specific_impl_fn.loc14_3.1 // CHECK:STDOUT: %Destroy.WithSelf.Op.call: init %empty_tuple.type = call %bound_method.loc14_3.2(%k.var) // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/eval/binding.carbon b/toolchain/check/testdata/eval/binding.carbon index 32a597d0b73e..83e72bffad37 100644 --- a/toolchain/check/testdata/eval/binding.carbon +++ b/toolchain/check/testdata/eval/binding.carbon @@ -195,5 +195,7 @@ let n: array(i32, G()) = (1, 2, 3); // CHECK:STDOUT: %int_3: Core.IntLiteral = int_value 3 [concrete = constants.%int_3.1ba] // CHECK:STDOUT: %.loc11: %tuple.type.37f = tuple_literal (%int_1, %int_2, %int_3) [concrete = constants.%tuple.2d5] // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/eval/branch.carbon b/toolchain/check/testdata/eval/branch.carbon index 673da55460c2..7cdd14e1016a 100644 --- a/toolchain/check/testdata/eval/branch.carbon +++ b/toolchain/check/testdata/eval/branch.carbon @@ -130,6 +130,8 @@ var b: if false then A else B = MakeB(); // CHECK:STDOUT: %MakeB.call: init %B to %.loc15 = call %MakeB.ref() // CHECK:STDOUT: assign file.%b.var, %MakeB.call // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- if_expression_in_eval_fn.carbon @@ -198,5 +200,7 @@ var b: if false then A else B = MakeB(); // CHECK:STDOUT: %MakeB.call: init %B to %.loc11 = call %MakeB.ref() // CHECK:STDOUT: assign file.%b.var, %MakeB.call // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/eval/call.carbon b/toolchain/check/testdata/eval/call.carbon index 1ee2c7a6fba8..8f241db939a2 100644 --- a/toolchain/check/testdata/eval/call.carbon +++ b/toolchain/check/testdata/eval/call.carbon @@ -200,6 +200,8 @@ fn H() { // CHECK:STDOUT: %.loc8_5.2: ref %tuple.type.555 = temporary %.loc8_5.1, %F.call [concrete = constants.%.e1e] // CHECK:STDOUT: %Destroy.Op.call: init %empty_tuple.type = call constants.%Destroy.Op.bound(constants.%.e1e) // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Destroy.Op.loc8_5.1(%self.param: ref %i32.builtin) = "no_op"; @@ -207,11 +209,15 @@ fn H() { // CHECK:STDOUT: fn @Destroy.Op.loc8_5.2(%self.param: ref %i32) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Destroy.Op.loc8_5.3(%self.param: ref %tuple.type.555) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- return_in_place_init.carbon @@ -259,6 +265,8 @@ fn H() { // CHECK:STDOUT: %Destroy.Op.bound: = bound_method %a.var, constants.%Destroy.Op.1a2547.3 // CHECK:STDOUT: %Destroy.Op.call: init %empty_tuple.type = call %Destroy.Op.bound(%a.var) // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Destroy.Op.loc8_3.1(%self.param: ref %i32.builtin) = "no_op"; @@ -266,11 +274,15 @@ fn H() { // CHECK:STDOUT: fn @Destroy.Op.loc8_3.2(%self.param: ref %i32) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Destroy.Op.loc8_3.3(%self.param: ref %tuple.type.555) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- fail_todo_return_in_place_tuple.carbon @@ -377,6 +389,8 @@ fn H() { // CHECK:STDOUT: %.loc5_49.8: init %tuple.type.555 to %return.param = tuple_init (%.loc5_49.3, %.loc5_49.5, %.loc5_49.7) [concrete = constants.%tuple.479] // CHECK:STDOUT: %.loc5_50: init %tuple.type.555 = converted %.loc5_49.1, %.loc5_49.8 [concrete = constants.%tuple.479] // CHECK:STDOUT: return %.loc5_50 to %return.param +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @H() { @@ -394,6 +408,8 @@ fn H() { // CHECK:STDOUT: } // CHECK:STDOUT: %Destroy.Op.call: init %empty_tuple.type = call constants.%Destroy.Op.bound(constants.%.e1e) // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Destroy.Op.loc17_32.1(%self.param: ref %i32.builtin) = "no_op"; @@ -401,11 +417,15 @@ fn H() { // CHECK:STDOUT: fn @Destroy.Op.loc17_32.2(%self.param: ref %i32) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Destroy.Op.loc17_32.3(%self.param: ref %tuple.type.555) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- return_in_place_class.carbon @@ -449,6 +469,8 @@ fn H() { // CHECK:STDOUT: %.loc6_28.2: init %C to %return.param = class_init () [concrete = constants.%C.val] // CHECK:STDOUT: %.loc6_29: init %C = converted %.loc6_28.1, %.loc6_28.2 [concrete = constants.%C.val] // CHECK:STDOUT: return %.loc6_29 to %return.param +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @H() { @@ -463,6 +485,8 @@ fn H() { // CHECK:STDOUT: %G.call: init %empty_tuple.type = call %G.specific_fn() // CHECK:STDOUT: %Destroy.Op.call: init %empty_tuple.type = call constants.%Destroy.Op.bound(constants.%.115) // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Destroy.Op.loc13_7.1(%self.param: ref %empty_struct_type) = "no_op"; @@ -470,5 +494,7 @@ fn H() { // CHECK:STDOUT: fn @Destroy.Op.loc13_7.2(%self.param: ref %C) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/eval/symbolic.carbon b/toolchain/check/testdata/eval/symbolic.carbon index 4413685d2b1b..1c4b1c6f3d8c 100644 --- a/toolchain/check/testdata/eval/symbolic.carbon +++ b/toolchain/check/testdata/eval/symbolic.carbon @@ -111,6 +111,8 @@ fn F() { // CHECK:STDOUT: %bound_method: = bound_method %.loc11, %impl.elem0 [symbolic = %type.as.Copy.impl.Op.bound (constants.%type.as.Copy.impl.Op.bound.05d)] // CHECK:STDOUT: %type.as.Copy.impl.Op.call: init type = call %bound_method(%.loc11) [symbolic = %U.as_type.loc11_11.2 (constants.%U.as_type.ff1)] // CHECK:STDOUT: return %type.as.Copy.impl.Op.call +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/facet/access.carbon b/toolchain/check/testdata/facet/access.carbon index 78fe1cd2fca9..fe03b387c7cf 100644 --- a/toolchain/check/testdata/facet/access.carbon +++ b/toolchain/check/testdata/facet/access.carbon @@ -513,6 +513,8 @@ fn F(T:! Z where C impls NY(.Self)) -> C.(Y(T).Y1) { // CHECK:STDOUT: %specific_impl_fn.loc10_4.1: = specific_impl_function %impl.elem0.loc10_4.1, @I.WithSelf.DoIt(constants.%T) [symbolic = %specific_impl_fn.loc10_4.2 (constants.%specific_impl_fn)] // CHECK:STDOUT: %I.WithSelf.DoIt.call: init %empty_tuple.type = call %specific_impl_fn.loc10_4.1() // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: @@ -564,6 +566,8 @@ fn F(T:! Z where C impls NY(.Self)) -> C.(Y(T).Y1) { // CHECK:STDOUT: // CHECK:STDOUT: %I.WithSelf.Make.call: init @Use.%T.as_type.loc8_18.1 (%T.as_type) to %.loc8_18.1 = call %specific_impl_fn.loc10_11.1() // CHECK:STDOUT: return %I.WithSelf.Make.call to %return.param +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: @@ -666,6 +670,8 @@ fn F(T:! Z where C impls NY(.Self)) -> C.(Y(T).Y1) { // CHECK:STDOUT: %.loc9_24.1: ref @Use.%T.as_type.loc9_18.1 (%T.as_type) = splice_block %return.param {} // CHECK:STDOUT: %I.WithSelf.Copy.call: init @Use.%T.as_type.loc9_18.1 (%T.as_type) to %.loc9_24.1 = call %bound_method.loc10_17(%x.ref) // CHECK:STDOUT: return %I.WithSelf.Copy.call to %return.param +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: @@ -721,6 +727,8 @@ fn F(T:! Z where C impls NY(.Self)) -> C.(Y(T).Y1) { // CHECK:STDOUT: %specific_impl_fn.loc10_4.1: = specific_impl_function %impl.elem0.loc10_4.1, @I.WithSelf.Hello(constants.%T) [symbolic = %specific_impl_fn.loc10_4.2 (constants.%specific_impl_fn)] // CHECK:STDOUT: %I.WithSelf.Hello.call: init %empty_tuple.type = call %specific_impl_fn.loc10_4.1() // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: @@ -783,6 +791,8 @@ fn F(T:! Z where C impls NY(.Self)) -> C.(Y(T).Y1) { // CHECK:STDOUT: // CHECK:STDOUT: %I.WithSelf.Copy.call: init @UseIndirect.%T.as_type.loc8_26.1 (%T.as_type) to %.loc8_32.1 = call %bound_method.loc10_21(%x.ref) // CHECK:STDOUT: return %I.WithSelf.Copy.call to %return.param +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/facet/call_combined_impl_witness.carbon b/toolchain/check/testdata/facet/call_combined_impl_witness.carbon index ec31ac6c1997..08946c55a08a 100644 --- a/toolchain/check/testdata/facet/call_combined_impl_witness.carbon +++ b/toolchain/check/testdata/facet/call_combined_impl_witness.carbon @@ -225,6 +225,8 @@ fn F() { // CHECK:STDOUT: witness = () // CHECK:STDOUT: // CHECK:STDOUT: !requires: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: interface @A { @@ -242,6 +244,8 @@ fn F() { // CHECK:STDOUT: witness = (@A.WithSelf.%A.WithSelf.AA.decl) // CHECK:STDOUT: // CHECK:STDOUT: !requires: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: interface @B { @@ -259,6 +263,8 @@ fn F() { // CHECK:STDOUT: witness = (@B.WithSelf.%B.WithSelf.BB.decl) // CHECK:STDOUT: // CHECK:STDOUT: !requires: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: impl @C.as.Empty.impl: %C.ref as %Empty.ref { @@ -311,11 +317,15 @@ fn F() { // CHECK:STDOUT: fn @C.as.A.impl.AA() { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @C.as.B.impl.BB() { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: generic fn @G(%T.loc33_7.2: %facet_type.22e) { @@ -386,6 +396,8 @@ fn F() { // CHECK:STDOUT: %specific_impl_fn.loc41: = specific_impl_function %impl.elem0.loc41, @B.WithSelf.BB(constants.%B.facet.746) [symbolic = %specific_impl_fn.loc35_4.2 (constants.%specific_impl_fn.c6b)] // CHECK:STDOUT: %B.WithSelf.BB.call.loc41: init %empty_tuple.type = call %specific_impl_fn.loc41() // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: @@ -407,6 +419,8 @@ fn F() { // CHECK:STDOUT: %G.call: init %empty_tuple.type = call %G.specific_fn(%.loc45_8.3) // CHECK:STDOUT: %Destroy.Op.call: init %empty_tuple.type = call constants.%Destroy.Op.bound(constants.%.115) // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Destroy.Op.loc45_8.1(%self.param: ref %empty_struct_type) = "no_op"; @@ -414,6 +428,8 @@ fn F() { // CHECK:STDOUT: fn @Destroy.Op.loc45_8.2(%self.param: ref %C) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: specific @Empty.WithSelf(constants.%Self.d44) { diff --git a/toolchain/check/testdata/facet/convert_class_type_to_facet_type.carbon b/toolchain/check/testdata/facet/convert_class_type_to_facet_type.carbon index 3c49830bd215..eb38146629ce 100644 --- a/toolchain/check/testdata/facet/convert_class_type_to_facet_type.carbon +++ b/toolchain/check/testdata/facet/convert_class_type_to_facet_type.carbon @@ -89,6 +89,8 @@ fn F() { // CHECK:STDOUT: witness = () // CHECK:STDOUT: // CHECK:STDOUT: !requires: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: impl @Goat.as.Animal.impl: %Goat.ref as %Animal.ref { @@ -117,6 +119,8 @@ fn F() { // CHECK:STDOUT: fn() { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: @@ -129,6 +133,8 @@ fn F() { // CHECK:STDOUT: %WalkAnimal.specific_fn: = specific_function %WalkAnimal.ref, @WalkAnimal(constants.%Animal.facet) [concrete = constants.%WalkAnimal.specific_fn] // CHECK:STDOUT: %WalkAnimal.call: init %empty_tuple.type = call %WalkAnimal.specific_fn() // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: specific @Animal.WithSelf(constants.%Self) { diff --git a/toolchain/check/testdata/facet/convert_class_type_to_generic_facet_value.carbon b/toolchain/check/testdata/facet/convert_class_type_to_generic_facet_value.carbon index dab852ac989f..53916dbc6bae 100644 --- a/toolchain/check/testdata/facet/convert_class_type_to_generic_facet_value.carbon +++ b/toolchain/check/testdata/facet/convert_class_type_to_generic_facet_value.carbon @@ -220,6 +220,8 @@ fn G() { // CHECK:STDOUT: witness = (@Generic.WithSelf.%Generic.WithSelf.F.decl) // CHECK:STDOUT: // CHECK:STDOUT: !requires: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: @@ -257,6 +259,8 @@ fn G() { // CHECK:STDOUT: fn @ImplsGeneric.as.Generic.impl.F() { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: generic fn @CallGenericMethod(%T.loc15_23.2: type, %U.loc15_40.2: @CallGenericMethod.%Generic.type.loc15_52.1 (%Generic.type.ee14e9.2)) { @@ -272,6 +276,8 @@ fn G() { // CHECK:STDOUT: fn() { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: @@ -285,6 +291,8 @@ fn G() { // CHECK:STDOUT: %CallGenericMethod.specific_fn: = specific_function %CallGenericMethod.ref, @CallGenericMethod(constants.%GenericParam, constants.%Generic.facet) [concrete = constants.%CallGenericMethod.specific_fn.42a] // CHECK:STDOUT: %CallGenericMethod.call: init %empty_tuple.type = call %CallGenericMethod.specific_fn() // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: generic fn @PassThroughToGenericMethod(%T.loc21_32.2: type, %U.loc21_42.2: @PassThroughToGenericMethod.%Generic.type.loc21_54.1 (%Generic.type.ee14e9.2)) { @@ -306,6 +314,8 @@ fn G() { // CHECK:STDOUT: %CallGenericMethod.specific_fn.loc22_3.1: = specific_function %CallGenericMethod.ref, @CallGenericMethod(constants.%T, constants.%U.af9edd.2) [symbolic = %CallGenericMethod.specific_fn.loc22_3.2 (constants.%CallGenericMethod.specific_fn.151)] // CHECK:STDOUT: %CallGenericMethod.call: init %empty_tuple.type = call %CallGenericMethod.specific_fn.loc22_3.1() // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: @@ -319,6 +329,8 @@ fn G() { // CHECK:STDOUT: %PassThroughToGenericMethod.specific_fn: = specific_function %PassThroughToGenericMethod.ref, @PassThroughToGenericMethod(constants.%GenericParam, constants.%Generic.facet) [concrete = constants.%PassThroughToGenericMethod.specific_fn] // CHECK:STDOUT: %PassThroughToGenericMethod.call: init %empty_tuple.type = call %PassThroughToGenericMethod.specific_fn() // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: specific @Generic(constants.%Scalar) { @@ -580,6 +592,8 @@ fn G() { // CHECK:STDOUT: witness = (@Generic.WithSelf.%Generic.WithSelf.F.decl) // CHECK:STDOUT: // CHECK:STDOUT: !requires: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: @@ -617,6 +631,8 @@ fn G() { // CHECK:STDOUT: fn @ImplsGeneric.as.Generic.impl.F() { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: generic fn @CallGenericMethod(%T.loc15_23.2: type, %U.loc15_40.2: @CallGenericMethod.%Generic.type.loc15_52.1 (%Generic.type.ee14e9.2)) { @@ -636,6 +652,8 @@ fn G() { // CHECK:STDOUT: fn(%t.param: @CallGenericMethod.%T.loc15_23.1 (%T)) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: @@ -656,6 +674,8 @@ fn G() { // CHECK:STDOUT: %CallGenericMethod.call: init %empty_tuple.type = call %CallGenericMethod.specific_fn(%.loc18_38.3) // CHECK:STDOUT: %Destroy.Op.call: init %empty_tuple.type = call constants.%Destroy.Op.bound(constants.%.b65) // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Destroy.Op.loc18_38.1(%self.param: ref %empty_struct_type) = "no_op"; @@ -663,6 +683,8 @@ fn G() { // CHECK:STDOUT: fn @Destroy.Op.loc18_38.2(%self.param: ref %GenericParam) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: specific @Generic(constants.%Scalar) { diff --git a/toolchain/check/testdata/facet/convert_class_value_to_facet_value_value.carbon b/toolchain/check/testdata/facet/convert_class_value_to_facet_value_value.carbon index 465feffcd489..f4f3928e0ce2 100644 --- a/toolchain/check/testdata/facet/convert_class_value_to_facet_value_value.carbon +++ b/toolchain/check/testdata/facet/convert_class_value_to_facet_value_value.carbon @@ -115,6 +115,8 @@ fn F() { // CHECK:STDOUT: witness = () // CHECK:STDOUT: // CHECK:STDOUT: !requires: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: impl @Goat.as.Animal.impl: %Goat.ref as %Animal.ref { @@ -148,6 +150,8 @@ fn F() { // CHECK:STDOUT: fn(%a.param: @WalkAnimal.%T.as_type.loc17_37.1 (%T.as_type)) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: @@ -169,6 +173,8 @@ fn F() { // CHECK:STDOUT: %WalkAnimal.call: init %empty_tuple.type = call %WalkAnimal.specific_fn(%.loc23_17.3) // CHECK:STDOUT: %Destroy.Op.call: init %empty_tuple.type = call constants.%Destroy.Op.bound(constants.%.4ea) // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Destroy.Op.loc23_17.1(%self.param: ref %empty_struct_type) = "no_op"; @@ -176,6 +182,8 @@ fn F() { // CHECK:STDOUT: fn @Destroy.Op.loc23_17.2(%self.param: ref %Goat) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: specific @Animal.WithSelf(constants.%Self.f00) { diff --git a/toolchain/check/testdata/facet/convert_class_value_to_generic_facet_value_value.carbon b/toolchain/check/testdata/facet/convert_class_value_to_generic_facet_value_value.carbon index 109d54557ad3..e17212fd9d71 100644 --- a/toolchain/check/testdata/facet/convert_class_value_to_generic_facet_value_value.carbon +++ b/toolchain/check/testdata/facet/convert_class_value_to_generic_facet_value_value.carbon @@ -275,6 +275,8 @@ fn B() { // CHECK:STDOUT: witness = (@Generic.WithSelf.%Generic.WithSelf.F.decl) // CHECK:STDOUT: // CHECK:STDOUT: !requires: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: @@ -312,6 +314,8 @@ fn B() { // CHECK:STDOUT: fn @ImplsGeneric.as.Generic.impl.F() { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: generic fn @CallGenericMethod(%T.loc15_23.2: type, %U.loc15_33.2: @CallGenericMethod.%Generic.type.loc15_45.1 (%Generic.type.ee14e9.2)) { @@ -352,6 +356,8 @@ fn B() { // CHECK:STDOUT: %specific_impl_fn.loc16_4.1: = specific_impl_function %impl.elem0.loc16_4.1, @Generic.WithSelf.F(constants.%T, constants.%U) [symbolic = %specific_impl_fn.loc16_4.2 (constants.%specific_impl_fn)] // CHECK:STDOUT: %Generic.WithSelf.F.call: init %empty_tuple.type = call %specific_impl_fn.loc16_4.1() // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: @@ -379,6 +385,8 @@ fn B() { // CHECK:STDOUT: %Destroy.Op.call.loc20_44: init %empty_tuple.type = call constants.%Destroy.Op.bound.852(constants.%.b65) // CHECK:STDOUT: %Destroy.Op.call.loc20_24: init %empty_tuple.type = call constants.%Destroy.Op.bound.047(constants.%.cd4) // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Destroy.Op.loc20_44.1(%self.param: ref %empty_struct_type) = "no_op"; @@ -386,11 +394,15 @@ fn B() { // CHECK:STDOUT: fn @Destroy.Op.loc20_44.2(%self.param: ref %GenericParam) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Destroy.Op.loc20_24(%self.param: ref %ImplsGeneric) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: specific @Generic(constants.%Scalar) { @@ -662,6 +674,8 @@ fn B() { // CHECK:STDOUT: witness = () // CHECK:STDOUT: // CHECK:STDOUT: !requires: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: @@ -706,6 +720,8 @@ fn B() { // CHECK:STDOUT: fn(%t.param: @A.%T.as_type.loc9_31.1 (%T.as_type)) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: @@ -727,6 +743,8 @@ fn B() { // CHECK:STDOUT: %A.call: init %empty_tuple.type = call %A.specific_fn(%.loc12_8.3) // CHECK:STDOUT: %Destroy.Op.call: init %empty_tuple.type = call constants.%Destroy.Op.bound(constants.%.115) // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Destroy.Op.loc12_8.1(%self.param: ref %empty_struct_type) = "no_op"; @@ -734,6 +752,8 @@ fn B() { // CHECK:STDOUT: fn @Destroy.Op.loc12_8.2(%self.param: ref %C) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: specific @I(constants.%V, constants.%W) { @@ -953,6 +973,8 @@ fn B() { // CHECK:STDOUT: witness = () // CHECK:STDOUT: // CHECK:STDOUT: !requires: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: @@ -997,6 +1019,8 @@ fn B() { // CHECK:STDOUT: fn(%t.param: @A.%T.as_type.loc9_31.1 (%T.as_type)) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: @@ -1009,6 +1033,8 @@ fn B() { // CHECK:STDOUT: %.loc19_6.3: init %C to %.loc19_6.2 = class_init () [concrete = constants.%C.val] // CHECK:STDOUT: %.loc19_8: init %C = converted %.loc19_6.1, %.loc19_6.3 [concrete = constants.%C.val] // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: specific @I(constants.%V, constants.%W) { @@ -1188,6 +1214,8 @@ fn B() { // CHECK:STDOUT: witness = () // CHECK:STDOUT: // CHECK:STDOUT: !requires: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: generic impl @C.as.I.impl(%T.loc7_15.1: type) { @@ -1239,6 +1267,8 @@ fn B() { // CHECK:STDOUT: fn(%t.param: @A.%T.as_type.loc9_23.1 (%T.as_type)) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: @@ -1256,6 +1286,8 @@ fn B() { // CHECK:STDOUT: %.loc19_6.3: init %C.b48 to %.loc19_6.2 = class_init () [concrete = constants.%C.val] // CHECK:STDOUT: %.loc19_8: init %C.b48 = converted %.loc19_6.1, %.loc19_6.3 [concrete = constants.%C.val] // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: specific @I.WithSelf(constants.%Self) { diff --git a/toolchain/check/testdata/facet/convert_facet_value_as_type_knows_original_type.carbon b/toolchain/check/testdata/facet/convert_facet_value_as_type_knows_original_type.carbon index 0afaec243bf8..4ae74b4f397e 100644 --- a/toolchain/check/testdata/facet/convert_facet_value_as_type_knows_original_type.carbon +++ b/toolchain/check/testdata/facet/convert_facet_value_as_type_knows_original_type.carbon @@ -122,6 +122,8 @@ fn F[A:! J, B:! A](x: C(A, B)) { // CHECK:STDOUT: %Feed.specific_fn: = specific_function %Feed.ref, @Feed(constants.%Eats.facet) [concrete = constants.%Feed.specific_fn] // CHECK:STDOUT: %Feed.call: init %empty_tuple.type = call %Feed.specific_fn() // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- facet_type_in_type_position.carbon @@ -215,6 +217,8 @@ fn F[A:! J, B:! A](x: C(A, B)) { // CHECK:STDOUT: %Destroy.Op.call.loc26: init %empty_tuple.type = call constants.%Destroy.Op.bound(constants.%.4ea) // CHECK:STDOUT: %Destroy.Op.call.loc22: init %empty_tuple.type = call constants.%Destroy.Op.bound(constants.%.4ea) // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Destroy.Op.loc27_8.1(%self.param: ref %empty_struct_type) = "no_op"; @@ -222,6 +226,8 @@ fn F[A:! J, B:! A](x: C(A, B)) { // CHECK:STDOUT: fn @Destroy.Op.loc27_8.2(%self.param: ref %Goat) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- facet_access_type_converts_back_to_original_facet_value.carbon @@ -261,6 +267,8 @@ fn F[A:! J, B:! A](x: C(A, B)) { // CHECK:STDOUT: %G.specific_fn.loc27_3.1: = specific_function %G.ref, @G(constants.%A, constants.%B) [symbolic = %G.specific_fn.loc27_3.2 (constants.%G.specific_fn)] // CHECK:STDOUT: %G.call: init %empty_tuple.type = call %G.specific_fn.loc27_3.1(%x.ref) // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/facet/convert_facet_value_to_itself.carbon b/toolchain/check/testdata/facet/convert_facet_value_to_itself.carbon index 9fd34d972b8d..0780aed25659 100644 --- a/toolchain/check/testdata/facet/convert_facet_value_to_itself.carbon +++ b/toolchain/check/testdata/facet/convert_facet_value_to_itself.carbon @@ -107,6 +107,8 @@ fn F() { // CHECK:STDOUT: witness = () // CHECK:STDOUT: // CHECK:STDOUT: !requires: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: impl @Goat.as.Animal.impl: %Goat.ref as %Animal.ref { @@ -135,6 +137,8 @@ fn F() { // CHECK:STDOUT: fn() { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: @@ -152,6 +156,8 @@ fn F() { // CHECK:STDOUT: %FeedAnimal.specific_fn.loc19_31.1: = specific_function %FeedAnimal.ref, @FeedAnimal(constants.%T.443025.2) [symbolic = %FeedAnimal.specific_fn.loc19_31.2 (constants.%FeedAnimal.specific_fn.5bd)] // CHECK:STDOUT: %FeedAnimal.call: init %empty_tuple.type = call %FeedAnimal.specific_fn.loc19_31.1() // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: @@ -164,6 +170,8 @@ fn F() { // CHECK:STDOUT: %HandleAnimal.specific_fn: = specific_function %HandleAnimal.ref, @HandleAnimal(constants.%Animal.facet) [concrete = constants.%HandleAnimal.specific_fn] // CHECK:STDOUT: %HandleAnimal.call: init %empty_tuple.type = call %HandleAnimal.specific_fn() // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: specific @Animal.WithSelf(constants.%Self) { diff --git a/toolchain/check/testdata/facet/convert_facet_value_to_narrowed_facet_type.carbon b/toolchain/check/testdata/facet/convert_facet_value_to_narrowed_facet_type.carbon index 1cc07ca342e2..447c03fa678d 100644 --- a/toolchain/check/testdata/facet/convert_facet_value_to_narrowed_facet_type.carbon +++ b/toolchain/check/testdata/facet/convert_facet_value_to_narrowed_facet_type.carbon @@ -212,6 +212,8 @@ fn CallsWithTypeExplicit(U:! type) { // CHECK:STDOUT: witness = () // CHECK:STDOUT: // CHECK:STDOUT: !requires: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: interface @Animal { @@ -223,6 +225,8 @@ fn CallsWithTypeExplicit(U:! type) { // CHECK:STDOUT: witness = () // CHECK:STDOUT: // CHECK:STDOUT: !requires: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: generic fn @Feed(%T.loc6_10.2: %Eats.type) { @@ -239,6 +243,8 @@ fn CallsWithTypeExplicit(U:! type) { // CHECK:STDOUT: fn(%e.param: @Feed.%T.as_type.loc6_29.1 (%T.as_type)) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: @@ -267,6 +273,8 @@ fn CallsWithTypeExplicit(U:! type) { // CHECK:STDOUT: %Feed.specific_fn.loc8_44.1: = specific_function %Feed.ref, @Feed(constants.%Eats.facet) [symbolic = %Feed.specific_fn.loc8_44.2 (constants.%Feed.specific_fn)] // CHECK:STDOUT: %Feed.call: init %empty_tuple.type = call %Feed.specific_fn.loc8_44.1(%a.ref) // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: @@ -452,6 +460,8 @@ fn CallsWithTypeExplicit(U:! type) { // CHECK:STDOUT: witness = () // CHECK:STDOUT: // CHECK:STDOUT: !requires: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: interface @Animal { @@ -463,6 +473,8 @@ fn CallsWithTypeExplicit(U:! type) { // CHECK:STDOUT: witness = () // CHECK:STDOUT: // CHECK:STDOUT: !requires: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: interface @Tame { @@ -474,6 +486,8 @@ fn CallsWithTypeExplicit(U:! type) { // CHECK:STDOUT: witness = () // CHECK:STDOUT: // CHECK:STDOUT: !requires: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: generic fn @FeedTame(%V.loc7_14.2: %facet_type.bbb) { @@ -490,6 +504,8 @@ fn CallsWithTypeExplicit(U:! type) { // CHECK:STDOUT: fn(%v.param: @FeedTame.%V.as_type.loc7_40.1 (%V.as_type)) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: @@ -519,6 +535,8 @@ fn CallsWithTypeExplicit(U:! type) { // CHECK:STDOUT: %FeedTame.specific_fn.loc10_3.1: = specific_function %FeedTame.ref, @FeedTame(constants.%facet_value) [symbolic = %FeedTame.specific_fn.loc10_3.2 (constants.%FeedTame.specific_fn)] // CHECK:STDOUT: %FeedTame.call: init %empty_tuple.type = call %FeedTame.specific_fn.loc10_3.1(%w.ref) // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: @@ -723,6 +741,8 @@ fn CallsWithTypeExplicit(U:! type) { // CHECK:STDOUT: witness = () // CHECK:STDOUT: // CHECK:STDOUT: !requires: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: interface @Animal { @@ -734,6 +754,8 @@ fn CallsWithTypeExplicit(U:! type) { // CHECK:STDOUT: witness = () // CHECK:STDOUT: // CHECK:STDOUT: !requires: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: interface @Tame { @@ -745,6 +767,8 @@ fn CallsWithTypeExplicit(U:! type) { // CHECK:STDOUT: witness = () // CHECK:STDOUT: // CHECK:STDOUT: !requires: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: generic impl @A.as_type.as.Eats.impl(%A.loc7_15.1: %Animal.type) { @@ -779,6 +803,8 @@ fn CallsWithTypeExplicit(U:! type) { // CHECK:STDOUT: fn(%v.param: @FeedTame2.%V.as_type.loc9_41.1 (%V.as_type)) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: @@ -811,6 +837,8 @@ fn CallsWithTypeExplicit(U:! type) { // CHECK:STDOUT: %FeedTame2.specific_fn.loc12_3.1: = specific_function %FeedTame2.ref, @FeedTame2(constants.%facet_value) [symbolic = %FeedTame2.specific_fn.loc12_3.2 (constants.%FeedTame2.specific_fn)] // CHECK:STDOUT: %FeedTame2.call: init %empty_tuple.type = call %FeedTame2.specific_fn.loc12_3.1(%w.ref) // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: @@ -982,6 +1010,8 @@ fn CallsWithTypeExplicit(U:! type) { // CHECK:STDOUT: witness = () // CHECK:STDOUT: // CHECK:STDOUT: !requires: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: generic fn @TakesA(%T.loc7_12.2: %A.type) { @@ -998,6 +1028,8 @@ fn CallsWithTypeExplicit(U:! type) { // CHECK:STDOUT: fn(%x.param: @TakesA.%T.as_type.loc7_28.1 (%T.as_type)) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: @@ -1022,6 +1054,8 @@ fn CallsWithTypeExplicit(U:! type) { // CHECK:STDOUT: %TakesA.specific_fn.loc10_3.1: = specific_function %TakesA.ref, @TakesA(constants.%U) [symbolic = %TakesA.specific_fn.loc10_3.2 (constants.%TakesA.specific_fn)] // CHECK:STDOUT: %TakesA.call: init %empty_tuple.type = call %TakesA.specific_fn.loc10_3.1(%y.ref) // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: @@ -1195,6 +1229,8 @@ fn CallsWithTypeExplicit(U:! type) { // CHECK:STDOUT: fn(%x.param: @TakesTypeDeduced.%T.loc3_22.1 (%T.67db0b.1)) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: @@ -1217,6 +1253,8 @@ fn CallsWithTypeExplicit(U:! type) { // CHECK:STDOUT: %TakesTypeDeduced.specific_fn.loc5_3.1: = specific_function %TakesTypeDeduced.ref, @TakesTypeDeduced(constants.%U.as_type) [symbolic = %TakesTypeDeduced.specific_fn.loc5_3.2 (constants.%TakesTypeDeduced.specific_fn)] // CHECK:STDOUT: %TakesTypeDeduced.call: init %empty_tuple.type = call %TakesTypeDeduced.specific_fn.loc5_3.1(%y.ref) // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: @@ -1230,6 +1268,8 @@ fn CallsWithTypeExplicit(U:! type) { // CHECK:STDOUT: fn() { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: @@ -1250,6 +1290,8 @@ fn CallsWithTypeExplicit(U:! type) { // CHECK:STDOUT: %TakesTypeExplicit.specific_fn.loc10_3.1: = specific_function %TakesTypeExplicit.ref, @TakesTypeExplicit(constants.%U.as_type) [symbolic = %TakesTypeExplicit.specific_fn.loc10_3.2 (constants.%TakesTypeExplicit.specific_fn)] // CHECK:STDOUT: %TakesTypeExplicit.call: init %empty_tuple.type = call %TakesTypeExplicit.specific_fn.loc10_3.1() // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: @@ -1438,6 +1480,8 @@ fn CallsWithTypeExplicit(U:! type) { // CHECK:STDOUT: fn(%x.param: @TakesExtraWhereDeduced.%T.as_type.loc3_70.1 (%T.as_type)) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: @@ -1464,6 +1508,8 @@ fn CallsWithTypeExplicit(U:! type) { // CHECK:STDOUT: %TakesExtraWhereDeduced.specific_fn.loc5_3.1: = specific_function %TakesExtraWhereDeduced.ref, @TakesExtraWhereDeduced(constants.%facet_value) [symbolic = %TakesExtraWhereDeduced.specific_fn.loc5_3.2 (constants.%TakesExtraWhereDeduced.specific_fn)] // CHECK:STDOUT: %TakesExtraWhereDeduced.call: init %empty_tuple.type = call %TakesExtraWhereDeduced.specific_fn.loc5_3.1(%y.ref) // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: @@ -1477,6 +1523,8 @@ fn CallsWithTypeExplicit(U:! type) { // CHECK:STDOUT: fn() { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: @@ -1497,6 +1545,8 @@ fn CallsWithTypeExplicit(U:! type) { // CHECK:STDOUT: %TakesExtraWhereExplicit.specific_fn.loc10_3.1: = specific_function %TakesExtraWhereExplicit.ref, @TakesExtraWhereExplicit(constants.%facet_value) [symbolic = %TakesExtraWhereExplicit.specific_fn.loc10_3.2 (constants.%TakesExtraWhereExplicit.specific_fn)] // CHECK:STDOUT: %TakesExtraWhereExplicit.call: init %empty_tuple.type = call %TakesExtraWhereExplicit.specific_fn.loc10_3.1() // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/facet/convert_facet_value_value_to_blanket_impl.carbon b/toolchain/check/testdata/facet/convert_facet_value_value_to_blanket_impl.carbon index 21e0af3eca44..066ade233be7 100644 --- a/toolchain/check/testdata/facet/convert_facet_value_value_to_blanket_impl.carbon +++ b/toolchain/check/testdata/facet/convert_facet_value_value_to_blanket_impl.carbon @@ -143,6 +143,8 @@ fn HandleAnimal[T:! Animal](a: T) { Feed(a); } // CHECK:STDOUT: witness = () // CHECK:STDOUT: // CHECK:STDOUT: !requires: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: interface @Animal { @@ -154,6 +156,8 @@ fn HandleAnimal[T:! Animal](a: T) { Feed(a); } // CHECK:STDOUT: witness = () // CHECK:STDOUT: // CHECK:STDOUT: !requires: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: generic impl @A.as_type.as.Eats.impl(%A.loc18_15.1: %Animal.type) { @@ -188,6 +192,8 @@ fn HandleAnimal[T:! Animal](a: T) { Feed(a); } // CHECK:STDOUT: fn(%e.param: @Feed.%T.as_type.loc20_29.1 (%T.as_type.422)) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: @@ -217,6 +223,8 @@ fn HandleAnimal[T:! Animal](a: T) { Feed(a); } // CHECK:STDOUT: %Feed.specific_fn.loc22_37.1: = specific_function %Feed.ref, @Feed(constants.%Eats.facet.934) [symbolic = %Feed.specific_fn.loc22_37.2 (constants.%Feed.specific_fn)] // CHECK:STDOUT: %Feed.call: init %empty_tuple.type = call %Feed.specific_fn.loc22_37.1(%a.ref) // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/facet/convert_facet_value_value_to_generic_facet_value_value.carbon b/toolchain/check/testdata/facet/convert_facet_value_value_to_generic_facet_value_value.carbon index 51a1302ea721..49dfe58688a5 100644 --- a/toolchain/check/testdata/facet/convert_facet_value_value_to_generic_facet_value_value.carbon +++ b/toolchain/check/testdata/facet/convert_facet_value_value_to_generic_facet_value_value.carbon @@ -303,6 +303,8 @@ fn F() { // CHECK:STDOUT: witness = () // CHECK:STDOUT: // CHECK:STDOUT: !requires: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: interface @Animal { @@ -314,6 +316,8 @@ fn F() { // CHECK:STDOUT: witness = () // CHECK:STDOUT: // CHECK:STDOUT: !requires: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: generic interface @Eats(%Food.loc21_20.2: type) { @@ -333,6 +337,8 @@ fn F() { // CHECK:STDOUT: witness = () // CHECK:STDOUT: // CHECK:STDOUT: !requires: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: @@ -416,6 +422,8 @@ fn F() { // CHECK:STDOUT: fn(%e.param: @Feed.%T.as_type.loc31_50.1 (%T.as_type.b84), %food.param: @Feed.%Food.as_type.loc31_37.1 (%Food.as_type.bca)) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: @@ -454,6 +462,8 @@ fn F() { // CHECK:STDOUT: %Feed.specific_fn.loc32_64.1: = specific_function %Feed.ref, @Feed(constants.%Food.5f8, constants.%Eats.facet.f11) [symbolic = %Feed.specific_fn.loc32_64.2 (constants.%Feed.specific_fn.292)] // CHECK:STDOUT: %Feed.call: init %empty_tuple.type = call %Feed.specific_fn.loc32_64.1(%a.ref, %food.ref) // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: @@ -487,6 +497,8 @@ fn F() { // CHECK:STDOUT: %Destroy.Op.call.loc35_31: init %empty_tuple.type = call constants.%Destroy.Op.bound.a54(constants.%.202) // CHECK:STDOUT: %Destroy.Op.call.loc35_19: init %empty_tuple.type = call constants.%Destroy.Op.bound.115(constants.%.4ea) // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Destroy.Op.loc35_31.1(%self.param: ref %empty_struct_type) = "no_op"; @@ -494,11 +506,15 @@ fn F() { // CHECK:STDOUT: fn @Destroy.Op.loc35_31.2(%self.param: ref %Grass) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Destroy.Op.loc35_19(%self.param: ref %Goat) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: specific @Edible.WithSelf(constants.%Self.59b) { diff --git a/toolchain/check/testdata/facet/convert_facet_value_value_to_itself.carbon b/toolchain/check/testdata/facet/convert_facet_value_value_to_itself.carbon index c79eb7bea55b..813427e52a65 100644 --- a/toolchain/check/testdata/facet/convert_facet_value_value_to_itself.carbon +++ b/toolchain/check/testdata/facet/convert_facet_value_value_to_itself.carbon @@ -142,6 +142,8 @@ fn F() { // CHECK:STDOUT: witness = () // CHECK:STDOUT: // CHECK:STDOUT: !requires: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: impl @Goat.as.Animal.impl: %Goat.ref as %Animal.ref { @@ -175,6 +177,8 @@ fn F() { // CHECK:STDOUT: fn(%a.param: @FeedAnimal.%T.as_type.loc17_37.1 (%T.as_type)) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: @@ -199,6 +203,8 @@ fn F() { // CHECK:STDOUT: %FeedAnimal.specific_fn.loc19_37.1: = specific_function %FeedAnimal.ref, @FeedAnimal(constants.%T) [symbolic = %FeedAnimal.specific_fn.loc19_37.2 (constants.%FeedAnimal.specific_fn.5bd)] // CHECK:STDOUT: %FeedAnimal.call: init %empty_tuple.type = call %FeedAnimal.specific_fn.loc19_37.1(%a.ref) // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: @@ -220,6 +226,8 @@ fn F() { // CHECK:STDOUT: %HandleAnimal.call: init %empty_tuple.type = call %HandleAnimal.specific_fn(%.loc25_19.3) // CHECK:STDOUT: %Destroy.Op.call: init %empty_tuple.type = call constants.%Destroy.Op.bound(constants.%.4ea) // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Destroy.Op.loc25_19.1(%self.param: ref %empty_struct_type) = "no_op"; @@ -227,6 +235,8 @@ fn F() { // CHECK:STDOUT: fn @Destroy.Op.loc25_19.2(%self.param: ref %Goat) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: specific @Animal.WithSelf(constants.%Self.f00) { diff --git a/toolchain/check/testdata/facet/convert_interface.carbon b/toolchain/check/testdata/facet/convert_interface.carbon index 80c9c647aa66..b6e02913c1b9 100644 --- a/toolchain/check/testdata/facet/convert_interface.carbon +++ b/toolchain/check/testdata/facet/convert_interface.carbon @@ -83,6 +83,8 @@ fn G() { F(Animal); } // CHECK:STDOUT: witness = () // CHECK:STDOUT: // CHECK:STDOUT: !requires: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: interface @Animal { @@ -94,6 +96,8 @@ fn G() { F(Animal); } // CHECK:STDOUT: witness = () // CHECK:STDOUT: // CHECK:STDOUT: !requires: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: impl @Animal.type.as.Eats.impl: %Animal.ref as %Eats.ref { @@ -108,6 +112,8 @@ fn G() { F(Animal); } // CHECK:STDOUT: fn @F(%e.param: %Eats.type) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @G() { @@ -118,6 +124,8 @@ fn G() { F(Animal); } // CHECK:STDOUT: %.loc23: %Eats.type = converted %Animal.ref, %Eats.facet [concrete = constants.%Eats.facet] // CHECK:STDOUT: %F.call: init %empty_tuple.type = call %F.ref(%.loc23) // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: specific @Eats.WithSelf(constants.%Self.23e) { diff --git a/toolchain/check/testdata/facet/facet_assoc_const.carbon b/toolchain/check/testdata/facet/facet_assoc_const.carbon index 3e4a2fa23208..9dee1dfd05ed 100644 --- a/toolchain/check/testdata/facet/facet_assoc_const.carbon +++ b/toolchain/check/testdata/facet/facet_assoc_const.carbon @@ -714,6 +714,8 @@ fn F(unused T:! I & J where .I1 = .J1.I2) {} // CHECK:STDOUT: fn() { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/facet/fail_convert_class_type_to_generic_facet_value.carbon b/toolchain/check/testdata/facet/fail_convert_class_type_to_generic_facet_value.carbon index a98d664116bb..6e3cdd956bd0 100644 --- a/toolchain/check/testdata/facet/fail_convert_class_type_to_generic_facet_value.carbon +++ b/toolchain/check/testdata/facet/fail_convert_class_type_to_generic_facet_value.carbon @@ -160,6 +160,8 @@ fn G() { // CHECK:STDOUT: witness = (@Generic.WithSelf.%Generic.WithSelf.F.decl) // CHECK:STDOUT: // CHECK:STDOUT: !requires: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: @@ -205,6 +207,8 @@ fn G() { // CHECK:STDOUT: fn @ImplsGeneric.as.Generic.impl.F() { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: generic fn @CallGenericMethod(%T.loc27_23.2: type, %U.loc27_40.2: @CallGenericMethod.%Generic.type.loc27_52.1 (%Generic.type.ee14e9.2)) { @@ -220,6 +224,8 @@ fn G() { // CHECK:STDOUT: fn() { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: @@ -229,6 +235,8 @@ fn G() { // CHECK:STDOUT: %WrongGenericParam.ref: type = name_ref WrongGenericParam, file.%WrongGenericParam.decl [concrete = constants.%WrongGenericParam] // CHECK:STDOUT: %ImplsGeneric.ref: type = name_ref ImplsGeneric, file.%ImplsGeneric.decl [concrete = constants.%ImplsGeneric] // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: specific @Generic(constants.%Scalar) { diff --git a/toolchain/check/testdata/facet/fail_convert_facet_value_to_missing_impl.carbon b/toolchain/check/testdata/facet/fail_convert_facet_value_to_missing_impl.carbon index 4f27788c86df..143f40ee2cf8 100644 --- a/toolchain/check/testdata/facet/fail_convert_facet_value_to_missing_impl.carbon +++ b/toolchain/check/testdata/facet/fail_convert_facet_value_to_missing_impl.carbon @@ -122,6 +122,8 @@ fn HandleAnimal[T:! Animal](a: T) { Feed(a); } // CHECK:STDOUT: witness = () // CHECK:STDOUT: // CHECK:STDOUT: !requires: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: interface @Animal { @@ -133,6 +135,8 @@ fn HandleAnimal[T:! Animal](a: T) { Feed(a); } // CHECK:STDOUT: witness = () // CHECK:STDOUT: // CHECK:STDOUT: !requires: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: generic fn @Feed(%T.loc18_10.2: %Eats.type) { @@ -149,6 +153,8 @@ fn HandleAnimal[T:! Animal](a: T) { Feed(a); } // CHECK:STDOUT: fn(%e.param: @Feed.%T.as_type.loc18_29.1 (%T.as_type.422)) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: @@ -168,6 +174,8 @@ fn HandleAnimal[T:! Animal](a: T) { Feed(a); } // CHECK:STDOUT: %Feed.ref: %Feed.type = name_ref Feed, file.%Feed.decl [concrete = constants.%Feed] // CHECK:STDOUT: %a.ref: @HandleAnimal.%T.as_type.loc27_32.1 (%T.as_type.01d) = name_ref a, %a // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/facet/fail_convert_type_erased_type_to_facet.carbon b/toolchain/check/testdata/facet/fail_convert_type_erased_type_to_facet.carbon index 2f6854d88dcf..91cc6b085bba 100644 --- a/toolchain/check/testdata/facet/fail_convert_type_erased_type_to_facet.carbon +++ b/toolchain/check/testdata/facet/fail_convert_type_erased_type_to_facet.carbon @@ -52,6 +52,8 @@ fn F() { // CHECK:STDOUT: witness = () // CHECK:STDOUT: // CHECK:STDOUT: !requires: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: impl @: .inst{{[0-9A-F]+}}.loc18_6 as .inst{{[0-9A-F]+}}.loc18_14 { @@ -80,6 +82,8 @@ fn F() { // CHECK:STDOUT: fn() { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/facet/fail_deduction_uses_runtime_type_conversion.carbon b/toolchain/check/testdata/facet/fail_deduction_uses_runtime_type_conversion.carbon index ff61389f5c7c..1f4fd9ab94eb 100644 --- a/toolchain/check/testdata/facet/fail_deduction_uses_runtime_type_conversion.carbon +++ b/toolchain/check/testdata/facet/fail_deduction_uses_runtime_type_conversion.carbon @@ -261,6 +261,8 @@ fn G(holds_to: HoldsType((RuntimeConvertTo, )), from:! RuntimeConvertFrom) { // CHECK:STDOUT: %.loc24_57.2: init %RuntimeConvertTo to %return.param = class_init () [concrete = constants.%RuntimeConvertTo.val] // CHECK:STDOUT: %.loc24_58: init %RuntimeConvertTo = converted %.loc24_57.1, %.loc24_57.2 [concrete = constants.%RuntimeConvertTo.val] // CHECK:STDOUT: return %.loc24_58 to %return.param +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: generic fn @F(%T.loc27_7.2: %tuple.type, %A.loc27_28.2: @F.%tuple.elem0.loc27_32.1 (%tuple.elem0)) { @@ -281,6 +283,8 @@ fn G(holds_to: HoldsType((RuntimeConvertTo, )), from:! RuntimeConvertFrom) { // CHECK:STDOUT: fn(%x.param: @F.%HoldsType.loc27_57.1 (%HoldsType.a83)) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: @@ -310,6 +314,8 @@ fn G(holds_to: HoldsType((RuntimeConvertTo, )), from:! RuntimeConvertFrom) { // CHECK:STDOUT: %Destroy.Op.bound: = bound_method %.loc40_19.3, constants.%Destroy.Op.1a2547.2 // CHECK:STDOUT: %Destroy.Op.call: init %empty_tuple.type = call %Destroy.Op.bound(%.loc40_19.3) // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: @@ -318,6 +324,8 @@ fn G(holds_to: HoldsType((RuntimeConvertTo, )), from:! RuntimeConvertFrom) { // CHECK:STDOUT: fn @Destroy.Op.loc40_19.2(%self.param: ref %RuntimeConvertTo) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: specific @HoldsType(constants.%T) { diff --git a/toolchain/check/testdata/facet/period_self.carbon b/toolchain/check/testdata/facet/period_self.carbon index 2d3b21473d9a..348992dba3d2 100644 --- a/toolchain/check/testdata/facet/period_self.carbon +++ b/toolchain/check/testdata/facet/period_self.carbon @@ -696,6 +696,8 @@ fn F(T:! L where C(.W) impls Z(.Self) and .Self impls M) { // CHECK:STDOUT: witness = (@I.WithSelf.%I1) // CHECK:STDOUT: // CHECK:STDOUT: !requires: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: @@ -715,6 +717,8 @@ fn F(T:! L where C(.W) impls Z(.Self) and .Self impls M) { // CHECK:STDOUT: %.loc9_11.2: init %empty_tuple.type = tuple_init () [concrete = constants.%empty_tuple] // CHECK:STDOUT: %.loc9_12: init %empty_tuple.type = converted %.loc9_11.1, %.loc9_11.2 [concrete = constants.%empty_tuple] // CHECK:STDOUT: return %.loc9_12 +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: @@ -732,6 +736,8 @@ fn F(T:! L where C(.W) impls Z(.Self) and .Self impls M) { // CHECK:STDOUT: %.loc13_11.2: init %empty_tuple.type = tuple_init () [concrete = constants.%empty_tuple] // CHECK:STDOUT: %.loc13_12: init %empty_tuple.type = converted %.loc13_11.1, %.loc13_11.2 [concrete = constants.%empty_tuple] // CHECK:STDOUT: return %.loc13_12 +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/facet/require_import.carbon b/toolchain/check/testdata/facet/require_import.carbon index fc78ead3945d..3f9aa130727c 100644 --- a/toolchain/check/testdata/facet/require_import.carbon +++ b/toolchain/check/testdata/facet/require_import.carbon @@ -165,6 +165,8 @@ fn F(B:! Y) { // CHECK:STDOUT: witness = (imports.%Main.F) // CHECK:STDOUT: // CHECK:STDOUT: !requires: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: @@ -178,6 +180,8 @@ fn F(B:! Y) { // CHECK:STDOUT: @Y.WithSelf.Self.as_type.impls.Z.type.require { // CHECK:STDOUT: require imports.%Main.import_ref.4f9 impls imports.%Main.import_ref.5c2 // CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: constraint @X [from "a.carbon"] { @@ -237,6 +241,8 @@ fn F(B:! Y) { // CHECK:STDOUT: %specific_impl_fn.loc5_4.1: = specific_impl_function %impl.elem0.loc5_4.1, @Z.WithSelf.F(constants.%A.as_type, constants.%Z.facet) [symbolic = %specific_impl_fn.loc5_4.2 (constants.%specific_impl_fn)] // CHECK:STDOUT: %Z.WithSelf.F.call: init %empty_tuple.type = call %specific_impl_fn.loc5_4.1() // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/facet/runtime_value.carbon b/toolchain/check/testdata/facet/runtime_value.carbon index e9a3b3d11324..5f5170a90bf0 100644 --- a/toolchain/check/testdata/facet/runtime_value.carbon +++ b/toolchain/check/testdata/facet/runtime_value.carbon @@ -151,6 +151,8 @@ fn F(T: Z) { // CHECK:STDOUT: %a.patt: %pattern_type.6cb = value_binding_pattern a [concrete = constants.%a.patt] // CHECK:STDOUT: } // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- fail_todo_facet_copy_narrowing_from_reference.carbon @@ -176,5 +178,7 @@ fn F(T: Z) { // CHECK:STDOUT: %a.patt: %pattern_type.6cb = value_binding_pattern a [concrete = constants.%a.patt] // CHECK:STDOUT: } // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/facet/self_in_interface_param.carbon b/toolchain/check/testdata/facet/self_in_interface_param.carbon index 81a4768d562c..9ca09eeea459 100644 --- a/toolchain/check/testdata/facet/self_in_interface_param.carbon +++ b/toolchain/check/testdata/facet/self_in_interface_param.carbon @@ -122,6 +122,8 @@ fn G(_:! I(.Self) where .I1 = ()) {} // CHECK:STDOUT: %.loc19_11.2: init %empty_tuple.type = tuple_init () [concrete = constants.%empty_tuple] // CHECK:STDOUT: %.loc19_12: init %empty_tuple.type = converted %.loc19_11.1, %.loc19_11.2 [concrete = constants.%empty_tuple] // CHECK:STDOUT: return %.loc19_12 +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/facet/validate_rewrite_constraints.carbon b/toolchain/check/testdata/facet/validate_rewrite_constraints.carbon index b10f290baf92..a7eaa721d7a6 100644 --- a/toolchain/check/testdata/facet/validate_rewrite_constraints.carbon +++ b/toolchain/check/testdata/facet/validate_rewrite_constraints.carbon @@ -1418,6 +1418,8 @@ fn G(T:! N) { // CHECK:STDOUT: %F.specific_fn.loc14_3.1: = specific_function %F.ref, @F(constants.%facet_value) [symbolic = %F.specific_fn.loc14_3.2 (constants.%F.specific_fn)] // CHECK:STDOUT: %F.call: init %empty_tuple.type = call %F.specific_fn.loc14_3.1() // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/for/actual.carbon b/toolchain/check/testdata/for/actual.carbon index 002fc634cedb..68b9e7323a50 100644 --- a/toolchain/check/testdata/for/actual.carbon +++ b/toolchain/check/testdata/for/actual.carbon @@ -557,6 +557,8 @@ fn Read(y:! Core.IntLiteral) { // CHECK:STDOUT: %.loc6_39.6: init @IntRange.Make.%IntRange (%IntRange.2c4) to %return.param = class_init (%.loc6_39.3, %.loc6_39.5) // CHECK:STDOUT: %.loc6_40: init @IntRange.Make.%IntRange (%IntRange.2c4) = converted %.loc6_39.1, %.loc6_39.6 // CHECK:STDOUT: return %.loc6_40 to %return.param +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: @@ -600,6 +602,8 @@ fn Read(y:! Core.IntLiteral) { // CHECK:STDOUT: %bound_method.loc10_52.2: = bound_method %.loc10_52.2, %specific_impl_fn.loc10_52.1 // CHECK:STDOUT: %Copy.WithSelf.Op.call: init @IntRange.as.Iterate.impl.NewCursor.%Int.loc10_37.1 (%Int.67af24.1) = call %bound_method.loc10_52.2(%.loc10_52.2) // CHECK:STDOUT: return %Copy.WithSelf.Op.call +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: @@ -785,6 +789,8 @@ fn Read(y:! Core.IntLiteral) { // CHECK:STDOUT: %bound_method.loc12_7.4: = bound_method %value.var, %specific_impl_fn.loc12_7.2 // CHECK:STDOUT: %Destroy.WithSelf.Op.call.loc12_7.2: init %empty_tuple.type = call %bound_method.loc12_7.4(%value.var) // CHECK:STDOUT: return %Optional.None.call to %return.param +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: @@ -808,6 +814,8 @@ fn Read(y:! Core.IntLiteral) { // CHECK:STDOUT: %.loc27_28.2: %i32 = converted %int_0, %.loc27_28.1 [concrete = constants.%int_0.3c0] // CHECK:STDOUT: %IntRange.Make.call: init %IntRange.bbd to %.loc26_34.1 = call %IntRange.Make.specific_fn(%.loc27_28.2, %end.ref) // CHECK:STDOUT: return %IntRange.Make.call to %return.param +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: specific @IntRange(constants.%N) { @@ -1137,6 +1145,8 @@ fn Read(y:! Core.IntLiteral) { // CHECK:STDOUT: %Destroy.Op.bound: = bound_method %x.var, constants.%Destroy.Op.1a2547.4 // CHECK:STDOUT: %Destroy.Op.call: init %empty_tuple.type = call %Destroy.Op.bound(%x.var) // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: @@ -1176,16 +1186,22 @@ fn Read(y:! Core.IntLiteral) { // CHECK:STDOUT: fn @Destroy.Op.loc5_3.2(%self.param: ref %i32) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Destroy.Op.loc5_3.3(%self.param: ref %struct_type.start.end.e93) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Destroy.Op.loc5_3.4(%self.param: ref %IntRange.bbd) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: specific @Read(constants.%y) { diff --git a/toolchain/check/testdata/for/basic.carbon b/toolchain/check/testdata/for/basic.carbon index 61d6e077c594..acc669edbdc7 100644 --- a/toolchain/check/testdata/for/basic.carbon +++ b/toolchain/check/testdata/for/basic.carbon @@ -193,6 +193,8 @@ fn Run() { // CHECK:STDOUT: %Destroy.Op.call.loc18_35.3: init %empty_tuple.type = call %Destroy.Op.bound.loc18_35.3(%var) // CHECK:STDOUT: %Destroy.Op.call.loc18_20: init %empty_tuple.type = call constants.%Destroy.Op.bound(constants.%.50e) // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Destroy.Op.loc18_35.1(%self.param: ref %empty_tuple.type) = "no_op"; @@ -202,11 +204,15 @@ fn Run() { // CHECK:STDOUT: fn @Destroy.Op.loc18_35.3(%self.param: ref %struct_type.has_value.value.da2) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Destroy.Op.loc18_35.4(%self.param: ref %Optional.21a) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Destroy.Op.loc18_20.1(%self.param: ref %empty_struct_type) = "no_op"; @@ -214,5 +220,7 @@ fn Run() { // CHECK:STDOUT: fn @Destroy.Op.loc18_20.2(%self.param: ref %TrivialRange) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/for/pattern.carbon b/toolchain/check/testdata/for/pattern.carbon index e606ca5bcd31..deb0cb143045 100644 --- a/toolchain/check/testdata/for/pattern.carbon +++ b/toolchain/check/testdata/for/pattern.carbon @@ -272,6 +272,8 @@ fn Run() { // CHECK:STDOUT: %Destroy.Op.bound.loc10_35: = bound_method %.loc10_35.2, constants.%Destroy.Op.1a2547.6 // CHECK:STDOUT: %Destroy.Op.call.loc10_35: init %empty_tuple.type = call %Destroy.Op.bound.loc10_35(%.loc10_35.2) // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Destroy.Op.loc10_36.1(%self.param: ref %empty_struct_type) = "no_op"; @@ -279,6 +281,8 @@ fn Run() { // CHECK:STDOUT: fn @Destroy.Op.loc10_36.2(%self.param: ref %C) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Destroy.Op.loc10_36.3(%self.param: ref bool) = "no_op"; @@ -286,16 +290,22 @@ fn Run() { // CHECK:STDOUT: fn @Destroy.Op.loc10_36.4(%self.param: ref %struct_type.has_value.value.9e7) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Destroy.Op.loc10_36.5(%self.param: ref %Optional.f82) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Destroy.Op.loc10_35(%self.param: ref %EmptyRange.de0) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- var.carbon @@ -456,6 +466,8 @@ fn Run() { // CHECK:STDOUT: %Destroy.Op.bound.loc10_39: = bound_method %.loc10_39.2, constants.%Destroy.Op.1a2547.6 // CHECK:STDOUT: %Destroy.Op.call.loc10_39: init %empty_tuple.type = call %Destroy.Op.bound.loc10_39(%.loc10_39.2) // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Destroy.Op.loc10_8.1(%self.param: ref %empty_struct_type) = "no_op"; @@ -463,6 +475,8 @@ fn Run() { // CHECK:STDOUT: fn @Destroy.Op.loc10_8.2(%self.param: ref %C) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Destroy.Op.loc10_40.1(%self.param: ref bool) = "no_op"; @@ -470,16 +484,22 @@ fn Run() { // CHECK:STDOUT: fn @Destroy.Op.loc10_40.2(%self.param: ref %struct_type.has_value.value.9e7) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Destroy.Op.loc10_40.3(%self.param: ref %Optional.f82) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Destroy.Op.loc10_39(%self.param: ref %EmptyRange.de0) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- tuple.carbon @@ -657,6 +677,8 @@ fn Run() { // CHECK:STDOUT: %Destroy.Op.bound.loc10_60: = bound_method %.loc10_60.2, constants.%Destroy.Op.1a2547.6 // CHECK:STDOUT: %Destroy.Op.call.loc10_60: init %empty_tuple.type = call %Destroy.Op.bound.loc10_60(%.loc10_60.2) // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Destroy.Op.loc10_61.1(%self.param: ref bool) = "no_op"; @@ -664,16 +686,22 @@ fn Run() { // CHECK:STDOUT: fn @Destroy.Op.loc10_61.2(%self.param: ref %tuple.type.784) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Destroy.Op.loc10_61.3(%self.param: ref %struct_type.has_value.value.6f9) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Destroy.Op.loc10_61.4(%self.param: ref %Optional.8b2) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Destroy.Op.loc10_61.5(%self.param: ref %empty_struct_type) = "no_op"; @@ -681,6 +709,8 @@ fn Run() { // CHECK:STDOUT: fn @Destroy.Op.loc10_60(%self.param: ref %EmptyRange.012) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- tuple_class.carbon @@ -860,6 +890,8 @@ fn Run() { // CHECK:STDOUT: %Destroy.Op.bound.loc10_48: = bound_method %.loc10_48.2, constants.%Destroy.Op.1a2547.7 // CHECK:STDOUT: %Destroy.Op.call.loc10_48: init %empty_tuple.type = call %Destroy.Op.bound.loc10_48(%.loc10_48.2) // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Destroy.Op.loc10_49.1(%self.param: ref %empty_struct_type) = "no_op"; @@ -867,11 +899,15 @@ fn Run() { // CHECK:STDOUT: fn @Destroy.Op.loc10_49.2(%self.param: ref %C) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Destroy.Op.loc10_49.3(%self.param: ref %tuple.type.748) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Destroy.Op.loc10_49.4(%self.param: ref bool) = "no_op"; @@ -879,15 +915,21 @@ fn Run() { // CHECK:STDOUT: fn @Destroy.Op.loc10_49.5(%self.param: ref %struct_type.has_value.value.9b1) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Destroy.Op.loc10_49.6(%self.param: ref %Optional.8e2) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Destroy.Op.loc10_48(%self.param: ref %EmptyRange.617) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/function/builtin/adapted_type.carbon b/toolchain/check/testdata/function/builtin/adapted_type.carbon index b3d928da19fc..7278efaa363c 100644 --- a/toolchain/check/testdata/function/builtin/adapted_type.carbon +++ b/toolchain/check/testdata/function/builtin/adapted_type.carbon @@ -257,6 +257,8 @@ fn Int(N: MyIntLiteral) -> type = "int.make_type_signed"; // CHECK:STDOUT: %MyAdd.call: init %MyInt32 = call %MyAdd.ref(%.loc23_54.2, %.loc23_87.2) [concrete = constants.%int_3] // CHECK:STDOUT: assign file.%v.var, %MyAdd.call // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- fail_bad_adapt.carbon diff --git a/toolchain/check/testdata/function/builtin/call.carbon b/toolchain/check/testdata/function/builtin/call.carbon index 61a673137a8b..99175389d79e 100644 --- a/toolchain/check/testdata/function/builtin/call.carbon +++ b/toolchain/check/testdata/function/builtin/call.carbon @@ -203,6 +203,8 @@ fn RuntimeCall(a: i32, b: i32) -> i32 { // CHECK:STDOUT: %b.ref: %i32 = name_ref b, %b // CHECK:STDOUT: %Add.call: init %i32 = call %Add.ref(%a.ref, %b.ref) // CHECK:STDOUT: return %Add.call +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @__global_init() { @@ -216,5 +218,7 @@ fn RuntimeCall(a: i32, b: i32) -> i32 { // CHECK:STDOUT: %T.as.DefaultOrUnformed.impl.Op.call: init %array_type to %.loc17_1 = call %T.as.DefaultOrUnformed.impl.Op.specific_fn() // CHECK:STDOUT: assign file.%arr.var, %T.as.DefaultOrUnformed.impl.Op.call // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/function/builtin/call_from_operator.carbon b/toolchain/check/testdata/function/builtin/call_from_operator.carbon index 56e99cdc922f..96a3477dfe70 100644 --- a/toolchain/check/testdata/function/builtin/call_from_operator.carbon +++ b/toolchain/check/testdata/function/builtin/call_from_operator.carbon @@ -326,6 +326,8 @@ var arr: array(i32, (1 as i32) + (2 as i32)) = (3, 4, (3 as i32) + (4 as i32)); // CHECK:STDOUT: witness = (@AddWith.WithSelf.%AddWith.WithSelf.Op.decl) // CHECK:STDOUT: // CHECK:STDOUT: !requires: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: @@ -371,6 +373,8 @@ var arr: array(i32, (1 as i32) + (2 as i32)) = (3, 4, (3 as i32) + (4 as i32)); // CHECK:STDOUT: witness = (@As.WithSelf.%As.WithSelf.Convert.decl) // CHECK:STDOUT: // CHECK:STDOUT: !requires: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: @@ -417,6 +421,8 @@ var arr: array(i32, (1 as i32) + (2 as i32)) = (3, 4, (3 as i32) + (4 as i32)); // CHECK:STDOUT: witness = (@ImplicitAs.WithSelf.%ImplicitAs.WithSelf.Convert.decl) // CHECK:STDOUT: // CHECK:STDOUT: !requires: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: @@ -1078,6 +1084,8 @@ var arr: array(i32, (1 as i32) + (2 as i32)) = (3, 4, (3 as i32) + (4 as i32)); // CHECK:STDOUT: witness = (imports.%Core.Convert.b64) // CHECK:STDOUT: // CHECK:STDOUT: !requires: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: @@ -1096,6 +1104,8 @@ var arr: array(i32, (1 as i32) + (2 as i32)) = (3, 4, (3 as i32) + (4 as i32)); // CHECK:STDOUT: witness = (imports.%Core.Op) // CHECK:STDOUT: // CHECK:STDOUT: !requires: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: @@ -1114,6 +1124,8 @@ var arr: array(i32, (1 as i32) + (2 as i32)) = (3, 4, (3 as i32) + (4 as i32)); // CHECK:STDOUT: witness = (imports.%Core.Convert.368) // CHECK:STDOUT: // CHECK:STDOUT: !requires: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: @@ -1239,6 +1251,8 @@ var arr: array(i32, (1 as i32) + (2 as i32)) = (3, 4, (3 as i32) + (4 as i32)); // CHECK:STDOUT: %.loc4_1: init %array_type = converted %.loc4_78.1, %.loc4_78.10 [concrete = constants.%array] // CHECK:STDOUT: assign file.%arr.var, %.loc4_1 // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: specific @As(constants.%T) { diff --git a/toolchain/check/testdata/function/builtin/fail_redefined.carbon b/toolchain/check/testdata/function/builtin/fail_redefined.carbon index 0544e0598163..2480e145179c 100644 --- a/toolchain/check/testdata/function/builtin/fail_redefined.carbon +++ b/toolchain/check/testdata/function/builtin/fail_redefined.carbon @@ -230,6 +230,8 @@ fn C(n: i32, m: i32) -> i32 = "int.sadd"; // CHECK:STDOUT: %bound_method.loc23_45.2: = bound_method %n.ref, %specific_fn // CHECK:STDOUT: %Int.as.Copy.impl.Op.call: init %i32 = call %bound_method.loc23_45.2(%n.ref) // CHECK:STDOUT: return %Int.as.Copy.impl.Op.call +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @B.loc25(%n.param: %i32, %m.param: %i32) -> out %return.param: %i32 { @@ -241,6 +243,8 @@ fn C(n: i32, m: i32) -> i32 = "int.sadd"; // CHECK:STDOUT: %bound_method.loc25_45.2: = bound_method %n.ref, %specific_fn // CHECK:STDOUT: %Int.as.Copy.impl.Op.call: init %i32 = call %bound_method.loc25_45.2(%n.ref) // CHECK:STDOUT: return %Int.as.Copy.impl.Op.call +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @B.loc33(%n.param: %i32, %m.param: %i32) -> out %return.param: %i32 = "int.sadd"; diff --git a/toolchain/check/testdata/function/builtin/import.carbon b/toolchain/check/testdata/function/builtin/import.carbon index 9d4f92657594..e0e4f4d422ca 100644 --- a/toolchain/check/testdata/function/builtin/import.carbon +++ b/toolchain/check/testdata/function/builtin/import.carbon @@ -284,5 +284,7 @@ var arr: array(i32, Core.AsIntLiteral(Core.TestAdd(Core.AsI32(1), Core.AsI32(2)) // CHECK:STDOUT: %.loc4_1: init %array_type = converted %.loc4_130.1, %.loc4_130.8 [concrete = constants.%array] // CHECK:STDOUT: assign file.%arr.var, %.loc4_1 // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/function/builtin/method.carbon b/toolchain/check/testdata/function/builtin/method.carbon index 7e45dbdbe942..5821ea8dc12c 100644 --- a/toolchain/check/testdata/function/builtin/method.carbon +++ b/toolchain/check/testdata/function/builtin/method.carbon @@ -244,6 +244,8 @@ var arr: array(i32, (1 as i32).(I.F)(2)); // CHECK:STDOUT: witness = (@I.WithSelf.%I.WithSelf.F.decl) // CHECK:STDOUT: // CHECK:STDOUT: !requires: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: impl @i32.as.I.impl: %i32 as %I.ref { @@ -303,6 +305,8 @@ var arr: array(i32, (1 as i32).(I.F)(2)); // CHECK:STDOUT: %T.as.DefaultOrUnformed.impl.Op.call: init %array_type to %.loc23_1 = call %T.as.DefaultOrUnformed.impl.Op.specific_fn() // CHECK:STDOUT: assign file.%arr.var, %T.as.DefaultOrUnformed.impl.Op.call // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: specific @I.WithSelf(constants.%Self.37e) { diff --git a/toolchain/check/testdata/function/call/alias.carbon b/toolchain/check/testdata/function/call/alias.carbon index df9bf3829373..3befb1a7e03b 100644 --- a/toolchain/check/testdata/function/call/alias.carbon +++ b/toolchain/check/testdata/function/call/alias.carbon @@ -78,6 +78,8 @@ fn Main() { // CHECK:STDOUT: %.loc15_24.2: init %empty_tuple.type = tuple_init () [concrete = constants.%empty_tuple] // CHECK:STDOUT: %.loc15_25: init %empty_tuple.type = converted %.loc15_24.1, %.loc15_24.2 [concrete = constants.%empty_tuple] // CHECK:STDOUT: return %.loc15_25 +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Main() { @@ -98,6 +100,8 @@ fn Main() { // CHECK:STDOUT: %Destroy.Op.bound: = bound_method %b.var, constants.%Destroy.Op // CHECK:STDOUT: %Destroy.Op.call: init %empty_tuple.type = call %Destroy.Op.bound(%b.var) // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Destroy.Op(%self.param: ref %empty_tuple.type) = "no_op"; diff --git a/toolchain/check/testdata/function/call/empty_struct.carbon b/toolchain/check/testdata/function/call/empty_struct.carbon index cdbd1bb57994..1810de44c482 100644 --- a/toolchain/check/testdata/function/call/empty_struct.carbon +++ b/toolchain/check/testdata/function/call/empty_struct.carbon @@ -69,6 +69,8 @@ fn Main() { // CHECK:STDOUT: %.loc16_10: init %empty_struct_type = struct_init () [concrete = constants.%empty_struct] // CHECK:STDOUT: %.loc16_11: init %empty_struct_type = converted %a.ref, %.loc16_10 [concrete = constants.%empty_struct] // CHECK:STDOUT: return %.loc16_11 +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Main() { @@ -79,5 +81,7 @@ fn Main() { // CHECK:STDOUT: %.loc20_9.2: %empty_struct_type = converted %.loc20_9.1, %empty_struct [concrete = constants.%empty_struct] // CHECK:STDOUT: %Echo.call: init %empty_struct_type = call %Echo.ref(%.loc20_9.2) // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/function/call/empty_tuple.carbon b/toolchain/check/testdata/function/call/empty_tuple.carbon index 73967d33e602..8e8c359c8ca9 100644 --- a/toolchain/check/testdata/function/call/empty_tuple.carbon +++ b/toolchain/check/testdata/function/call/empty_tuple.carbon @@ -69,6 +69,8 @@ fn Main() { // CHECK:STDOUT: %.loc16_10: init %empty_tuple.type = tuple_init () [concrete = constants.%empty_tuple] // CHECK:STDOUT: %.loc16_11: init %empty_tuple.type = converted %a.ref, %.loc16_10 [concrete = constants.%empty_tuple] // CHECK:STDOUT: return %.loc16_11 +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Main() { @@ -79,5 +81,7 @@ fn Main() { // CHECK:STDOUT: %.loc20_9.2: %empty_tuple.type = converted %.loc20_9.1, %empty_tuple [concrete = constants.%empty_tuple] // CHECK:STDOUT: %Echo.call: init %empty_tuple.type = call %Echo.ref(%.loc20_9.2) // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/function/call/fail_param_count.carbon b/toolchain/check/testdata/function/call/fail_param_count.carbon index 41a8a93690ad..dad225fbcf7e 100644 --- a/toolchain/check/testdata/function/call/fail_param_count.carbon +++ b/toolchain/check/testdata/function/call/fail_param_count.carbon @@ -140,16 +140,22 @@ fn Main() { // CHECK:STDOUT: fn @Run0() { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Run1(%a.param: %i32) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Run2(%a.param: %i32, %b.param: %i32) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Main() { @@ -167,5 +173,7 @@ fn Main() { // CHECK:STDOUT: %Run2.ref.loc69: %Run2.type = name_ref Run2, file.%Run2.decl [concrete = constants.%Run2] // CHECK:STDOUT: %int_0.loc69: Core.IntLiteral = int_value 0 [concrete = constants.%int_0] // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/function/call/fail_param_type.carbon b/toolchain/check/testdata/function/call/fail_param_type.carbon index ac247cecaffd..23089deeee6f 100644 --- a/toolchain/check/testdata/function/call/fail_param_type.carbon +++ b/toolchain/check/testdata/function/call/fail_param_type.carbon @@ -80,6 +80,8 @@ fn F() { // CHECK:STDOUT: fn @G(%a.param: %i32) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @F() { @@ -89,5 +91,7 @@ fn F() { // CHECK:STDOUT: %.loc28: %i32 = converted %float, [concrete = ] // CHECK:STDOUT: %G.call: init %empty_tuple.type = call %G.ref() // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/function/call/fail_return_type_mismatch.carbon b/toolchain/check/testdata/function/call/fail_return_type_mismatch.carbon index 7615f2d396df..885abac97191 100644 --- a/toolchain/check/testdata/function/call/fail_return_type_mismatch.carbon +++ b/toolchain/check/testdata/function/call/fail_return_type_mismatch.carbon @@ -117,6 +117,8 @@ fn Run() { // CHECK:STDOUT: %Core.FloatLiteral.as.ImplicitAs.impl.Convert.call: init %f64.dc1 = call %bound_method.loc15_29.2(%float) [concrete = constants.%float.3b9] // CHECK:STDOUT: %.loc15_29: init %f64.dc1 = converted %float, %Core.FloatLiteral.as.ImplicitAs.impl.Convert.call [concrete = constants.%float.3b9] // CHECK:STDOUT: return %.loc15_29 +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Run() { @@ -135,6 +137,8 @@ fn Run() { // CHECK:STDOUT: %Destroy.Op.bound: = bound_method %x.var, constants.%Destroy.Op.1a2547.2 // CHECK:STDOUT: %Destroy.Op.call: init %empty_tuple.type = call %Destroy.Op.bound(%x.var) // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Destroy.Op.loc25_3.1(%self.param: ref %i32.builtin) = "no_op"; @@ -142,5 +146,7 @@ fn Run() { // CHECK:STDOUT: fn @Destroy.Op.loc25_3.2(%self.param: ref %i32) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/function/call/fail_runtime_implicit_param.carbon b/toolchain/check/testdata/function/call/fail_runtime_implicit_param.carbon index a9662d8d62bd..540c859488d6 100644 --- a/toolchain/check/testdata/function/call/fail_runtime_implicit_param.carbon +++ b/toolchain/check/testdata/function/call/fail_runtime_implicit_param.carbon @@ -48,5 +48,7 @@ fn Run() { // CHECK:STDOUT: %F.ref: %F.type = name_ref F, file.%F.decl [concrete = constants.%F] // CHECK:STDOUT: %F.call: init %empty_tuple.type = call %F.ref() // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/function/call/form.carbon b/toolchain/check/testdata/function/call/form.carbon index 5803a1542593..1087983aa5ec 100644 --- a/toolchain/check/testdata/function/call/form.carbon +++ b/toolchain/check/testdata/function/call/form.carbon @@ -327,6 +327,8 @@ fn G() { // CHECK:STDOUT: %.loc10: %i32 = ref_tag %y.ref // CHECK:STDOUT: %F.call: init %empty_tuple.type = call %F.ref(%y.ref) // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- var_form_param.carbon @@ -401,6 +403,8 @@ fn G() { // CHECK:STDOUT: %Destroy.Op.bound: = bound_method %x.var, constants.%Destroy.Op.1a2547.2 // CHECK:STDOUT: %Destroy.Op.call: init %empty_tuple.type = call %Destroy.Op.bound(%x.var) // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Destroy.Op.loc4_7.1(%self.param: ref %i32.builtin) = "no_op"; @@ -408,6 +412,8 @@ fn G() { // CHECK:STDOUT: fn @Destroy.Op.loc4_7.2(%self.param: ref %i32) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- val_form_param.carbon @@ -474,6 +480,8 @@ fn G() { // CHECK:STDOUT: %.loc9_5.2: %i32 = converted %int_0, %.loc9_5.1 [concrete = constants.%int_0.3c0] // CHECK:STDOUT: %F.call: init %empty_tuple.type = call %F.ref(%.loc9_5.2) // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- type_component_needs_conversion.carbon @@ -546,6 +554,8 @@ fn G() { // CHECK:STDOUT: %_.patt: %pattern_type.6b6 = ref_binding_pattern _ [concrete = constants.%_.patt] // CHECK:STDOUT: } // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- var_return_form.carbon @@ -597,6 +607,8 @@ fn G() { // CHECK:STDOUT: %Destroy.Op.bound: = bound_method %_.var, constants.%Destroy.Op.1a2547.2 // CHECK:STDOUT: %Destroy.Op.call: init %empty_tuple.type = call %Destroy.Op.bound(%_.var) // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Destroy.Op.loc9_7.1(%self.param: ref %i32.builtin) = "no_op"; @@ -604,6 +616,8 @@ fn G() { // CHECK:STDOUT: fn @Destroy.Op.loc9_7.2(%self.param: ref %i32) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- val_return_form.carbon @@ -645,6 +659,8 @@ fn G() { // CHECK:STDOUT: %_.patt: %pattern_type.6b6 = value_binding_pattern _ [concrete = constants.%_.patt] // CHECK:STDOUT: } // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- form_generic_return.carbon @@ -847,6 +863,8 @@ fn G() { // CHECK:STDOUT: !entry: // CHECK:STDOUT: %v.ref: @F.%.loc4_26.1 (%.42f) = name_ref v, %v // CHECK:STDOUT: return %v.ref +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: @@ -922,6 +940,8 @@ fn G() { // CHECK:STDOUT: %Destroy.Op.bound.loc11: = bound_method %v.var.loc11, constants.%Destroy.Op.1a2547.2 // CHECK:STDOUT: %Destroy.Op.call.loc11: init %empty_tuple.type = call %Destroy.Op.bound.loc11(%v.var.loc11) // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Destroy.Op.1(%self.param: ref %i32.builtin) = "no_op"; @@ -929,6 +949,8 @@ fn G() { // CHECK:STDOUT: fn @Destroy.Op.2(%self.param: ref %i32) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: specific @F(constants.%Fm) { diff --git a/toolchain/check/testdata/function/call/i32.carbon b/toolchain/check/testdata/function/call/i32.carbon index f7ff61abf668..7a4fb17c9ddf 100644 --- a/toolchain/check/testdata/function/call/i32.carbon +++ b/toolchain/check/testdata/function/call/i32.carbon @@ -126,6 +126,8 @@ fn Main() { // CHECK:STDOUT: %bound_method.loc16_10.2: = bound_method %a.ref, %specific_fn // CHECK:STDOUT: %Int.as.Copy.impl.Op.call: init %i32 = call %bound_method.loc16_10.2(%a.ref) // CHECK:STDOUT: return %Int.as.Copy.impl.Op.call +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Main() { @@ -151,6 +153,8 @@ fn Main() { // CHECK:STDOUT: %Destroy.Op.bound: = bound_method %b.var, constants.%Destroy.Op.1a2547.2 // CHECK:STDOUT: %Destroy.Op.call: init %empty_tuple.type = call %Destroy.Op.bound(%b.var) // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Destroy.Op.loc20_3.1(%self.param: ref %i32.builtin) = "no_op"; @@ -158,5 +162,7 @@ fn Main() { // CHECK:STDOUT: fn @Destroy.Op.loc20_3.2(%self.param: ref %i32) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/function/call/more_param_ir.carbon b/toolchain/check/testdata/function/call/more_param_ir.carbon index 8a298d831529..c5da977642d8 100644 --- a/toolchain/check/testdata/function/call/more_param_ir.carbon +++ b/toolchain/check/testdata/function/call/more_param_ir.carbon @@ -115,6 +115,8 @@ fn Main() { // CHECK:STDOUT: fn @Foo(%a.param: %i32, %b.param: %i32) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Main() { @@ -158,6 +160,8 @@ fn Main() { // CHECK:STDOUT: %Destroy.Op.bound: = bound_method %x.var, constants.%Destroy.Op.1a2547.3 // CHECK:STDOUT: %Destroy.Op.call: init %empty_tuple.type = call %Destroy.Op.bound(%x.var) // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Destroy.Op.loc18_3.1(%self.param: ref %i32.builtin) = "no_op"; @@ -165,10 +169,14 @@ fn Main() { // CHECK:STDOUT: fn @Destroy.Op.loc18_3.2(%self.param: ref %i32) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Destroy.Op.loc18_3.3(%self.param: ref %tuple.type.a8a) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/function/call/params_one.carbon b/toolchain/check/testdata/function/call/params_one.carbon index 7ea0d866660d..5273636d74ac 100644 --- a/toolchain/check/testdata/function/call/params_one.carbon +++ b/toolchain/check/testdata/function/call/params_one.carbon @@ -86,6 +86,8 @@ fn Main() { // CHECK:STDOUT: fn @Foo(%a.param: %i32) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Main() { @@ -101,5 +103,7 @@ fn Main() { // CHECK:STDOUT: %.loc18_7.2: %i32 = converted %int_1, %.loc18_7.1 [concrete = constants.%int_1.0c6] // CHECK:STDOUT: %Foo.call: init %empty_tuple.type = call %Foo.ref(%.loc18_7.2) // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/function/call/params_one_comma.carbon b/toolchain/check/testdata/function/call/params_one_comma.carbon index 53a02c5429e7..883eb2165c26 100644 --- a/toolchain/check/testdata/function/call/params_one_comma.carbon +++ b/toolchain/check/testdata/function/call/params_one_comma.carbon @@ -87,6 +87,8 @@ fn Main() { // CHECK:STDOUT: fn @Foo(%a.param: %i32) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Main() { @@ -112,5 +114,7 @@ fn Main() { // CHECK:STDOUT: %.loc19_7.2: %i32 = converted %int_1.loc19, %.loc19_7.1 [concrete = constants.%int_1.0c6] // CHECK:STDOUT: %Foo.call.loc19: init %empty_tuple.type = call %Foo.ref.loc19(%.loc19_7.2) // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/function/call/params_two.carbon b/toolchain/check/testdata/function/call/params_two.carbon index c461b1872c44..1049f3aa3a5c 100644 --- a/toolchain/check/testdata/function/call/params_two.carbon +++ b/toolchain/check/testdata/function/call/params_two.carbon @@ -97,6 +97,8 @@ fn Main() { // CHECK:STDOUT: fn @Foo(%a.param: %i32, %b.param: %i32) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Main() { @@ -120,5 +122,7 @@ fn Main() { // CHECK:STDOUT: %.loc18_10.2: %i32 = converted %int_2, %.loc18_10.1 [concrete = constants.%int_2.295] // CHECK:STDOUT: %Foo.call: init %empty_tuple.type = call %Foo.ref(%.loc18_7.2, %.loc18_10.2) // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/function/call/params_two_comma.carbon b/toolchain/check/testdata/function/call/params_two_comma.carbon index 8360e9de1abe..ace6c82070e1 100644 --- a/toolchain/check/testdata/function/call/params_two_comma.carbon +++ b/toolchain/check/testdata/function/call/params_two_comma.carbon @@ -98,6 +98,8 @@ fn Main() { // CHECK:STDOUT: fn @Foo(%a.param: %i32, %b.param: %i32) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Main() { @@ -139,5 +141,7 @@ fn Main() { // CHECK:STDOUT: %.loc19_10.2: %i32 = converted %int_2.loc19, %.loc19_10.1 [concrete = constants.%int_2.295] // CHECK:STDOUT: %Foo.call.loc19: init %empty_tuple.type = call %Foo.ref.loc19(%.loc19_7.2, %.loc19_10.2) // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/function/call/params_zero.carbon b/toolchain/check/testdata/function/call/params_zero.carbon index 0431ccb0cba3..6f2137a4c960 100644 --- a/toolchain/check/testdata/function/call/params_zero.carbon +++ b/toolchain/check/testdata/function/call/params_zero.carbon @@ -40,6 +40,8 @@ fn Main() { // CHECK:STDOUT: fn @Foo() { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Main() { @@ -47,5 +49,7 @@ fn Main() { // CHECK:STDOUT: %Foo.ref: %Foo.type = name_ref Foo, file.%Foo.decl [concrete = constants.%Foo] // CHECK:STDOUT: %Foo.call: init %empty_tuple.type = call %Foo.ref() // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/function/call/prefer_unqualified_lookup.carbon b/toolchain/check/testdata/function/call/prefer_unqualified_lookup.carbon index cbdb90d8deaa..7523fbdf422b 100644 --- a/toolchain/check/testdata/function/call/prefer_unqualified_lookup.carbon +++ b/toolchain/check/testdata/function/call/prefer_unqualified_lookup.carbon @@ -185,6 +185,8 @@ fn Class(F:! type).Inner.G() -> i32 { return F(); } // CHECK:STDOUT: %Core.IntLiteral.as.ImplicitAs.impl.Convert.call: init %i32 = call %bound_method.loc8_29.2(%int_0) [concrete = constants.%int_0.3c0] // CHECK:STDOUT: %.loc8_29: init %i32 = converted %int_0, %Core.IntLiteral.as.ImplicitAs.impl.Convert.call [concrete = constants.%int_0.3c0] // CHECK:STDOUT: return %.loc8_29 +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: @@ -202,6 +204,8 @@ fn Class(F:! type).Inner.G() -> i32 { return F(); } // CHECK:STDOUT: %Inner.F.specific_fn.loc13_46.1: = specific_function %F.ref, @Inner.F(constants.%F) [symbolic = %Inner.F.specific_fn.loc13_46.2 (constants.%Inner.F.specific_fn)] // CHECK:STDOUT: %Inner.F.call: init %i32 = call %Inner.F.specific_fn.loc13_46.1() // CHECK:STDOUT: return %Inner.F.call +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/function/call/ref.carbon b/toolchain/check/testdata/function/call/ref.carbon index 777d60753491..ee25d28c320d 100644 --- a/toolchain/check/testdata/function/call/ref.carbon +++ b/toolchain/check/testdata/function/call/ref.carbon @@ -189,6 +189,8 @@ fn G(ref d: D) { F(ref d); } // CHECK:STDOUT: %Destroy.Op.bound: = bound_method %y.var, constants.%Destroy.Op.1a2547.2 // CHECK:STDOUT: %Destroy.Op.call: init %empty_tuple.type = call %Destroy.Op.bound(%y.var) // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Destroy.Op.loc8_3.1(%self.param: ref %i32.builtin) = "no_op"; @@ -196,6 +198,8 @@ fn G(ref d: D) { F(ref d); } // CHECK:STDOUT: fn @Destroy.Op.loc8_3.2(%self.param: ref %i32) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- class.carbon @@ -277,6 +281,8 @@ fn G(ref d: D) { F(ref d); } // CHECK:STDOUT: %Destroy.Op.bound: = bound_method %c.var, constants.%Destroy.Op.1a2547.2 // CHECK:STDOUT: %Destroy.Op.call: init %empty_tuple.type = call %Destroy.Op.bound(%c.var) // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Destroy.Op.loc10_3.1(%self.param: ref %empty_struct_type) = "no_op"; @@ -284,5 +290,7 @@ fn G(ref d: D) { F(ref d); } // CHECK:STDOUT: fn @Destroy.Op.loc10_3.2(%self.param: ref %C) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/function/call/return_implicit.carbon b/toolchain/check/testdata/function/call/return_implicit.carbon index f25f087869ce..f61fcfdf4328 100644 --- a/toolchain/check/testdata/function/call/return_implicit.carbon +++ b/toolchain/check/testdata/function/call/return_implicit.carbon @@ -59,6 +59,8 @@ fn Main() { // CHECK:STDOUT: fn @MakeImplicitEmptyTuple() { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Main() { @@ -79,6 +81,8 @@ fn Main() { // CHECK:STDOUT: %Destroy.Op.bound: = bound_method %b.var, constants.%Destroy.Op // CHECK:STDOUT: %Destroy.Op.call: init %empty_tuple.type = call %Destroy.Op.bound(%b.var) // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Destroy.Op(%self.param: ref %empty_tuple.type) = "no_op"; diff --git a/toolchain/check/testdata/function/declaration/export_name.carbon b/toolchain/check/testdata/function/declaration/export_name.carbon index 5f82e5fc914f..532df75e0dca 100644 --- a/toolchain/check/testdata/function/declaration/export_name.carbon +++ b/toolchain/check/testdata/function/declaration/export_name.carbon @@ -121,5 +121,7 @@ var f: () = F(); // CHECK:STDOUT: %F.call: init %empty_tuple.type = call %F.ref() // CHECK:STDOUT: assign file.%f.var, %F.call // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/function/declaration/extern.carbon b/toolchain/check/testdata/function/declaration/extern.carbon index 30875fcf2d8f..6f453a812c8f 100644 --- a/toolchain/check/testdata/function/declaration/extern.carbon +++ b/toolchain/check/testdata/function/declaration/extern.carbon @@ -143,6 +143,8 @@ extern library "basic" fn F(); // CHECK:STDOUT: %F.call: init %empty_tuple.type = call %F.ref() // CHECK:STDOUT: assign file.%x.var, %F.call // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- fail_redecl.carbon diff --git a/toolchain/check/testdata/function/declaration/extern_library.carbon b/toolchain/check/testdata/function/declaration/extern_library.carbon index d6b3fa50b015..414ed4bc7789 100644 --- a/toolchain/check/testdata/function/declaration/extern_library.carbon +++ b/toolchain/check/testdata/function/declaration/extern_library.carbon @@ -357,5 +357,7 @@ extern library "extern_library_owner" fn F() {} // CHECK:STDOUT: extern fn @F() { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/function/declaration/fail_import_incomplete_return.carbon b/toolchain/check/testdata/function/declaration/fail_import_incomplete_return.carbon index 1acfc0b0112c..4c72630b6f4f 100644 --- a/toolchain/check/testdata/function/declaration/fail_import_incomplete_return.carbon +++ b/toolchain/check/testdata/function/declaration/fail_import_incomplete_return.carbon @@ -201,6 +201,8 @@ fn CallFAndGIncomplete() { // CHECK:STDOUT: %ReturnDUsed.ref: %ReturnDUsed.type = name_ref ReturnDUsed, file.%ReturnDUsed.decl [concrete = constants.%ReturnDUsed] // CHECK:STDOUT: %ReturnDUsed.call: init = call %ReturnDUsed.ref() // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- fail_use_imported.carbon @@ -288,6 +290,8 @@ fn CallFAndGIncomplete() { // CHECK:STDOUT: %Destroy.Op.bound.loc33: = bound_method %.loc33_17.2, constants.%Destroy.Op.1a2547.2 // CHECK:STDOUT: %Destroy.Op.call.loc33: init %empty_tuple.type = call %Destroy.Op.bound.loc33(%.loc33_17.2) // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @ReturnCUnused [from "fail_incomplete_return.carbon"]; @@ -303,5 +307,7 @@ fn CallFAndGIncomplete() { // CHECK:STDOUT: fn @Destroy.Op.loc34_15.2(%self.param: ref %D) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/function/declaration/fail_modifiers.carbon b/toolchain/check/testdata/function/declaration/fail_modifiers.carbon index 9d791592e4b8..88a769be1b4a 100644 --- a/toolchain/check/testdata/function/declaration/fail_modifiers.carbon +++ b/toolchain/check/testdata/function/declaration/fail_modifiers.carbon @@ -138,6 +138,8 @@ extern private fn ExternOrderAndConflict() {} // CHECK:STDOUT: fn @DuplicateVirtual() { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @TwoAccess(); @@ -145,6 +147,8 @@ extern private fn ExternOrderAndConflict() {} // CHECK:STDOUT: fn @ModifiersConflict() { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @InvalidModifier(); @@ -152,10 +156,14 @@ extern private fn ExternOrderAndConflict() {} // CHECK:STDOUT: fn @ModifiersConflict2() { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: extern fn @ExternOrderAndConflict() { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/function/declaration/fail_redecl.carbon b/toolchain/check/testdata/function/declaration/fail_redecl.carbon index 3bcda9e11008..e79776e144c1 100644 --- a/toolchain/check/testdata/function/declaration/fail_redecl.carbon +++ b/toolchain/check/testdata/function/declaration/fail_redecl.carbon @@ -147,15 +147,21 @@ fn E() {} // CHECK:STDOUT: fn @D() { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @E.loc55() { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @E.loc63() { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/function/declaration/fail_todo_no_params.carbon b/toolchain/check/testdata/function/declaration/fail_todo_no_params.carbon index 8fa85959c507..ef649f917e1d 100644 --- a/toolchain/check/testdata/function/declaration/fail_todo_no_params.carbon +++ b/toolchain/check/testdata/function/declaration/fail_todo_no_params.carbon @@ -114,6 +114,8 @@ fn A { // CHECK:STDOUT: fn @A { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- fail_todo_return_type.carbon diff --git a/toolchain/check/testdata/function/declaration/implicit_import.carbon b/toolchain/check/testdata/function/declaration/implicit_import.carbon index b21959eb5d59..2e1c208e3954 100644 --- a/toolchain/check/testdata/function/declaration/implicit_import.carbon +++ b/toolchain/check/testdata/function/declaration/implicit_import.carbon @@ -103,6 +103,8 @@ extern fn A(); // CHECK:STDOUT: fn @A() [from "basic.carbon"] { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- extern_api.carbon diff --git a/toolchain/check/testdata/function/declaration/import.carbon b/toolchain/check/testdata/function/declaration/import.carbon index ad67c0421a51..d4a9978bb2d3 100644 --- a/toolchain/check/testdata/function/declaration/import.carbon +++ b/toolchain/check/testdata/function/declaration/import.carbon @@ -663,6 +663,8 @@ import library "extern_api"; // CHECK:STDOUT: %E.call: init %empty_tuple.type = call %E.ref() // CHECK:STDOUT: assign file.%e.var, %E.call // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- fail_redecl_api.carbon @@ -881,6 +883,8 @@ import library "extern_api"; // CHECK:STDOUT: %E.call: init %empty_tuple.type = call %E.ref() // CHECK:STDOUT: assign file.%e.var, %E.call // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- redecl_extern_api.carbon @@ -1099,6 +1103,8 @@ import library "extern_api"; // CHECK:STDOUT: %E.call: init %empty_tuple.type = call %E.ref() // CHECK:STDOUT: assign file.%e.var, %E.call // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- fail_merge.carbon @@ -1292,6 +1298,8 @@ import library "extern_api"; // CHECK:STDOUT: %E.call: init %empty_tuple.type = call %E.ref() // CHECK:STDOUT: assign file.%e.var, %E.call // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- fail_merge_reverse.carbon @@ -1485,6 +1493,8 @@ import library "extern_api"; // CHECK:STDOUT: %E.call: init %empty_tuple.type = call %E.ref() // CHECK:STDOUT: assign file.%e.var, %E.call // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- unloaded.carbon diff --git a/toolchain/check/testdata/function/declaration/no_definition_in_impl_file.carbon b/toolchain/check/testdata/function/declaration/no_definition_in_impl_file.carbon index 056c39a48fac..1d268ce31971 100644 --- a/toolchain/check/testdata/function/declaration/no_definition_in_impl_file.carbon +++ b/toolchain/check/testdata/function/declaration/no_definition_in_impl_file.carbon @@ -112,6 +112,8 @@ fn D(); // CHECK:STDOUT: fn @A() [from "decl_in_api_definition_in_impl.carbon"] { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- use_decl_in_api.carbon diff --git a/toolchain/check/testdata/function/declaration/pattern_in_signature.carbon b/toolchain/check/testdata/function/declaration/pattern_in_signature.carbon index 5af11e629c1c..37833ee3286f 100644 --- a/toolchain/check/testdata/function/declaration/pattern_in_signature.carbon +++ b/toolchain/check/testdata/function/declaration/pattern_in_signature.carbon @@ -103,6 +103,8 @@ fn CallF(ab: ({}, {}), c: {}) { // CHECK:STDOUT: fn @F(%a.param: %empty_struct_type, %b.param: %empty_struct_type, %c.param: %empty_struct_type) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @CallF(%ab.param: %tuple.type.b6b, %c.param: %empty_struct_type) { @@ -114,5 +116,7 @@ fn CallF(ab: ({}, {}), c: {}) { // CHECK:STDOUT: %tuple.elem1: %empty_struct_type = tuple_access %ab.ref, element1 // CHECK:STDOUT: %F.call: init %empty_tuple.type = call %F.ref(%tuple.elem0, %tuple.elem1, %c.ref) // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/function/declaration/ref.carbon b/toolchain/check/testdata/function/declaration/ref.carbon index 3f54c2e386c9..6c6a19a3efaf 100644 --- a/toolchain/check/testdata/function/declaration/ref.carbon +++ b/toolchain/check/testdata/function/declaration/ref.carbon @@ -80,5 +80,7 @@ fn G() { // CHECK:STDOUT: %x.patt: %pattern_type.6b6 = ref_binding_pattern x [concrete = constants.%x.patt] // CHECK:STDOUT: } // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/function/declaration/simple.carbon b/toolchain/check/testdata/function/declaration/simple.carbon index f26d5ae06474..da742ba5e34a 100644 --- a/toolchain/check/testdata/function/declaration/simple.carbon +++ b/toolchain/check/testdata/function/declaration/simple.carbon @@ -42,5 +42,7 @@ fn G() { F(); } // CHECK:STDOUT: %F.ref: %F.type = name_ref F, file.%F.decl [concrete = constants.%F] // CHECK:STDOUT: %F.call: init %empty_tuple.type = call %F.ref() // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/function/definition/basics.carbon b/toolchain/check/testdata/function/definition/basics.carbon index 2304693b4876..ada06f2985d8 100644 --- a/toolchain/check/testdata/function/definition/basics.carbon +++ b/toolchain/check/testdata/function/definition/basics.carbon @@ -58,5 +58,7 @@ fn F(unused n: C) {} // CHECK:STDOUT: fn @F(%n.param: %C) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/function/definition/extern.carbon b/toolchain/check/testdata/function/definition/extern.carbon index 3fd4c16b2874..d890965bd24b 100644 --- a/toolchain/check/testdata/function/definition/extern.carbon +++ b/toolchain/check/testdata/function/definition/extern.carbon @@ -132,6 +132,8 @@ extern fn F() {} // CHECK:STDOUT: extern fn @F() { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- def_for_extern_decl.carbon @@ -152,6 +154,8 @@ extern fn F() {} // CHECK:STDOUT: extern fn @F() { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- split_library.carbon @@ -189,6 +193,8 @@ extern fn F() {} // CHECK:STDOUT: extern fn @F() [from "split_library.carbon"] { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- fail_def_extern_mismatch.carbon @@ -209,6 +215,8 @@ extern fn F() {} // CHECK:STDOUT: extern fn @F() { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- fail_def_extern_mismatch_reverse.carbon @@ -229,6 +237,8 @@ extern fn F() {} // CHECK:STDOUT: fn @F() { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- fail_extern_diag_suppressed.carbon @@ -250,6 +260,8 @@ extern fn F() {} // CHECK:STDOUT: extern fn @F() { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- fail_extern_decl_after_def.carbon @@ -270,6 +282,8 @@ extern fn F() {} // CHECK:STDOUT: fn @F() { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- in_impl.carbon @@ -297,5 +311,7 @@ extern fn F() {} // CHECK:STDOUT: extern fn @F() { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/function/definition/extern_library.carbon b/toolchain/check/testdata/function/definition/extern_library.carbon index d7e7c8697280..5b612b8e758d 100644 --- a/toolchain/check/testdata/function/definition/extern_library.carbon +++ b/toolchain/check/testdata/function/definition/extern_library.carbon @@ -205,6 +205,8 @@ extern fn ExternDecl(); // CHECK:STDOUT: extern fn @F() { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- two_file_extern.carbon @@ -258,6 +260,8 @@ extern fn ExternDecl(); // CHECK:STDOUT: extern fn @F() [from "two_file.carbon"] { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- two_file_impl_mismatch_extern.carbon @@ -311,6 +315,8 @@ extern fn ExternDecl(); // CHECK:STDOUT: extern fn @F() [from "two_file_impl_mismatch.carbon"] { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- no_decl_extern.carbon @@ -418,6 +424,8 @@ extern fn ExternDecl(); // CHECK:STDOUT: extern fn @F() { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- in_impl_extern.carbon @@ -461,6 +469,8 @@ extern fn ExternDecl(); // CHECK:STDOUT: extern fn @F() { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- cross_package_extern.carbon @@ -512,6 +522,8 @@ extern fn ExternDecl(); // CHECK:STDOUT: %Extern.ref: %Extern.type = name_ref Extern, imports.%OtherPackage.Extern [concrete = constants.%Extern] // CHECK:STDOUT: %Extern.call: init %empty_tuple.type = call %Extern.ref() // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: extern fn @Extern; diff --git a/toolchain/check/testdata/function/definition/fail_decl_param_mismatch.carbon b/toolchain/check/testdata/function/definition/fail_decl_param_mismatch.carbon index 29e6a667bf2d..f7c300033de5 100644 --- a/toolchain/check/testdata/function/definition/fail_decl_param_mismatch.carbon +++ b/toolchain/check/testdata/function/definition/fail_decl_param_mismatch.carbon @@ -214,6 +214,8 @@ fn K() -> {} { return {}; } // CHECK:STDOUT: fn @F.loc23(%x.param: %empty_tuple.type) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @G.loc25(%x.param: %empty_tuple.type); @@ -221,6 +223,8 @@ fn K() -> {} { return {}; } // CHECK:STDOUT: fn @G.loc33() { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @H.loc35(%x.param: %empty_tuple.type); @@ -228,6 +232,8 @@ fn K() -> {} { return {}; } // CHECK:STDOUT: fn @H.loc40(%x.param: ) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @I.loc42(); @@ -238,6 +244,8 @@ fn K() -> {} { return {}; } // CHECK:STDOUT: %.loc50_24.2: init %empty_tuple.type = tuple_init () [concrete = constants.%empty_tuple] // CHECK:STDOUT: %.loc50_25: init %empty_tuple.type = converted %.loc50_24.1, %.loc50_24.2 [concrete = constants.%empty_tuple] // CHECK:STDOUT: return %.loc50_25 +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @J.loc52() -> out %return.param: %empty_tuple.type; @@ -245,6 +253,8 @@ fn K() -> {} { return {}; } // CHECK:STDOUT: fn @J.loc60() { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @K.loc62() -> out %return.param: %empty_tuple.type; @@ -255,5 +265,7 @@ fn K() -> {} { return {}; } // CHECK:STDOUT: %.loc70_24.2: init %empty_struct_type = struct_init () [concrete = constants.%empty_struct] // CHECK:STDOUT: %.loc70_25: init %empty_struct_type = converted %.loc70_24.1, %.loc70_24.2 [concrete = constants.%empty_struct] // CHECK:STDOUT: return %.loc70_25 +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/function/definition/fail_redef.carbon b/toolchain/check/testdata/function/definition/fail_redef.carbon index 08d1825e46a8..74a540e18f97 100644 --- a/toolchain/check/testdata/function/definition/fail_redef.carbon +++ b/toolchain/check/testdata/function/definition/fail_redef.carbon @@ -42,10 +42,14 @@ fn F() {} // CHECK:STDOUT: fn @F.loc15() { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @F.loc23() { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/function/definition/forward_decl.carbon b/toolchain/check/testdata/function/definition/forward_decl.carbon index c5221fc056c3..db96249d93e3 100644 --- a/toolchain/check/testdata/function/definition/forward_decl.carbon +++ b/toolchain/check/testdata/function/definition/forward_decl.carbon @@ -34,5 +34,7 @@ fn Foo() {} // CHECK:STDOUT: fn @Foo() { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/function/definition/implicit_import.carbon b/toolchain/check/testdata/function/definition/implicit_import.carbon index 0b8e34c1145c..ab4dd24d9460 100644 --- a/toolchain/check/testdata/function/definition/implicit_import.carbon +++ b/toolchain/check/testdata/function/definition/implicit_import.carbon @@ -160,6 +160,8 @@ fn B() {} // CHECK:STDOUT: fn @A() [from "basic.carbon"] { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- extern_api.carbon @@ -197,6 +199,8 @@ fn B() {} // CHECK:STDOUT: extern fn @A() [from "extern_api.carbon"] { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- extern_impl.carbon @@ -234,6 +238,8 @@ fn B() {} // CHECK:STDOUT: fn @A() [from "extern_impl.carbon"] { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- redecl_after_def.carbon @@ -253,6 +259,8 @@ fn B() {} // CHECK:STDOUT: fn @A() { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- fail_redecl_after_def.impl.carbon @@ -290,6 +298,8 @@ fn B() {} // CHECK:STDOUT: fn @A() { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- fail_redef_after_def.impl.carbon @@ -319,6 +329,8 @@ fn B() {} // CHECK:STDOUT: fn @A.loc12() { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- def_alias.carbon @@ -369,5 +381,7 @@ fn B() {} // CHECK:STDOUT: fn @B() { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/function/definition/import.carbon b/toolchain/check/testdata/function/definition/import.carbon index 75dca738276c..93630a74872c 100644 --- a/toolchain/check/testdata/function/definition/import.carbon +++ b/toolchain/check/testdata/function/definition/import.carbon @@ -222,6 +222,8 @@ fn D() {} // CHECK:STDOUT: fn @A() { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @B(%b.param: %i32) -> out %return.param: %i32 { @@ -233,6 +235,8 @@ fn D() {} // CHECK:STDOUT: %bound_method.loc5_30.2: = bound_method %b.ref, %specific_fn // CHECK:STDOUT: %Int.as.Copy.impl.Op.call: init %i32 = call %bound_method.loc5_30.2(%b.ref) // CHECK:STDOUT: return %Int.as.Copy.impl.Op.call +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @C(%c.param: %tuple.type.a8a) -> out %return.param: %struct_type.c { @@ -249,6 +253,8 @@ fn D() {} // CHECK:STDOUT: %.loc6_48.2: init %struct_type.c = struct_init (%Int.as.Copy.impl.Op.call) // CHECK:STDOUT: %.loc6_49: init %struct_type.c = converted %.loc6_48.1, %.loc6_48.2 // CHECK:STDOUT: return %.loc6_49 +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @D(); @@ -422,6 +428,8 @@ fn D() {} // CHECK:STDOUT: %C.call: init %struct_type.c = call %C.ref(%.loc8_25.4) // CHECK:STDOUT: assign file.%c.var, %C.call // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- fail_def_ownership.carbon @@ -479,6 +487,8 @@ fn D() {} // CHECK:STDOUT: fn @A.loc14() { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @B [from "fns.carbon"]; @@ -511,6 +521,8 @@ fn D() {} // CHECK:STDOUT: extern fn @A() [from "extern.carbon"] { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- fail_mix_extern_decl.carbon @@ -547,5 +559,7 @@ fn D() {} // CHECK:STDOUT: fn @D() [from "fns.carbon"] { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/function/definition/import_access.carbon b/toolchain/check/testdata/function/definition/import_access.carbon index 4c08d8d29484..1e5eecc2acb9 100644 --- a/toolchain/check/testdata/function/definition/import_access.carbon +++ b/toolchain/check/testdata/function/definition/import_access.carbon @@ -157,6 +157,8 @@ private fn Redecl() {} // CHECK:STDOUT: fn @Def() { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- forward_with_def.carbon @@ -177,6 +179,8 @@ private fn Redecl() {} // CHECK:STDOUT: fn @ForwardWithDef() { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- forward.carbon @@ -238,6 +242,8 @@ private fn Redecl() {} // CHECK:STDOUT: %Def.call: init %empty_tuple.type = call %Def.ref() // CHECK:STDOUT: assign file.%f.var, %Def.call // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- fail_local_def.carbon @@ -273,6 +279,8 @@ private fn Redecl() {} // CHECK:STDOUT: %Def.ref: = name_ref Def, [concrete = ] // CHECK:STDOUT: assign file.%f.var, // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- fail_other_def.carbon @@ -316,6 +324,8 @@ private fn Redecl() {} // CHECK:STDOUT: %Def.ref: = name_ref Def, [concrete = ] // CHECK:STDOUT: assign file.%f.var, // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- forward_with_def.impl.carbon @@ -361,6 +371,8 @@ private fn Redecl() {} // CHECK:STDOUT: %ForwardWithDef.call: init %empty_tuple.type = call %ForwardWithDef.ref() // CHECK:STDOUT: assign file.%f.var, %ForwardWithDef.call // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- fail_local_forward_with_def.carbon @@ -396,6 +408,8 @@ private fn Redecl() {} // CHECK:STDOUT: %ForwardWithDef.ref: = name_ref ForwardWithDef, [concrete = ] // CHECK:STDOUT: assign file.%f.var, // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- fail_other_forward_with_def.carbon @@ -439,6 +453,8 @@ private fn Redecl() {} // CHECK:STDOUT: %ForwardWithDef.ref: = name_ref ForwardWithDef, [concrete = ] // CHECK:STDOUT: assign file.%f.var, // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- forward.impl.carbon @@ -480,6 +496,8 @@ private fn Redecl() {} // CHECK:STDOUT: fn @Forward() [from "forward.carbon"] { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @__global_init() { @@ -488,6 +506,8 @@ private fn Redecl() {} // CHECK:STDOUT: %Forward.call: init %empty_tuple.type = call %Forward.ref() // CHECK:STDOUT: assign file.%f.var, %Forward.call // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- fail_local_forward.carbon @@ -523,6 +543,8 @@ private fn Redecl() {} // CHECK:STDOUT: %Forward.ref: = name_ref Forward, [concrete = ] // CHECK:STDOUT: assign file.%f.var, // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- fail_other_forward.carbon @@ -566,6 +588,8 @@ private fn Redecl() {} // CHECK:STDOUT: %Forward.ref: = name_ref Forward, [concrete = ] // CHECK:STDOUT: assign file.%f.var, // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- todo_fail_private_on_redecl.carbon @@ -586,5 +610,7 @@ private fn Redecl() {} // CHECK:STDOUT: fn @Redecl() { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/function/definition/order.carbon b/toolchain/check/testdata/function/definition/order.carbon index d5a79aca8ca5..e369799b9917 100644 --- a/toolchain/check/testdata/function/definition/order.carbon +++ b/toolchain/check/testdata/function/definition/order.carbon @@ -41,15 +41,21 @@ fn Baz() {} // CHECK:STDOUT: fn @Foo() { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Bar() { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Baz() { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/function/definition/params_one.carbon b/toolchain/check/testdata/function/definition/params_one.carbon index ea4d6a8b5482..f6413270ba09 100644 --- a/toolchain/check/testdata/function/definition/params_one.carbon +++ b/toolchain/check/testdata/function/definition/params_one.carbon @@ -56,5 +56,7 @@ fn Foo(unused a: i32) {} // CHECK:STDOUT: fn @Foo(%a.param: %i32) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/function/definition/params_one_comma.carbon b/toolchain/check/testdata/function/definition/params_one_comma.carbon index 0756b54abcb8..777809691ad5 100644 --- a/toolchain/check/testdata/function/definition/params_one_comma.carbon +++ b/toolchain/check/testdata/function/definition/params_one_comma.carbon @@ -56,5 +56,7 @@ fn Foo(unused a: i32,) {} // CHECK:STDOUT: fn @Foo(%a.param: %i32) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/function/definition/params_two.carbon b/toolchain/check/testdata/function/definition/params_two.carbon index f56233fabf08..9408ff578eec 100644 --- a/toolchain/check/testdata/function/definition/params_two.carbon +++ b/toolchain/check/testdata/function/definition/params_two.carbon @@ -63,5 +63,7 @@ fn Foo(unused a: i32, unused b: i32) {} // CHECK:STDOUT: fn @Foo(%a.param: %i32, %b.param: %i32) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/function/definition/params_two_comma.carbon b/toolchain/check/testdata/function/definition/params_two_comma.carbon index b053862c91cf..1eac145c0037 100644 --- a/toolchain/check/testdata/function/definition/params_two_comma.carbon +++ b/toolchain/check/testdata/function/definition/params_two_comma.carbon @@ -63,5 +63,7 @@ fn Foo(unused a: i32, unused b: i32,) {} // CHECK:STDOUT: fn @Foo(%a.param: %i32, %b.param: %i32) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/function/definition/params_zero.carbon b/toolchain/check/testdata/function/definition/params_zero.carbon index 09f4ff8a8ca5..6c56174f78bd 100644 --- a/toolchain/check/testdata/function/definition/params_zero.carbon +++ b/toolchain/check/testdata/function/definition/params_zero.carbon @@ -31,5 +31,7 @@ fn Foo() {} // CHECK:STDOUT: fn @Foo() { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/function/definition/syntactic_merge.carbon b/toolchain/check/testdata/function/definition/syntactic_merge.carbon index 916c599eab6c..e0c8ce12648f 100644 --- a/toolchain/check/testdata/function/definition/syntactic_merge.carbon +++ b/toolchain/check/testdata/function/definition/syntactic_merge.carbon @@ -275,11 +275,15 @@ fn Foo(unused a: const (const C)) {} // CHECK:STDOUT: fn @Foo(%a.param.loc8: %C) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Bar(%a.param.loc11: %C) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- spacing.carbon @@ -330,6 +334,8 @@ fn Foo(unused a: const (const C)) {} // CHECK:STDOUT: fn @Foo(%a.param.loc7: %C) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- fail_parens.carbon @@ -384,6 +390,8 @@ fn Foo(unused a: const (const C)) {} // CHECK:STDOUT: fn @Foo.loc14(%a.param: %C) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- fail_only_implicit_params.carbon @@ -421,6 +429,8 @@ fn Foo(unused a: const (const C)) {} // CHECK:STDOUT: fn @Foo.loc23() { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- fail_raw_identifier.carbon @@ -475,6 +485,8 @@ fn Foo(unused a: const (const C)) {} // CHECK:STDOUT: fn @Foo.loc14(%_.param: %C) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- two_file.carbon @@ -592,11 +604,15 @@ fn Foo(unused a: const (const C)) {} // CHECK:STDOUT: fn @Foo(%a.param: %C) [from "two_file.carbon"] { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Bar(%a.param: %C) [from "two_file.carbon"] { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- fail_name_mismatch.carbon @@ -656,6 +672,8 @@ fn Foo(unused a: const (const C)) {} // CHECK:STDOUT: fn @Foo.loc15(%b.param: %C) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- fail_alias.carbon @@ -713,6 +731,8 @@ fn Foo(unused a: const (const C)) {} // CHECK:STDOUT: fn @Foo.loc15(%a.param: %C) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- fail_deduced_alias.carbon @@ -787,6 +807,8 @@ fn Foo(unused a: const (const C)) {} // CHECK:STDOUT: fn() { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: @@ -860,6 +882,8 @@ fn Foo(unused a: const (const C)) {} // CHECK:STDOUT: %.loc8_25.2: init %C to %return.param.loc8 = class_init () [concrete = constants.%C.val] // CHECK:STDOUT: %.loc8_26: init %C = converted %.loc8_25.1, %.loc8_25.2 [concrete = constants.%C.val] // CHECK:STDOUT: return %.loc8_26 to %return.param.loc8 +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- alias_two_file.carbon @@ -950,6 +974,8 @@ fn Foo(unused a: const (const C)) {} // CHECK:STDOUT: fn @Foo(%a.param: %C) [from "alias_two_file.carbon"] { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- fail_repeat_const.carbon @@ -1012,5 +1038,7 @@ fn Foo(unused a: const (const C)) {} // CHECK:STDOUT: fn @Foo.loc18(%a.param: %const) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/function/generic/call.carbon b/toolchain/check/testdata/function/generic/call.carbon index 2f34cfb9bd9b..3de4f3005c4b 100644 --- a/toolchain/check/testdata/function/generic/call.carbon +++ b/toolchain/check/testdata/function/generic/call.carbon @@ -208,6 +208,8 @@ fn CallSpecific(x: C*) -> C* { // CHECK:STDOUT: %.loc5_37.1: ref @Function.%T.as_type.loc5_31.1 (%T.as_type) = splice_block %return.param {} // CHECK:STDOUT: %Copy.WithSelf.Op.call: init @Function.%T.as_type.loc5_31.1 (%T.as_type) to %.loc5_37.1 = call %bound_method.loc6_10.2(%x.ref) // CHECK:STDOUT: return %Copy.WithSelf.Op.call to %return.param +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: @@ -229,6 +231,8 @@ fn CallSpecific(x: C*) -> C* { // CHECK:STDOUT: // CHECK:STDOUT: %Function.call: init @CallGeneric.%T.as_type.loc10_34.1 (%T.as_type) to %.loc10_40.1 = call %Function.specific_fn.loc12_10.1(%x.ref) // CHECK:STDOUT: return %Function.call to %return.param +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: @@ -257,6 +261,8 @@ fn CallSpecific(x: C*) -> C* { // CHECK:STDOUT: %Function.specific_fn.loc18_10.1: = specific_function %Function.ref, @Function(constants.%Copy.facet.302) [symbolic = %Function.specific_fn.loc18_10.2 (constants.%Function.specific_fn.162)] // CHECK:STDOUT: %Function.call: init @CallGenericPtr.%ptr.loc16_33.1 (%ptr.e8f) = call %Function.specific_fn.loc18_10.1(%x.ref) // CHECK:STDOUT: return %Function.call +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: @@ -275,6 +281,8 @@ fn CallSpecific(x: C*) -> C* { // CHECK:STDOUT: %Function.specific_fn: = specific_function %Function.ref, @Function(constants.%Copy.facet.3f0) [concrete = constants.%Function.specific_fn.710] // CHECK:STDOUT: %Function.call: init %ptr.6b6 = call %Function.specific_fn(%x.ref) // CHECK:STDOUT: return %Function.call +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: specific @Function(constants.%T.f84) { @@ -498,6 +506,8 @@ fn CallSpecific(x: C*) -> C* { // CHECK:STDOUT: %.loc5_37.1: ref @Function.%T.as_type.loc5_31.1 (%T.as_type) = splice_block %return.param {} // CHECK:STDOUT: %Copy.WithSelf.Op.call: init @Function.%T.as_type.loc5_31.1 (%T.as_type) to %.loc5_37.1 = call %bound_method.loc6_10.2(%x.ref) // CHECK:STDOUT: return %Copy.WithSelf.Op.call to %return.param +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: @@ -518,6 +528,8 @@ fn CallSpecific(x: C*) -> C* { // CHECK:STDOUT: // CHECK:STDOUT: %Function.call: init @CallGeneric.%T.as_type.loc10_34.1 (%T.as_type) to %.loc10_40.1 = call %Function.specific_fn.loc12_10.1(%x.ref) // CHECK:STDOUT: return %Function.call to %return.param +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: @@ -542,6 +554,8 @@ fn CallSpecific(x: C*) -> C* { // CHECK:STDOUT: %Function.specific_fn.loc18_10.1: = specific_function %Function.ref, @Function(constants.%Copy.facet.302) [symbolic = %Function.specific_fn.loc18_10.2 (constants.%Function.specific_fn.162)] // CHECK:STDOUT: %Function.call: init @CallGenericPtr.%ptr.loc16_33.1 (%ptr.e8f) = call %Function.specific_fn.loc18_10.1(%x.ref) // CHECK:STDOUT: return %Function.call +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: @@ -556,6 +570,8 @@ fn CallSpecific(x: C*) -> C* { // CHECK:STDOUT: %Function.specific_fn: = specific_function %Function.ref, @Function(constants.%Copy.facet.3f0) [concrete = constants.%Function.specific_fn.710] // CHECK:STDOUT: %Function.call: init %ptr.6b6 = call %Function.specific_fn(%x.ref) // CHECK:STDOUT: return %Function.call +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: specific @Function(constants.%T.f84) { diff --git a/toolchain/check/testdata/function/generic/call_method_on_generic_facet.carbon b/toolchain/check/testdata/function/generic/call_method_on_generic_facet.carbon index 5370fa0bdb8b..a162b3061868 100644 --- a/toolchain/check/testdata/function/generic/call_method_on_generic_facet.carbon +++ b/toolchain/check/testdata/function/generic/call_method_on_generic_facet.carbon @@ -195,6 +195,8 @@ fn G() { // CHECK:STDOUT: witness = (@Generic.WithSelf.%Generic.WithSelf.F.decl) // CHECK:STDOUT: // CHECK:STDOUT: !requires: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: @@ -212,6 +214,8 @@ fn G() { // CHECK:STDOUT: witness = (@Other.WithSelf.%Other.WithSelf.G.decl) // CHECK:STDOUT: // CHECK:STDOUT: !requires: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: impl @ImplsGeneric.as.Generic.impl: %ImplsGeneric.ref as %Generic.type { @@ -259,6 +263,8 @@ fn G() { // CHECK:STDOUT: fn @ImplsGeneric.as.Generic.impl.F() { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: generic fn @Other.WithSelf.G(@Other.%Self: %Other.type) { @@ -297,6 +303,8 @@ fn G() { // CHECK:STDOUT: %specific_impl_fn.loc34_4.1: = specific_impl_function %impl.elem0.loc34_4.1, @Generic.WithSelf.F(constants.%T, constants.%U) [symbolic = %specific_impl_fn.loc34_4.2 (constants.%specific_impl_fn)] // CHECK:STDOUT: %Generic.WithSelf.F.call: init %empty_tuple.type = call %specific_impl_fn.loc34_4.1() // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: @@ -310,6 +318,8 @@ fn G() { // CHECK:STDOUT: %CallGenericMethod.specific_fn: = specific_function %CallGenericMethod.ref, @CallGenericMethod(constants.%GenericParam, constants.%Generic.facet) [concrete = constants.%CallGenericMethod.specific_fn] // CHECK:STDOUT: %CallGenericMethod.call: init %empty_tuple.type = call %CallGenericMethod.specific_fn() // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: specific @Generic(constants.%Scalar) { diff --git a/toolchain/check/testdata/function/generic/deduce.carbon b/toolchain/check/testdata/function/generic/deduce.carbon index 44f21bbe653b..6257ab8ff7ba 100644 --- a/toolchain/check/testdata/function/generic/deduce.carbon +++ b/toolchain/check/testdata/function/generic/deduce.carbon @@ -337,6 +337,8 @@ fn F() { // CHECK:STDOUT: %ExplicitGenericParam.specific_fn.loc4_50.1: = specific_function %ExplicitGenericParam.ref, @ExplicitGenericParam(constants.%T) [symbolic = %ExplicitGenericParam.specific_fn.loc4_50.2 (constants.%ExplicitGenericParam.specific_fn.2da)] // CHECK:STDOUT: %ExplicitGenericParam.call: init @ExplicitGenericParam.%ptr.loc4_39.1 (%ptr.e8f) = call %ExplicitGenericParam.specific_fn.loc4_50.1() // CHECK:STDOUT: return %ExplicitGenericParam.call +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: @@ -347,6 +349,8 @@ fn F() { // CHECK:STDOUT: %ExplicitGenericParam.specific_fn: = specific_function %ExplicitGenericParam.ref, @ExplicitGenericParam(constants.%i32) [concrete = constants.%ExplicitGenericParam.specific_fn.330] // CHECK:STDOUT: %ExplicitGenericParam.call: init %ptr.d08 = call %ExplicitGenericParam.specific_fn() // CHECK:STDOUT: return %ExplicitGenericParam.call +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: generic fn @CallExplicitGenericParamWithGenericArg(%T.loc10_44.2: type) { @@ -371,6 +375,8 @@ fn F() { // CHECK:STDOUT: %ExplicitGenericParam.specific_fn.loc11_10.1: = specific_function %ExplicitGenericParam.ref, @ExplicitGenericParam(constants.%struct_type.a) [symbolic = %ExplicitGenericParam.specific_fn.loc11_10.2 (constants.%ExplicitGenericParam.specific_fn.f5a)] // CHECK:STDOUT: %ExplicitGenericParam.call: init @CallExplicitGenericParamWithGenericArg.%ptr.loc10_63.1 (%ptr.88d) = call %ExplicitGenericParam.specific_fn.loc11_10.1() // CHECK:STDOUT: return %ExplicitGenericParam.call +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: @@ -522,6 +528,8 @@ fn F() { // CHECK:STDOUT: %ExplicitGenericParam.specific_fn.loc4_50.1: = specific_function %ExplicitGenericParam.ref, @ExplicitGenericParam(constants.%T) [symbolic = %ExplicitGenericParam.specific_fn.loc4_50.2 (constants.%ExplicitGenericParam.specific_fn)] // CHECK:STDOUT: %ExplicitGenericParam.call: init @ExplicitGenericParam.%ptr.loc4_39.1 (%ptr) = call %ExplicitGenericParam.specific_fn.loc4_50.1() // CHECK:STDOUT: return %ExplicitGenericParam.call +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: @@ -540,6 +548,8 @@ fn F() { // CHECK:STDOUT: %ExplicitGenericParam.specific_fn.loc7_3.1: = specific_function %ExplicitGenericParam.ref, @ExplicitGenericParam(constants.%T) [symbolic = %ExplicitGenericParam.specific_fn.loc7_3.2 (constants.%ExplicitGenericParam.specific_fn)] // CHECK:STDOUT: %ExplicitGenericParam.call: init @CallExplicitGenericParamConst.%ptr (%ptr) = call %ExplicitGenericParam.specific_fn.loc7_3.1() // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: @@ -548,6 +558,8 @@ fn F() { // CHECK:STDOUT: %ExplicitGenericParam.ref: %ExplicitGenericParam.type = name_ref ExplicitGenericParam, file.%ExplicitGenericParam.decl [concrete = constants.%ExplicitGenericParam] // CHECK:STDOUT: %T.ref: type = name_ref T, %T // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: specific @ExplicitGenericParam(constants.%T) { @@ -699,6 +711,8 @@ fn F() { // CHECK:STDOUT: %ExplicitAndAlsoDeduced.specific_fn.loc7_10.1: = specific_function %ExplicitAndAlsoDeduced.ref, @ExplicitAndAlsoDeduced(constants.%T) [symbolic = %ExplicitAndAlsoDeduced.specific_fn.loc7_10.2 (constants.%ExplicitAndAlsoDeduced.specific_fn.c99)] // CHECK:STDOUT: %ExplicitAndAlsoDeduced.call: init @ExplicitAndAlsoDeduced.%ptr.loc6_47.1 (%ptr.e8f) = call %ExplicitAndAlsoDeduced.specific_fn.loc7_10.1(%x.ref) // CHECK:STDOUT: return %ExplicitAndAlsoDeduced.call +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: @@ -716,6 +730,8 @@ fn F() { // CHECK:STDOUT: %ExplicitAndAlsoDeduced.call: init %ptr.d43 = call %ExplicitAndAlsoDeduced.specific_fn(%.loc11_37.6) // CHECK:STDOUT: %Destroy.Op.call: init %empty_tuple.type = call constants.%Destroy.Op.bound(constants.%.367) // CHECK:STDOUT: return %ExplicitAndAlsoDeduced.call +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Destroy.Op.loc11_37.1(%self.param: ref %empty_struct_type) = "no_op"; @@ -723,6 +739,8 @@ fn F() { // CHECK:STDOUT: fn @Destroy.Op.loc11_37.2(%self.param: ref %A) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: specific @ExplicitAndAlsoDeduced(constants.%T) { @@ -882,6 +900,8 @@ fn F() { // CHECK:STDOUT: %ImplicitGenericParam.specific_fn.loc4_56.1: = specific_function %ImplicitGenericParam.ref, @ImplicitGenericParam(constants.%T) [symbolic = %ImplicitGenericParam.specific_fn.loc4_56.2 (constants.%ImplicitGenericParam.specific_fn.0d7)] // CHECK:STDOUT: %ImplicitGenericParam.call: init @ImplicitGenericParam.%ptr.loc4_45.1 (%ptr.e8f) = call %ImplicitGenericParam.specific_fn.loc4_56.1(%x.ref) // CHECK:STDOUT: return %ImplicitGenericParam.call +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: @@ -892,6 +912,8 @@ fn F() { // CHECK:STDOUT: %ImplicitGenericParam.specific_fn: = specific_function %ImplicitGenericParam.ref, @ImplicitGenericParam(constants.%i32) [concrete = constants.%ImplicitGenericParam.specific_fn.ae4] // CHECK:STDOUT: %ImplicitGenericParam.call: init %ptr.d08 = call %ImplicitGenericParam.specific_fn(%n.ref) // CHECK:STDOUT: return %ImplicitGenericParam.call +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: specific @ImplicitGenericParam(constants.%T) { @@ -1041,6 +1063,8 @@ fn F() { // CHECK:STDOUT: fn(%x.param: @TupleParam.%tuple.type (%tuple.type.2d8)) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: @@ -1062,6 +1086,8 @@ fn F() { // CHECK:STDOUT: %.loc7_19.4: %tuple.type.94b = converted %.loc7_19.1, %tuple [concrete = constants.%tuple.946] // CHECK:STDOUT: %TupleParam.call: init %empty_tuple.type = call %TupleParam.specific_fn(%.loc7_19.4) // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: specific @TupleParam(constants.%T) { @@ -1193,6 +1219,8 @@ fn F() { // CHECK:STDOUT: fn(%x.param: @StructParam.%struct_type.a.b.loc4_51.1 (%struct_type.a.b.3aa)) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: @@ -1214,6 +1242,8 @@ fn F() { // CHECK:STDOUT: %.loc7_30.4: %struct_type.a.b.f91 = converted %.loc7_30.1, %struct [concrete = constants.%struct.72d] // CHECK:STDOUT: %StructParam.call: init %empty_tuple.type = call %StructParam.specific_fn(%.loc7_30.4) // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: specific @StructParam(constants.%T) { @@ -1316,6 +1346,8 @@ fn F() { // CHECK:STDOUT: fn(%x.param: @BigStructParam.%struct_type.c.d.e.loc4_63.1 (%struct_type.c.d.e)) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: @@ -1326,6 +1358,8 @@ fn F() { // CHECK:STDOUT: %int_4: Core.IntLiteral = int_value 4 [concrete = constants.%int_4] // CHECK:STDOUT: %.loc14: %struct_type.c.d = struct_literal (%int_3, %int_4) [concrete = constants.%struct] // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: specific @BigStructParam(constants.%T) { @@ -1416,6 +1450,8 @@ fn F() { // CHECK:STDOUT: fn(%x.param: @SmallStructParam.%struct_type.f.g.loc4_56.1 (%struct_type.f.g)) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: @@ -1427,6 +1463,8 @@ fn F() { // CHECK:STDOUT: %int_7: Core.IntLiteral = int_value 7 [concrete = constants.%int_7] // CHECK:STDOUT: %.loc14: %struct_type.f.g.h = struct_literal (%int_5, %int_6, %int_7) [concrete = constants.%struct] // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: specific @SmallStructParam(constants.%T) { @@ -1516,6 +1554,8 @@ fn F() { // CHECK:STDOUT: fn(%x.param: @WrongNameStructParam.%struct_type.i.different.loc4_68.1 (%struct_type.i.different)) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: @@ -1526,6 +1566,8 @@ fn F() { // CHECK:STDOUT: %int_9: Core.IntLiteral = int_value 9 [concrete = constants.%int_9] // CHECK:STDOUT: %.loc14: %struct_type.i.j = struct_literal (%int_8, %int_9) [concrete = constants.%struct] // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: specific @WrongNameStructParam(constants.%T) { @@ -1615,6 +1657,8 @@ fn F() { // CHECK:STDOUT: fn(%x.param: @WrongOrderStructParam.%struct_type.first.second.loc4_70.1 (%struct_type.first.second)) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: @@ -1625,6 +1669,8 @@ fn F() { // CHECK:STDOUT: %int_10: Core.IntLiteral = int_value 10 [concrete = constants.%int_10] // CHECK:STDOUT: %.loc14: %struct_type.second.first = struct_literal (%int_11, %int_10) [concrete = constants.%struct] // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: specific @WrongOrderStructParam(constants.%T) { @@ -1724,6 +1770,8 @@ fn F() { // CHECK:STDOUT: %ImplicitNotDeducible.ref: %ImplicitNotDeducible.type = name_ref ImplicitNotDeducible, file.%ImplicitNotDeducible.decl [concrete = constants.%ImplicitNotDeducible] // CHECK:STDOUT: %int_42: Core.IntLiteral = int_value 42 [concrete = constants.%int_42] // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: specific @ImplicitNotDeducible(constants.%T, constants.%U) { @@ -1830,6 +1878,8 @@ fn F() { // CHECK:STDOUT: %int_12: Core.IntLiteral = int_value 12 [concrete = constants.%int_12] // CHECK:STDOUT: %.loc14: %struct_type.x = struct_literal (%int_12) [concrete = constants.%struct] // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: specific @ImplicitNotDeducible(constants.%T) { @@ -1971,6 +2021,8 @@ fn F() { // CHECK:STDOUT: witness = () // CHECK:STDOUT: // CHECK:STDOUT: !requires: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: impl @EE.as.Z.impl: %EE.ref as %Z.ref { @@ -2073,6 +2125,8 @@ fn F() { // CHECK:STDOUT: %Z.facet.loc15_14: %Z.type = facet_value %CC, (constants.%Z.impl_witness.df9) [concrete = constants.%Z.facet.57d] // CHECK:STDOUT: %.loc15_14: %Z.type = converted %CC, %Z.facet.loc15_14 [concrete = constants.%Z.facet.57d] // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: specific @Z.WithSelf(constants.%Self) { diff --git a/toolchain/check/testdata/function/generic/deduce_nested_facet_value.carbon b/toolchain/check/testdata/function/generic/deduce_nested_facet_value.carbon index 1805c4cbd49b..2f4f07e80448 100644 --- a/toolchain/check/testdata/function/generic/deduce_nested_facet_value.carbon +++ b/toolchain/check/testdata/function/generic/deduce_nested_facet_value.carbon @@ -166,6 +166,8 @@ fn F() { // CHECK:STDOUT: witness = () // CHECK:STDOUT: // CHECK:STDOUT: !requires: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: interface @W { @@ -177,6 +179,8 @@ fn F() { // CHECK:STDOUT: witness = () // CHECK:STDOUT: // CHECK:STDOUT: !requires: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: interface @Z { @@ -188,6 +192,8 @@ fn F() { // CHECK:STDOUT: witness = () // CHECK:STDOUT: // CHECK:STDOUT: !requires: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: impl @DD.as.Y.impl: %DD.ref as %Y.ref { @@ -263,6 +269,8 @@ fn F() { // CHECK:STDOUT: %Z.facet: %Z.type = facet_value %CC, (constants.%Z.impl_witness.b3a) [concrete = constants.%Z.facet.737] // CHECK:STDOUT: %.loc22_12: %Z.type = converted %CC, %Z.facet [concrete = constants.%Z.facet.737] // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: specific @Y.WithSelf(constants.%Self.765) { diff --git a/toolchain/check/testdata/function/generic/fail_deduce_imported_function.carbon b/toolchain/check/testdata/function/generic/fail_deduce_imported_function.carbon index 430c04f05290..fe6d02b47817 100644 --- a/toolchain/check/testdata/function/generic/fail_deduce_imported_function.carbon +++ b/toolchain/check/testdata/function/generic/fail_deduce_imported_function.carbon @@ -101,6 +101,8 @@ fn B() { // CHECK:STDOUT: witness = () // CHECK:STDOUT: // CHECK:STDOUT: !requires: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: generic fn @A(%T.loc4_7.2: %Z.type) { @@ -118,6 +120,8 @@ fn B() { // CHECK:STDOUT: fn(%x.param: @A.%struct_type.a.loc4_29.1 (%struct_type.a)) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: @@ -212,6 +216,8 @@ fn B() { // CHECK:STDOUT: witness = () // CHECK:STDOUT: // CHECK:STDOUT: !requires: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: generic fn @A.loc4(%T.loc4_7.2: %Z.type) { @@ -229,6 +235,8 @@ fn B() { // CHECK:STDOUT: fn(%x.param: @A.loc4.%struct_type.a.loc4_33.1 (%struct_type.a)) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: @@ -242,6 +250,8 @@ fn B() { // CHECK:STDOUT: %.loc24_16: %empty_struct_type = struct_literal () [concrete = constants.%empty_struct] // CHECK:STDOUT: %.loc24_17: %struct_type.b = struct_literal (%.loc24_16) [concrete = constants.%struct] // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: generic fn @A.1(imports.%Lib.import_ref.78f: %Z.type) [from "lib.carbon"] { diff --git a/toolchain/check/testdata/function/generic/import_specific.carbon b/toolchain/check/testdata/function/generic/import_specific.carbon index b93cb0b4ab42..3d926dddf5b7 100644 --- a/toolchain/check/testdata/function/generic/import_specific.carbon +++ b/toolchain/check/testdata/function/generic/import_specific.carbon @@ -90,6 +90,8 @@ fn H() { // CHECK:STDOUT: fn() { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: @@ -107,6 +109,8 @@ fn H() { // CHECK:STDOUT: %F.specific_fn.loc8_3.1: = specific_function %F.ref, @F(constants.%T.67db0b.2) [symbolic = %F.specific_fn.loc8_3.2 (constants.%F.specific_fn)] // CHECK:STDOUT: %F.call: init %empty_tuple.type = call %F.specific_fn.loc8_3.1() // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: @@ -187,6 +191,8 @@ fn H() { // CHECK:STDOUT: %G.specific_fn: = specific_function %G.ref, @G(constants.%C) [concrete = constants.%G.specific_fn] // CHECK:STDOUT: %G.call: init %empty_tuple.type = call %G.specific_fn() // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: generic fn @F(imports.%Main.import_ref.b3bc94.1: type) [from "library.carbon"] { diff --git a/toolchain/check/testdata/function/generic/indirect_generic_type.carbon b/toolchain/check/testdata/function/generic/indirect_generic_type.carbon index 7da5f659f185..98c5b11e62bf 100644 --- a/toolchain/check/testdata/function/generic/indirect_generic_type.carbon +++ b/toolchain/check/testdata/function/generic/indirect_generic_type.carbon @@ -74,6 +74,8 @@ fn F(T:! type, p: T**) -> T* { // CHECK:STDOUT: %bound_method.loc6_10.2: = bound_method %.loc6_10.2, %specific_impl_fn.loc6_10.1 // CHECK:STDOUT: %Copy.WithSelf.Op.call: init @F.%ptr.loc4_20.1 (%ptr.e8f) = call %bound_method.loc6_10.2(%.loc6_10.2) // CHECK:STDOUT: return %Copy.WithSelf.Op.call +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/function/generic/redeclare.carbon b/toolchain/check/testdata/function/generic/redeclare.carbon index d6ebf3e3574e..7bab77b7b7d1 100644 --- a/toolchain/check/testdata/function/generic/redeclare.carbon +++ b/toolchain/check/testdata/function/generic/redeclare.carbon @@ -180,6 +180,8 @@ fn F(U:! type, T:! type) -> U* { // CHECK:STDOUT: %F.specific_fn.loc7_10.1: = specific_function %F.ref, @F(constants.%T) [symbolic = %F.specific_fn.loc7_10.2 (constants.%F.specific_fn)] // CHECK:STDOUT: %F.call: init @F.%ptr.loc4_20.1 (%ptr) = call %F.specific_fn.loc7_10.1() // CHECK:STDOUT: return %F.call +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: @@ -316,6 +318,8 @@ fn F(U:! type, T:! type) -> U* { // CHECK:STDOUT: %F.ref: %F.type.eb3ec9.1 = name_ref F, file.%F.decl.loc4 [concrete = constants.%F.7088cc.1] // CHECK:STDOUT: %T.ref: type = name_ref T, %T.loc13_7.2 [symbolic = %T.loc13_7.1 (constants.%T)] // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: @@ -466,6 +470,8 @@ fn F(U:! type, T:! type) -> U* { // CHECK:STDOUT: %F.ref: %F.type.eb3ec9.1 = name_ref F, file.%F.decl.loc4 [concrete = constants.%F.7088cc.1] // CHECK:STDOUT: %T.ref.loc21: type = name_ref T, %T.loc13_24.2 [symbolic = %T.loc13_24.1 (constants.%T.091)] // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: @@ -616,6 +622,8 @@ fn F(U:! type, T:! type) -> U* { // CHECK:STDOUT: %F.ref: %F.type.eb3ec9.1 = name_ref F, file.%F.decl.loc4 [concrete = constants.%F.7088cc.1] // CHECK:STDOUT: %T.ref: type = name_ref T, %T.loc13_17.2 [symbolic = %T.loc13_17.1 (constants.%T.091)] // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/function/generic/resolve_used.carbon b/toolchain/check/testdata/function/generic/resolve_used.carbon index 77343ba3af41..f463718440c5 100644 --- a/toolchain/check/testdata/function/generic/resolve_used.carbon +++ b/toolchain/check/testdata/function/generic/resolve_used.carbon @@ -192,6 +192,8 @@ fn CallNegative() { // CHECK:STDOUT: %bound_method.loc9_3.2: = bound_method %v.var, %specific_impl_fn.loc9_3.1 // CHECK:STDOUT: %Destroy.WithSelf.Op.call: init %empty_tuple.type = call %bound_method.loc9_3.2(%v.var) // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: @@ -202,11 +204,15 @@ fn CallNegative() { // CHECK:STDOUT: %ErrorIfNIsZero.specific_fn: = specific_function %ErrorIfNIsZero.ref, @ErrorIfNIsZero(constants.%int_0) [concrete = constants.%ErrorIfNIsZero.specific_fn] // CHECK:STDOUT: %ErrorIfNIsZero.call: init %empty_tuple.type = call %ErrorIfNIsZero.specific_fn() // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Destroy.Op(%self.param: ref %i0) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: specific @ErrorIfNIsZero(constants.%N) { diff --git a/toolchain/check/testdata/function/generic/return_slot.carbon b/toolchain/check/testdata/function/generic/return_slot.carbon index d03f80c85fe7..2b3104f43c2e 100644 --- a/toolchain/check/testdata/function/generic/return_slot.carbon +++ b/toolchain/check/testdata/function/generic/return_slot.carbon @@ -192,6 +192,8 @@ fn G() { // CHECK:STDOUT: %.loc16_16.1: ref @Wrap.Make.%T (%T) = splice_block %return.param {} // CHECK:STDOUT: %Wrap.Make.call: init @Wrap.Make.%T (%T) to %.loc16_16.1 = call %Wrap.Make.specific_fn.loc16_27.1() // CHECK:STDOUT: return %Wrap.Make.call to %return.param +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: @@ -254,6 +256,8 @@ fn G() { // CHECK:STDOUT: %Destroy.Op.bound.loc22: = bound_method %a.var, constants.%Destroy.Op.1a2547.2 // CHECK:STDOUT: %Destroy.Op.call.loc22: init %empty_tuple.type = call %Destroy.Op.bound.loc22(%a.var) // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Destroy.Op.loc24_3.1(%self.param: ref %i32.builtin) = "no_op"; @@ -261,21 +265,29 @@ fn G() { // CHECK:STDOUT: fn @Destroy.Op.loc24_3.2(%self.param: ref %i32) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Destroy.Op.loc24_3.3(%self.param: ref %array_type) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Destroy.Op.loc24_3.4(%self.param: ref %struct_type.arr.fdc) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Destroy.Op.loc24_3.5(%self.param: ref %C) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Destroy.Op.loc23(%self.param: ref %empty_tuple.type) = "no_op"; diff --git a/toolchain/check/testdata/function/generic/template_param.carbon b/toolchain/check/testdata/function/generic/template_param.carbon index 237fa2a3b6ef..68e4f5297775 100644 --- a/toolchain/check/testdata/function/generic/template_param.carbon +++ b/toolchain/check/testdata/function/generic/template_param.carbon @@ -67,6 +67,8 @@ fn G() { // CHECK:STDOUT: fn() { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: @@ -78,6 +80,8 @@ fn G() { // CHECK:STDOUT: %F.specific_fn: = specific_function %F.ref, @F(constants.%empty_struct_type) [concrete = constants.%F.specific_fn] // CHECK:STDOUT: %F.call: init %empty_tuple.type = call %F.specific_fn() // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: specific @F(constants.%T) { diff --git a/toolchain/check/testdata/function/generic/type_param.carbon b/toolchain/check/testdata/function/generic/type_param.carbon index d411133fc196..b56ff02fd177 100644 --- a/toolchain/check/testdata/function/generic/type_param.carbon +++ b/toolchain/check/testdata/function/generic/type_param.carbon @@ -148,6 +148,8 @@ fn F(T:! type) { // CHECK:STDOUT: %bound_method.loc16_3.2: = bound_method %p.var, %specific_impl_fn.loc16_3.1 // CHECK:STDOUT: %Destroy.WithSelf.Op.call: init %empty_tuple.type = call %bound_method.loc16_3.2(%p.var) // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/function/generic/type_param_scope.carbon b/toolchain/check/testdata/function/generic/type_param_scope.carbon index 240b5a97329e..29c1e7a2f56b 100644 --- a/toolchain/check/testdata/function/generic/type_param_scope.carbon +++ b/toolchain/check/testdata/function/generic/type_param_scope.carbon @@ -82,6 +82,8 @@ fn F(T:! type, n: T*) -> T* { // CHECK:STDOUT: %bound_method.loc7_10.2: = bound_method %m.ref, %specific_impl_fn.loc7_10.1 // CHECK:STDOUT: %Copy.WithSelf.Op.call: init @F.%ptr.loc4_20.1 (%ptr) = call %bound_method.loc7_10.2(%m.ref) // CHECK:STDOUT: return %Copy.WithSelf.Op.call +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/generic/call_basic_depth.carbon b/toolchain/check/testdata/generic/call_basic_depth.carbon index 2ec01accb001..241a82b755ae 100644 --- a/toolchain/check/testdata/generic/call_basic_depth.carbon +++ b/toolchain/check/testdata/generic/call_basic_depth.carbon @@ -114,6 +114,8 @@ fn M() { // CHECK:STDOUT: fn(%x.param: @F.%T.loc19_7.1 (%T)) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: @@ -131,6 +133,8 @@ fn M() { // CHECK:STDOUT: %F.specific_fn.loc25_3.1: = specific_function %F.ref, @F(constants.%T) [symbolic = %F.specific_fn.loc25_3.2 (constants.%F.specific_fn.eab)] // CHECK:STDOUT: %F.call: init %empty_tuple.type = call %F.specific_fn.loc25_3.1(%x.ref) // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: @@ -154,6 +158,8 @@ fn M() { // CHECK:STDOUT: %F.specific_fn.loc32_3.1: = specific_function %F.ref, @F(constants.%T) [symbolic = %F.specific_fn.loc32_3.2 (constants.%F.specific_fn.eab)] // CHECK:STDOUT: %F.call: init %empty_tuple.type = call %F.specific_fn.loc32_3.1(%x.ref.loc32) // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: @@ -171,6 +177,8 @@ fn M() { // CHECK:STDOUT: %.loc44: %C = acquire_value %n.ref.loc44 // CHECK:STDOUT: %G.call: init %empty_tuple.type = call %G.specific_fn(%.loc44) // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: specific @F(constants.%T) { diff --git a/toolchain/check/testdata/generic/complete_type.carbon b/toolchain/check/testdata/generic/complete_type.carbon index 7b19eabec45f..59e4ab102905 100644 --- a/toolchain/check/testdata/generic/complete_type.carbon +++ b/toolchain/check/testdata/generic/complete_type.carbon @@ -189,6 +189,8 @@ fn G(p: B*) { F(B, p); } // CHECK:STDOUT: fn @F(%x.param: %A.d32) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: specific @A(constants.%T) { @@ -312,6 +314,8 @@ fn G(p: B*) { F(B, p); } // CHECK:STDOUT: %v.ref: @F.%ptr.loc6_20.1 (%ptr.e8f) = name_ref v, %v // CHECK:STDOUT: %.loc7: ref @F.%T.loc6_7.1 (%T) = deref %v.ref // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: @@ -323,6 +327,8 @@ fn G(p: B*) { F(B, p); } // CHECK:STDOUT: %F.specific_fn: = specific_function %F.ref, @F(constants.%B) [concrete = constants.%F.specific_fn] // CHECK:STDOUT: %F.call: init %empty_tuple.type = call %F.specific_fn(%p.ref) // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: specific @F(constants.%T) { @@ -451,6 +457,8 @@ fn G(p: B*) { F(B, p); } // CHECK:STDOUT: %_.patt.loc7_8.1: @F.%pattern_type.loc7 (%pattern_type.51d) = value_binding_pattern _ [symbolic = %_.patt.loc7_8.2 (constants.%_.patt.ee9)] // CHECK:STDOUT: } // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: @@ -462,6 +470,8 @@ fn G(p: B*) { F(B, p); } // CHECK:STDOUT: %F.specific_fn: = specific_function %F.ref, @F(constants.%B) [concrete = constants.%F.specific_fn] // CHECK:STDOUT: %F.call: init %empty_tuple.type = call %F.specific_fn(%p.ref) // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: specific @F(constants.%T) { diff --git a/toolchain/check/testdata/generic/dependent_param.carbon b/toolchain/check/testdata/generic/dependent_param.carbon index 2aebcfaf05c4..fdc2098acca5 100644 --- a/toolchain/check/testdata/generic/dependent_param.carbon +++ b/toolchain/check/testdata/generic/dependent_param.carbon @@ -203,6 +203,8 @@ var n: i32 = Outer(i32).Inner(42).Get(); // CHECK:STDOUT: %.loc7_17.1: ref @Inner.Get.%T.as_type.loc7_17.1 (%T.as_type) = splice_block %return.param {} // CHECK:STDOUT: %Copy.WithSelf.Op.call: init @Inner.Get.%T.as_type.loc7_17.1 (%T.as_type) to %.loc7_17.1 = call %bound_method.loc7_28.2(%U.ref) // CHECK:STDOUT: return %Copy.WithSelf.Op.call to %return.param +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: @@ -232,6 +234,8 @@ var n: i32 = Outer(i32).Inner(42).Get(); // CHECK:STDOUT: %Inner.Get.call: init %i32 = call %Inner.Get.specific_fn() // CHECK:STDOUT: assign file.%n.var, %Inner.Get.call // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: specific @Outer(constants.%T.f84) { diff --git a/toolchain/check/testdata/generic/dot_self_symbolic_type.carbon b/toolchain/check/testdata/generic/dot_self_symbolic_type.carbon index df49db4dc218..f4a31d669f5d 100644 --- a/toolchain/check/testdata/generic/dot_self_symbolic_type.carbon +++ b/toolchain/check/testdata/generic/dot_self_symbolic_type.carbon @@ -202,6 +202,8 @@ fn H(T:! type) { // CHECK:STDOUT: fn() { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: @@ -224,6 +226,8 @@ fn H(T:! type) { // CHECK:STDOUT: %F.ref: @D.G.%C.F.type (%C.F.type.55fb78.2) = name_ref F, %.loc25 [symbolic = %C.F (constants.%C.F.6da92d.2)] // CHECK:STDOUT: %T.ref: type = name_ref T, %T.loc16_9.2 [symbolic = %T.loc16_9.1 (constants.%T.091)] // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: @@ -471,6 +475,8 @@ fn H(T:! type) { // CHECK:STDOUT: %B.facet.loc21_7.1: @D.G.%B.type.loc21_15.2 (%B.type.4a0be4.2) = facet_value %T.ref, (constants.%B.lookup_impl_witness.fc3) [symbolic = %B.facet.loc21_7.2 (constants.%B.facet.f68)] // CHECK:STDOUT: %.loc21_7.1: @D.G.%B.type.loc21_15.2 (%B.type.4a0be4.2) = converted %T.ref, %B.facet.loc21_7.1 [symbolic = %B.facet.loc21_7.2 (constants.%B.facet.f68)] // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/generic/local.carbon b/toolchain/check/testdata/generic/local.carbon index 526a74ce50a0..c8e3017b9df1 100644 --- a/toolchain/check/testdata/generic/local.carbon +++ b/toolchain/check/testdata/generic/local.carbon @@ -194,6 +194,8 @@ class C(C:! type) { // CHECK:STDOUT: %Destroy.Op.bound: = bound_method %v.var, constants.%Destroy.Op.1a2547.4 // CHECK:STDOUT: %Destroy.Op.call: init %empty_tuple.type = call %Destroy.Op.bound(%v.var) // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Destroy.Op.loc8_3.1(%self.param: ref %i32.builtin) = "no_op"; @@ -201,16 +203,22 @@ class C(C:! type) { // CHECK:STDOUT: fn @Destroy.Op.loc8_3.2(%self.param: ref %i32) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Destroy.Op.loc8_3.3(%self.param: ref %struct_type.x.a15) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Destroy.Op.loc8_3.4(%self.param: ref %C.8eb) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: specific @C(constants.%T) { @@ -292,6 +300,8 @@ class C(C:! type) { // CHECK:STDOUT: %C.loc13_12.2: type = symbolic_binding C, 0 [symbolic = %C.loc13_12.1 (constants.%C.67d)] // CHECK:STDOUT: } // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: specific @C(constants.%C.67d) { diff --git a/toolchain/check/testdata/generic/local_function.carbon b/toolchain/check/testdata/generic/local_function.carbon index a292f2830a93..543744d82adf 100644 --- a/toolchain/check/testdata/generic/local_function.carbon +++ b/toolchain/check/testdata/generic/local_function.carbon @@ -74,6 +74,8 @@ fn Test[unused T:! type]() { // CHECK:STDOUT: %Local.specific_fn.loc18_3.1: = specific_function %Local.ref, @Local(constants.%T) [symbolic = %Local.specific_fn.loc18_3.2 (constants.%Local.specific_fn)] // CHECK:STDOUT: %Local.call: init %empty_tuple.type = call %Local.specific_fn.loc18_3.1() // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: @@ -83,6 +85,8 @@ fn Test[unused T:! type]() { // CHECK:STDOUT: fn() { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/generic/template/convert.carbon b/toolchain/check/testdata/generic/template/convert.carbon index 1bd104f43486..f41b0db6930b 100644 --- a/toolchain/check/testdata/generic/template/convert.carbon +++ b/toolchain/check/testdata/generic/template/convert.carbon @@ -293,6 +293,8 @@ fn Test(d: D) -> i32 { // CHECK:STDOUT: %bound_method.loc6_10.2: = bound_method %n.ref, %specific_fn // CHECK:STDOUT: %Int.as.Copy.impl.Op.call: init %i32 = call %bound_method.loc6_10.2(%n.ref) // CHECK:STDOUT: return %Int.as.Copy.impl.Op.call +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: @@ -303,6 +305,8 @@ fn Test(d: D) -> i32 { // CHECK:STDOUT: %F.specific_fn: = specific_function %F.ref, @F(constants.%i32) [concrete = constants.%F.specific_fn.6c3] // CHECK:STDOUT: %F.call: init %i32 = call %F.specific_fn(%n.ref) // CHECK:STDOUT: return %F.call +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @C.as.ImplicitAs.impl.Convert(%self.param: %C) -> out %return.param: %i32 { @@ -317,6 +321,8 @@ fn Test(d: D) -> i32 { // CHECK:STDOUT: %bound_method.loc16_42.2: = bound_method %.loc16_42.2, %specific_fn // CHECK:STDOUT: %Int.as.Copy.impl.Op.call: init %i32 = call %bound_method.loc16_42.2(%.loc16_42.2) // CHECK:STDOUT: return %Int.as.Copy.impl.Op.call +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Test2(%c.param: %C) -> out %return.param: %i32 { @@ -326,6 +332,8 @@ fn Test(d: D) -> i32 { // CHECK:STDOUT: %F.specific_fn: = specific_function %F.ref, @F(constants.%C) [concrete = constants.%F.specific_fn.e0d] // CHECK:STDOUT: %F.call: init %i32 = call %F.specific_fn(%c.ref) // CHECK:STDOUT: return %F.call +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: specific @F(constants.%T.67db0b.1) { @@ -516,6 +524,8 @@ fn Test(d: D) -> i32 { // CHECK:STDOUT: %bound_method.loc6_10.2: = bound_method %n.ref, %specific_fn // CHECK:STDOUT: %Int.as.Copy.impl.Op.call: init %i32 = call %bound_method.loc6_10.2(%n.ref) // CHECK:STDOUT: return %Int.as.Copy.impl.Op.call +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: @@ -526,6 +536,8 @@ fn Test(d: D) -> i32 { // CHECK:STDOUT: %F.specific_fn: = specific_function %F.ref, @F(constants.%D) [concrete = constants.%F.specific_fn] // CHECK:STDOUT: %F.call: init %i32 = call %F.specific_fn(%d.ref) // CHECK:STDOUT: return %F.call +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: specific @F(constants.%T.67db0b.1) { diff --git a/toolchain/check/testdata/generic/template/member_access.carbon b/toolchain/check/testdata/generic/template/member_access.carbon index f6da154c98f5..1d2cdd85ae8f 100644 --- a/toolchain/check/testdata/generic/template/member_access.carbon +++ b/toolchain/check/testdata/generic/template/member_access.carbon @@ -270,6 +270,8 @@ fn Test(e: E) { // CHECK:STDOUT: %bound_method.loc6_10.2: = bound_method %n.ref, %specific_fn // CHECK:STDOUT: %Int.as.Copy.impl.Op.call: init %i32 = call %bound_method.loc6_10.2(%n.ref) // CHECK:STDOUT: return %Int.as.Copy.impl.Op.call +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: @@ -280,6 +282,8 @@ fn Test(e: E) { // CHECK:STDOUT: %F.specific_fn: = specific_function %F.ref, @F(constants.%C) [concrete = constants.%F.specific_fn.e0d] // CHECK:STDOUT: %F.call: init %i32 = call %F.specific_fn(%c.ref) // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Test2(%x.param: %struct_type.m.n) { @@ -289,6 +293,8 @@ fn Test(e: E) { // CHECK:STDOUT: %F.specific_fn: = specific_function %F.ref, @F(constants.%struct_type.m.n) [concrete = constants.%F.specific_fn.4da] // CHECK:STDOUT: %F.call: init %i32 = call %F.specific_fn(%x.ref) // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: specific @F(constants.%T.67db0b.1) { @@ -481,6 +487,8 @@ fn Test(e: E) { // CHECK:STDOUT: %bound_method.loc6_10.2: = bound_method %n.ref, %specific_fn // CHECK:STDOUT: %Int.as.Copy.impl.Op.call: init %i32 = call %bound_method.loc6_10.2(%n.ref) // CHECK:STDOUT: return %Int.as.Copy.impl.Op.call +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: @@ -491,6 +499,8 @@ fn Test(e: E) { // CHECK:STDOUT: %F.specific_fn: = specific_function %F.ref, @F(constants.%D) [concrete = constants.%F.specific_fn] // CHECK:STDOUT: %F.call: init %i32 = call %F.specific_fn(%d.ref) // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: specific @F(constants.%T.67db0b.1) { @@ -690,6 +700,8 @@ fn Test(e: E) { // CHECK:STDOUT: %bound_method.loc6_10.2: = bound_method %n.ref, %specific_fn // CHECK:STDOUT: %Int.as.Copy.impl.Op.call: init %i32 = call %bound_method.loc6_10.2(%n.ref) // CHECK:STDOUT: return %Int.as.Copy.impl.Op.call +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: @@ -700,6 +712,8 @@ fn Test(e: E) { // CHECK:STDOUT: %F.specific_fn: = specific_function %F.ref, @F.loc4(constants.%E) [concrete = constants.%F.specific_fn] // CHECK:STDOUT: %F.call: init %i32 = call %F.specific_fn(%e.ref) // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: specific @F.loc4(constants.%T.67db0b.1) { diff --git a/toolchain/check/testdata/generic/template/unimplemented.carbon b/toolchain/check/testdata/generic/template/unimplemented.carbon index 41a0ee2ec1c5..0770e8293acc 100644 --- a/toolchain/check/testdata/generic/template/unimplemented.carbon +++ b/toolchain/check/testdata/generic/template/unimplemented.carbon @@ -157,6 +157,8 @@ fn F[template T:! Core.Destroy](x: T) { // CHECK:STDOUT: %.loc11_11.2: @F.%.loc11_11.5 (@F.%.loc11_11.5) = splice_inst %.loc11_11.4 // CHECK:STDOUT: %int_3: Core.IntLiteral = int_value 3 [concrete = constants.%int_3] // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: @@ -255,6 +257,8 @@ fn F[template T:! Core.Destroy](x: T) { // CHECK:STDOUT: %.loc16_11.1: @F.%.loc16_11.3 (@F.%.loc16_11.3) = splice_inst %.loc16_11.2 // CHECK:STDOUT: %int_3: Core.IntLiteral = int_value 3 [concrete = constants.%int_3] // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: @@ -402,6 +406,8 @@ fn F[template T:! Core.Destroy](x: T) { // CHECK:STDOUT: %bound_method.loc14_3.2: = bound_method %v.var, %specific_impl_fn.loc14_3.1 // CHECK:STDOUT: %Destroy.WithSelf.Op.call: init %empty_tuple.type = call %bound_method.loc14_3.2(%v.var) // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: @@ -410,6 +416,8 @@ fn F[template T:! Core.Destroy](x: T) { // CHECK:STDOUT: fn @Destroy.Op.loc22_3.2(%self.param: ref %i32) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: specific @F(constants.%T.0e7) { diff --git a/toolchain/check/testdata/generic/template_dependence.carbon b/toolchain/check/testdata/generic/template_dependence.carbon index 6239288dfe33..9294f2eb1c84 100644 --- a/toolchain/check/testdata/generic/template_dependence.carbon +++ b/toolchain/check/testdata/generic/template_dependence.carbon @@ -129,6 +129,8 @@ fn F(template T:! type, U:! type) -> (T, U) { // CHECK:STDOUT: %bound_method.loc6_10.2: = bound_method %.loc6_10.2, %specific_impl_fn.loc6_10.1 // CHECK:STDOUT: %Copy.WithSelf.Op.call: init @F.%ptr.loc5_29.1 (%ptr.e8f8f9.1) = call %bound_method.loc6_10.2(%.loc6_10.2) // CHECK:STDOUT: return %Copy.WithSelf.Op.call +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: @@ -221,6 +223,8 @@ fn F(template T:! type, U:! type) -> (T, U) { // CHECK:STDOUT: %.loc5_43.1: ref @F.%tuple.type (%tuple.type.a5e) = splice_block %return.param {} // CHECK:STDOUT: %F.call: init @F.%tuple.type (%tuple.type.a5e) to %.loc5_43.1 = call %F.specific_fn.loc6_10.1() // CHECK:STDOUT: return %F.call to %return.param +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/generic/var_param.carbon b/toolchain/check/testdata/generic/var_param.carbon index 1e935e5d3a0e..e6cfe7ba7847 100644 --- a/toolchain/check/testdata/generic/var_param.carbon +++ b/toolchain/check/testdata/generic/var_param.carbon @@ -110,6 +110,8 @@ fn Test(x: i32) { // CHECK:STDOUT: fn(%x.param: ref @TestOp.%T.as_type.loc22_32.1 (%T.as_type.b38)) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: @@ -133,6 +135,8 @@ fn Test(x: i32) { // CHECK:STDOUT: %Destroy.Op.bound: = bound_method %x.var, constants.%Destroy.Op.1a2547.2 // CHECK:STDOUT: %Destroy.Op.call: init %empty_tuple.type = call %Destroy.Op.bound(%x.var) // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Destroy.Op.loc22_25.1(%self.param: ref %i32.builtin) = "no_op"; @@ -140,6 +144,8 @@ fn Test(x: i32) { // CHECK:STDOUT: fn @Destroy.Op.loc22_25.2(%self.param: ref %i32) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: specific @TestOp(constants.%T.dda) { diff --git a/toolchain/check/testdata/global/basics.carbon b/toolchain/check/testdata/global/basics.carbon index aeccbed0e110..82267890b245 100644 --- a/toolchain/check/testdata/global/basics.carbon +++ b/toolchain/check/testdata/global/basics.carbon @@ -97,6 +97,8 @@ var a: A = Make(); // CHECK:STDOUT: %T.as.DefaultOrUnformed.impl.Op.call: init %empty_struct_type = call %T.as.DefaultOrUnformed.impl.Op.specific_fn() // CHECK:STDOUT: assign file.%a.var, %T.as.DefaultOrUnformed.impl.Op.call // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- simple_init.carbon @@ -129,6 +131,8 @@ var a: A = Make(); // CHECK:STDOUT: %.loc4_1: init %empty_struct_type = converted %.loc4_14.1, %.loc4_14.2 [concrete = constants.%empty_struct] // CHECK:STDOUT: assign file.%a.var, %.loc4_1 // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- simple_init_with_fn.carbon @@ -162,6 +166,8 @@ var a: A = Make(); // CHECK:STDOUT: %Make.call: init %empty_struct_type = call %Make.ref() // CHECK:STDOUT: assign file.%a.var, %Make.call // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- class_init.carbon @@ -193,6 +199,8 @@ var a: A = Make(); // CHECK:STDOUT: %.loc6_1: init %A = converted %.loc6_13.1, %.loc6_13.2 [concrete = constants.%A.val] // CHECK:STDOUT: assign file.%a.var, %.loc6_1 // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- class_init_from_fn.carbon @@ -223,5 +231,7 @@ var a: A = Make(); // CHECK:STDOUT: %Make.call: init %A to %.loc8 = call %Make.ref() // CHECK:STDOUT: assign file.%a.var, %Make.call // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/if/basics.carbon b/toolchain/check/testdata/if/basics.carbon index b44d8012cc66..0b75b336e640 100644 --- a/toolchain/check/testdata/if/basics.carbon +++ b/toolchain/check/testdata/if/basics.carbon @@ -154,6 +154,8 @@ fn VarScope(b: bool) -> bool { // CHECK:STDOUT: %H.ref: %H.type = name_ref H, file.%H.decl [concrete = constants.%H] // CHECK:STDOUT: %H.call: init %empty_tuple.type = call %H.ref() // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- no_else.carbon @@ -196,6 +198,8 @@ fn VarScope(b: bool) -> bool { // CHECK:STDOUT: %G.ref: %G.type = name_ref G, file.%G.decl [concrete = constants.%G] // CHECK:STDOUT: %G.call: init %empty_tuple.type = call %G.ref() // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- unreachable_fallthrough.carbon @@ -262,5 +266,7 @@ fn VarScope(b: bool) -> bool { // CHECK:STDOUT: %bound_method.loc8: = bound_method %true, %impl.elem0.loc8 [concrete = constants.%bool.as.Copy.impl.Op.bound.1b3] // CHECK:STDOUT: %bool.as.Copy.impl.Op.call.loc8: init bool = call %bound_method.loc8(%true) [concrete = constants.%true] // CHECK:STDOUT: return %bool.as.Copy.impl.Op.call.loc8 +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/if_expr/basic.carbon b/toolchain/check/testdata/if_expr/basic.carbon index faa5da495a45..4029f61e1c0f 100644 --- a/toolchain/check/testdata/if_expr/basic.carbon +++ b/toolchain/check/testdata/if_expr/basic.carbon @@ -187,6 +187,8 @@ fn F(b: bool, n: i32, m: i32) -> i32 { // CHECK:STDOUT: %Destroy.Op.bound: = bound_method %x.var, constants.%Destroy.Op.1a2547.3 // CHECK:STDOUT: %Destroy.Op.call: init %empty_tuple.type = call %Destroy.Op.bound(%x.var) // CHECK:STDOUT: return %Int.as.Copy.impl.Op.call +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Destroy.Op.loc16_3.1(%self.param: ref %i32.builtin) = "no_op"; @@ -194,10 +196,14 @@ fn F(b: bool, n: i32, m: i32) -> i32 { // CHECK:STDOUT: fn @Destroy.Op.loc16_3.2(%self.param: ref %i32) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Destroy.Op.loc16_3.3(%self.param: ref %array_type) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/if_expr/constant_condition.carbon b/toolchain/check/testdata/if_expr/constant_condition.carbon index 746f4e0f42f7..3e6ff6a7055c 100644 --- a/toolchain/check/testdata/if_expr/constant_condition.carbon +++ b/toolchain/check/testdata/if_expr/constant_condition.carbon @@ -223,6 +223,8 @@ fn PartiallyConstant(t: type) -> i32 { // CHECK:STDOUT: %Core.IntLiteral.as.ImplicitAs.impl.Convert.call: init %i32 = call %bound_method.loc15_25.2(%int_1) [concrete = constants.%int_1.0c6] // CHECK:STDOUT: %.loc15_25: init %i32 = converted %int_1, %Core.IntLiteral.as.ImplicitAs.impl.Convert.call [concrete = constants.%int_1.0c6] // CHECK:STDOUT: return %.loc15_25 +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @B() -> out %return.param: %i32 { @@ -235,6 +237,8 @@ fn PartiallyConstant(t: type) -> i32 { // CHECK:STDOUT: %Core.IntLiteral.as.ImplicitAs.impl.Convert.call: init %i32 = call %bound_method.loc16_25.2(%int_2) [concrete = constants.%int_2.295] // CHECK:STDOUT: %.loc16_25: init %i32 = converted %int_2, %Core.IntLiteral.as.ImplicitAs.impl.Convert.call [concrete = constants.%int_2.295] // CHECK:STDOUT: return %.loc16_25 +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @F() -> out %return.param: %i32 { @@ -264,6 +268,8 @@ fn PartiallyConstant(t: type) -> i32 { // CHECK:STDOUT: %bound_method.loc19_10.2: = bound_method %.loc19_10, %specific_fn // CHECK:STDOUT: %Int.as.Copy.impl.Op.call: init %i32 = call %bound_method.loc19_10.2(%.loc19_10) // CHECK:STDOUT: return %Int.as.Copy.impl.Op.call +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @G() -> out %return.param: %i32 { @@ -293,6 +299,8 @@ fn PartiallyConstant(t: type) -> i32 { // CHECK:STDOUT: %bound_method.loc23_10.2: = bound_method %.loc23_10, %specific_fn // CHECK:STDOUT: %Int.as.Copy.impl.Op.call: init %i32 = call %bound_method.loc23_10.2(%.loc23_10) // CHECK:STDOUT: return %Int.as.Copy.impl.Op.call +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Constant() -> out %return.param: %i32 { @@ -379,6 +387,8 @@ fn PartiallyConstant(t: type) -> i32 { // CHECK:STDOUT: %Destroy.Op.bound.loc27: = bound_method %v.var, constants.%Destroy.Op.1a2547.3 // CHECK:STDOUT: %Destroy.Op.call.loc27: init %empty_tuple.type = call %Destroy.Op.bound.loc27(%v.var) // CHECK:STDOUT: return %Int.as.Copy.impl.Op.call +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Destroy.Op.loc28(%self.param: ref %ptr.d08) = "no_op"; @@ -388,6 +398,8 @@ fn PartiallyConstant(t: type) -> i32 { // CHECK:STDOUT: fn @Destroy.Op.loc27_3.2(%self.param: ref %i32) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @PartiallyConstant(%t.param: type) -> out %return.param: %i32 { @@ -473,5 +485,7 @@ fn PartiallyConstant(t: type) -> i32 { // CHECK:STDOUT: %Destroy.Op.bound.loc33: = bound_method %v.var, constants.%Destroy.Op.1a2547.3 // CHECK:STDOUT: %Destroy.Op.call.loc33: init %empty_tuple.type = call %Destroy.Op.bound.loc33(%v.var) // CHECK:STDOUT: return %Int.as.Copy.impl.Op.call +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/if_expr/control_flow.carbon b/toolchain/check/testdata/if_expr/control_flow.carbon index a06b92725789..00e480e697fe 100644 --- a/toolchain/check/testdata/if_expr/control_flow.carbon +++ b/toolchain/check/testdata/if_expr/control_flow.carbon @@ -144,6 +144,8 @@ fn F(b: bool) -> i32 { // CHECK:STDOUT: %Core.IntLiteral.as.ImplicitAs.impl.Convert.call: init %i32 = call %bound_method.loc15_25.2(%int_1) [concrete = constants.%int_1.0c6] // CHECK:STDOUT: %.loc15_25: init %i32 = converted %int_1, %Core.IntLiteral.as.ImplicitAs.impl.Convert.call [concrete = constants.%int_1.0c6] // CHECK:STDOUT: return %.loc15_25 +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @B() -> out %return.param: %i32 { @@ -156,6 +158,8 @@ fn F(b: bool) -> i32 { // CHECK:STDOUT: %Core.IntLiteral.as.ImplicitAs.impl.Convert.call: init %i32 = call %bound_method.loc16_25.2(%int_2) [concrete = constants.%int_2.295] // CHECK:STDOUT: %.loc16_25: init %i32 = converted %int_2, %Core.IntLiteral.as.ImplicitAs.impl.Convert.call [concrete = constants.%int_2.295] // CHECK:STDOUT: return %.loc16_25 +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @F(%b.param: bool) -> out %return.param: %i32 { @@ -185,5 +189,7 @@ fn F(b: bool) -> i32 { // CHECK:STDOUT: %bound_method.loc19_10.2: = bound_method %.loc19_10, %specific_fn // CHECK:STDOUT: %Int.as.Copy.impl.Op.call: init %i32 = call %bound_method.loc19_10.2(%.loc19_10) // CHECK:STDOUT: return %Int.as.Copy.impl.Op.call +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/if_expr/fail_partial_constant.carbon b/toolchain/check/testdata/if_expr/fail_partial_constant.carbon index f96f6335035d..40dae0b2cd90 100644 --- a/toolchain/check/testdata/if_expr/fail_partial_constant.carbon +++ b/toolchain/check/testdata/if_expr/fail_partial_constant.carbon @@ -119,6 +119,8 @@ fn ChosenBranchIsNonConstant(t: type) { // CHECK:STDOUT: %v.var_patt: = var_pattern %v.patt [concrete = ] // CHECK:STDOUT: } // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- fail_non_constant_result.carbon @@ -223,5 +225,7 @@ fn ChosenBranchIsNonConstant(t: type) { // CHECK:STDOUT: %w.var_patt: = var_pattern %w.patt [concrete = ] // CHECK:STDOUT: } // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/if_expr/nested.carbon b/toolchain/check/testdata/if_expr/nested.carbon index d7038c282672..ebb04864bfc8 100644 --- a/toolchain/check/testdata/if_expr/nested.carbon +++ b/toolchain/check/testdata/if_expr/nested.carbon @@ -202,5 +202,7 @@ fn F(a: bool, b: bool, c: bool) -> i32 { // CHECK:STDOUT: %bound_method.loc16_10.2: = bound_method %.loc16_10, %specific_fn.loc16_10 // CHECK:STDOUT: %Int.as.Copy.impl.Op.call: init %i32 = call %bound_method.loc16_10.2(%.loc16_10) // CHECK:STDOUT: return %Int.as.Copy.impl.Op.call +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/if_expr/struct.carbon b/toolchain/check/testdata/if_expr/struct.carbon index 4545a8c1a897..027b105dc6a5 100644 --- a/toolchain/check/testdata/if_expr/struct.carbon +++ b/toolchain/check/testdata/if_expr/struct.carbon @@ -183,6 +183,8 @@ fn F(cond: bool) { // CHECK:STDOUT: %Destroy.Op.bound: = bound_method %a.var, constants.%Destroy.Op.1a2547.3 // CHECK:STDOUT: %Destroy.Op.call: init %empty_tuple.type = call %Destroy.Op.bound(%a.var) // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Destroy.Op.loc18_3.1(%self.param: ref %i32.builtin) = "no_op"; @@ -190,10 +192,14 @@ fn F(cond: bool) { // CHECK:STDOUT: fn @Destroy.Op.loc18_3.2(%self.param: ref %i32) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Destroy.Op.loc18_3.3(%self.param: ref %struct_type.a.b.b4c) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/impl/assoc_const_self.carbon b/toolchain/check/testdata/impl/assoc_const_self.carbon index a1fcef89b155..88cd3bcd8508 100644 --- a/toolchain/check/testdata/impl/assoc_const_self.carbon +++ b/toolchain/check/testdata/impl/assoc_const_self.carbon @@ -217,6 +217,8 @@ fn CallF() { // CHECK:STDOUT: witness = (@I.WithSelf.%V) // CHECK:STDOUT: // CHECK:STDOUT: !requires: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: impl @empty_struct_type.as.I.impl: %.loc8_7.2 as %.loc8_14 { @@ -355,6 +357,8 @@ fn CallF() { // CHECK:STDOUT: witness = (@I.WithSelf.%V) // CHECK:STDOUT: // CHECK:STDOUT: !requires: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: impl @empty_struct_type.as.I.impl: %.loc15_7.2 as %.loc15_14.1 { @@ -495,6 +499,8 @@ fn CallF() { // CHECK:STDOUT: witness = (@I.WithSelf.%V) // CHECK:STDOUT: // CHECK:STDOUT: !requires: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: impl @empty_tuple.type.as.ImplicitAs.impl: %.loc10_7.2 as %ImplicitAs.type { @@ -556,6 +562,8 @@ fn CallF() { // CHECK:STDOUT: %.loc11_46.2: init %C to %return.param = class_init () [concrete = constants.%C.val] // CHECK:STDOUT: %.loc11_47: init %C = converted %.loc11_46.1, %.loc11_46.2 [concrete = constants.%C.val] // CHECK:STDOUT: return %.loc11_47 to %return.param +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: specific @I.WithSelf(constants.%Self.37e) { @@ -699,6 +707,8 @@ fn CallF() { // CHECK:STDOUT: witness = (@I.WithSelf.%V) // CHECK:STDOUT: // CHECK:STDOUT: !requires: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: @@ -832,6 +842,8 @@ fn CallF() { // CHECK:STDOUT: witness = (@I.WithSelf.%V) // CHECK:STDOUT: // CHECK:STDOUT: !requires: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: generic fn @F(%T.loc8_7.2: %I_where.type.366d4a.1) { @@ -847,6 +859,8 @@ fn CallF() { // CHECK:STDOUT: %.loc19: %empty_struct_type = struct_literal () [concrete = constants.%empty_struct] // CHECK:STDOUT: %I_where.type: type = facet_type <@I where constants.%empty_struct_type impls @ImplicitAs, @ImplicitAs(constants.%empty_struct_type) and constants.%impl.elem0 = constants.%empty_struct> [concrete = constants.%I_where.type.366d4a.2] // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: specific @I.WithSelf(constants.%Self.37e) { diff --git a/toolchain/check/testdata/impl/basic.carbon b/toolchain/check/testdata/impl/basic.carbon index b25a61714089..609d43add19c 100644 --- a/toolchain/check/testdata/impl/basic.carbon +++ b/toolchain/check/testdata/impl/basic.carbon @@ -141,5 +141,7 @@ final impl C(invalid) as I {} // CHECK:STDOUT: fn @C.as.Simple.impl.F() { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/impl/compound.carbon b/toolchain/check/testdata/impl/compound.carbon index afbab1ff9177..9c6e6f66f4ae 100644 --- a/toolchain/check/testdata/impl/compound.carbon +++ b/toolchain/check/testdata/impl/compound.carbon @@ -204,6 +204,8 @@ fn InstanceCallFail() { // CHECK:STDOUT: witness = (@ImplicitAs.WithSelf.%ImplicitAs.WithSelf.Convert.decl) // CHECK:STDOUT: // CHECK:STDOUT: !requires: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: @@ -296,6 +298,8 @@ fn InstanceCallFail() { // CHECK:STDOUT: witness = (@NonInstance1.WithSelf.%NonInstance1.WithSelf.F1.decl) // CHECK:STDOUT: // CHECK:STDOUT: !requires: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: impl @struct_type.a.as.NonInstance1.impl: %struct_type.a as %NonInstance1.ref { @@ -316,6 +320,8 @@ fn InstanceCallFail() { // CHECK:STDOUT: fn @struct_type.a.as.NonInstance1.impl.F1() { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @NonInstanceCall1() { @@ -330,6 +336,8 @@ fn InstanceCallFail() { // CHECK:STDOUT: %impl.elem0: %.735 = impl_witness_access constants.%NonInstance1.impl_witness, element0 [concrete = constants.%struct_type.a.as.NonInstance1.impl.F1] // CHECK:STDOUT: %struct_type.a.as.NonInstance1.impl.F1.call: init %empty_tuple.type = call %impl.elem0() // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: specific @NonInstance1.WithSelf(constants.%Self) { @@ -458,6 +466,8 @@ fn InstanceCallFail() { // CHECK:STDOUT: witness = (@NonInstance2.WithSelf.%NonInstance2.WithSelf.F2.decl) // CHECK:STDOUT: // CHECK:STDOUT: !requires: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: generic interface @ImplicitAs(imports.%Core.import_ref.b3bc94.3: type) [from "core.carbon"] { @@ -475,6 +485,8 @@ fn InstanceCallFail() { // CHECK:STDOUT: witness = (imports.%Core.Convert) // CHECK:STDOUT: // CHECK:STDOUT: !requires: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: @@ -496,6 +508,8 @@ fn InstanceCallFail() { // CHECK:STDOUT: fn @struct_type.b.as.NonInstance2.impl.F2() { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @NonInstanceCall2(%n.param: %struct_type.b) { @@ -505,6 +519,8 @@ fn InstanceCallFail() { // CHECK:STDOUT: %F2.ref: %NonInstance2.assoc_type = name_ref F2, @NonInstance2.WithSelf.%assoc0 [concrete = constants.%assoc0.fab] // CHECK:STDOUT: %.loc21: %NonInstance2.type = converted %n.ref, [concrete = ] // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: generic fn @ImplicitAs.WithSelf.Convert(imports.%Core.import_ref.b3bc94.2: type, imports.%Core.import_ref.f19eaa.2: @ImplicitAs.%ImplicitAs.type (%ImplicitAs.type.3aa)) [from "core.carbon"] { @@ -692,6 +708,8 @@ fn InstanceCallFail() { // CHECK:STDOUT: witness = (@NonInstance3.WithSelf.%NonInstance3.WithSelf.F3.decl) // CHECK:STDOUT: // CHECK:STDOUT: !requires: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: generic interface @ImplicitAs(imports.%Core.import_ref.b3bc94.3: type) [from "core.carbon"] { @@ -709,6 +727,8 @@ fn InstanceCallFail() { // CHECK:STDOUT: witness = (imports.%Core.Convert) // CHECK:STDOUT: // CHECK:STDOUT: !requires: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: @@ -730,6 +750,8 @@ fn InstanceCallFail() { // CHECK:STDOUT: fn @struct_type.c.as.NonInstance3.impl.F3() { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @NonInstanceCallIndirect(%p.param: %ptr) { @@ -740,6 +762,8 @@ fn InstanceCallFail() { // CHECK:STDOUT: %.loc21_4.1: ref %struct_type.c = deref %p.ref // CHECK:STDOUT: %.loc21_4.2: %NonInstance3.type = converted %.loc21_4.1, [concrete = ] // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: generic fn @ImplicitAs.WithSelf.Convert(imports.%Core.import_ref.b3bc94.2: type, imports.%Core.import_ref.f19eaa.2: @ImplicitAs.%ImplicitAs.type (%ImplicitAs.type.3aa)) [from "core.carbon"] { @@ -921,6 +945,8 @@ fn InstanceCallFail() { // CHECK:STDOUT: witness = (@Instance1.WithSelf.%Instance1.WithSelf.G1.decl) // CHECK:STDOUT: // CHECK:STDOUT: !requires: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: impl @struct_type.d.as.Instance1.impl: %struct_type.d as %Instance1.ref { @@ -954,6 +980,8 @@ fn InstanceCallFail() { // CHECK:STDOUT: fn @struct_type.d.as.Instance1.impl.G1(%self.param: %struct_type.d) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @InstanceCall(%n.param: %struct_type.d) { @@ -965,6 +993,8 @@ fn InstanceCallFail() { // CHECK:STDOUT: %bound_method: = bound_method %n.ref, %impl.elem0 // CHECK:STDOUT: %struct_type.d.as.Instance1.impl.G1.call: init %empty_tuple.type = call %bound_method(%n.ref) // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @InstanceCallIndirect(%p.param: %ptr) { @@ -982,6 +1012,8 @@ fn InstanceCallFail() { // CHECK:STDOUT: %.loc16_4.4: %struct_type.d = converted %.loc16_4.1, %struct [concrete = constants.%struct] // CHECK:STDOUT: %struct_type.d.as.Instance1.impl.G1.call: init %empty_tuple.type = call %bound_method(%.loc16_4.4) // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: specific @Instance1.WithSelf(constants.%Self) { @@ -1083,6 +1115,8 @@ fn InstanceCallFail() { // CHECK:STDOUT: witness = (@Instance2.WithSelf.%Instance2.WithSelf.G2.decl) // CHECK:STDOUT: // CHECK:STDOUT: !requires: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: impl @struct_type.e.as.Instance2.impl: %struct_type.e as %Instance2.ref { @@ -1116,6 +1150,8 @@ fn InstanceCallFail() { // CHECK:STDOUT: fn @struct_type.e.as.Instance2.impl.G2(%self.param: %struct_type.e) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @InstanceCallFail() { @@ -1126,6 +1162,8 @@ fn InstanceCallFail() { // CHECK:STDOUT: %Instance2.ref: type = name_ref Instance2, file.%Instance2.decl [concrete = constants.%Instance2.type] // CHECK:STDOUT: %G2.ref: %Instance2.assoc_type = name_ref G2, @Instance2.WithSelf.%assoc0 [concrete = constants.%assoc0] // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: specific @Instance2.WithSelf(constants.%Self) { diff --git a/toolchain/check/testdata/impl/declaration.carbon b/toolchain/check/testdata/impl/declaration.carbon index 814b2024116e..123dd25a4671 100644 --- a/toolchain/check/testdata/impl/declaration.carbon +++ b/toolchain/check/testdata/impl/declaration.carbon @@ -66,6 +66,8 @@ impl i32 as I {} // CHECK:STDOUT: witness = () // CHECK:STDOUT: // CHECK:STDOUT: !requires: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: impl @i32.as.I.impl: %i32.loc17 as %I.ref.loc17 { diff --git a/toolchain/check/testdata/impl/empty.carbon b/toolchain/check/testdata/impl/empty.carbon index 4775ab433109..5af1f993309e 100644 --- a/toolchain/check/testdata/impl/empty.carbon +++ b/toolchain/check/testdata/impl/empty.carbon @@ -62,6 +62,8 @@ impl i32 as Empty { // CHECK:STDOUT: witness = () // CHECK:STDOUT: // CHECK:STDOUT: !requires: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: impl @i32.as.Empty.impl: %i32 as %Empty.ref { diff --git a/toolchain/check/testdata/impl/error_recovery.carbon b/toolchain/check/testdata/impl/error_recovery.carbon index 11ccee9e45fb..ef1496457f4e 100644 --- a/toolchain/check/testdata/impl/error_recovery.carbon +++ b/toolchain/check/testdata/impl/error_recovery.carbon @@ -209,6 +209,8 @@ impl C as I { // CHECK:STDOUT: %F.specific_fn.loc19_3.1: = specific_function %F.ref, @F(constants.%Z.facet) [symbolic = %F.specific_fn.loc19_3.2 (constants.%F.specific_fn)] // CHECK:STDOUT: %F.call: init %empty_tuple.type = call %F.specific_fn.loc19_3.1() // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: @@ -269,6 +271,8 @@ impl C as I { // CHECK:STDOUT: %F.specific_fn.loc19_3.1: = specific_function %F.ref, @F(constants.%Z.facet) [symbolic = %F.specific_fn.loc19_3.2 (constants.%F.specific_fn)] // CHECK:STDOUT: %F.call: init %empty_tuple.type = call %F.specific_fn.loc19_3.1() // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: @@ -310,6 +314,8 @@ impl C as I { // CHECK:STDOUT: %F.specific_fn: = specific_function %F.ref, @F(constants.%Z.facet) [concrete = constants.%F.specific_fn] // CHECK:STDOUT: %F.call: init %empty_tuple.type = call %F.specific_fn() // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- fail_invalid_fn_syntax_in_impl.carbon diff --git a/toolchain/check/testdata/impl/extend_impl.carbon b/toolchain/check/testdata/impl/extend_impl.carbon index 9c8f27605d41..8e90fb11e35c 100644 --- a/toolchain/check/testdata/impl/extend_impl.carbon +++ b/toolchain/check/testdata/impl/extend_impl.carbon @@ -152,5 +152,7 @@ extend impl nonexistent* as I {} // CHECK:STDOUT: fn @C.as.HasF.impl.F() { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/impl/extend_impl_generic.carbon b/toolchain/check/testdata/impl/extend_impl_generic.carbon index 5c53b69a000a..727a674b20bc 100644 --- a/toolchain/check/testdata/impl/extend_impl_generic.carbon +++ b/toolchain/check/testdata/impl/extend_impl_generic.carbon @@ -234,6 +234,8 @@ class X(U:! type) { // CHECK:STDOUT: witness = (@HasF.WithSelf.%HasF.WithSelf.F.decl) // CHECK:STDOUT: // CHECK:STDOUT: !requires: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: @@ -310,6 +312,8 @@ class X(U:! type) { // CHECK:STDOUT: %.loc15_21.5: init %Param to %return.param = class_init (%.loc15_21.4) [concrete = constants.%Param.val] // CHECK:STDOUT: %.loc15_22: init %Param = converted %.loc15_21.1, %.loc15_21.5 [concrete = constants.%Param.val] // CHECK:STDOUT: return %.loc15_22 to %return.param +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @G(%c.param: %C) { @@ -359,6 +363,8 @@ class X(U:! type) { // CHECK:STDOUT: %Destroy.Op.bound.loc21: = bound_method %.loc21_27.2, constants.%Destroy.Op.1a2547.4 // CHECK:STDOUT: %Destroy.Op.call.loc21: init %empty_tuple.type = call %Destroy.Op.bound.loc21(%.loc21_27.2) // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Destroy.Op.loc22_27.1(%self.param: ref %i32.builtin) = "no_op"; @@ -366,16 +372,22 @@ class X(U:! type) { // CHECK:STDOUT: fn @Destroy.Op.loc22_27.2(%self.param: ref %i32) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Destroy.Op.loc22_27.3(%self.param: ref %struct_type.x.a15) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Destroy.Op.loc22_27.4(%self.param: ref %Param) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: specific @HasF(constants.%T.67d) { @@ -572,6 +584,8 @@ class X(U:! type) { // CHECK:STDOUT: witness = (@I.WithSelf.%I.WithSelf.F.decl) // CHECK:STDOUT: // CHECK:STDOUT: !requires: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: @@ -673,6 +687,8 @@ class X(U:! type) { // CHECK:STDOUT: fn(%self.param: @X.as.I.impl.F.%X (%X), %t.param: @X.as.I.impl.F.%U (%U)) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/impl/fail_alias.carbon b/toolchain/check/testdata/impl/fail_alias.carbon index f76b6488d1fb..d8648fe5fe0b 100644 --- a/toolchain/check/testdata/impl/fail_alias.carbon +++ b/toolchain/check/testdata/impl/fail_alias.carbon @@ -73,6 +73,8 @@ impl AC as AI {} // CHECK:STDOUT: witness = () // CHECK:STDOUT: // CHECK:STDOUT: !requires: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: impl @C.as.I.impl.e103db.1: %AC.ref as %AI.ref { diff --git a/toolchain/check/testdata/impl/fail_call_invalid.carbon b/toolchain/check/testdata/impl/fail_call_invalid.carbon index dbaf6fcafd8a..0d7c77017a2c 100644 --- a/toolchain/check/testdata/impl/fail_call_invalid.carbon +++ b/toolchain/check/testdata/impl/fail_call_invalid.carbon @@ -123,6 +123,8 @@ fn InstanceCall(n: i32) { // CHECK:STDOUT: witness = (@Simple.WithSelf.%Simple.WithSelf.G.decl) // CHECK:STDOUT: // CHECK:STDOUT: !requires: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: impl @i32.as.Simple.impl: %i32 as %Simple.ref { @@ -169,6 +171,8 @@ fn InstanceCall(n: i32) { // CHECK:STDOUT: %i32.as.Simple.impl.G.bound: = bound_method %self.param, %G.ref // CHECK:STDOUT: %i32.as.Simple.impl.G.call: init %empty_tuple.type = call %i32.as.Simple.impl.G.bound() // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @InstanceCall(%n.param: %i32) { @@ -182,6 +186,8 @@ fn InstanceCall(n: i32) { // CHECK:STDOUT: %i32.as.Simple.impl.G.bound: = bound_method %n.ref, %G.ref.loc28_16 // CHECK:STDOUT: %i32.as.Simple.impl.G.call: init %empty_tuple.type = call %i32.as.Simple.impl.G.bound() // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: specific @Simple.WithSelf(constants.%Self) { diff --git a/toolchain/check/testdata/impl/fail_extend_impl_forall.carbon b/toolchain/check/testdata/impl/fail_extend_impl_forall.carbon index f035fd81582c..5a07a29f33ed 100644 --- a/toolchain/check/testdata/impl/fail_extend_impl_forall.carbon +++ b/toolchain/check/testdata/impl/fail_extend_impl_forall.carbon @@ -102,6 +102,8 @@ class C { // CHECK:STDOUT: witness = (@GenericInterface.WithSelf.%GenericInterface.WithSelf.F.decl) // CHECK:STDOUT: // CHECK:STDOUT: !requires: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: @@ -179,6 +181,8 @@ class C { // CHECK:STDOUT: fn(%x.param: @C.as.GenericInterface.impl.F.%T (%T)) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/impl/fail_extend_impl_scope.carbon b/toolchain/check/testdata/impl/fail_extend_impl_scope.carbon index f6cb2bd1ab68..ad2ac96157cc 100644 --- a/toolchain/check/testdata/impl/fail_extend_impl_scope.carbon +++ b/toolchain/check/testdata/impl/fail_extend_impl_scope.carbon @@ -104,6 +104,8 @@ fn F() { // CHECK:STDOUT: witness = () // CHECK:STDOUT: // CHECK:STDOUT: !requires: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: impl @empty_tuple.type.as.I.impl: %.loc9_14.2 as %I.ref { @@ -156,6 +158,8 @@ fn F() { // CHECK:STDOUT: witness = () // CHECK:STDOUT: // CHECK:STDOUT: !requires: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: impl @empty_struct_type.as.J.impl: %.loc10_16.2 as %J.ref { @@ -175,6 +179,8 @@ fn F() { // CHECK:STDOUT: %J.ref: type = name_ref J, file.%J.decl [concrete = constants.%J.type] // CHECK:STDOUT: } // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: specific @J.WithSelf(constants.%Self) {} @@ -257,6 +263,8 @@ fn F() { // CHECK:STDOUT: witness = (@Z.WithSelf.%Z.WithSelf.Zero.decl) // CHECK:STDOUT: // CHECK:STDOUT: !requires: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: generic impl @.as.Z.impl(@Z.%Self: %Z.type) { @@ -311,12 +319,16 @@ fn F() { // CHECK:STDOUT: fn() { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Point.as.Z.impl.Zero() { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @F() { @@ -332,6 +344,8 @@ fn F() { // CHECK:STDOUT: %Point.as.Z.impl.Zero.call: init %empty_tuple.type = call %impl.elem0() // CHECK:STDOUT: %Destroy.Op.call: init %empty_tuple.type = call constants.%Destroy.Op.bound(constants.%.e6b) // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Destroy.Op.loc25_7.1(%self.param: ref %empty_struct_type) = "no_op"; @@ -339,6 +353,8 @@ fn F() { // CHECK:STDOUT: fn @Destroy.Op.loc25_7.2(%self.param: ref %Point) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: specific @Z.WithSelf(constants.%Self.cb6) { diff --git a/toolchain/check/testdata/impl/fail_extend_impl_type_as.carbon b/toolchain/check/testdata/impl/fail_extend_impl_type_as.carbon index 832ffd65b258..4ec8419309e2 100644 --- a/toolchain/check/testdata/impl/fail_extend_impl_type_as.carbon +++ b/toolchain/check/testdata/impl/fail_extend_impl_type_as.carbon @@ -99,6 +99,8 @@ class E { // CHECK:STDOUT: witness = () // CHECK:STDOUT: // CHECK:STDOUT: !requires: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: impl @.as.I.impl: as %I.ref { diff --git a/toolchain/check/testdata/impl/fail_extend_partially_defined_interface.carbon b/toolchain/check/testdata/impl/fail_extend_partially_defined_interface.carbon index 21c8f7482fe7..395a5d9b084e 100644 --- a/toolchain/check/testdata/impl/fail_extend_partially_defined_interface.carbon +++ b/toolchain/check/testdata/impl/fail_extend_partially_defined_interface.carbon @@ -58,6 +58,8 @@ interface I { // CHECK:STDOUT: witness = () // CHECK:STDOUT: // CHECK:STDOUT: !requires: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: generic impl @C.as.I.impl(@I.%Self: %I.type) { diff --git a/toolchain/check/testdata/impl/fail_extend_undefined_interface.carbon b/toolchain/check/testdata/impl/fail_extend_undefined_interface.carbon index 3b2f4e973f14..ba696eff320f 100644 --- a/toolchain/check/testdata/impl/fail_extend_undefined_interface.carbon +++ b/toolchain/check/testdata/impl/fail_extend_undefined_interface.carbon @@ -88,5 +88,7 @@ fn F(c: C) { // CHECK:STDOUT: %c.ref: %C = name_ref c, %c // CHECK:STDOUT: %F.ref.loc30: = name_ref F, [concrete = ] // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/impl/fail_impl_as_scope.carbon b/toolchain/check/testdata/impl/fail_impl_as_scope.carbon index 898e9c272834..f365a108e1c0 100644 --- a/toolchain/check/testdata/impl/fail_impl_as_scope.carbon +++ b/toolchain/check/testdata/impl/fail_impl_as_scope.carbon @@ -144,6 +144,8 @@ class X { // CHECK:STDOUT: witness = () // CHECK:STDOUT: // CHECK:STDOUT: !requires: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: impl @.as.I.impl: as %I.ref { @@ -155,6 +157,8 @@ class X { // CHECK:STDOUT: fn @G() { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @F() { @@ -162,6 +166,8 @@ class X { // CHECK:STDOUT: %G.ref: %G.type = name_ref G, file.%G.decl [concrete = constants.%G] // CHECK:STDOUT: %G.call: init %empty_tuple.type = call %G.ref() // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: specific @I.WithSelf(constants.%Self) {} @@ -207,6 +213,8 @@ class X { // CHECK:STDOUT: witness = () // CHECK:STDOUT: // CHECK:STDOUT: !requires: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: impl @.as.J.impl: as %J.ref { @@ -218,6 +226,8 @@ class X { // CHECK:STDOUT: fn @G() { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @F() { @@ -228,6 +238,8 @@ class X { // CHECK:STDOUT: %G.ref: %G.type = name_ref G, file.%G.decl [concrete = constants.%G] // CHECK:STDOUT: %G.call: init %empty_tuple.type = call %G.ref() // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: specific @J.WithSelf(constants.%Self) {} @@ -339,6 +351,8 @@ class X { // CHECK:STDOUT: witness = (@Z.WithSelf.%Z.WithSelf.Zero.decl, @Z.WithSelf.%Z.WithSelf.Method.decl) // CHECK:STDOUT: // CHECK:STDOUT: !requires: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: generic impl @.as.Z.impl(@Z.%Self: %Z.type) { @@ -425,6 +439,8 @@ class X { // CHECK:STDOUT: fn() { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: @@ -441,17 +457,23 @@ class X { // CHECK:STDOUT: fn(%self.param: @.as.Z.impl.Method.%Self.as_type.loc13_22.1 (%Self.as_type.0cf)) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Point.as.Z.impl.Zero() { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Point.as.Z.impl.Method(%self.param: %Point) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @F() { @@ -477,6 +499,8 @@ class X { // CHECK:STDOUT: %Point.as.Z.impl.Method.call: init %empty_tuple.type = call %bound_method(%.loc29_7.3) // CHECK:STDOUT: %Destroy.Op.call: init %empty_tuple.type = call constants.%Destroy.Op.bound(constants.%.e6b) // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Destroy.Op.loc29_7.1(%self.param: ref %empty_struct_type) = "no_op"; @@ -484,6 +508,8 @@ class X { // CHECK:STDOUT: fn @Destroy.Op.loc29_7.2(%self.param: ref %Point) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: specific @Z.WithSelf(constants.%Self.cb6) { @@ -606,6 +632,8 @@ class X { // CHECK:STDOUT: witness = (@A.WithSelf.%A.WithSelf.B.decl) // CHECK:STDOUT: // CHECK:STDOUT: !requires: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: interface @C { @@ -617,6 +645,8 @@ class X { // CHECK:STDOUT: witness = () // CHECK:STDOUT: // CHECK:STDOUT: !requires: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: impl @X.as.A.impl: %Self.ref as %A.ref { @@ -663,6 +693,8 @@ class X { // CHECK:STDOUT: fn @G() { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @X.as.A.impl.B() { @@ -670,6 +702,8 @@ class X { // CHECK:STDOUT: %G.ref: %G.type = name_ref G, file.%G.decl [concrete = constants.%G] // CHECK:STDOUT: %G.call: init %empty_tuple.type = call %G.ref() // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: specific @A.WithSelf(constants.%Self.d0c) { diff --git a/toolchain/check/testdata/impl/fail_impl_bad_assoc_const.carbon b/toolchain/check/testdata/impl/fail_impl_bad_assoc_const.carbon index a68f56e001a1..9abdbf0f0f34 100644 --- a/toolchain/check/testdata/impl/fail_impl_bad_assoc_const.carbon +++ b/toolchain/check/testdata/impl/fail_impl_bad_assoc_const.carbon @@ -63,6 +63,8 @@ impl () as I {} // CHECK:STDOUT: witness = (@I.WithSelf.%T) // CHECK:STDOUT: // CHECK:STDOUT: !requires: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: impl @empty_tuple.type.as.I.impl: %.loc24_7.2 as %I.ref { diff --git a/toolchain/check/testdata/impl/fail_impl_bad_assoc_fn.carbon b/toolchain/check/testdata/impl/fail_impl_bad_assoc_fn.carbon index 9b75f0191808..eff6ba5a57a3 100644 --- a/toolchain/check/testdata/impl/fail_impl_bad_assoc_fn.carbon +++ b/toolchain/check/testdata/impl/fail_impl_bad_assoc_fn.carbon @@ -532,6 +532,8 @@ class SelfNestedBadReturnType { // CHECK:STDOUT: witness = (@I.WithSelf.%I.WithSelf.F.decl) // CHECK:STDOUT: // CHECK:STDOUT: !requires: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: interface @J { @@ -566,6 +568,8 @@ class SelfNestedBadReturnType { // CHECK:STDOUT: witness = (@J.WithSelf.%J.WithSelf.F.decl) // CHECK:STDOUT: // CHECK:STDOUT: !requires: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: interface @SelfNested { @@ -613,6 +617,8 @@ class SelfNestedBadReturnType { // CHECK:STDOUT: witness = (@SelfNested.WithSelf.%SelfNested.WithSelf.F.decl) // CHECK:STDOUT: // CHECK:STDOUT: !requires: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: impl @NoF.as.I.impl: %Self.ref as %I.ref { @@ -1255,6 +1261,8 @@ class SelfNestedBadReturnType { // CHECK:STDOUT: !entry: // CHECK:STDOUT: %F.ref: %FExtraParam.as.I.impl.F.type.ec7b0b.1 = name_ref F, @FExtraParam.as.I.impl.%FExtraParam.as.I.impl.F.decl.loc69_18.1 [concrete = constants.%FExtraParam.as.I.impl.F.ef9801.1] // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @FExtraImplicitParam.as.I.impl.F.loc85_15.1(%self.param: %FExtraImplicitParam); @@ -1263,6 +1271,8 @@ class SelfNestedBadReturnType { // CHECK:STDOUT: !entry: // CHECK:STDOUT: %F.ref: %FExtraImplicitParam.as.I.impl.F.type.54cac2.1 = name_ref F, @FExtraImplicitParam.as.I.impl.%FExtraImplicitParam.as.I.impl.F.decl.loc85_15.1 [concrete = constants.%FExtraImplicitParam.as.I.impl.F.a42f35.1] // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @FExtraReturnType.as.I.impl.F() -> out %return.param: bool; @@ -1278,6 +1288,8 @@ class SelfNestedBadReturnType { // CHECK:STDOUT: %F.ref: %FMissingParam.as.J.impl.F.type.aad6ec.1 = name_ref F, @FMissingParam.as.J.impl.%FMissingParam.as.J.impl.F.decl.loc117_29.1 [concrete = constants.%FMissingParam.as.J.impl.F.dd09dc.1] // CHECK:STDOUT: %FMissingParam.as.J.impl.F.bound: = bound_method %self.param, %F.ref // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @FMissingImplicitParam.as.J.impl.F.loc130_26.1(%b.param: bool) -> out %return.param: bool; @@ -1287,6 +1299,8 @@ class SelfNestedBadReturnType { // CHECK:STDOUT: %F.ref: %FMissingImplicitParam.as.J.impl.F.type.f666a8.1 = name_ref F, @FMissingImplicitParam.as.J.impl.%FMissingImplicitParam.as.J.impl.F.decl.loc130_26.1 [concrete = constants.%FMissingImplicitParam.as.J.impl.F.620ed1.1] // CHECK:STDOUT: %FMissingImplicitParam.as.J.impl.F.call: init bool = call %F.ref(%b.param) // CHECK:STDOUT: return %FMissingImplicitParam.as.J.impl.F.call +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @FMissingReturnType.as.J.impl.F.loc148_30.1(%self.param: bool, %b.param: bool); @@ -1298,6 +1312,8 @@ class SelfNestedBadReturnType { // CHECK:STDOUT: %FMissingReturnType.as.J.impl.F.call: init %empty_tuple.type = call %FMissingReturnType.as.J.impl.F.bound(%self.param, %b.param) // CHECK:STDOUT: %.loc148: bool = converted %FMissingReturnType.as.J.impl.F.call, [concrete = ] // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @FDifferentParamType.as.J.impl.F.loc163_38.1(%self.param: bool, %b.param: %FDifferentParamType) -> out %return.param: bool; @@ -1312,6 +1328,8 @@ class SelfNestedBadReturnType { // CHECK:STDOUT: %.5: %FDifferentParamType = converted %b.param, [concrete = ] // CHECK:STDOUT: %FDifferentParamType.as.J.impl.F.call: init bool = call %FDifferentParamType.as.J.impl.F.bound(%self.param, ) // CHECK:STDOUT: return %FDifferentParamType.as.J.impl.F.call +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @FDifferentImplicitParamType.as.J.impl.F.loc176_32.1(%self.param: %FDifferentImplicitParamType, %b.param: bool) -> out %return.param: bool; @@ -1326,6 +1344,8 @@ class SelfNestedBadReturnType { // CHECK:STDOUT: %.5: %FDifferentImplicitParamType = converted %self.param, [concrete = ] // CHECK:STDOUT: %FDifferentImplicitParamType.as.J.impl.F.call: init bool = call %FDifferentImplicitParamType.as.J.impl.F.bound(, %b.param) // CHECK:STDOUT: return %FDifferentImplicitParamType.as.J.impl.F.call +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @FDifferentReturnType.as.J.impl.F.loc194_38.1(%self.param: bool, %b.param: bool) -> out %return.param: %FDifferentReturnType; @@ -1338,6 +1358,8 @@ class SelfNestedBadReturnType { // CHECK:STDOUT: %FDifferentReturnType.as.J.impl.F.call: init %FDifferentReturnType to %.loc194_38.1 = call %FDifferentReturnType.as.J.impl.F.bound(%self.param, %b.param) // CHECK:STDOUT: %.loc194_38.2: bool = converted %FDifferentReturnType.as.J.impl.F.call, [concrete = ] // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: generic fn @SelfNested.WithSelf.F(@SelfNested.%Self: %SelfNested.type) { @@ -1374,6 +1396,8 @@ class SelfNestedBadReturnType { // CHECK:STDOUT: %.6: %i32 = converted %.4, [concrete = ] // CHECK:STDOUT: %SelfNestedBadParam.as.SelfNested.impl.F.call: init %array_type.291 to %.3 = call %F.ref() // CHECK:STDOUT: return %SelfNestedBadParam.as.SelfNested.impl.F.call to %return.param +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @SelfNestedBadReturnType.as.SelfNested.impl.F.loc227_112.1(%x.param: %tuple.type.829) -> out %return.param: %array_type.291; @@ -1385,6 +1409,8 @@ class SelfNestedBadReturnType { // CHECK:STDOUT: %SelfNestedBadReturnType.as.SelfNested.impl.F.call: init %array_type.291 to %.loc227_112.1 = call %F.ref(%x.param) // CHECK:STDOUT: %.loc227_112.2: %array_type.a08 = converted %SelfNestedBadReturnType.as.SelfNested.impl.F.call, [concrete = ] // CHECK:STDOUT: return to %return.param +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: specific @I.WithSelf(constants.%Self.37e) { diff --git a/toolchain/check/testdata/impl/fail_impl_bad_interface.carbon b/toolchain/check/testdata/impl/fail_impl_bad_interface.carbon index 0cad2bb3bf43..a04aa434644c 100644 --- a/toolchain/check/testdata/impl/fail_impl_bad_interface.carbon +++ b/toolchain/check/testdata/impl/fail_impl_bad_interface.carbon @@ -226,6 +226,8 @@ impl {.a: bool} as type where .Self impls I {} // CHECK:STDOUT: witness = () // CHECK:STDOUT: // CHECK:STDOUT: !requires: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: impl @struct_type.a.as..impl: %struct_type.a as { diff --git a/toolchain/check/testdata/impl/fail_impl_bad_type.carbon b/toolchain/check/testdata/impl/fail_impl_bad_type.carbon index e3e561e35484..80766bc806a6 100644 --- a/toolchain/check/testdata/impl/fail_impl_bad_type.carbon +++ b/toolchain/check/testdata/impl/fail_impl_bad_type.carbon @@ -65,6 +65,8 @@ impl true as I {} // CHECK:STDOUT: witness = () // CHECK:STDOUT: // CHECK:STDOUT: !requires: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: impl @.as.I.impl: as %I.ref { diff --git a/toolchain/check/testdata/impl/fail_redefinition.carbon b/toolchain/check/testdata/impl/fail_redefinition.carbon index 6f34d01d5cbc..f7669a540cfa 100644 --- a/toolchain/check/testdata/impl/fail_redefinition.carbon +++ b/toolchain/check/testdata/impl/fail_redefinition.carbon @@ -73,6 +73,8 @@ impl i32 as I {} // CHECK:STDOUT: witness = () // CHECK:STDOUT: // CHECK:STDOUT: !requires: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: impl @i32.as.I.impl.6a2a49.1: %i32 as %I.ref { diff --git a/toolchain/check/testdata/impl/fail_self_type_mismatch.carbon b/toolchain/check/testdata/impl/fail_self_type_mismatch.carbon index a47994eff707..dcc363319fd9 100644 --- a/toolchain/check/testdata/impl/fail_self_type_mismatch.carbon +++ b/toolchain/check/testdata/impl/fail_self_type_mismatch.carbon @@ -190,6 +190,8 @@ impl i32 as I { // CHECK:STDOUT: witness = (@I.WithSelf.%I.WithSelf.F.decl) // CHECK:STDOUT: // CHECK:STDOUT: !requires: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: impl @bool.as.I.impl: %.loc24 as %I.ref { @@ -290,6 +292,8 @@ impl i32 as I { // CHECK:STDOUT: %.3: %C.8dc = converted %c.param, [concrete = ] // CHECK:STDOUT: %i32.as.I.impl.F.call: init %empty_tuple.type = call %F.ref() // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: specific @C(constants.%T, constants.%X) { diff --git a/toolchain/check/testdata/impl/forward_decls.carbon b/toolchain/check/testdata/impl/forward_decls.carbon index 4cdd6a7e40cb..a3582c69407c 100644 --- a/toolchain/check/testdata/impl/forward_decls.carbon +++ b/toolchain/check/testdata/impl/forward_decls.carbon @@ -277,6 +277,8 @@ impl C as Y {} // CHECK:STDOUT: witness = () // CHECK:STDOUT: // CHECK:STDOUT: !requires: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: impl @empty_struct_type.as.I.impl: %.loc4_7.2 as %I.ref.loc4 { @@ -356,6 +358,8 @@ impl C as Y {} // CHECK:STDOUT: witness = (@I.WithSelf.%I.WithSelf.G.decl) // CHECK:STDOUT: // CHECK:STDOUT: !requires: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: impl @empty_struct_type.as.I.impl: %.loc4_7.2 as %I.ref.loc4 { @@ -376,6 +380,8 @@ impl C as Y {} // CHECK:STDOUT: fn @empty_struct_type.as.I.impl.G() { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: specific @I.WithSelf(constants.%Self) { @@ -469,6 +475,8 @@ impl C as Y {} // CHECK:STDOUT: witness = () // CHECK:STDOUT: // CHECK:STDOUT: !requires: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: impl @empty_struct_type.as.I.impl: %.loc4_7.2 as file.%.loc4_14.2 { @@ -573,6 +581,8 @@ impl C as Y {} // CHECK:STDOUT: witness = (@I.WithSelf.%T) // CHECK:STDOUT: // CHECK:STDOUT: !requires: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: impl @empty_struct_type.as.I.impl: %.loc6_7.2 as %.loc6_14 { @@ -700,6 +710,8 @@ impl C as Y {} // CHECK:STDOUT: witness = (@I.WithSelf.%T) // CHECK:STDOUT: // CHECK:STDOUT: !requires: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: impl @C.as.I.impl: %C.ref.loc7 as %.loc7_13 { @@ -724,6 +736,8 @@ impl C as Y {} // CHECK:STDOUT: !entry: // CHECK:STDOUT: %.loc9: %empty_tuple.type = tuple_literal () [concrete = constants.%empty_tuple] // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: specific @I.WithSelf(constants.%Self) { @@ -843,6 +857,8 @@ impl C as Y {} // CHECK:STDOUT: witness = (@I.WithSelf.%T) // CHECK:STDOUT: // CHECK:STDOUT: !requires: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: impl @C.as.I.impl: %C.ref.loc7 as %.loc7_13 { @@ -867,6 +883,8 @@ impl C as Y {} // CHECK:STDOUT: !entry: // CHECK:STDOUT: %.loc9: %empty_tuple.type = tuple_literal () [concrete = constants.%empty_tuple] // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: specific @I.WithSelf(constants.%Self) { @@ -953,6 +971,8 @@ impl C as Y {} // CHECK:STDOUT: witness = (@I.WithSelf.%T) // CHECK:STDOUT: // CHECK:STDOUT: !requires: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: impl @C.as.I.impl: %C.ref.loc7 as %I.ref.loc7 { @@ -976,6 +996,8 @@ impl C as Y {} // CHECK:STDOUT: !entry: // CHECK:STDOUT: %.loc13: %empty_tuple.type = tuple_literal () [concrete = constants.%empty_tuple] // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: specific @I.WithSelf(constants.%Self) { @@ -1059,6 +1081,8 @@ impl C as Y {} // CHECK:STDOUT: witness = () // CHECK:STDOUT: // CHECK:STDOUT: !requires: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: impl @D.as..impl: %D.ref.loc13 as { @@ -1210,6 +1234,8 @@ impl C as Y {} // CHECK:STDOUT: witness = (@I.WithSelf.%T) // CHECK:STDOUT: // CHECK:STDOUT: !requires: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: @@ -1386,6 +1412,8 @@ impl C as Y {} // CHECK:STDOUT: witness = () // CHECK:STDOUT: // CHECK:STDOUT: !requires: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: impl @D.as.I.impl: %D.ref.loc5 as %I.ref.loc5 { @@ -1423,6 +1451,8 @@ impl C as Y {} // CHECK:STDOUT: fn @F(%x.param.loc14: %C.fd5) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: specific @C(constants.%T) { @@ -1511,6 +1541,8 @@ impl C as Y {} // CHECK:STDOUT: witness = () // CHECK:STDOUT: // CHECK:STDOUT: !requires: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: interface @J { @@ -1522,6 +1554,8 @@ impl C as Y {} // CHECK:STDOUT: witness = () // CHECK:STDOUT: // CHECK:STDOUT: !requires: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: impl @empty_struct_type.as..impl: %.loc10_7.2 as ; @@ -1621,6 +1655,8 @@ impl C as Y {} // CHECK:STDOUT: witness = (@I.WithSelf.%T, @I.WithSelf.%U) // CHECK:STDOUT: // CHECK:STDOUT: !requires: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: impl @C.as.I.impl: %C.ref.loc9 as %.loc9_13 { @@ -1808,6 +1844,8 @@ impl C as Y {} // CHECK:STDOUT: witness = () // CHECK:STDOUT: // CHECK:STDOUT: !requires: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: interface @Y { @@ -1819,6 +1857,8 @@ impl C as Y {} // CHECK:STDOUT: witness = () // CHECK:STDOUT: // CHECK:STDOUT: !requires: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: impl @C.as.X.impl: %C.ref.loc12 as %X.ref.loc12 { @@ -1856,6 +1896,8 @@ impl C as Y {} // CHECK:STDOUT: fn() { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: @@ -1873,6 +1915,8 @@ impl C as Y {} // CHECK:STDOUT: fn(%u.param.loc35: @G.%U.as_type.loc7_16.1 (%U.as_type)) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: @@ -1893,6 +1937,8 @@ impl C as Y {} // CHECK:STDOUT: %G.specific_fn: = specific_function %G.ref, @G(constants.%X.facet) [concrete = constants.%G.specific_fn] // CHECK:STDOUT: %G.call: init %empty_tuple.type = call %G.specific_fn(%c.ref) // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: specific @F(constants.%_) { diff --git a/toolchain/check/testdata/impl/generic_redeclaration.carbon b/toolchain/check/testdata/impl/generic_redeclaration.carbon index da3d9b947151..334f6c261a58 100644 --- a/toolchain/check/testdata/impl/generic_redeclaration.carbon +++ b/toolchain/check/testdata/impl/generic_redeclaration.carbon @@ -296,6 +296,8 @@ impl forall [T:! type] T as I { // CHECK:STDOUT: witness = () // CHECK:STDOUT: // CHECK:STDOUT: !requires: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: interface @I { @@ -307,6 +309,8 @@ impl forall [T:! type] T as I { // CHECK:STDOUT: witness = () // CHECK:STDOUT: // CHECK:STDOUT: !requires: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: interface @J { @@ -318,6 +322,8 @@ impl forall [T:! type] T as I { // CHECK:STDOUT: witness = () // CHECK:STDOUT: // CHECK:STDOUT: !requires: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: interface @K { @@ -329,6 +335,8 @@ impl forall [T:! type] T as I { // CHECK:STDOUT: witness = () // CHECK:STDOUT: // CHECK:STDOUT: !requires: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: interface @L { @@ -340,6 +348,8 @@ impl forall [T:! type] T as I { // CHECK:STDOUT: witness = () // CHECK:STDOUT: // CHECK:STDOUT: !requires: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: generic impl @T.as_type.as.Interface.impl.72f(%T.loc12_15.1: %I.type) { @@ -548,6 +558,8 @@ impl forall [T:! type] T as I { // CHECK:STDOUT: witness = () // CHECK:STDOUT: // CHECK:STDOUT: !requires: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: interface @J { @@ -559,6 +571,8 @@ impl forall [T:! type] T as I { // CHECK:STDOUT: witness = () // CHECK:STDOUT: // CHECK:STDOUT: !requires: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: generic impl @T.as_type.as.J.impl.377648.1(%T.loc7_15.1: %I.type) { @@ -674,6 +688,8 @@ impl forall [T:! type] T as I { // CHECK:STDOUT: witness = () // CHECK:STDOUT: // CHECK:STDOUT: !requires: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: impl @C.as.I.impl.e103db.1: %C.ref as %I.ref { @@ -784,6 +800,8 @@ impl forall [T:! type] T as I { // CHECK:STDOUT: witness = () // CHECK:STDOUT: // CHECK:STDOUT: !requires: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: generic impl @T.as.I.impl.812d8b.1(%T.loc4_15.2: type) { @@ -857,6 +875,8 @@ impl forall [T:! type] T as I { // CHECK:STDOUT: fn() { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: @@ -866,6 +886,8 @@ impl forall [T:! type] T as I { // CHECK:STDOUT: fn() { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: @@ -878,6 +900,8 @@ impl forall [T:! type] T as I { // CHECK:STDOUT: %.loc19_26.2: init %empty_tuple.type = tuple_init () [concrete = constants.%empty_tuple] // CHECK:STDOUT: %.loc19_27: init %empty_tuple.type = converted %.loc19_26.1, %.loc19_26.2 [concrete = constants.%empty_tuple] // CHECK:STDOUT: return %.loc19_27 +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: @@ -895,6 +919,8 @@ impl forall [T:! type] T as I { // CHECK:STDOUT: %T.as.I.impl.C.specific_fn.loc21_12.1: = specific_function %C.ref, @T.as.I.impl.C(constants.%T) [symbolic = %T.as.I.impl.C.specific_fn.loc21_12.2 (constants.%T.as.I.impl.C.specific_fn)] // CHECK:STDOUT: %T.as.I.impl.C.call: init %empty_tuple.type = call %T.as.I.impl.C.specific_fn.loc21_12.1() // CHECK:STDOUT: return %T.as.I.impl.C.call +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/impl/impl_as.carbon b/toolchain/check/testdata/impl/impl_as.carbon index bd8b679ccd7c..6ab997c1cda1 100644 --- a/toolchain/check/testdata/impl/impl_as.carbon +++ b/toolchain/check/testdata/impl/impl_as.carbon @@ -89,6 +89,8 @@ class C { // CHECK:STDOUT: witness = (@Simple.WithSelf.%Simple.WithSelf.F.decl) // CHECK:STDOUT: // CHECK:STDOUT: !requires: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: impl @C.as.Simple.impl: %Self.ref as %Simple.ref { @@ -137,6 +139,8 @@ class C { // CHECK:STDOUT: %Destroy.Op.bound: = bound_method %c.var, constants.%Destroy.Op.1a2547.2 // CHECK:STDOUT: %Destroy.Op.call: init %empty_tuple.type = call %Destroy.Op.bound(%c.var) // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Destroy.Op.loc23_7.1(%self.param: ref %empty_struct_type) = "no_op"; @@ -144,6 +148,8 @@ class C { // CHECK:STDOUT: fn @Destroy.Op.loc23_7.2(%self.param: ref %C) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: specific @Simple.WithSelf(constants.%Self.f79) { diff --git a/toolchain/check/testdata/impl/impl_assoc_const_with_prelude.carbon b/toolchain/check/testdata/impl/impl_assoc_const_with_prelude.carbon index d43aa7b91172..b28dab70b1a2 100644 --- a/toolchain/check/testdata/impl/impl_assoc_const_with_prelude.carbon +++ b/toolchain/check/testdata/impl/impl_assoc_const_with_prelude.carbon @@ -237,6 +237,8 @@ impl () as I where .X = {.a = true, .b = (1, 2)} and .X = {.a = false, .b = (3, // CHECK:STDOUT: witness = (@I.WithSelf.%X) // CHECK:STDOUT: // CHECK:STDOUT: !requires: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: impl @empty_tuple.type.as.I.impl: %.loc6_7.2 as %.loc6_14 { @@ -430,6 +432,8 @@ impl () as I where .X = {.a = true, .b = (1, 2)} and .X = {.a = false, .b = (3, // CHECK:STDOUT: witness = (@I.WithSelf.%X) // CHECK:STDOUT: // CHECK:STDOUT: !requires: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: impl @empty_tuple.type.as..impl: %.loc10_7.2 as { diff --git a/toolchain/check/testdata/impl/impl_forall.carbon b/toolchain/check/testdata/impl/impl_forall.carbon index 92aa08e43084..49cd4f99195c 100644 --- a/toolchain/check/testdata/impl/impl_forall.carbon +++ b/toolchain/check/testdata/impl/impl_forall.carbon @@ -74,6 +74,8 @@ impl forall [T:! type] T as Simple { // CHECK:STDOUT: witness = (@Simple.WithSelf.%Simple.WithSelf.F.decl) // CHECK:STDOUT: // CHECK:STDOUT: !requires: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: generic impl @T.as.Simple.impl(%T.loc19_15.2: type) { @@ -107,6 +109,8 @@ impl forall [T:! type] T as Simple { // CHECK:STDOUT: fn() { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/impl/impl_thunk.carbon b/toolchain/check/testdata/impl/impl_thunk.carbon index 809d946b5428..6469d271ad90 100644 --- a/toolchain/check/testdata/impl/impl_thunk.carbon +++ b/toolchain/check/testdata/impl/impl_thunk.carbon @@ -439,6 +439,8 @@ impl () as I({}) { // CHECK:STDOUT: %Destroy.Op.bound: = bound_method %.loc10_48.2, constants.%Destroy.Op.1a2547.3 // CHECK:STDOUT: %Destroy.Op.call: init %empty_tuple.type = call %Destroy.Op.bound(%.loc10_48.2) // CHECK:STDOUT: return %.loc10_48.14 to %return.param +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Destroy.Op.loc10_48.1(%self.param: ref %empty_struct_type) = "no_op"; @@ -448,6 +450,8 @@ impl () as I({}) { // CHECK:STDOUT: fn @Destroy.Op.loc10_48.3(%self.param: ref %struct_type.d.c.b36) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- inheritance_conversion.carbon @@ -554,6 +558,8 @@ impl () as I({}) { // CHECK:STDOUT: %bound_method.loc14_37.2: = bound_method %.loc14_37.5, %specific_fn // CHECK:STDOUT: %ptr.as.Copy.impl.Op.call: init %ptr.432 = call %bound_method.loc14_37.2(%.loc14_37.5) // CHECK:STDOUT: return %ptr.as.Copy.impl.Op.call +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- inheritance_value_conversion.carbon @@ -613,6 +619,8 @@ impl () as I({}) { // CHECK:STDOUT: // CHECK:STDOUT: %B.as.X.impl.F.call: init %empty_tuple.type = call %B.as.X.impl.F.bound(%.6, %.10) // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- inheritance_value_conversion_pointer.carbon @@ -719,6 +727,8 @@ impl () as I({}) { // CHECK:STDOUT: %bound_method.loc14_37.2: = bound_method %.loc14_37.5, %specific_fn // CHECK:STDOUT: %ptr.as.Copy.impl.Op.call: init %ptr.432 = call %bound_method.loc14_37.2(%.loc14_37.5) // CHECK:STDOUT: return %ptr.as.Copy.impl.Op.call +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- inheritance_value_conversion_pointer_addr.carbon @@ -825,6 +835,8 @@ impl () as I({}) { // CHECK:STDOUT: %bound_method.loc14_37.2: = bound_method %.loc14_37.5, %specific_fn // CHECK:STDOUT: %ptr.as.Copy.impl.Op.call: init %ptr.432 = call %bound_method.loc14_37.2(%.loc14_37.5) // CHECK:STDOUT: return %ptr.as.Copy.impl.Op.call +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- inheritance_ref_conversion.carbon @@ -884,6 +896,8 @@ impl () as I({}) { // CHECK:STDOUT: // CHECK:STDOUT: %B.as.X.impl.F.call: init %empty_tuple.type = call %B.as.X.impl.F.bound(%.6, %.9) // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- form_parameter.carbon @@ -965,6 +979,8 @@ impl () as I({}) { // CHECK:STDOUT: // CHECK:STDOUT: %C.as.I.impl.F.call: init %empty_tuple.type = call %F.ref(%x.param, %.5) // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- fail_inheritance_value_conversion_copy_return.carbon @@ -1029,6 +1045,8 @@ impl () as I({}) { // CHECK:STDOUT: %Destroy.Op.bound: = bound_method %.loc23_14.3, constants.%Destroy.Op.1a2547.2 // CHECK:STDOUT: %Destroy.Op.call: init %empty_tuple.type = call %Destroy.Op.bound(%.loc23_14.3) // CHECK:STDOUT: return to %return.param +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Destroy.Op.loc23_14.1(%self.param: ref %empty_struct_type) = "no_op"; @@ -1036,6 +1054,8 @@ impl () as I({}) { // CHECK:STDOUT: fn @Destroy.Op.loc23_14.2(%self.param: ref %A) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- generic_function.carbon @@ -1171,6 +1191,8 @@ impl () as I({}) { // CHECK:STDOUT: %.loc10_32.1: ref @empty_tuple.type.as.I.impl.F.loc10_34.1.%U.as_type.loc10_26.1 (%U.as_type.c1c) = splice_block %return.param {} // CHECK:STDOUT: %Copy.WithSelf.Op.call: init @empty_tuple.type.as.I.impl.F.loc10_34.1.%U.as_type.loc10_26.1 (%U.as_type.c1c) to %.loc10_32.1 = call %bound_method.loc10_43.2(%x.ref) // CHECK:STDOUT: return %Copy.WithSelf.Op.call to %return.param +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: @@ -1194,6 +1216,8 @@ impl () as I({}) { // CHECK:STDOUT: %empty_tuple.type.as.I.impl.F.specific_fn.loc10_34.1: = specific_function %F.ref, @empty_tuple.type.as.I.impl.F.loc10_34.1(constants.%Copy.facet) [symbolic = %empty_tuple.type.as.I.impl.F.specific_fn.loc10_34.2 (constants.%empty_tuple.type.as.I.impl.F.specific_fn)] // CHECK:STDOUT: %empty_tuple.type.as.I.impl.F.call: init @empty_tuple.type.as.I.impl.F.loc10_34.2.%ptr (%ptr.e8f) = call %empty_tuple.type.as.I.impl.F.specific_fn.loc10_34.1(%x.param) // CHECK:STDOUT: return %empty_tuple.type.as.I.impl.F.call +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: @@ -1386,6 +1410,8 @@ impl () as I({}) { // CHECK:STDOUT: %.loc10_49.1: ref @empty_tuple.type.as.I.impl.F.loc10_51.1.%U.as_type.loc10_43.1 (%U.as_type.c1c) = splice_block %return.param {} // CHECK:STDOUT: %Copy.WithSelf.Op.call: init @empty_tuple.type.as.I.impl.F.loc10_51.1.%U.as_type.loc10_43.1 (%U.as_type.c1c) to %.loc10_49.1 = call %bound_method.loc10_60.2(%x.ref) // CHECK:STDOUT: return %Copy.WithSelf.Op.call to %return.param +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: @@ -1411,6 +1437,8 @@ impl () as I({}) { // CHECK:STDOUT: %bound_method: = bound_method %self.param, %empty_tuple.type.as.I.impl.F.specific_fn.loc10_51.1 // CHECK:STDOUT: %empty_tuple.type.as.I.impl.F.call: init @empty_tuple.type.as.I.impl.F.loc10_51.2.%ptr (%ptr.e8f) = call %bound_method(%self.param, %x.param) // CHECK:STDOUT: return %empty_tuple.type.as.I.impl.F.call +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: @@ -1533,6 +1561,8 @@ impl () as I({}) { // CHECK:STDOUT: %Destroy.Op.bound: = bound_method %.loc10_29.2, constants.%Destroy.Op.1a2547.2 // CHECK:STDOUT: %Destroy.Op.call: init %empty_tuple.type = call %Destroy.Op.bound(%.loc10_29.2) // CHECK:STDOUT: return %.loc10_29.14 to %return.param +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Destroy.Op.loc10_29.1(%self.param: ref %empty_struct_type) = "no_op"; @@ -1540,5 +1570,7 @@ impl () as I({}) { // CHECK:STDOUT: fn @Destroy.Op.loc10_29.2(%self.param: ref %struct_type.b.a.1b0) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/impl/impl_thunk_min_prelude.carbon b/toolchain/check/testdata/impl/impl_thunk_min_prelude.carbon index 307187a8a51c..78faa8e159c8 100644 --- a/toolchain/check/testdata/impl/impl_thunk_min_prelude.carbon +++ b/toolchain/check/testdata/impl/impl_thunk_min_prelude.carbon @@ -154,5 +154,7 @@ fn Call() -> i32 { // CHECK:STDOUT: %.loc18_13.2: %i32 = converted %int_2, %.loc18_13.1 [concrete = constants.%int_2.295] // CHECK:STDOUT: %i32.as.Add.impl.Op.call: init %i32 = call %i32.as.Add.impl.Op.specific_fn(%a.ref, %.loc18_13.2) // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/impl/import_builtin_call.carbon b/toolchain/check/testdata/impl/import_builtin_call.carbon index 3806c594b73b..6d45310ae8a0 100644 --- a/toolchain/check/testdata/impl/import_builtin_call.carbon +++ b/toolchain/check/testdata/impl/import_builtin_call.carbon @@ -107,6 +107,8 @@ var n: Int(64) = MakeFromClass(FromLiteral(64) as OtherInt); // CHECK:STDOUT: %Double.specific_fn: = specific_function %Double.ref, @Double(constants.%int_64) [concrete = constants.%Double.specific_fn] // CHECK:STDOUT: %Double.call: init %MyInt.9fc = call %Double.specific_fn(%n.ref) // CHECK:STDOUT: return %Double.call +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- use_convert_symbolic.carbon @@ -197,5 +199,7 @@ var n: Int(64) = MakeFromClass(FromLiteral(64) as OtherInt); // CHECK:STDOUT: %MakeFromClass.call: init %i64.builtin = call %MakeFromClass.specific_fn() // CHECK:STDOUT: assign file.%n.var, %MakeFromClass.call // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/impl/import_compound.carbon b/toolchain/check/testdata/impl/import_compound.carbon index 43b78a957c47..a32060543814 100644 --- a/toolchain/check/testdata/impl/import_compound.carbon +++ b/toolchain/check/testdata/impl/import_compound.carbon @@ -182,6 +182,8 @@ fn InstanceCallImportFail() { // CHECK:STDOUT: witness = (@NonInstance.WithSelf.%NonInstance.WithSelf.F.decl) // CHECK:STDOUT: // CHECK:STDOUT: !requires: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: interface @Instance { @@ -209,6 +211,8 @@ fn InstanceCallImportFail() { // CHECK:STDOUT: witness = (@Instance.WithSelf.%Instance.WithSelf.G.decl) // CHECK:STDOUT: // CHECK:STDOUT: !requires: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: impl @struct_type.i.as.NonInstance.impl: %struct_type.i as %NonInstance.ref { @@ -247,6 +251,8 @@ fn InstanceCallImportFail() { // CHECK:STDOUT: fn @struct_type.i.as.NonInstance.impl.F() { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: generic fn @Instance.WithSelf.G(@Instance.%Self: %Instance.type) { @@ -262,6 +268,8 @@ fn InstanceCallImportFail() { // CHECK:STDOUT: fn @struct_type.i.as.Instance.impl.G(%self.param: %struct_type.i) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: specific @NonInstance.WithSelf(constants.%Self.a14) { @@ -373,6 +381,8 @@ fn InstanceCallImportFail() { // CHECK:STDOUT: witness = (imports.%Main.F) // CHECK:STDOUT: // CHECK:STDOUT: !requires: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: impl @struct_type.i.as.NonInstance.impl: imports.%Main.import_ref.c9a as imports.%Main.import_ref.282 [from "lib.carbon"] { @@ -392,6 +402,8 @@ fn InstanceCallImportFail() { // CHECK:STDOUT: %impl.elem0: %.a34 = impl_witness_access constants.%NonInstance.impl_witness, element0 [concrete = constants.%struct_type.i.as.NonInstance.impl.F] // CHECK:STDOUT: %struct_type.i.as.NonInstance.impl.F.call: init %empty_tuple.type = call %impl.elem0() // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: generic fn @NonInstance.WithSelf.F(imports.%Main.import_ref.9ad11e.2: %NonInstance.type) [from "lib.carbon"] { @@ -483,6 +495,8 @@ fn InstanceCallImportFail() { // CHECK:STDOUT: witness = (imports.%Main.F) // CHECK:STDOUT: // CHECK:STDOUT: !requires: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @NonInstanceCallImportFail(%n.param: %struct_type.i) { @@ -492,6 +506,8 @@ fn InstanceCallImportFail() { // CHECK:STDOUT: %F.ref: %NonInstance.assoc_type = name_ref F, imports.%Main.import_ref.a5f [concrete = constants.%assoc0.8c6] // CHECK:STDOUT: %.loc13: %NonInstance.type = converted %n.ref, [concrete = ] // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: generic fn @NonInstance.WithSelf.F(imports.%Main.import_ref.9ad11e.2: %NonInstance.type) [from "lib.carbon"] { @@ -576,6 +592,8 @@ fn InstanceCallImportFail() { // CHECK:STDOUT: witness = (imports.%Main.F) // CHECK:STDOUT: // CHECK:STDOUT: !requires: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @NonInstanceCallIndirectImport(%p.param: %ptr) { @@ -586,6 +604,8 @@ fn InstanceCallImportFail() { // CHECK:STDOUT: %.loc13_4.1: ref %struct_type.i = deref %p.ref // CHECK:STDOUT: %.loc13_4.2: %NonInstance.type = converted %.loc13_4.1, [concrete = ] // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: generic fn @NonInstance.WithSelf.F(imports.%Main.import_ref.9ad11e.2: %NonInstance.type) [from "lib.carbon"] { @@ -701,6 +721,8 @@ fn InstanceCallImportFail() { // CHECK:STDOUT: witness = (imports.%Main.G) // CHECK:STDOUT: // CHECK:STDOUT: !requires: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: impl @struct_type.i.as.Instance.impl: imports.%Main.import_ref.c9a as imports.%Main.import_ref.fd3 [from "lib.carbon"] { @@ -717,6 +739,8 @@ fn InstanceCallImportFail() { // CHECK:STDOUT: %bound_method: = bound_method %n.ref, %impl.elem0 // CHECK:STDOUT: %struct_type.i.as.Instance.impl.G.call: init %empty_tuple.type = call %bound_method(%n.ref) // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: generic fn @Instance.WithSelf.G(imports.%Main.import_ref.a85b8b.2: %Instance.type) [from "lib.carbon"] { @@ -746,6 +770,8 @@ fn InstanceCallImportFail() { // CHECK:STDOUT: %.loc10_4.4: %struct_type.i = converted %.loc10_4.1, %struct [concrete = constants.%struct] // CHECK:STDOUT: %struct_type.i.as.Instance.impl.G.call: init %empty_tuple.type = call %bound_method(%.loc10_4.4) // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: specific @Instance.WithSelf(constants.%Self) { @@ -826,6 +852,8 @@ fn InstanceCallImportFail() { // CHECK:STDOUT: witness = (imports.%Main.G) // CHECK:STDOUT: // CHECK:STDOUT: !requires: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: impl @struct_type.i.as.Instance.impl: imports.%Main.import_ref.c9a as imports.%Main.import_ref.fd3 [from "lib.carbon"] { @@ -841,6 +869,8 @@ fn InstanceCallImportFail() { // CHECK:STDOUT: %Instance.ref: type = name_ref Instance, imports.%Main.Instance [concrete = constants.%Instance.type] // CHECK:STDOUT: %G.ref: %Instance.assoc_type = name_ref G, imports.%Main.import_ref.756 [concrete = constants.%assoc0] // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: generic fn @Instance.WithSelf.G(imports.%Main.import_ref.a85b8b.2: %Instance.type) [from "lib.carbon"] { diff --git a/toolchain/check/testdata/impl/import_extend_impl.carbon b/toolchain/check/testdata/impl/import_extend_impl.carbon index c014c2443462..4ffe87f374cd 100644 --- a/toolchain/check/testdata/impl/import_extend_impl.carbon +++ b/toolchain/check/testdata/impl/import_extend_impl.carbon @@ -80,6 +80,8 @@ fn G(c: C) { // CHECK:STDOUT: witness = (@I.WithSelf.%I.WithSelf.F.decl) // CHECK:STDOUT: // CHECK:STDOUT: !requires: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: impl @C.as.I.impl: %Self.ref as %I.ref { @@ -114,6 +116,8 @@ fn G(c: C) { // CHECK:STDOUT: fn @C.as.I.impl.F() { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: specific @I.WithSelf(constants.%Self) { @@ -207,6 +211,8 @@ fn G(c: C) { // CHECK:STDOUT: witness = (imports.%Main.F) // CHECK:STDOUT: // CHECK:STDOUT: !requires: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: impl @C.as.I.impl: imports.%Main.import_ref.5dc as imports.%Main.import_ref.c3f793.2 [from "extend_impl_library.carbon"] { @@ -234,6 +240,8 @@ fn G(c: C) { // CHECK:STDOUT: %impl.elem0.loc8: %.92e = impl_witness_access constants.%I.impl_witness, element0 [concrete = constants.%C.as.I.impl.F] // CHECK:STDOUT: %C.as.I.impl.F.call.loc8: init %empty_tuple.type = call %impl.elem0.loc8() // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: generic fn @I.WithSelf.F(imports.%Main.import_ref.e59c42.2: %I.type) [from "extend_impl_library.carbon"] { diff --git a/toolchain/check/testdata/impl/import_generic.carbon b/toolchain/check/testdata/impl/import_generic.carbon index 42525f6f205a..0eebe8d2bb25 100644 --- a/toolchain/check/testdata/impl/import_generic.carbon +++ b/toolchain/check/testdata/impl/import_generic.carbon @@ -246,6 +246,8 @@ impl forall [T:! type] D as N(T*) {} // CHECK:STDOUT: witness = () // CHECK:STDOUT: // CHECK:STDOUT: !requires: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: @@ -285,6 +287,8 @@ impl forall [T:! type] D as N(T*) {} // CHECK:STDOUT: @J.WithSelf.Self.as_type.impls.I.type.require { // CHECK:STDOUT: require @J.WithSelf.Self.as_type.impls.I.type.require.%Self.as_type.loc5_18.1 impls @J.WithSelf.Self.as_type.impls.I.type.require.%I.type.loc5_27.1 // CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: @@ -409,6 +413,8 @@ impl forall [T:! type] D as N(T*) {} // CHECK:STDOUT: witness = () // CHECK:STDOUT: // CHECK:STDOUT: !requires: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: @@ -430,6 +436,8 @@ impl forall [T:! type] D as N(T*) {} // CHECK:STDOUT: @J.WithSelf.Self.as_type.impls.I.type.require { // CHECK:STDOUT: require imports.%Main.import_ref.91b impls imports.%Main.import_ref.e01 // CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: @@ -611,6 +619,8 @@ impl forall [T:! type] D as N(T*) {} // CHECK:STDOUT: witness = () // CHECK:STDOUT: // CHECK:STDOUT: !requires: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: @@ -762,6 +772,8 @@ impl forall [T:! type] D as N(T*) {} // CHECK:STDOUT: witness = () // CHECK:STDOUT: // CHECK:STDOUT: !requires: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: @@ -1001,6 +1013,8 @@ impl forall [T:! type] D as N(T*) {} // CHECK:STDOUT: witness = () // CHECK:STDOUT: // CHECK:STDOUT: !requires: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: @@ -1326,6 +1340,8 @@ impl forall [T:! type] D as N(T*) {} // CHECK:STDOUT: witness = () // CHECK:STDOUT: // CHECK:STDOUT: !requires: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: @@ -1668,6 +1684,8 @@ impl forall [T:! type] D as N(T*) {} // CHECK:STDOUT: witness = () // CHECK:STDOUT: // CHECK:STDOUT: !requires: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: @@ -1898,6 +1916,8 @@ impl forall [T:! type] D as N(T*) {} // CHECK:STDOUT: witness = () // CHECK:STDOUT: // CHECK:STDOUT: !requires: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: @@ -2199,6 +2219,8 @@ impl forall [T:! type] D as N(T*) {} // CHECK:STDOUT: witness = () // CHECK:STDOUT: // CHECK:STDOUT: !requires: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: @@ -2483,6 +2505,8 @@ impl forall [T:! type] D as N(T*) {} // CHECK:STDOUT: witness = () // CHECK:STDOUT: // CHECK:STDOUT: !requires: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/impl/import_interface_assoc_const.carbon b/toolchain/check/testdata/impl/import_interface_assoc_const.carbon index c4b9eb0ab3ee..3b5b38e74e20 100644 --- a/toolchain/check/testdata/impl/import_interface_assoc_const.carbon +++ b/toolchain/check/testdata/impl/import_interface_assoc_const.carbon @@ -249,6 +249,8 @@ impl CD as IF where .F = 0 { // CHECK:STDOUT: witness = (@I.WithSelf.%T) // CHECK:STDOUT: // CHECK:STDOUT: !requires: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: interface @I3 { @@ -274,6 +276,8 @@ impl CD as IF where .F = 0 { // CHECK:STDOUT: witness = (@I3.WithSelf.%T1, @I3.WithSelf.%T2, @I3.WithSelf.%T3) // CHECK:STDOUT: // CHECK:STDOUT: !requires: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: interface @NonType { @@ -291,6 +295,8 @@ impl CD as IF where .F = 0 { // CHECK:STDOUT: witness = (@NonType.WithSelf.%Y) // CHECK:STDOUT: // CHECK:STDOUT: !requires: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: specific @I.WithSelf(constants.%Self.37e) {} @@ -364,6 +370,8 @@ impl CD as IF where .F = 0 { // CHECK:STDOUT: witness = (imports.%Main.T) // CHECK:STDOUT: // CHECK:STDOUT: !requires: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: impl @C1.as.I.impl: %C1.ref as %.loc5_14 { @@ -477,6 +485,8 @@ impl CD as IF where .F = 0 { // CHECK:STDOUT: witness = (imports.%Main.T) // CHECK:STDOUT: // CHECK:STDOUT: !requires: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: impl @C2.as.I.impl: %C2.ref.loc5 as %.loc5_14 { @@ -578,6 +588,8 @@ impl CD as IF where .F = 0 { // CHECK:STDOUT: witness = (imports.%Main.T) // CHECK:STDOUT: // CHECK:STDOUT: !requires: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: impl @C3.as.I.impl.a51: %C3.ref as %I.ref; @@ -696,6 +708,8 @@ impl CD as IF where .F = 0 { // CHECK:STDOUT: witness = (imports.%Main.T) // CHECK:STDOUT: // CHECK:STDOUT: !requires: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: impl @C4.as.I.impl.eff: %C4.ref as %.loc9_14; @@ -858,6 +872,8 @@ impl CD as IF where .F = 0 { // CHECK:STDOUT: witness = (imports.%Main.T1, imports.%Main.T2, imports.%Main.T3) // CHECK:STDOUT: // CHECK:STDOUT: !requires: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: impl @C5.as..impl.f79ae5.1: %C5.ref as ; @@ -953,6 +969,8 @@ impl CD as IF where .F = 0 { // CHECK:STDOUT: witness = (imports.%Main.T) // CHECK:STDOUT: // CHECK:STDOUT: !requires: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: impl @C6.as.I.impl.6c7: %C6.ref as %.loc5_14; @@ -1059,6 +1077,8 @@ impl CD as IF where .F = 0 { // CHECK:STDOUT: witness = (imports.%Main.T) // CHECK:STDOUT: // CHECK:STDOUT: !requires: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: impl @C7.as..impl: %C7.ref as { @@ -1155,6 +1175,8 @@ impl CD as IF where .F = 0 { // CHECK:STDOUT: witness = (imports.%Main.T) // CHECK:STDOUT: // CHECK:STDOUT: !requires: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: impl @C8.as..impl: %C8.ref as { @@ -1250,6 +1272,8 @@ impl CD as IF where .F = 0 { // CHECK:STDOUT: witness = (imports.%Main.T) // CHECK:STDOUT: // CHECK:STDOUT: !requires: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: impl @C9.as..impl: %C9.ref as { @@ -1344,6 +1368,8 @@ impl CD as IF where .F = 0 { // CHECK:STDOUT: witness = (imports.%Main.T) // CHECK:STDOUT: // CHECK:STDOUT: !requires: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: impl @CA.as..impl: %CA.ref as { @@ -1442,6 +1468,8 @@ impl CD as IF where .F = 0 { // CHECK:STDOUT: witness = (imports.%Main.T) // CHECK:STDOUT: // CHECK:STDOUT: !requires: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: impl @CB.as.I.impl: %CB.ref as %.loc6_14 { @@ -1545,6 +1573,8 @@ impl CD as IF where .F = 0 { // CHECK:STDOUT: witness = (imports.%Main.Y) // CHECK:STDOUT: // CHECK:STDOUT: !requires: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: impl @CC.as.NonType.impl: %CC.ref as %.loc6_20 { @@ -1609,6 +1639,8 @@ impl CD as IF where .F = 0 { // CHECK:STDOUT: witness = (@IF.WithSelf.%IF.WithSelf.F.decl) // CHECK:STDOUT: // CHECK:STDOUT: !requires: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: generic fn @IF.WithSelf.F(@IF.%Self: %IF.type) { @@ -1688,6 +1720,8 @@ impl CD as IF where .F = 0 { // CHECK:STDOUT: witness = (imports.%Main.F) // CHECK:STDOUT: // CHECK:STDOUT: !requires: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: impl @CD.as.IF.impl: %CD.ref as %.loc10_15 { @@ -1716,6 +1750,8 @@ impl CD as IF where .F = 0 { // CHECK:STDOUT: fn @CD.as.IF.impl.F() { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: specific @IF.WithSelf(constants.%Self) { diff --git a/toolchain/check/testdata/impl/import_self.carbon b/toolchain/check/testdata/impl/import_self.carbon index 84ce5d2dbc60..53f2d75a6906 100644 --- a/toolchain/check/testdata/impl/import_self.carbon +++ b/toolchain/check/testdata/impl/import_self.carbon @@ -115,6 +115,8 @@ fn F(x: C, y: C) -> C { // CHECK:STDOUT: witness = (@Add.WithSelf.%Add.WithSelf.Op.decl) // CHECK:STDOUT: // CHECK:STDOUT: !requires: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: generic fn @Add.WithSelf.Op(@Add.%Self: %Add.type) { @@ -250,6 +252,8 @@ fn F(x: C, y: C) -> C { // CHECK:STDOUT: witness = (imports.%Main.Op) // CHECK:STDOUT: // CHECK:STDOUT: !requires: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: impl @C.as.Add.impl: %C.ref as %Add.ref { @@ -320,6 +324,8 @@ fn F(x: C, y: C) -> C { // CHECK:STDOUT: %.loc9_66.3: init %C = as_compatible %.loc9_66.2 [concrete = constants.%empty_tuple.4db] // CHECK:STDOUT: %.loc9_66.4: init %C = converted %.loc9_62.2, %.loc9_66.3 [concrete = constants.%empty_tuple.4db] // CHECK:STDOUT: return %.loc9_66.4 +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @F(%x.param: %C, %y.param: %C) -> out %return.param: %C { @@ -332,6 +338,8 @@ fn F(x: C, y: C) -> C { // CHECK:STDOUT: %y.ref: %C = name_ref y, %y // CHECK:STDOUT: %C.as.Add.impl.Op.call: init %C = call %bound_method(%x.ref, %y.ref) // CHECK:STDOUT: return %C.as.Add.impl.Op.call +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: specific @Add.WithSelf(constants.%Self) { diff --git a/toolchain/check/testdata/impl/import_self_specific.carbon b/toolchain/check/testdata/impl/import_self_specific.carbon index 97b7cf2ba359..5b12486016bb 100644 --- a/toolchain/check/testdata/impl/import_self_specific.carbon +++ b/toolchain/check/testdata/impl/import_self_specific.carbon @@ -161,6 +161,8 @@ impl forall [N:! E] D(N) as I where .Assoc = () { // CHECK:STDOUT: witness = () // CHECK:STDOUT: // CHECK:STDOUT: !requires: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: interface @Z { @@ -172,6 +174,8 @@ impl forall [N:! E] D(N) as I where .Assoc = () { // CHECK:STDOUT: witness = () // CHECK:STDOUT: // CHECK:STDOUT: !requires: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: interface @I { @@ -211,6 +215,8 @@ impl forall [N:! E] D(N) as I where .Assoc = () { // CHECK:STDOUT: witness = (@I.WithSelf.%Assoc, @I.WithSelf.%I.WithSelf.F.decl) // CHECK:STDOUT: // CHECK:STDOUT: !requires: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: generic impl @T.as.Y.impl(%T.loc5_15.1: type) { @@ -504,6 +510,8 @@ impl forall [N:! E] D(N) as I where .Assoc = () { // CHECK:STDOUT: witness = (imports.%Main.Assoc, imports.%Main.F) // CHECK:STDOUT: // CHECK:STDOUT: !requires: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: interface @Z [from "impl_def.carbon"] { @@ -512,6 +520,8 @@ impl forall [N:! E] D(N) as I where .Assoc = () { // CHECK:STDOUT: witness = () // CHECK:STDOUT: // CHECK:STDOUT: !requires: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: interface @Y [from "impl_def.carbon"] { @@ -520,6 +530,8 @@ impl forall [N:! E] D(N) as I where .Assoc = () { // CHECK:STDOUT: witness = () // CHECK:STDOUT: // CHECK:STDOUT: !requires: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: generic impl @U.as.Z.impl(imports.%Main.import_ref.b3bc94.1: type) [from "impl_def.carbon"] { @@ -644,6 +656,8 @@ impl forall [N:! E] D(N) as I where .Assoc = () { // CHECK:STDOUT: fn(%c.param: %C.00e) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/impl/import_thunk.carbon b/toolchain/check/testdata/impl/import_thunk.carbon index ed2f607a31fa..3d5afe11e86a 100644 --- a/toolchain/check/testdata/impl/import_thunk.carbon +++ b/toolchain/check/testdata/impl/import_thunk.carbon @@ -98,6 +98,8 @@ fn G() { // CHECK:STDOUT: witness = (@I.WithSelf.%I.WithSelf.F.decl) // CHECK:STDOUT: // CHECK:STDOUT: !requires: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: generic fn @I.WithSelf.F(@I.%Self: %I.type) { @@ -224,6 +226,8 @@ fn G() { // CHECK:STDOUT: witness = (imports.%Main.F) // CHECK:STDOUT: // CHECK:STDOUT: !requires: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: generic impl @C.as.I.impl(%Y.loc7_15.2: %empty_tuple.type) { @@ -302,6 +306,8 @@ fn G() { // CHECK:STDOUT: fn(%x.param: @C.as.I.impl.F.loc8_24.1.%C.loc8_21.1 (%C.6b1ed7.2)) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: @@ -346,6 +352,8 @@ fn G() { // CHECK:STDOUT: %bound_method.2: = bound_method %.5, %specific_impl_fn.1 [symbolic = %bound_method.4 (constants.%bound_method.ef4)] // CHECK:STDOUT: %Destroy.WithSelf.Op.call: init %empty_tuple.type = call %bound_method.2(%.5) // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: @@ -527,6 +535,8 @@ fn G() { // CHECK:STDOUT: witness = (imports.%Main.F.006) // CHECK:STDOUT: // CHECK:STDOUT: !requires: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: generic impl @C.as.I.impl(imports.%Main.import_ref.c90e1a.4: %empty_tuple.type) [from "b.carbon"] { @@ -588,6 +598,8 @@ fn G() { // CHECK:STDOUT: %C.as.I.impl.F.call: init %empty_tuple.type = call %C.as.I.impl.F.specific_fn(%.loc7_16.7) // CHECK:STDOUT: %Destroy.Op.call: init %empty_tuple.type = call constants.%Destroy.Op.bound(constants.%.790) // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: generic fn @I.WithSelf.F(imports.%Main.import_ref.e59c42.2: %I.type) [from "a.carbon"] { @@ -634,6 +646,8 @@ fn G() { // CHECK:STDOUT: fn @Destroy.Op.loc7_16.2(%self.param: ref %C.2c9) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: specific @C(constants.%X) { diff --git a/toolchain/check/testdata/impl/import_use_generic.carbon b/toolchain/check/testdata/impl/import_use_generic.carbon index 840078f71072..083915072418 100644 --- a/toolchain/check/testdata/impl/import_use_generic.carbon +++ b/toolchain/check/testdata/impl/import_use_generic.carbon @@ -124,6 +124,8 @@ fn H() -> C({}).(I.F)() {} // CHECK:STDOUT: witness = (@I.WithSelf.%I.WithSelf.F.decl) // CHECK:STDOUT: // CHECK:STDOUT: !requires: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: generic impl @C.as.I.impl(%T.loc10_15.2: type) { @@ -173,6 +175,8 @@ fn H() -> C({}).(I.F)() {} // CHECK:STDOUT: fn() { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: @@ -329,6 +333,8 @@ fn H() -> C({}).(I.F)() {} // CHECK:STDOUT: witness = (imports.%Main.F) // CHECK:STDOUT: // CHECK:STDOUT: !requires: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: generic impl @C.as.I.impl(imports.%Main.import_ref.b3bc94.3: type) [from "import_generic.carbon"] { @@ -367,6 +373,8 @@ fn H() -> C({}).(I.F)() {} // CHECK:STDOUT: // CHECK:STDOUT: fn @G() -> { // CHECK:STDOUT: !entry: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: generic fn @C.as.I.impl.F(imports.%Main.import_ref.b3bc94.2: type) [from "import_generic.carbon"] { @@ -377,6 +385,8 @@ fn H() -> C({}).(I.F)() {} // CHECK:STDOUT: // CHECK:STDOUT: fn @H() -> { // CHECK:STDOUT: !entry: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @__global_init() { @@ -386,6 +396,8 @@ fn H() -> C({}).(I.F)() {} // CHECK:STDOUT: %.loc6_1: init %C.d8e = converted %.loc6_17.1, %.loc6_17.2 [concrete = constants.%C.val] // CHECK:STDOUT: assign file.%c.var, %.loc6_1 // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: specific @C(constants.%T) { diff --git a/toolchain/check/testdata/impl/incomplete.carbon b/toolchain/check/testdata/impl/incomplete.carbon index 9d9bb7ba8b80..3b7188f33445 100644 --- a/toolchain/check/testdata/impl/incomplete.carbon +++ b/toolchain/check/testdata/impl/incomplete.carbon @@ -424,6 +424,8 @@ interface B { // CHECK:STDOUT: witness = () // CHECK:STDOUT: // CHECK:STDOUT: !requires: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: interface @Incomplete; @@ -543,6 +545,8 @@ interface B { // CHECK:STDOUT: witness = (@J.WithSelf.%T) // CHECK:STDOUT: // CHECK:STDOUT: !requires: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: interface @Incomplete; @@ -629,6 +633,8 @@ interface B { // CHECK:STDOUT: witness = () // CHECK:STDOUT: // CHECK:STDOUT: !requires: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: interface @Incomplete; @@ -793,6 +799,8 @@ interface B { // CHECK:STDOUT: @X.WithSelf.Self.as_type.impls.Y.type.require { // CHECK:STDOUT: require @X.WithSelf.Self.as_type.impls.Y.type.require.%Self.as_type.loc12_11.1 impls @X.WithSelf.Self.as_type.impls.Y.type.require.%Y.ref // CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: constraint @Y { @@ -837,6 +845,8 @@ interface B { // CHECK:STDOUT: fn() { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: @@ -902,6 +912,8 @@ interface B { // CHECK:STDOUT: witness = () // CHECK:STDOUT: // CHECK:STDOUT: !requires: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: constraint @A; diff --git a/toolchain/check/testdata/impl/interface_args.carbon b/toolchain/check/testdata/impl/interface_args.carbon index cf660c7639c9..f45c5be37f33 100644 --- a/toolchain/check/testdata/impl/interface_args.carbon +++ b/toolchain/check/testdata/impl/interface_args.carbon @@ -191,6 +191,8 @@ fn InstanceC(a: A) -> C { // CHECK:STDOUT: witness = (@ImplicitAs.WithSelf.%ImplicitAs.WithSelf.Convert.decl) // CHECK:STDOUT: // CHECK:STDOUT: !requires: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: @@ -358,6 +360,8 @@ fn InstanceC(a: A) -> C { // CHECK:STDOUT: witness = (@Action.WithSelf.%Action.WithSelf.Op.decl) // CHECK:STDOUT: // CHECK:STDOUT: !requires: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: @@ -418,6 +422,8 @@ fn InstanceC(a: A) -> C { // CHECK:STDOUT: fn @A.as.Action.impl.Op(%self.param: %A) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @F(%a.param: %A) { @@ -432,6 +438,8 @@ fn InstanceC(a: A) -> C { // CHECK:STDOUT: %bound_method: = bound_method %a.ref, %impl.elem0 // CHECK:STDOUT: %A.as.Action.impl.Op.call: init %empty_tuple.type = call %bound_method(%a.ref) // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: specific @Action(constants.%T) { @@ -604,6 +612,8 @@ fn InstanceC(a: A) -> C { // CHECK:STDOUT: witness = (imports.%Main.Op) // CHECK:STDOUT: // CHECK:STDOUT: !requires: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: @@ -652,6 +662,8 @@ fn InstanceC(a: A) -> C { // CHECK:STDOUT: %bound_method: = bound_method %a.ref, %impl.elem0 // CHECK:STDOUT: %A.as.Action.impl.Op.call: init %empty_tuple.type = call %bound_method(%a.ref) // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @A.as.Action.impl.Op [from "action.carbon"]; @@ -811,6 +823,8 @@ fn InstanceC(a: A) -> C { // CHECK:STDOUT: witness = (imports.%Main.Op) // CHECK:STDOUT: // CHECK:STDOUT: !requires: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: @@ -863,6 +877,8 @@ fn InstanceC(a: A) -> C { // CHECK:STDOUT: %.loc8: %Action.assoc_type.35c = specific_constant imports.%Main.import_ref.00f, @Action.WithSelf(constants.%C, constants.%Self.ea2) [concrete = constants.%assoc0.940] // CHECK:STDOUT: %Op.ref: %Action.assoc_type.35c = name_ref Op, %.loc8 [concrete = constants.%assoc0.940] // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: specific @Action(constants.%T) { @@ -1058,6 +1074,8 @@ fn InstanceC(a: A) -> C { // CHECK:STDOUT: witness = (@Factory.WithSelf.%Factory.WithSelf.Make.decl, @Factory.WithSelf.%Factory.WithSelf.Method.decl) // CHECK:STDOUT: // CHECK:STDOUT: !requires: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: @@ -1383,6 +1401,8 @@ fn InstanceC(a: A) -> C { // CHECK:STDOUT: witness = (imports.%Main.Make, imports.%Main.Method) // CHECK:STDOUT: // CHECK:STDOUT: !requires: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: @@ -1448,6 +1468,8 @@ fn InstanceC(a: A) -> C { // CHECK:STDOUT: %.loc4_15.1: ref %B = splice_block %return.param {} // CHECK:STDOUT: %A.as.Factory.impl.Make.call: init %B to %.loc4_15.1 = call %impl.elem0() // CHECK:STDOUT: return %A.as.Factory.impl.Make.call to %return.param +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @A.as.Factory.impl.Make [from "factory.carbon"]; @@ -1465,6 +1487,8 @@ fn InstanceC(a: A) -> C { // CHECK:STDOUT: %.loc7_23.1: ref %B = splice_block %return.param {} // CHECK:STDOUT: %A.as.Factory.impl.Method.call: init %B to %.loc7_23.1 = call %bound_method(%a.ref) // CHECK:STDOUT: return %A.as.Factory.impl.Method.call to %return.param +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @A.as.Factory.impl.Method [from "factory.carbon"]; @@ -1679,6 +1703,8 @@ fn InstanceC(a: A) -> C { // CHECK:STDOUT: witness = (imports.%Main.Make, imports.%Main.Method) // CHECK:STDOUT: // CHECK:STDOUT: !requires: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: @@ -1747,6 +1773,8 @@ fn InstanceC(a: A) -> C { // CHECK:STDOUT: %.loc13: %Factory.assoc_type.fc0 = specific_constant imports.%Main.import_ref.a26, @Factory.WithSelf(constants.%C, constants.%Self.3e3) [concrete = constants.%assoc0.c53] // CHECK:STDOUT: %Make.ref: %Factory.assoc_type.fc0 = name_ref Make, %.loc13 [concrete = constants.%assoc0.c53] // CHECK:STDOUT: return to %return.param +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @InstanceC(%a.param: %A) -> out %return.param: %C { @@ -1758,6 +1786,8 @@ fn InstanceC(a: A) -> C { // CHECK:STDOUT: %.loc21: %Factory.assoc_type.fc0 = specific_constant imports.%Main.import_ref.1ef, @Factory.WithSelf(constants.%C, constants.%Self.3e3) [concrete = constants.%assoc1.f6c] // CHECK:STDOUT: %Method.ref: %Factory.assoc_type.fc0 = name_ref Method, %.loc21 [concrete = constants.%assoc1.f6c] // CHECK:STDOUT: return to %return.param +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: specific @Factory(constants.%T) { diff --git a/toolchain/check/testdata/impl/lookup/alias.carbon b/toolchain/check/testdata/impl/lookup/alias.carbon index d89b13181bbb..0ccbc6c1a176 100644 --- a/toolchain/check/testdata/impl/lookup/alias.carbon +++ b/toolchain/check/testdata/impl/lookup/alias.carbon @@ -92,6 +92,8 @@ fn G(c: C) { // CHECK:STDOUT: witness = (@HasF.WithSelf.%HasF.WithSelf.F.decl) // CHECK:STDOUT: // CHECK:STDOUT: !requires: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: impl @C.as.HasF.impl: %C.ref as %HasF.ref { @@ -125,6 +127,8 @@ fn G(c: C) { // CHECK:STDOUT: fn @C.as.HasF.impl.F() { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @G(%c.param: %C) { @@ -138,6 +142,8 @@ fn G(c: C) { // CHECK:STDOUT: %impl.elem0.loc29: %.34f = impl_witness_access constants.%HasF.impl_witness, element0 [concrete = constants.%C.as.HasF.impl.F] // CHECK:STDOUT: %C.as.HasF.impl.F.call.loc29: init %empty_tuple.type = call %impl.elem0.loc29() // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: specific @HasF.WithSelf(constants.%Self) { diff --git a/toolchain/check/testdata/impl/lookup/canonical_query_self.carbon b/toolchain/check/testdata/impl/lookup/canonical_query_self.carbon index 1481aaab7789..cd9a3b0705eb 100644 --- a/toolchain/check/testdata/impl/lookup/canonical_query_self.carbon +++ b/toolchain/check/testdata/impl/lookup/canonical_query_self.carbon @@ -227,6 +227,8 @@ fn G() { // CHECK:STDOUT: witness = (@I.WithSelf.%I.WithSelf.II.decl) // CHECK:STDOUT: // CHECK:STDOUT: !requires: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: interface @J { @@ -254,6 +256,8 @@ fn G() { // CHECK:STDOUT: witness = (@J.WithSelf.%J.WithSelf.JJ.decl) // CHECK:STDOUT: // CHECK:STDOUT: !requires: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: impl @C.as.I.impl: %Self.ref as %I.ref { @@ -391,6 +395,8 @@ fn G() { // CHECK:STDOUT: %bound_method.loc26_73: = bound_method %t.ref, %specific_impl_fn.loc26_69.1 // CHECK:STDOUT: %J.WithSelf.JJ.call: init %empty_tuple.type = call %bound_method.loc26_73(%t.ref) // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: @@ -452,16 +458,22 @@ fn G() { // CHECK:STDOUT: %Destroy.Op.call.loc46: init %empty_tuple.type = call constants.%Destroy.Op.bound(constants.%.5d3) // CHECK:STDOUT: %Destroy.Op.call.loc40: init %empty_tuple.type = call constants.%Destroy.Op.bound(constants.%.5d3) // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @C.as.I.impl.II(%self.param: %C) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @C.as.J.impl.JJ(%self.param: %C) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Destroy.Op.loc46_11.1(%self.param: ref %empty_struct_type) = "no_op"; @@ -469,6 +481,8 @@ fn G() { // CHECK:STDOUT: fn @Destroy.Op.loc46_11.2(%self.param: ref %C) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: specific @I.WithSelf(constants.%Self.37e) { diff --git a/toolchain/check/testdata/impl/lookup/fail_alias_impl_not_found.carbon b/toolchain/check/testdata/impl/lookup/fail_alias_impl_not_found.carbon index 95c2253140d5..34906f3f75af 100644 --- a/toolchain/check/testdata/impl/lookup/fail_alias_impl_not_found.carbon +++ b/toolchain/check/testdata/impl/lookup/fail_alias_impl_not_found.carbon @@ -84,6 +84,8 @@ fn F(c: C) { // CHECK:STDOUT: witness = (@I.WithSelf.%I.WithSelf.F.decl) // CHECK:STDOUT: // CHECK:STDOUT: !requires: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: class @C { @@ -110,6 +112,8 @@ fn F(c: C) { // CHECK:STDOUT: %c.ref: %C = name_ref c, %c // CHECK:STDOUT: %F.ref.loc33: %I.assoc_type = name_ref F, @C.%F [concrete = constants.%assoc0] // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: specific @I.WithSelf(constants.%Self) { diff --git a/toolchain/check/testdata/impl/lookup/fail_todo_undefined_impl.carbon b/toolchain/check/testdata/impl/lookup/fail_todo_undefined_impl.carbon index 3372a199df97..6f81bfe642a5 100644 --- a/toolchain/check/testdata/impl/lookup/fail_todo_undefined_impl.carbon +++ b/toolchain/check/testdata/impl/lookup/fail_todo_undefined_impl.carbon @@ -112,6 +112,8 @@ fn G() { // CHECK:STDOUT: witness = (@I.WithSelf.%I.WithSelf.F.decl) // CHECK:STDOUT: // CHECK:STDOUT: !requires: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: impl @C.as.I.impl.ac9: %Self.ref as %I.ref; @@ -152,11 +154,15 @@ fn G() { // CHECK:STDOUT: %F.ref: %I.assoc_type = name_ref F, @I.WithSelf.%assoc0 [concrete = constants.%assoc0] // CHECK:STDOUT: %impl.elem0: %.010 = impl_witness_access constants.%I.impl_witness.4e9, element0 [concrete = ] // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @C.as.I.impl.F() { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @G() { @@ -165,6 +171,8 @@ fn G() { // CHECK:STDOUT: %F.ref: %I.assoc_type = name_ref F, @I.WithSelf.%assoc0 [concrete = constants.%assoc0] // CHECK:STDOUT: %impl.elem0: %.010 = impl_witness_access constants.%I.impl_witness.4e9, element0 [concrete = ] // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: specific @I.WithSelf(constants.%Self) { diff --git a/toolchain/check/testdata/impl/lookup/generic.carbon b/toolchain/check/testdata/impl/lookup/generic.carbon index b281769f223d..1c58efeba8c4 100644 --- a/toolchain/check/testdata/impl/lookup/generic.carbon +++ b/toolchain/check/testdata/impl/lookup/generic.carbon @@ -241,6 +241,8 @@ fn G(x: A) { // CHECK:STDOUT: witness = (@HasF.WithSelf.%HasF.WithSelf.F.decl) // CHECK:STDOUT: // CHECK:STDOUT: !requires: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: generic impl @T.as.HasF.impl(%T.loc8_15.2: type) { @@ -293,6 +295,8 @@ fn G(x: A) { // CHECK:STDOUT: fn(%self.param: @T.as.HasF.impl.F.%T (%T)) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: @@ -307,6 +311,8 @@ fn G(x: A) { // CHECK:STDOUT: %bound_method.loc13_14: = bound_method %x.ref, %specific_fn // CHECK:STDOUT: %T.as.HasF.impl.F.call: init %empty_tuple.type = call %bound_method.loc13_14(%x.ref) // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: specific @HasF.WithSelf(constants.%Self) { @@ -547,6 +553,8 @@ fn G(x: A) { // CHECK:STDOUT: witness = (@HasF.WithSelf.%HasF.WithSelf.F.decl) // CHECK:STDOUT: // CHECK:STDOUT: !requires: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: generic impl @ptr.as.HasF.impl(%T.loc8_15.2: type) { @@ -632,6 +640,8 @@ fn G(x: A) { // CHECK:STDOUT: %bound_method.loc9_29.2: = bound_method %self.ref, %specific_impl_fn.loc9_29.1 // CHECK:STDOUT: %Copy.WithSelf.Op.call: init @ptr.as.HasF.impl.F.%ptr.loc9_8 (%ptr.e8f) = call %bound_method.loc9_29.2(%self.ref) // CHECK:STDOUT: return %Copy.WithSelf.Op.call +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: @@ -646,6 +656,8 @@ fn G(x: A) { // CHECK:STDOUT: %bound_method.loc13_21: = bound_method %x.ref, %specific_fn // CHECK:STDOUT: %ptr.as.HasF.impl.F.call: init %ptr.c28 = call %bound_method.loc13_21(%x.ref) // CHECK:STDOUT: return %ptr.as.HasF.impl.F.call +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: specific @HasF.WithSelf(constants.%Self.c62) { @@ -876,6 +888,8 @@ fn G(x: A) { // CHECK:STDOUT: witness = (@HasF.WithSelf.%HasF.WithSelf.F.decl) // CHECK:STDOUT: // CHECK:STDOUT: !requires: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: generic impl @C.as.HasF.impl(%T.loc10_15.2: type) { @@ -945,6 +959,8 @@ fn G(x: A) { // CHECK:STDOUT: fn(%self.param: @C.as.HasF.impl.F.%C (%C.1d0)) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: @@ -959,6 +975,8 @@ fn G(x: A) { // CHECK:STDOUT: %bound_method.loc15_14: = bound_method %x.ref, %specific_fn // CHECK:STDOUT: %C.as.HasF.impl.F.call: init %empty_tuple.type = call %bound_method.loc15_14(%x.ref) // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: specific @HasF.WithSelf(constants.%Self) { @@ -1191,6 +1209,8 @@ fn G(x: A) { // CHECK:STDOUT: witness = (@HasF.WithSelf.%HasF.WithSelf.F.decl) // CHECK:STDOUT: // CHECK:STDOUT: !requires: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: @@ -1242,6 +1262,8 @@ fn G(x: A) { // CHECK:STDOUT: fn(%self.param: %empty_struct_type) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: @@ -1260,6 +1282,8 @@ fn G(x: A) { // CHECK:STDOUT: %bound_method.loc13_18: = bound_method %x.ref, %specific_fn // CHECK:STDOUT: %empty_struct_type.as.HasF.impl.F.call: init %empty_tuple.type = call %bound_method.loc13_18(%x.ref) // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: specific @HasF(constants.%T) { @@ -1480,6 +1504,8 @@ fn G(x: A) { // CHECK:STDOUT: witness = (@HasF.WithSelf.%HasF.WithSelf.F.decl) // CHECK:STDOUT: // CHECK:STDOUT: !requires: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: generic impl @T.as.HasF.impl(%T.loc12_15.2: type, %U.loc12_25.2: type) { @@ -1534,6 +1560,8 @@ fn G(x: A) { // CHECK:STDOUT: fn(%self.param: @T.as.HasF.impl.F.%T (%T)) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: @@ -1543,6 +1571,8 @@ fn G(x: A) { // CHECK:STDOUT: %HasF.ref: type = name_ref HasF, file.%HasF.decl [concrete = constants.%HasF.type] // CHECK:STDOUT: %F.ref: %HasF.assoc_type = name_ref F, @HasF.WithSelf.%assoc0 [concrete = constants.%assoc0] // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: specific @HasF.WithSelf(constants.%Self) { @@ -1711,6 +1741,8 @@ fn G(x: A) { // CHECK:STDOUT: witness = (@HasF.WithSelf.%HasF.WithSelf.F.decl) // CHECK:STDOUT: // CHECK:STDOUT: !requires: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: @@ -1784,6 +1816,8 @@ fn G(x: A) { // CHECK:STDOUT: fn(%self.param: @T.as.HasF.impl.F.%T (%T)) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: @@ -1796,6 +1830,8 @@ fn G(x: A) { // CHECK:STDOUT: %.loc22: %HasF.assoc_type.43e = specific_constant @HasF.WithSelf.%assoc0.loc5_13.1, @HasF.WithSelf(constants.%B, constants.%Self.822) [concrete = constants.%assoc0.613] // CHECK:STDOUT: %F.ref: %HasF.assoc_type.43e = name_ref F, %.loc22 [concrete = constants.%assoc0.613] // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: specific @HasF(constants.%T) { diff --git a/toolchain/check/testdata/impl/lookup/impl_forall.carbon b/toolchain/check/testdata/impl/lookup/impl_forall.carbon index e50cf161489f..6f192f39f377 100644 --- a/toolchain/check/testdata/impl/lookup/impl_forall.carbon +++ b/toolchain/check/testdata/impl/lookup/impl_forall.carbon @@ -250,6 +250,8 @@ fn TestSpecific(a: A({})*) -> {}* { // CHECK:STDOUT: %bound_method.loc14_12.2: = bound_method %addr, %specific_impl_fn.loc14_12.1 // CHECK:STDOUT: %Copy.WithSelf.Op.call: init @A.as.I.impl.F.%ptr.loc13_22.1 (%ptr.e8f8f9.2) = call %bound_method.loc14_12.2(%addr) // CHECK:STDOUT: return %Copy.WithSelf.Op.call +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: @@ -285,6 +287,8 @@ fn TestSpecific(a: A({})*) -> {}* { // CHECK:STDOUT: %bound_method.loc21_22: = bound_method %.loc21_11.1, %specific_impl_fn.loc21_11.1 // CHECK:STDOUT: %I.WithSelf.F.call: init @TestGeneric.%ptr.loc19_40.1 (%ptr.e8f8f9.4) = call %bound_method.loc21_22(%.loc21_11.1) // CHECK:STDOUT: return %I.WithSelf.F.call +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: @@ -304,6 +308,8 @@ fn TestSpecific(a: A({})*) -> {}* { // CHECK:STDOUT: %bound_method.loc27_23: = bound_method %.loc27_11, %specific_fn // CHECK:STDOUT: %A.as.I.impl.F.call: init %ptr.c28 = call %bound_method.loc27_23(%.loc27_11) // CHECK:STDOUT: return %A.as.I.impl.F.call +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: specific @A.as.I.impl(constants.%V.67d) { diff --git a/toolchain/check/testdata/impl/lookup/import.carbon b/toolchain/check/testdata/impl/lookup/import.carbon index 3d783997a8fd..4b7cb056b113 100644 --- a/toolchain/check/testdata/impl/lookup/import.carbon +++ b/toolchain/check/testdata/impl/lookup/import.carbon @@ -298,6 +298,8 @@ fn Test(c: HasExtraInterfaces.C(type)) { // CHECK:STDOUT: witness = (@HasF.WithSelf.%HasF.WithSelf.F.decl) // CHECK:STDOUT: // CHECK:STDOUT: !requires: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: impl @C.as.HasF.impl: %C.ref as %HasF.ref { @@ -339,6 +341,8 @@ fn Test(c: HasExtraInterfaces.C(type)) { // CHECK:STDOUT: fn @C.as.HasF.impl.F(%self.param: %C) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: specific @HasF.WithSelf(constants.%Self) { @@ -494,6 +498,8 @@ fn Test(c: HasExtraInterfaces.C(type)) { // CHECK:STDOUT: witness = (@HasG.WithSelf.%HasG.WithSelf.G.decl) // CHECK:STDOUT: // CHECK:STDOUT: !requires: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: interface @HasF [from "package_a.carbon"] { @@ -503,6 +509,8 @@ fn Test(c: HasExtraInterfaces.C(type)) { // CHECK:STDOUT: witness = (imports.%PackageA.F) // CHECK:STDOUT: // CHECK:STDOUT: !requires: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: impl @C.as.HasG.impl: %C.ref as %HasG.ref { @@ -587,6 +595,8 @@ fn Test(c: HasExtraInterfaces.C(type)) { // CHECK:STDOUT: fn @C.as.HasG.impl.G(%self.param: %C) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: generic fn @HasF.WithSelf.F(imports.%PackageA.import_ref.b7072f.2: %HasF.type) [from "package_a.carbon"] { @@ -602,11 +612,15 @@ fn Test(c: HasExtraInterfaces.C(type)) { // CHECK:STDOUT: fn @D.as.HasF.impl.F(%self.param: %D) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @D.as.HasG.impl.G(%self.param: %D) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: specific @HasG.WithSelf(constants.%Self.150) { @@ -769,6 +783,8 @@ fn Test(c: HasExtraInterfaces.C(type)) { // CHECK:STDOUT: witness = (imports.%PackageA.F) // CHECK:STDOUT: // CHECK:STDOUT: !requires: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: impl @C.as.HasF.impl: imports.%PackageA.import_ref.364 as imports.%PackageA.import_ref.e71 [from "package_a.carbon"] { @@ -793,6 +809,8 @@ fn Test(c: HasExtraInterfaces.C(type)) { // CHECK:STDOUT: %bound_method: = bound_method %c.ref, %impl.elem0 // CHECK:STDOUT: %C.as.HasF.impl.F.call: init %empty_tuple.type = call %bound_method(%c.ref) // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: generic fn @HasF.WithSelf.F(imports.%PackageA.import_ref.b7072f.2: %HasF.type) [from "package_a.carbon"] { @@ -925,6 +943,8 @@ fn Test(c: HasExtraInterfaces.C(type)) { // CHECK:STDOUT: witness = (imports.%PackageA.F) // CHECK:STDOUT: // CHECK:STDOUT: !requires: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: impl @C.as.HasF.impl: imports.%PackageA.import_ref.364 as imports.%PackageA.import_ref.e71 [from "package_a.carbon"] { @@ -961,6 +981,8 @@ fn Test(c: HasExtraInterfaces.C(type)) { // CHECK:STDOUT: %bound_method: = bound_method %d.ref, %impl.elem0 // CHECK:STDOUT: %D.as.HasF.impl.F.call: init %empty_tuple.type = call %bound_method(%d.ref) // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: generic fn @HasF.WithSelf.F(imports.%PackageA.import_ref.b7072f.2: %HasF.type) [from "package_a.carbon"] { @@ -1093,6 +1115,8 @@ fn Test(c: HasExtraInterfaces.C(type)) { // CHECK:STDOUT: witness = (imports.%PackageB.G) // CHECK:STDOUT: // CHECK:STDOUT: !requires: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: impl @C.as.HasG.impl: imports.%PackageB.import_ref.473 as imports.%PackageB.import_ref.e35e93.1 [from "package_b.carbon"] { @@ -1129,6 +1153,8 @@ fn Test(c: HasExtraInterfaces.C(type)) { // CHECK:STDOUT: %bound_method: = bound_method %c.ref, %impl.elem0 // CHECK:STDOUT: %C.as.HasG.impl.G.call: init %empty_tuple.type = call %bound_method(%c.ref) // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: generic fn @HasG.WithSelf.G(imports.%PackageB.import_ref.10cb76.2: %HasG.type) [from "package_b.carbon"] { @@ -1256,6 +1282,8 @@ fn Test(c: HasExtraInterfaces.C(type)) { // CHECK:STDOUT: witness = (imports.%PackageB.G) // CHECK:STDOUT: // CHECK:STDOUT: !requires: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: impl @C.as.HasG.impl: imports.%PackageB.import_ref.473 as imports.%PackageB.import_ref.e35e93.1 [from "package_b.carbon"] { @@ -1292,6 +1320,8 @@ fn Test(c: HasExtraInterfaces.C(type)) { // CHECK:STDOUT: %bound_method: = bound_method %d.ref, %impl.elem0 // CHECK:STDOUT: %D.as.HasG.impl.G.call: init %empty_tuple.type = call %bound_method(%d.ref) // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: generic fn @HasG.WithSelf.G(imports.%PackageB.import_ref.10cb76.2: %HasG.type) [from "package_b.carbon"] { @@ -1400,6 +1430,8 @@ fn Test(c: HasExtraInterfaces.C(type)) { // CHECK:STDOUT: witness = (@Z.WithSelf.%Z.WithSelf.H.decl) // CHECK:STDOUT: // CHECK:STDOUT: !requires: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: impl @empty_tuple.type.as.Z.impl: %.loc8_7.2 as %Z.ref { @@ -1433,6 +1465,8 @@ fn Test(c: HasExtraInterfaces.C(type)) { // CHECK:STDOUT: fn @empty_tuple.type.as.Z.impl.H(%self.param: %empty_tuple.type) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: specific @Z.WithSelf(constants.%Self) { @@ -1532,6 +1566,8 @@ fn Test(c: HasExtraInterfaces.C(type)) { // CHECK:STDOUT: witness = (imports.%PackageAssociatedInterface.H) // CHECK:STDOUT: // CHECK:STDOUT: !requires: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: impl @empty_tuple.type.as.Z.impl: imports.%PackageAssociatedInterface.import_ref.e5c as imports.%PackageAssociatedInterface.import_ref.72a [from "associated_interface.carbon"] { @@ -1551,6 +1587,8 @@ fn Test(c: HasExtraInterfaces.C(type)) { // CHECK:STDOUT: %.loc7_4.2: %empty_tuple.type = converted %.loc7_4.1, %empty_tuple [concrete = constants.%empty_tuple] // CHECK:STDOUT: %empty_tuple.type.as.Z.impl.H.call: init %empty_tuple.type = call %bound_method(%.loc7_4.2) // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: generic fn @Z.WithSelf.H(imports.%PackageAssociatedInterface.import_ref.f4f417.2: %Z.type) [from "associated_interface.carbon"] { @@ -1673,6 +1711,8 @@ fn Test(c: HasExtraInterfaces.C(type)) { // CHECK:STDOUT: witness = (@Y.WithSelf.%Y.WithSelf.K.decl) // CHECK:STDOUT: // CHECK:STDOUT: !requires: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: generic class @AnyParam(%T.loc4_17.2: type, %X.loc4_27.2: @AnyParam.%T.loc4_17.1 (%T)) { @@ -1706,6 +1746,8 @@ fn Test(c: HasExtraInterfaces.C(type)) { // CHECK:STDOUT: fn(%self.param: @Y.WithSelf.K.%Self.as_type.loc7_15.1 (%Self.as_type)) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: @@ -1860,6 +1902,8 @@ fn Test(c: HasExtraInterfaces.C(type)) { // CHECK:STDOUT: witness = () // CHECK:STDOUT: // CHECK:STDOUT: !requires: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: @@ -1870,6 +1914,8 @@ fn Test(c: HasExtraInterfaces.C(type)) { // CHECK:STDOUT: witness = (imports.%PackageHasParam.K) // CHECK:STDOUT: // CHECK:STDOUT: !requires: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: impl @AnyParam.as.Y.impl: %AnyParam as %Y.ref { @@ -1923,6 +1969,8 @@ fn Test(c: HasExtraInterfaces.C(type)) { // CHECK:STDOUT: fn @AnyParam.as.Y.impl.K(%self.param: %AnyParam.591) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @L() { @@ -1954,6 +2002,8 @@ fn Test(c: HasExtraInterfaces.C(type)) { // CHECK:STDOUT: %Destroy.Op.bound: = bound_method %obj.var, constants.%Destroy.Op.1a2547.2 // CHECK:STDOUT: %Destroy.Op.call: init %empty_tuple.type = call %Destroy.Op.bound(%obj.var) // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Destroy.Op.loc13_3.1(%self.param: ref %empty_struct_type) = "no_op"; @@ -1961,6 +2011,8 @@ fn Test(c: HasExtraInterfaces.C(type)) { // CHECK:STDOUT: fn @Destroy.Op.loc13_3.2(%self.param: ref %AnyParam.591) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: specific @GenericInterface(constants.%U) { @@ -2135,6 +2187,8 @@ fn Test(c: HasExtraInterfaces.C(type)) { // CHECK:STDOUT: witness = () // CHECK:STDOUT: // CHECK:STDOUT: !requires: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: @@ -2145,6 +2199,8 @@ fn Test(c: HasExtraInterfaces.C(type)) { // CHECK:STDOUT: witness = (imports.%PackageHasParam.K) // CHECK:STDOUT: // CHECK:STDOUT: !requires: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: impl @AnyParam.as.Y.impl: imports.%PackageGenericInterface.import_ref.82e as imports.%PackageGenericInterface.import_ref.482 [from "has_generic_interface.carbon"] { @@ -2199,6 +2255,8 @@ fn Test(c: HasExtraInterfaces.C(type)) { // CHECK:STDOUT: %Destroy.Op.bound: = bound_method %obj.var, constants.%Destroy.Op.1a2547.2 // CHECK:STDOUT: %Destroy.Op.call: init %empty_tuple.type = call %Destroy.Op.bound(%obj.var) // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: generic fn @Y.WithSelf.K(imports.%PackageHasParam.import_ref.fa191b.2: %Y.type) [from "has_param.carbon"] { @@ -2221,6 +2279,8 @@ fn Test(c: HasExtraInterfaces.C(type)) { // CHECK:STDOUT: fn @Destroy.Op.loc8_3.2(%self.param: ref %AnyParam.591) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: specific @AnyParam(constants.%T, constants.%X) { @@ -2387,6 +2447,8 @@ fn Test(c: HasExtraInterfaces.C(type)) { // CHECK:STDOUT: witness = (imports.%PackageHasParam.K) // CHECK:STDOUT: // CHECK:STDOUT: !requires: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: impl @AnyParam.as.Y.impl: %AnyParam as %Y.ref { @@ -2455,6 +2517,8 @@ fn Test(c: HasExtraInterfaces.C(type)) { // CHECK:STDOUT: fn @AnyParam.as.Y.impl.K(%self.param: %AnyParam.21c) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @L() { @@ -2486,6 +2550,8 @@ fn Test(c: HasExtraInterfaces.C(type)) { // CHECK:STDOUT: %Destroy.Op.bound: = bound_method %obj.var, constants.%Destroy.Op.1a2547.2 // CHECK:STDOUT: %Destroy.Op.call: init %empty_tuple.type = call %Destroy.Op.bound(%obj.var) // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Destroy.Op.loc13_3.1(%self.param: ref %empty_struct_type) = "no_op"; @@ -2493,6 +2559,8 @@ fn Test(c: HasExtraInterfaces.C(type)) { // CHECK:STDOUT: fn @Destroy.Op.loc13_3.2(%self.param: ref %AnyParam.21c) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: specific @GenericClass(constants.%U) { @@ -2657,6 +2725,8 @@ fn Test(c: HasExtraInterfaces.C(type)) { // CHECK:STDOUT: witness = (imports.%PackageHasParam.K) // CHECK:STDOUT: // CHECK:STDOUT: !requires: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: impl @AnyParam.as.Y.impl: imports.%PackageGenericClass.import_ref.c77 as imports.%PackageGenericClass.import_ref.482 [from "has_generic_class.carbon"] { @@ -2725,6 +2795,8 @@ fn Test(c: HasExtraInterfaces.C(type)) { // CHECK:STDOUT: %Destroy.Op.bound: = bound_method %obj.var, constants.%Destroy.Op.1a2547.2 // CHECK:STDOUT: %Destroy.Op.call: init %empty_tuple.type = call %Destroy.Op.bound(%obj.var) // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: generic fn @Y.WithSelf.K(imports.%PackageHasParam.import_ref.fa191b.2: %Y.type) [from "has_param.carbon"] { @@ -2747,6 +2819,8 @@ fn Test(c: HasExtraInterfaces.C(type)) { // CHECK:STDOUT: fn @Destroy.Op.loc8_3.2(%self.param: ref %AnyParam.21c) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: specific @AnyParam(constants.%T, constants.%X) { @@ -2914,6 +2988,8 @@ fn Test(c: HasExtraInterfaces.C(type)) { // CHECK:STDOUT: witness = () // CHECK:STDOUT: // CHECK:STDOUT: !requires: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: interface @Extra2 { @@ -2925,6 +3001,8 @@ fn Test(c: HasExtraInterfaces.C(type)) { // CHECK:STDOUT: witness = () // CHECK:STDOUT: // CHECK:STDOUT: !requires: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: interface @Extra3 { @@ -2936,6 +3014,8 @@ fn Test(c: HasExtraInterfaces.C(type)) { // CHECK:STDOUT: witness = () // CHECK:STDOUT: // CHECK:STDOUT: !requires: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: interface @Extra4 { @@ -2947,6 +3027,8 @@ fn Test(c: HasExtraInterfaces.C(type)) { // CHECK:STDOUT: witness = () // CHECK:STDOUT: // CHECK:STDOUT: !requires: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: interface @Extra5 { @@ -2958,6 +3040,8 @@ fn Test(c: HasExtraInterfaces.C(type)) { // CHECK:STDOUT: witness = () // CHECK:STDOUT: // CHECK:STDOUT: !requires: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: interface @Extra6 { @@ -2969,6 +3053,8 @@ fn Test(c: HasExtraInterfaces.C(type)) { // CHECK:STDOUT: witness = () // CHECK:STDOUT: // CHECK:STDOUT: !requires: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: interface @Extra7 { @@ -2980,6 +3066,8 @@ fn Test(c: HasExtraInterfaces.C(type)) { // CHECK:STDOUT: witness = () // CHECK:STDOUT: // CHECK:STDOUT: !requires: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: interface @Extra8 { @@ -2991,6 +3079,8 @@ fn Test(c: HasExtraInterfaces.C(type)) { // CHECK:STDOUT: witness = () // CHECK:STDOUT: // CHECK:STDOUT: !requires: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: interface @I { @@ -3018,6 +3108,8 @@ fn Test(c: HasExtraInterfaces.C(type)) { // CHECK:STDOUT: witness = (@I.WithSelf.%I.WithSelf.F.decl) // CHECK:STDOUT: // CHECK:STDOUT: !requires: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: impl @C.as.I.impl: %C as %I.ref { @@ -3066,6 +3158,8 @@ fn Test(c: HasExtraInterfaces.C(type)) { // CHECK:STDOUT: fn @C.as.I.impl.F(%self.param: %C.279) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: specific @Extra1.WithSelf(constants.%Self.f48) {} @@ -3235,6 +3329,8 @@ fn Test(c: HasExtraInterfaces.C(type)) { // CHECK:STDOUT: witness = (imports.%HasExtraInterfaces.F) // CHECK:STDOUT: // CHECK:STDOUT: !requires: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: interface @Extra8 [from "has_extra_interfaces.carbon"] { @@ -3243,6 +3339,8 @@ fn Test(c: HasExtraInterfaces.C(type)) { // CHECK:STDOUT: witness = () // CHECK:STDOUT: // CHECK:STDOUT: !requires: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: interface @Extra7 [from "has_extra_interfaces.carbon"] { @@ -3251,6 +3349,8 @@ fn Test(c: HasExtraInterfaces.C(type)) { // CHECK:STDOUT: witness = () // CHECK:STDOUT: // CHECK:STDOUT: !requires: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: interface @Extra6 [from "has_extra_interfaces.carbon"] { @@ -3259,6 +3359,8 @@ fn Test(c: HasExtraInterfaces.C(type)) { // CHECK:STDOUT: witness = () // CHECK:STDOUT: // CHECK:STDOUT: !requires: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: interface @Extra5 [from "has_extra_interfaces.carbon"] { @@ -3267,6 +3369,8 @@ fn Test(c: HasExtraInterfaces.C(type)) { // CHECK:STDOUT: witness = () // CHECK:STDOUT: // CHECK:STDOUT: !requires: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: interface @Extra4 [from "has_extra_interfaces.carbon"] { @@ -3275,6 +3379,8 @@ fn Test(c: HasExtraInterfaces.C(type)) { // CHECK:STDOUT: witness = () // CHECK:STDOUT: // CHECK:STDOUT: !requires: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: interface @Extra3 [from "has_extra_interfaces.carbon"] { @@ -3283,6 +3389,8 @@ fn Test(c: HasExtraInterfaces.C(type)) { // CHECK:STDOUT: witness = () // CHECK:STDOUT: // CHECK:STDOUT: !requires: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: interface @Extra2 [from "has_extra_interfaces.carbon"] { @@ -3291,6 +3399,8 @@ fn Test(c: HasExtraInterfaces.C(type)) { // CHECK:STDOUT: witness = () // CHECK:STDOUT: // CHECK:STDOUT: !requires: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: interface @Extra1 [from "has_extra_interfaces.carbon"] { @@ -3299,6 +3409,8 @@ fn Test(c: HasExtraInterfaces.C(type)) { // CHECK:STDOUT: witness = () // CHECK:STDOUT: // CHECK:STDOUT: !requires: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: impl @C.as.I.impl: imports.%HasExtraInterfaces.import_ref.f05 as imports.%HasExtraInterfaces.import_ref.d6f [from "has_extra_interfaces.carbon"] { @@ -3327,6 +3439,8 @@ fn Test(c: HasExtraInterfaces.C(type)) { // CHECK:STDOUT: %I.ref: type = name_ref I, imports.%HasExtraInterfaces.I [concrete = constants.%I.type] // CHECK:STDOUT: %F.ref: %I.assoc_type = name_ref F, imports.%HasExtraInterfaces.import_ref.8f6 [concrete = constants.%assoc0] // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: generic fn @I.WithSelf.F(imports.%HasExtraInterfaces.import_ref.51a236.2: %I.type) [from "has_extra_interfaces.carbon"] { diff --git a/toolchain/check/testdata/impl/lookup/instance_method.carbon b/toolchain/check/testdata/impl/lookup/instance_method.carbon index ebea5992136c..c2c80b1fd8ca 100644 --- a/toolchain/check/testdata/impl/lookup/instance_method.carbon +++ b/toolchain/check/testdata/impl/lookup/instance_method.carbon @@ -140,6 +140,8 @@ fn F(c: C) -> i32 { // CHECK:STDOUT: witness = (@I.WithSelf.%I.WithSelf.F.decl) // CHECK:STDOUT: // CHECK:STDOUT: !requires: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: impl @C.as.I.impl: %Self.ref as %I.ref { @@ -201,6 +203,8 @@ fn F(c: C) -> i32 { // CHECK:STDOUT: %bound_method: = bound_method %c.ref, %impl.elem0 // CHECK:STDOUT: %C.as.I.impl.F.call: init %i32 = call %bound_method(%c.ref) // CHECK:STDOUT: return %C.as.I.impl.F.call +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: specific @I.WithSelf(constants.%Self) { diff --git a/toolchain/check/testdata/impl/lookup/lookup_interface_with_enclosing_generic_inside_rewrite_constraint.carbon b/toolchain/check/testdata/impl/lookup/lookup_interface_with_enclosing_generic_inside_rewrite_constraint.carbon index d3b852a2f360..8304659b80db 100644 --- a/toolchain/check/testdata/impl/lookup/lookup_interface_with_enclosing_generic_inside_rewrite_constraint.carbon +++ b/toolchain/check/testdata/impl/lookup/lookup_interface_with_enclosing_generic_inside_rewrite_constraint.carbon @@ -225,6 +225,8 @@ fn F() { // CHECK:STDOUT: witness = (@Y.WithSelf.%T) // CHECK:STDOUT: // CHECK:STDOUT: !requires: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: @@ -304,6 +306,8 @@ fn F() { // CHECK:STDOUT: fn() { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: @@ -321,6 +325,8 @@ fn F() { // CHECK:STDOUT: %Outer.G.specific_fn: = specific_function %G.ref, @Outer.G(constants.%empty_tuple.type, constants.%facet_value) [concrete = constants.%Outer.G.specific_fn] // CHECK:STDOUT: %Outer.G.call: init %empty_tuple.type = call %Outer.G.specific_fn() // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: specific @Outer(constants.%OuterParam) { @@ -557,6 +563,8 @@ fn F() { // CHECK:STDOUT: witness = () // CHECK:STDOUT: // CHECK:STDOUT: !requires: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: interface @Z2 { @@ -568,6 +576,8 @@ fn F() { // CHECK:STDOUT: witness = () // CHECK:STDOUT: // CHECK:STDOUT: !requires: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: generic interface @Y(@Outer.%OuterParam.loc6_23.2: %Z1.type) { @@ -591,6 +601,8 @@ fn F() { // CHECK:STDOUT: witness = (@Y.WithSelf.%T) // CHECK:STDOUT: // CHECK:STDOUT: !requires: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: @@ -730,6 +742,8 @@ fn F() { // CHECK:STDOUT: fn() { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: @@ -774,6 +788,8 @@ fn F() { // CHECK:STDOUT: %Outer.G.specific_fn: = specific_function %G.ref, @Outer.G(constants.%Z1.facet, constants.%facet_value.1c3) [concrete = constants.%Outer.G.specific_fn] // CHECK:STDOUT: %Outer.G.call: init %empty_tuple.type = call %Outer.G.specific_fn() // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: specific @Z1.WithSelf(constants.%Self.bc4) { diff --git a/toolchain/check/testdata/impl/lookup/specialization_with_symbolic_rewrite.carbon b/toolchain/check/testdata/impl/lookup/specialization_with_symbolic_rewrite.carbon index 3c4eb42f5ab1..1a7be58ebac5 100644 --- a/toolchain/check/testdata/impl/lookup/specialization_with_symbolic_rewrite.carbon +++ b/toolchain/check/testdata/impl/lookup/specialization_with_symbolic_rewrite.carbon @@ -285,6 +285,8 @@ fn F[T:! Ptr](var t: T) -> T.(Ptr.Type) { // CHECK:STDOUT: witness = (@Z.WithSelf.%X) // CHECK:STDOUT: // CHECK:STDOUT: !requires: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: @@ -375,6 +377,8 @@ fn F[T:! Ptr](var t: T) -> T.(Ptr.Type) { // CHECK:STDOUT: %a.patt.loc15_15.1: @F.%pattern_type (%pattern_type.d37) = value_binding_pattern a [symbolic = %a.patt.loc15_15.2 (constants.%a.patt)] // CHECK:STDOUT: } // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: @@ -707,6 +711,8 @@ fn F[T:! Ptr](var t: T) -> T.(Ptr.Type) { // CHECK:STDOUT: witness = (@Z.WithSelf.%X) // CHECK:STDOUT: // CHECK:STDOUT: !requires: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: @@ -719,6 +725,8 @@ fn F[T:! Ptr](var t: T) -> T.(Ptr.Type) { // CHECK:STDOUT: witness = () // CHECK:STDOUT: // CHECK:STDOUT: !requires: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: generic impl @T.as.Z.impl.9ba(%T.loc10_15.1: type, %S.loc10_25.1: type) { @@ -819,6 +827,8 @@ fn F[T:! Ptr](var t: T) -> T.(Ptr.Type) { // CHECK:STDOUT: %a.patt.loc22_15.1: @F.%pattern_type.loc22 (%pattern_type.dc1) = value_binding_pattern a [symbolic = %a.patt.loc22_15.2 (constants.%a.patt)] // CHECK:STDOUT: } // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: @@ -1063,6 +1073,8 @@ fn F[T:! Ptr](var t: T) -> T.(Ptr.Type) { // CHECK:STDOUT: witness = (@Ptr.WithSelf.%Type) // CHECK:STDOUT: // CHECK:STDOUT: !requires: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: generic impl @U.as.Ptr.impl(%U.loc7_21.1: type) { @@ -1126,6 +1138,8 @@ fn F[T:! Ptr](var t: T) -> T.(Ptr.Type) { // CHECK:STDOUT: %bound_method.loc10_10.2: = bound_method %addr, %specific_impl_fn.loc10_10.1 // CHECK:STDOUT: %Copy.WithSelf.Op.call: init @F.%ptr (%ptr.e8f8f9.2) = call %bound_method.loc10_10.2(%addr) // CHECK:STDOUT: return %Copy.WithSelf.Op.call +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: @@ -1316,6 +1330,8 @@ fn F[T:! Ptr](var t: T) -> T.(Ptr.Type) { // CHECK:STDOUT: witness = (@Ptr.WithSelf.%Type) // CHECK:STDOUT: // CHECK:STDOUT: !requires: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: generic impl @U.as.Ptr.impl(%U.loc7_21.1: type) { @@ -1378,6 +1394,8 @@ fn F[T:! Ptr](var t: T) -> T.(Ptr.Type) { // CHECK:STDOUT: %bound_method.loc10_10.2: = bound_method %addr, %specific_impl_fn.loc10_10.1 // CHECK:STDOUT: %Copy.WithSelf.Op.call: init @F.%ptr (%ptr.ac4) = call %bound_method.loc10_10.2(%addr) // CHECK:STDOUT: return %Copy.WithSelf.Op.call +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: @@ -1566,6 +1584,8 @@ fn F[T:! Ptr](var t: T) -> T.(Ptr.Type) { // CHECK:STDOUT: witness = (@Ptr.WithSelf.%Type) // CHECK:STDOUT: // CHECK:STDOUT: !requires: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: generic impl @U.as.Ptr.impl(%U.loc7_21.1: type) { @@ -1628,6 +1648,8 @@ fn F[T:! Ptr](var t: T) -> T.(Ptr.Type) { // CHECK:STDOUT: %bound_method.loc10_10.2: = bound_method %addr, %specific_impl_fn.loc10_10.1 // CHECK:STDOUT: %Copy.WithSelf.Op.call: init @F.%ptr (%ptr.ac4) = call %bound_method.loc10_10.2(%addr) // CHECK:STDOUT: return %Copy.WithSelf.Op.call +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/impl/lookup/specific_args.carbon b/toolchain/check/testdata/impl/lookup/specific_args.carbon index 09e6703ca050..a15cc9d37c32 100644 --- a/toolchain/check/testdata/impl/lookup/specific_args.carbon +++ b/toolchain/check/testdata/impl/lookup/specific_args.carbon @@ -145,6 +145,8 @@ fn H(c: C(InClassArgs)) { c.(I(X).F)(); } // CHECK:STDOUT: witness = (@I.WithSelf.%I.WithSelf.F.decl) // CHECK:STDOUT: // CHECK:STDOUT: !requires: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: @@ -289,6 +291,8 @@ fn H(c: C(InClassArgs)) { c.(I(X).F)(); } // CHECK:STDOUT: witness = (imports.%Main.F) // CHECK:STDOUT: // CHECK:STDOUT: !requires: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: @@ -340,6 +344,8 @@ fn H(c: C(InClassArgs)) { c.(I(X).F)(); } // CHECK:STDOUT: fn @X.as.I.impl.F(%self.param: %X) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: specific @I(constants.%T) { @@ -501,6 +507,8 @@ fn H(c: C(InClassArgs)) { c.(I(X).F)(); } // CHECK:STDOUT: witness = (imports.%Main.F) // CHECK:STDOUT: // CHECK:STDOUT: !requires: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: @@ -535,6 +543,8 @@ fn H(c: C(InClassArgs)) { c.(I(X).F)(); } // CHECK:STDOUT: %bound_method: = bound_method %x.ref, %impl.elem0 // CHECK:STDOUT: %X.as.I.impl.F.call: init %empty_tuple.type = call %bound_method(%x.ref) // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: generic fn @I.WithSelf.F(imports.%Main.import_ref.b3bc94.2: type, imports.%Main.import_ref.d08dda.2: @I.%I.type (%I.type.3fe)) [from "types.carbon"] { @@ -691,6 +701,8 @@ fn H(c: C(InClassArgs)) { c.(I(X).F)(); } // CHECK:STDOUT: witness = (imports.%Main.F) // CHECK:STDOUT: // CHECK:STDOUT: !requires: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: @@ -756,6 +768,8 @@ fn H(c: C(InClassArgs)) { c.(I(X).F)(); } // CHECK:STDOUT: fn @C.as.I.impl.F(%self.param: %C.165) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: specific @C(constants.%T) { @@ -939,6 +953,8 @@ fn H(c: C(InClassArgs)) { c.(I(X).F)(); } // CHECK:STDOUT: witness = (imports.%Main.F) // CHECK:STDOUT: // CHECK:STDOUT: !requires: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: @@ -987,6 +1003,8 @@ fn H(c: C(InClassArgs)) { c.(I(X).F)(); } // CHECK:STDOUT: %bound_method: = bound_method %c.ref, %impl.elem0 // CHECK:STDOUT: %C.as.I.impl.F.call: init %empty_tuple.type = call %bound_method(%c.ref) // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: generic fn @I.WithSelf.F(imports.%Main.import_ref.b3bc94.3: type, imports.%Main.import_ref.d08dda.2: @I.%I.type (%I.type.3fe)) [from "types.carbon"] { diff --git a/toolchain/check/testdata/impl/lookup/transitive.carbon b/toolchain/check/testdata/impl/lookup/transitive.carbon index 70beb5cdcbb9..50ca8ffd1251 100644 --- a/toolchain/check/testdata/impl/lookup/transitive.carbon +++ b/toolchain/check/testdata/impl/lookup/transitive.carbon @@ -104,6 +104,8 @@ fn Call() { // CHECK:STDOUT: witness = (@I.WithSelf.%I.WithSelf.F.decl) // CHECK:STDOUT: // CHECK:STDOUT: !requires: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: generic fn @I.WithSelf.F(@I.%Self: %I.type) { @@ -185,6 +187,8 @@ fn Call() { // CHECK:STDOUT: witness = (imports.%Main.F) // CHECK:STDOUT: // CHECK:STDOUT: !requires: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: impl @C.as.I.impl: %C.ref as %I.ref { @@ -226,6 +230,8 @@ fn Call() { // CHECK:STDOUT: fn @C.as.I.impl.F(%self.param: %C) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: specific @I.WithSelf(constants.%Self) { @@ -385,6 +391,8 @@ fn Call() { // CHECK:STDOUT: witness = (imports.%Main.F) // CHECK:STDOUT: // CHECK:STDOUT: !requires: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: impl @C.as.I.impl: imports.%Main.import_ref.335 as imports.%Main.import_ref.e90 [from "c.carbon"] { @@ -414,6 +422,8 @@ fn Call() { // CHECK:STDOUT: %Destroy.Op.bound: = bound_method %.loc9_7.2, constants.%Destroy.Op.1a2547.2 // CHECK:STDOUT: %Destroy.Op.call: init %empty_tuple.type = call %Destroy.Op.bound(%.loc9_7.2) // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Get [from "get.carbon"]; @@ -435,6 +445,8 @@ fn Call() { // CHECK:STDOUT: fn @Destroy.Op.loc9_7.2(%self.param: ref %C) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: specific @I.WithSelf(constants.%Self.dda) { diff --git a/toolchain/check/testdata/impl/multiple_extend.carbon b/toolchain/check/testdata/impl/multiple_extend.carbon index fc17c01d8826..95e795828c58 100644 --- a/toolchain/check/testdata/impl/multiple_extend.carbon +++ b/toolchain/check/testdata/impl/multiple_extend.carbon @@ -246,6 +246,8 @@ fn P(o: O) { // CHECK:STDOUT: witness = (@HasF.WithSelf.%HasF.WithSelf.F.decl) // CHECK:STDOUT: // CHECK:STDOUT: !requires: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: interface @HasG { @@ -263,6 +265,8 @@ fn P(o: O) { // CHECK:STDOUT: witness = (@HasG.WithSelf.%HasG.WithSelf.G.decl) // CHECK:STDOUT: // CHECK:STDOUT: !requires: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: impl @C.as.HasF.impl: %Self.ref as %HasF.ref { @@ -320,11 +324,15 @@ fn P(o: O) { // CHECK:STDOUT: fn @C.as.HasF.impl.F() { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @C.as.HasG.impl.G() { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @H(%c.param: %C) { @@ -346,6 +354,8 @@ fn P(o: O) { // CHECK:STDOUT: %impl.elem0.loc25: %.ccf = impl_witness_access constants.%HasG.impl_witness, element0 [concrete = constants.%C.as.HasG.impl.G] // CHECK:STDOUT: %C.as.HasG.impl.G.call.loc25: init %empty_tuple.type = call %impl.elem0.loc25() // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: specific @HasF.WithSelf(constants.%Self.c62) { @@ -476,6 +486,8 @@ fn P(o: O) { // CHECK:STDOUT: witness = (@HasA1.WithSelf.%HasA1.WithSelf.A.decl) // CHECK:STDOUT: // CHECK:STDOUT: !requires: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: interface @HasA2 { @@ -492,6 +504,8 @@ fn P(o: O) { // CHECK:STDOUT: witness = (@HasA2.WithSelf.%HasA2.WithSelf.A.decl) // CHECK:STDOUT: // CHECK:STDOUT: !requires: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: impl @D.as.HasA1.impl: %Self.ref as %HasA1.ref { @@ -548,11 +562,15 @@ fn P(o: O) { // CHECK:STDOUT: fn @D.as.HasA1.impl.A() { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @D.as.HasA2.impl.A() { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @B(%d.param: %D) { @@ -562,6 +580,8 @@ fn P(o: O) { // CHECK:STDOUT: %d.ref: %D = name_ref d, %d // CHECK:STDOUT: %A.ref.loc31: = name_ref A, [concrete = ] // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: specific @HasA1.WithSelf(constants.%Self.1db) { @@ -686,6 +706,8 @@ fn P(o: O) { // CHECK:STDOUT: witness = (@HasI.WithSelf.%HasI.WithSelf.I.decl) // CHECK:STDOUT: // CHECK:STDOUT: !requires: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: impl @E.as.HasI.impl: %Self.ref as %HasI.ref { @@ -739,11 +761,15 @@ fn P(o: O) { // CHECK:STDOUT: fn @B.J() { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @E.as.HasI.impl.I() { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @H(%e.param: %E) { @@ -763,6 +789,8 @@ fn P(o: O) { // CHECK:STDOUT: %J.ref.loc23: %B.J.type = name_ref J, @B.%B.J.decl [concrete = constants.%B.J] // CHECK:STDOUT: %B.J.call.loc23: init %empty_tuple.type = call %J.ref.loc23() // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: specific @HasI.WithSelf(constants.%Self) { @@ -859,6 +887,8 @@ fn P(o: O) { // CHECK:STDOUT: witness = (@HasK.WithSelf.%HasK.WithSelf.K.decl) // CHECK:STDOUT: // CHECK:STDOUT: !requires: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: impl @L.as.HasK.impl: %Self.ref as %HasK.ref { @@ -906,6 +936,8 @@ fn P(o: O) { // CHECK:STDOUT: fn @Base.K() { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: generic fn @HasK.WithSelf.K(@HasK.%Self: %HasK.type) { @@ -915,6 +947,8 @@ fn P(o: O) { // CHECK:STDOUT: fn @L.as.HasK.impl.K() { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @M(%l.param: %L) { @@ -924,6 +958,8 @@ fn P(o: O) { // CHECK:STDOUT: %l.ref: %L = name_ref l, %l // CHECK:STDOUT: %K.ref.loc29: = name_ref K, [concrete = ] // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: specific @HasK.WithSelf(constants.%Self) { @@ -1034,6 +1070,8 @@ fn P(o: O) { // CHECK:STDOUT: witness = (@HasN1.WithSelf.%HasN1.WithSelf.N.decl) // CHECK:STDOUT: // CHECK:STDOUT: !requires: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: interface @HasN2 { @@ -1050,6 +1088,8 @@ fn P(o: O) { // CHECK:STDOUT: witness = (@HasN2.WithSelf.%HasN2.WithSelf.N.decl) // CHECK:STDOUT: // CHECK:STDOUT: !requires: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: impl @O.as.HasN1.impl: %Self.ref as %HasN1.ref { @@ -1116,6 +1156,8 @@ fn P(o: O) { // CHECK:STDOUT: fn @NBase.N() { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: generic fn @HasN1.WithSelf.N(@HasN1.%Self: %HasN1.type) { @@ -1129,11 +1171,15 @@ fn P(o: O) { // CHECK:STDOUT: fn @O.as.HasN1.impl.N() { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @O.as.HasN2.impl.N() { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @O.N(); @@ -1147,6 +1193,8 @@ fn P(o: O) { // CHECK:STDOUT: %N.ref.loc29: %O.N.type = name_ref N, @O.%O.N.decl [concrete = constants.%O.N] // CHECK:STDOUT: %O.N.call.loc29: init %empty_tuple.type = call %N.ref.loc29() // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: specific @HasN1.WithSelf(constants.%Self.97e) { diff --git a/toolchain/check/testdata/impl/name_lookup_in_impl_definition.carbon b/toolchain/check/testdata/impl/name_lookup_in_impl_definition.carbon index ecf8524ccadf..ab02042ad21c 100644 --- a/toolchain/check/testdata/impl/name_lookup_in_impl_definition.carbon +++ b/toolchain/check/testdata/impl/name_lookup_in_impl_definition.carbon @@ -98,6 +98,8 @@ impl forall [T:! type] T as I where .U = C { // CHECK:STDOUT: %.loc13_31.3: init %C = as_compatible %.loc13_31.2 [concrete = constants.%C.val] // CHECK:STDOUT: %.loc13_31.4: init %C = converted %.loc13_27.2, %.loc13_31.3 [concrete = constants.%C.val] // CHECK:STDOUT: return %.loc13_31.4 +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/impl/no_definition_in_impl_file.carbon b/toolchain/check/testdata/impl/no_definition_in_impl_file.carbon index f10e89cd8d64..4900e79cc5a2 100644 --- a/toolchain/check/testdata/impl/no_definition_in_impl_file.carbon +++ b/toolchain/check/testdata/impl/no_definition_in_impl_file.carbon @@ -134,6 +134,8 @@ impl () as D; // CHECK:STDOUT: witness = () // CHECK:STDOUT: // CHECK:STDOUT: !requires: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: impl @empty_tuple.type.as.A.impl: %.loc10_7.2 as %A.ref; @@ -180,6 +182,8 @@ impl () as D; // CHECK:STDOUT: witness = () // CHECK:STDOUT: // CHECK:STDOUT: !requires: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: impl @empty_tuple.type.as.A.impl.f51: imports.%Main.import_ref.e5c as imports.%Main.import_ref.201 [from "fail_decl_in_api_definition_in_impl.carbon"]; @@ -244,6 +248,8 @@ impl () as D; // CHECK:STDOUT: witness = () // CHECK:STDOUT: // CHECK:STDOUT: !requires: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: impl @empty_tuple.type.as.B.impl: %.loc10_7.2 as %B.ref; @@ -279,6 +285,8 @@ impl () as D; // CHECK:STDOUT: witness = () // CHECK:STDOUT: // CHECK:STDOUT: !requires: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: impl @empty_tuple.type.as.B.impl: imports.%Main.import_ref.e5c as imports.%Main.import_ref.21a [from "fail_decl_only_in_api.carbon"]; @@ -315,6 +323,8 @@ impl () as D; // CHECK:STDOUT: witness = () // CHECK:STDOUT: // CHECK:STDOUT: !requires: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: impl @empty_tuple.type.as.C.impl: %.loc10_7.2 as %C.ref; @@ -356,6 +366,8 @@ impl () as D; // CHECK:STDOUT: witness = () // CHECK:STDOUT: // CHECK:STDOUT: !requires: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: impl @empty_tuple.type.as.C.impl.4b9: imports.%Main.import_ref.e5c as imports.%Main.import_ref.3f1 [from "fail_decl_in_api_decl_in_impl.carbon"]; @@ -402,6 +414,8 @@ impl () as D; // CHECK:STDOUT: witness = () // CHECK:STDOUT: // CHECK:STDOUT: !requires: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: impl @empty_tuple.type.as.D.impl: %.loc10_7.2 as %D.ref; diff --git a/toolchain/check/testdata/impl/self_in_class.carbon b/toolchain/check/testdata/impl/self_in_class.carbon index 12acf33a1e8d..e99ed6243153 100644 --- a/toolchain/check/testdata/impl/self_in_class.carbon +++ b/toolchain/check/testdata/impl/self_in_class.carbon @@ -93,6 +93,8 @@ class A { // CHECK:STDOUT: witness = (@DefaultConstructible.WithSelf.%DefaultConstructible.WithSelf.Make.decl) // CHECK:STDOUT: // CHECK:STDOUT: !requires: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: impl @C.as.DefaultConstructible.impl: %C.ref as %DefaultConstructible.ref { @@ -153,6 +155,8 @@ class A { // CHECK:STDOUT: %.loc25_33.2: init %C to %return.param = class_init () [concrete = constants.%C.val] // CHECK:STDOUT: %.loc25_34: init %C = converted %.loc25_33.1, %.loc25_33.2 [concrete = constants.%C.val] // CHECK:STDOUT: return %.loc25_34 to %return.param +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: specific @DefaultConstructible.WithSelf(constants.%Self) { diff --git a/toolchain/check/testdata/impl/self_in_signature.carbon b/toolchain/check/testdata/impl/self_in_signature.carbon index 86663c241e98..53991c4ba8c5 100644 --- a/toolchain/check/testdata/impl/self_in_signature.carbon +++ b/toolchain/check/testdata/impl/self_in_signature.carbon @@ -211,6 +211,8 @@ impl D as SelfNested { // CHECK:STDOUT: witness = (@UseSelf.WithSelf.%UseSelf.WithSelf.F.decl) // CHECK:STDOUT: // CHECK:STDOUT: !requires: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: interface @SelfNested { @@ -248,6 +250,8 @@ impl D as SelfNested { // CHECK:STDOUT: witness = (@SelfNested.WithSelf.%SelfNested.WithSelf.F.decl) // CHECK:STDOUT: // CHECK:STDOUT: !requires: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: impl @C.as.UseSelf.impl: %C.ref as %UseSelf.ref { @@ -401,6 +405,8 @@ impl D as SelfNested { // CHECK:STDOUT: %.loc24_52.2: init %C to %return.param = class_init () [concrete = constants.%C.val] // CHECK:STDOUT: %.loc24_53: init %C = converted %.loc24_52.1, %.loc24_52.2 [concrete = constants.%C.val] // CHECK:STDOUT: return %.loc24_53 to %return.param +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @D.as.UseSelf.impl.F(%self.param: %D, %x.param: %D) -> out %return.param: %D { @@ -409,6 +415,8 @@ impl D as SelfNested { // CHECK:STDOUT: %.loc28_55.2: init %D to %return.param = class_init () [concrete = constants.%D.val] // CHECK:STDOUT: %.loc28_56: init %D = converted %.loc28_55.1, %.loc28_55.2 [concrete = constants.%D.val] // CHECK:STDOUT: return %.loc28_56 to %return.param +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: generic fn @SelfNested.WithSelf.F(@SelfNested.%Self: %SelfNested.type) { diff --git a/toolchain/check/testdata/impl/todo_impl_with_unrelated_fn.carbon b/toolchain/check/testdata/impl/todo_impl_with_unrelated_fn.carbon index 2044f73fb878..e73f7d492177 100644 --- a/toolchain/check/testdata/impl/todo_impl_with_unrelated_fn.carbon +++ b/toolchain/check/testdata/impl/todo_impl_with_unrelated_fn.carbon @@ -70,6 +70,8 @@ class X { // CHECK:STDOUT: witness = (@A.WithSelf.%A.WithSelf.B.decl) // CHECK:STDOUT: // CHECK:STDOUT: !requires: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: impl @X.as.A.impl: %Self.ref as %A.ref { @@ -105,11 +107,15 @@ class X { // CHECK:STDOUT: fn @X.as.A.impl.B() { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @X.as.A.impl.F() { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: specific @A.WithSelf(constants.%Self) { diff --git a/toolchain/check/testdata/impl/use_assoc_entity.carbon b/toolchain/check/testdata/impl/use_assoc_entity.carbon index 8317725cc034..4c9c55c959b2 100644 --- a/toolchain/check/testdata/impl/use_assoc_entity.carbon +++ b/toolchain/check/testdata/impl/use_assoc_entity.carbon @@ -626,6 +626,8 @@ fn F() { // CHECK:STDOUT: witness = (@J.WithSelf.%U, @J.WithSelf.%J.WithSelf.F.decl) // CHECK:STDOUT: // CHECK:STDOUT: !requires: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: impl @empty_tuple.type.as.J.impl: %.loc10_7.2 as %.loc10_14 { @@ -712,6 +714,8 @@ fn F() { // CHECK:STDOUT: %bound_method.loc12_45.2: = bound_method %u.ref, %specific_fn // CHECK:STDOUT: %Int.as.Negate.impl.Op.call: init %i32 = call %bound_method.loc12_45.2(%u.ref) // CHECK:STDOUT: return %Int.as.Negate.impl.Op.call +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @CallMethod(%x.param: %empty_tuple.type) -> out %return.param: %i32 { @@ -731,6 +735,8 @@ fn F() { // CHECK:STDOUT: %.loc18_18.2: %i32 = converted %int_40, %.loc18_18.1 [concrete = constants.%int_40.e3d] // CHECK:STDOUT: %empty_tuple.type.as.J.impl.F.call: init %i32 = call %bound_method.loc18_11(%x.ref, %.loc18_18.2) // CHECK:STDOUT: return %empty_tuple.type.as.J.impl.F.call +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @C.as.J.impl.F(%self.param: %C, %u.param: %C) -> out %return.param: %C { @@ -741,6 +747,8 @@ fn F() { // CHECK:STDOUT: %.loc29_45.3: init %C = as_compatible %.loc29_45.2 [concrete = constants.%C.val] // CHECK:STDOUT: %.loc29_45.4: init %C = converted %self.ref, %.loc29_45.3 [concrete = constants.%C.val] // CHECK:STDOUT: return %.loc29_45.4 +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: specific @J.WithSelf(constants.%Self.653) { @@ -986,6 +994,8 @@ fn F() { // CHECK:STDOUT: %e5.patt: %pattern_type.6b6 = value_binding_pattern e5 [concrete = constants.%e5.patt] // CHECK:STDOUT: } // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- use_associated_fn_in_impl.carbon @@ -1015,6 +1025,8 @@ fn F() { // CHECK:STDOUT: %F.ref: %E.as.J.impl.F.type = name_ref F, @E.as.J.impl.%E.as.J.impl.F.decl [concrete = constants.%E.as.J.impl.F] // CHECK:STDOUT: %E.as.J.impl.F.call: init %empty_tuple.type = call %F.ref() // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- use_associated_constant_in_impl.carbon @@ -1103,6 +1115,8 @@ fn F() { // CHECK:STDOUT: %bound_method.loc12_14.2: = bound_method %u.ref, %specific_fn // CHECK:STDOUT: %Int.as.Copy.impl.Op.call: init %i32 = call %bound_method.loc12_14.2(%u.ref) // CHECK:STDOUT: return %Int.as.Copy.impl.Op.call +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- call_extend_fn.carbon @@ -1139,6 +1153,8 @@ fn F() { // CHECK:STDOUT: %F.ref: %.b5e = name_ref F, %impl.elem0 [concrete = constants.%E.as.J.impl.F] // CHECK:STDOUT: %E.as.J.impl.F.call: init %empty_tuple.type = call %F.ref() // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- use_extend_constant.carbon @@ -1189,6 +1205,8 @@ fn F() { // CHECK:STDOUT: %.loc11_25.2: init %empty_tuple.type = tuple_init () [concrete = constants.%empty_tuple] // CHECK:STDOUT: %.loc11_26: init %empty_tuple.type = converted %.loc11_25.1, %.loc11_25.2 [concrete = constants.%empty_tuple] // CHECK:STDOUT: return %.loc11_26 +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- associated_fn_use_in_def_before_decl.carbon @@ -1218,6 +1236,8 @@ fn F() { // CHECK:STDOUT: %G.ref: %A.as.J.impl.G.type = name_ref G, @A.as.J.impl.%A.as.J.impl.G.decl [concrete = constants.%A.as.J.impl.G] // CHECK:STDOUT: %A.as.J.impl.G.call: init %empty_tuple.type = call %G.ref() // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- use_non-type_in_function.carbon @@ -1260,5 +1280,7 @@ fn F() { // CHECK:STDOUT: %.loc11_25.2: init %empty_struct_type = struct_init () [concrete = constants.%empty_struct] // CHECK:STDOUT: %.loc11_27: init %empty_struct_type = converted %.loc11_25.1, %.loc11_25.2 [concrete = constants.%empty_struct] // CHECK:STDOUT: return %.loc11_27 +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/index/array_element_access.carbon b/toolchain/check/testdata/index/array_element_access.carbon index 4bdf2c75f650..ff8b03e0bd55 100644 --- a/toolchain/check/testdata/index/array_element_access.carbon +++ b/toolchain/check/testdata/index/array_element_access.carbon @@ -204,5 +204,7 @@ var d: i32 = a[b]; // CHECK:STDOUT: %Int.as.Copy.impl.Op.call.loc18: init %i32 = call %bound_method.loc18_17.2(%.loc18_17.2) // CHECK:STDOUT: assign file.%d.var, %Int.as.Copy.impl.Op.call.loc18 // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/index/expr_category.carbon b/toolchain/check/testdata/index/expr_category.carbon index e08d5bbb335d..03e08312c3aa 100644 --- a/toolchain/check/testdata/index/expr_category.carbon +++ b/toolchain/check/testdata/index/expr_category.carbon @@ -278,6 +278,8 @@ fn ValueBinding(b: array(i32, 3)) { // CHECK:STDOUT: %Destroy.Op.bound.loc18: = bound_method %a.var, constants.%Destroy.Op.1a2547.4 // CHECK:STDOUT: %Destroy.Op.call.loc18: init %empty_tuple.type = call %Destroy.Op.bound.loc18(%a.var) // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Destroy.Op.loc21(%self.param: ref %ptr.d08) = "no_op"; @@ -287,11 +289,15 @@ fn ValueBinding(b: array(i32, 3)) { // CHECK:STDOUT: fn @Destroy.Op.loc18_3.2(%self.param: ref %i32) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Destroy.Op.loc18_3.3(%self.param: ref %array_type) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @ValueBinding(%b.param: %array_type) { @@ -382,5 +388,7 @@ fn ValueBinding(b: array(i32, 3)) { // CHECK:STDOUT: %Destroy.Op.bound.loc26: = bound_method %a.var, constants.%Destroy.Op.1a2547.4 // CHECK:STDOUT: %Destroy.Op.call.loc26: init %empty_tuple.type = call %Destroy.Op.bound.loc26(%a.var) // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/index/fail_array_large_index.carbon b/toolchain/check/testdata/index/fail_array_large_index.carbon index a27d5f031313..fd5445064c92 100644 --- a/toolchain/check/testdata/index/fail_array_large_index.carbon +++ b/toolchain/check/testdata/index/fail_array_large_index.carbon @@ -187,5 +187,7 @@ var c: i32 = a[0x7FFF_FFFF]; // CHECK:STDOUT: %Int.as.Copy.impl.Op.call.loc27: init %i32 = call %bound_method.loc27_27.2(%.loc27_27.2) [concrete = ] // CHECK:STDOUT: assign file.%c.var, %Int.as.Copy.impl.Op.call.loc27 // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/index/fail_array_non_int_indexing.carbon b/toolchain/check/testdata/index/fail_array_non_int_indexing.carbon index d94053aba40d..07f5ff7a4a63 100644 --- a/toolchain/check/testdata/index/fail_array_non_int_indexing.carbon +++ b/toolchain/check/testdata/index/fail_array_non_int_indexing.carbon @@ -144,5 +144,7 @@ var b: i32 = a[2.6]; // CHECK:STDOUT: %Int.as.Copy.impl.Op.call: init %i32 = call %bound_method.loc23_19.2(%.loc23_19.2) [concrete = ] // CHECK:STDOUT: assign file.%b.var, %Int.as.Copy.impl.Op.call // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/index/fail_array_out_of_bound_access.carbon b/toolchain/check/testdata/index/fail_array_out_of_bound_access.carbon index 0ad91b6c5578..befede06f87f 100644 --- a/toolchain/check/testdata/index/fail_array_out_of_bound_access.carbon +++ b/toolchain/check/testdata/index/fail_array_out_of_bound_access.carbon @@ -149,5 +149,7 @@ var b: i32 = a[1]; // CHECK:STDOUT: %Int.as.Copy.impl.Op.call: init %i32 = call %bound_method.loc20_17.2(%.loc20_17.2) [concrete = ] // CHECK:STDOUT: assign file.%b.var, %Int.as.Copy.impl.Op.call // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/index/fail_expr_category.carbon b/toolchain/check/testdata/index/fail_expr_category.carbon index 5b6e385aeca4..a058acf90685 100644 --- a/toolchain/check/testdata/index/fail_expr_category.carbon +++ b/toolchain/check/testdata/index/fail_expr_category.carbon @@ -273,6 +273,8 @@ fn G(b: array(i32, 3)) { // CHECK:STDOUT: %Destroy.Op.bound.loc23: = bound_method %pb.var, constants.%Destroy.Op.1a2547.4 // CHECK:STDOUT: %Destroy.Op.call.loc23: init %empty_tuple.type = call %Destroy.Op.bound.loc23(%pb.var) // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Destroy.Op.loc41_5.1(%self.param: ref %i32.builtin) = "no_op"; @@ -280,11 +282,15 @@ fn G(b: array(i32, 3)) { // CHECK:STDOUT: fn @Destroy.Op.loc41_5.2(%self.param: ref %i32) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Destroy.Op.loc41_5.3(%self.param: ref %array_type) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Destroy.Op.loc36(%self.param: ref %ptr.d08) = "no_op"; diff --git a/toolchain/check/testdata/index/fail_invalid_base.carbon b/toolchain/check/testdata/index/fail_invalid_base.carbon index e0d59965b96f..3672415dd221 100644 --- a/toolchain/check/testdata/index/fail_invalid_base.carbon +++ b/toolchain/check/testdata/index/fail_invalid_base.carbon @@ -144,5 +144,7 @@ var d: i32 = {.a: i32, .b: i32}[0]; // CHECK:STDOUT: %int_0.loc40: Core.IntLiteral = int_value 0 [concrete = constants.%int_0] // CHECK:STDOUT: assign file.%d.var, // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/index/fail_name_not_found.carbon b/toolchain/check/testdata/index/fail_name_not_found.carbon index fea60545ca46..6cbad170c1c9 100644 --- a/toolchain/check/testdata/index/fail_name_not_found.carbon +++ b/toolchain/check/testdata/index/fail_name_not_found.carbon @@ -76,6 +76,8 @@ fn Main() { // CHECK:STDOUT: %Destroy.Op.bound: = bound_method %b.var, constants.%Destroy.Op.1a2547.2 // CHECK:STDOUT: %Destroy.Op.call: init %empty_tuple.type = call %Destroy.Op.bound(%b.var) // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Destroy.Op.loc20_3.1(%self.param: ref %i32.builtin) = "no_op"; @@ -83,5 +85,7 @@ fn Main() { // CHECK:STDOUT: fn @Destroy.Op.loc20_3.2(%self.param: ref %i32) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/index/fail_negative_indexing.carbon b/toolchain/check/testdata/index/fail_negative_indexing.carbon index dfd252a937e8..536bc06be0db 100644 --- a/toolchain/check/testdata/index/fail_negative_indexing.carbon +++ b/toolchain/check/testdata/index/fail_negative_indexing.carbon @@ -181,5 +181,7 @@ var d: i32 = c[-10]; // CHECK:STDOUT: %Int.as.Copy.impl.Op.call: init %i32 = call %bound_method.loc20_19.2(%.loc20_19.2) [concrete = ] // CHECK:STDOUT: assign file.%d.var, %Int.as.Copy.impl.Op.call // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/index/fail_non_tuple_access.carbon b/toolchain/check/testdata/index/fail_non_tuple_access.carbon index dfa900b3f3a0..c59e652aa8d0 100644 --- a/toolchain/check/testdata/index/fail_non_tuple_access.carbon +++ b/toolchain/check/testdata/index/fail_non_tuple_access.carbon @@ -54,5 +54,7 @@ fn Main() { // CHECK:STDOUT: %int_0: Core.IntLiteral = int_value 0 [concrete = constants.%int_0] // CHECK:STDOUT: %int_1: Core.IntLiteral = int_value 1 [concrete = constants.%int_1] // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/interface/as_type.carbon b/toolchain/check/testdata/interface/as_type.carbon index b1b634f2d4b7..269ef2174bc0 100644 --- a/toolchain/check/testdata/interface/as_type.carbon +++ b/toolchain/check/testdata/interface/as_type.carbon @@ -53,11 +53,15 @@ fn F(unused e: Empty) {} // CHECK:STDOUT: witness = () // CHECK:STDOUT: // CHECK:STDOUT: !requires: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @F(%e.param: %Empty.type) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: specific @Empty.WithSelf(constants.%Self) { diff --git a/toolchain/check/testdata/interface/as_type_of_type.carbon b/toolchain/check/testdata/interface/as_type_of_type.carbon index 27495f51f4ea..2e2e124e5cb4 100644 --- a/toolchain/check/testdata/interface/as_type_of_type.carbon +++ b/toolchain/check/testdata/interface/as_type_of_type.carbon @@ -109,6 +109,8 @@ fn F(T:! Empty) { // CHECK:STDOUT: witness = () // CHECK:STDOUT: // CHECK:STDOUT: !requires: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: impl @C.as.Empty.impl: %C.ref as %Empty.ref { @@ -185,6 +187,8 @@ fn F(T:! Empty) { // CHECK:STDOUT: %bound_method.loc22_3.2: = bound_method %x.var, %specific_impl_fn.loc22_3.1 // CHECK:STDOUT: %Destroy.WithSelf.Op.call: init %empty_tuple.type = call %bound_method.loc22_3.2(%x.var) // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/interface/assoc_const.carbon b/toolchain/check/testdata/interface/assoc_const.carbon index ccc749026ad9..34c83b589eb7 100644 --- a/toolchain/check/testdata/interface/assoc_const.carbon +++ b/toolchain/check/testdata/interface/assoc_const.carbon @@ -75,6 +75,8 @@ interface I { // CHECK:STDOUT: witness = (@I.WithSelf.%T, @I.WithSelf.%N, @I.WithSelf.%Empty) // CHECK:STDOUT: // CHECK:STDOUT: !requires: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: specific @I.WithSelf(constants.%Self) {} diff --git a/toolchain/check/testdata/interface/assoc_const_in_generic.carbon b/toolchain/check/testdata/interface/assoc_const_in_generic.carbon index 6797602083bb..9624c11b52e1 100644 --- a/toolchain/check/testdata/interface/assoc_const_in_generic.carbon +++ b/toolchain/check/testdata/interface/assoc_const_in_generic.carbon @@ -130,6 +130,8 @@ fn H() { // CHECK:STDOUT: witness = (@I.WithSelf.%I.WithSelf.F.decl) // CHECK:STDOUT: // CHECK:STDOUT: !requires: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: @@ -162,6 +164,8 @@ fn H() { // CHECK:STDOUT: %.loc23: @G.%I.assoc_type (%I.assoc_type.b71) = specific_constant @I.WithSelf.%assoc0.loc16_22.1, @I.WithSelf(constants.%T, constants.%Self.191) [symbolic = %assoc0 (constants.%assoc0.13b)] // CHECK:STDOUT: %F.ref: @G.%I.assoc_type (%I.assoc_type.b71) = name_ref F, %.loc23 [symbolic = %assoc0 (constants.%assoc0.13b)] // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: @@ -173,6 +177,8 @@ fn H() { // CHECK:STDOUT: %G.specific_fn: = specific_function %G.ref, @G(constants.%empty_struct_type) [concrete = constants.%G.specific_fn] // CHECK:STDOUT: %G.call: init %empty_tuple.type = call %G.specific_fn() // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: specific @I(constants.%T) { diff --git a/toolchain/check/testdata/interface/basic.carbon b/toolchain/check/testdata/interface/basic.carbon index ae014584f3a8..e62bf7962f63 100644 --- a/toolchain/check/testdata/interface/basic.carbon +++ b/toolchain/check/testdata/interface/basic.carbon @@ -53,6 +53,8 @@ interface ForwardDeclared { // CHECK:STDOUT: witness = () // CHECK:STDOUT: // CHECK:STDOUT: !requires: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: interface @ForwardDeclared { @@ -69,6 +71,8 @@ interface ForwardDeclared { // CHECK:STDOUT: witness = (@ForwardDeclared.WithSelf.%ForwardDeclared.WithSelf.F.decl) // CHECK:STDOUT: // CHECK:STDOUT: !requires: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: generic fn @ForwardDeclared.WithSelf.F(@ForwardDeclared.%Self: %ForwardDeclared.type) { diff --git a/toolchain/check/testdata/interface/compound_member_access.carbon b/toolchain/check/testdata/interface/compound_member_access.carbon index 4163e7d8cb06..ee016b6778d8 100644 --- a/toolchain/check/testdata/interface/compound_member_access.carbon +++ b/toolchain/check/testdata/interface/compound_member_access.carbon @@ -291,6 +291,8 @@ fn Works() { // CHECK:STDOUT: witness = (@J.WithSelf.%U) // CHECK:STDOUT: // CHECK:STDOUT: !requires: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: generic fn @Simple1(%T.loc8_13.2: %J.type, %S.loc8_27.2: @Simple1.%impl.elem0.loc8_31.1 (%impl.elem0.436176.1)) { @@ -308,6 +310,8 @@ fn Works() { // CHECK:STDOUT: fn() { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: @@ -325,6 +329,8 @@ fn Works() { // CHECK:STDOUT: fn() { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: @@ -447,6 +453,8 @@ fn Works() { // CHECK:STDOUT: witness = (@K1.WithSelf.%K1.WithSelf.Q1.decl) // CHECK:STDOUT: // CHECK:STDOUT: !requires: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: generic fn @K1.WithSelf.Q1(@K1.%Self: %K1.type) { @@ -475,6 +483,8 @@ fn Works() { // CHECK:STDOUT: %specific_impl_fn.loc9_4.1: = specific_impl_function %impl.elem0.loc9_4.1, @K1.WithSelf.Q1(constants.%T) [symbolic = %specific_impl_fn.loc9_4.2 (constants.%specific_impl_fn.747340.1)] // CHECK:STDOUT: %K1.WithSelf.Q1.call: init %empty_tuple.type = call %specific_impl_fn.loc9_4.1() // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: @@ -498,6 +508,8 @@ fn Works() { // CHECK:STDOUT: %specific_impl_fn.loc14_4.1: = specific_impl_function %impl.elem0.loc14_4.1, @K1.WithSelf.Q1(constants.%V) [symbolic = %specific_impl_fn.loc14_4.2 (constants.%specific_impl_fn.747340.2)] // CHECK:STDOUT: %K1.WithSelf.Q1.call: init %empty_tuple.type = call %specific_impl_fn.loc14_4.1() // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: @@ -649,6 +661,8 @@ fn Works() { // CHECK:STDOUT: witness = (@K2.WithSelf.%K2.WithSelf.Q2.decl) // CHECK:STDOUT: // CHECK:STDOUT: !requires: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: generic fn @K2.WithSelf.Q2(@K2.%Self: %K2.type) { @@ -679,6 +693,8 @@ fn Works() { // CHECK:STDOUT: %specific_impl_fn.loc9_4.1: = specific_impl_function %impl.elem0.loc9_4.1, @K2.WithSelf.Q2(constants.%T) [symbolic = %specific_impl_fn.loc9_4.2 (constants.%specific_impl_fn)] // CHECK:STDOUT: %K2.WithSelf.Q2.call: init %empty_tuple.type = call %specific_impl_fn.loc9_4.1() // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: @@ -700,6 +716,8 @@ fn Works() { // CHECK:STDOUT: %Q2.ref: %K2.assoc_type = name_ref Q2, @K2.WithSelf.%assoc0 [concrete = constants.%assoc0.7f8] // CHECK:STDOUT: %.loc22: %K2.type = converted %y.ref, [concrete = ] // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: @@ -934,6 +952,8 @@ fn Works() { // CHECK:STDOUT: witness = (@L1.WithSelf.%L1.WithSelf.R1.decl, @L1.WithSelf.%L1.WithSelf.S1.decl) // CHECK:STDOUT: // CHECK:STDOUT: !requires: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: generic fn @L1.WithSelf.R1(@L1.%Self: %L1.type) { @@ -1003,6 +1023,8 @@ fn Works() { // CHECK:STDOUT: %bound_method.loc11_9: = bound_method %.loc11_4.1, %specific_impl_fn.loc11_4.1 // CHECK:STDOUT: %L1.WithSelf.S1.call: init %empty_tuple.type = call %bound_method.loc11_9(%.loc11_4.1) // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: @@ -1055,6 +1077,8 @@ fn Works() { // CHECK:STDOUT: %bound_method.loc17_14: = bound_method %.loc17_4.1, %specific_impl_fn.loc17_4.1 // CHECK:STDOUT: %L1.WithSelf.S1.call: init %empty_tuple.type = call %bound_method.loc17_14(%.loc17_4.1) // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: @@ -1275,6 +1299,8 @@ fn Works() { // CHECK:STDOUT: witness = (@L2.WithSelf.%L2.WithSelf.R2.decl, @L2.WithSelf.%L2.WithSelf.S2.decl) // CHECK:STDOUT: // CHECK:STDOUT: !requires: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: generic fn @L2.WithSelf.R2(@L2.%Self: %L2.type) { @@ -1324,6 +1350,8 @@ fn Works() { // CHECK:STDOUT: %S2.ref: %L2.assoc_type = name_ref S2, @L2.WithSelf.%assoc1 [concrete = constants.%assoc1] // CHECK:STDOUT: %impl.elem1.loc26_4.1: @Simple5.%.loc26_4.2 (%.451) = impl_witness_access constants.%L2.lookup_impl_witness.d84, element1 [symbolic = %impl.elem1.loc26_4.2 (constants.%impl.elem1)] // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: @@ -1342,6 +1370,8 @@ fn Works() { // CHECK:STDOUT: %L2.ref.loc40: type = name_ref L2, file.%L2.decl [concrete = constants.%L2.type] // CHECK:STDOUT: %S2.ref: %L2.assoc_type = name_ref S2, @L2.WithSelf.%assoc1 [concrete = constants.%assoc1] // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: @@ -1469,6 +1499,8 @@ fn Works() { // CHECK:STDOUT: witness = (@A.WithSelf.%A.WithSelf.G.decl) // CHECK:STDOUT: // CHECK:STDOUT: !requires: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: impl @C.as.A.impl: %C.ref as %A.ref { @@ -1497,6 +1529,8 @@ fn Works() { // CHECK:STDOUT: fn @C.as.A.impl.G() { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Fails() { @@ -1558,6 +1592,8 @@ fn Works() { // CHECK:STDOUT: %G.ref.loc38: %A.assoc_type = name_ref G, @A.WithSelf.%assoc0 [concrete = constants.%assoc0.f27] // CHECK:STDOUT: %.loc38_32: %A.type = converted %.loc38_8, [concrete = ] // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: specific @A.WithSelf(constants.%Self.d0c) { @@ -1654,6 +1690,8 @@ fn Works() { // CHECK:STDOUT: witness = (@A.WithSelf.%A.WithSelf.G.decl) // CHECK:STDOUT: // CHECK:STDOUT: !requires: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: impl @C.as.A.impl: %C.ref as %A.ref { @@ -1682,6 +1720,8 @@ fn Works() { // CHECK:STDOUT: fn @C.as.A.impl.G() { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Works() { @@ -1730,6 +1770,8 @@ fn Works() { // CHECK:STDOUT: %impl.elem0.loc15_17: %.282 = impl_witness_access constants.%A.impl_witness, element0 [concrete = constants.%C.as.A.impl.G] // CHECK:STDOUT: %C.as.A.impl.G.call.loc15: init %empty_tuple.type = call %impl.elem0.loc15_17() // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: specific @A.WithSelf(constants.%Self.d0c) { diff --git a/toolchain/check/testdata/interface/default_fn.carbon b/toolchain/check/testdata/interface/default_fn.carbon index e7155cb30c09..9b0c7256cb6a 100644 --- a/toolchain/check/testdata/interface/default_fn.carbon +++ b/toolchain/check/testdata/interface/default_fn.carbon @@ -113,6 +113,8 @@ class C { // CHECK:STDOUT: witness = (@I.WithSelf.%I.WithSelf.F.decl) // CHECK:STDOUT: // CHECK:STDOUT: !requires: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: impl @C.as.I.impl: %C.ref as %I.ref { @@ -181,12 +183,16 @@ class C { // CHECK:STDOUT: %Destroy.Op.bound: = bound_method %c.var, constants.%Destroy.Op.1a2547.2 // CHECK:STDOUT: %Destroy.Op.call: init %empty_tuple.type = call %Destroy.Op.bound(%c.var) // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @C.as.I.impl.F(%self.param: %C) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Destroy.Op.loc20_7.1(%self.param: ref %empty_struct_type) = "no_op"; @@ -194,6 +200,8 @@ class C { // CHECK:STDOUT: fn @Destroy.Op.loc20_7.2(%self.param: ref %C) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: specific @I.WithSelf(constants.%Self.4e9) { diff --git a/toolchain/check/testdata/interface/export_name.carbon b/toolchain/check/testdata/interface/export_name.carbon index 91290937b683..cc6244b71207 100644 --- a/toolchain/check/testdata/interface/export_name.carbon +++ b/toolchain/check/testdata/interface/export_name.carbon @@ -65,6 +65,8 @@ fn UseEmpty(unused i: I) {} // CHECK:STDOUT: witness = () // CHECK:STDOUT: // CHECK:STDOUT: !requires: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: specific @I.WithSelf(constants.%Self) {} @@ -95,6 +97,8 @@ fn UseEmpty(unused i: I) {} // CHECK:STDOUT: witness = () // CHECK:STDOUT: // CHECK:STDOUT: !requires: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: specific @I.WithSelf(constants.%Self) {} @@ -138,11 +142,15 @@ fn UseEmpty(unused i: I) {} // CHECK:STDOUT: witness = () // CHECK:STDOUT: // CHECK:STDOUT: !requires: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @UseEmpty(%i.param: %I.type) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: specific @I.WithSelf(constants.%Self) { diff --git a/toolchain/check/testdata/interface/fail_add_member_outside_definition.carbon b/toolchain/check/testdata/interface/fail_add_member_outside_definition.carbon index 614dfc8963e3..1fccaf6d440d 100644 --- a/toolchain/check/testdata/interface/fail_add_member_outside_definition.carbon +++ b/toolchain/check/testdata/interface/fail_add_member_outside_definition.carbon @@ -73,6 +73,8 @@ interface Outer { // CHECK:STDOUT: witness = () // CHECK:STDOUT: // CHECK:STDOUT: !requires: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: interface @Outer { @@ -89,6 +91,8 @@ interface Outer { // CHECK:STDOUT: witness = () // CHECK:STDOUT: // CHECK:STDOUT: !requires: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: generic interface @Inner(@Outer.%Self: %Outer.type) { @@ -110,6 +114,8 @@ interface Outer { // CHECK:STDOUT: witness = () // CHECK:STDOUT: // CHECK:STDOUT: !requires: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: @@ -119,6 +125,8 @@ interface Outer { // CHECK:STDOUT: fn() { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/interface/fail_assoc_const_alias.carbon b/toolchain/check/testdata/interface/fail_assoc_const_alias.carbon index 471138bf6720..7e44a4e48a00 100644 --- a/toolchain/check/testdata/interface/fail_assoc_const_alias.carbon +++ b/toolchain/check/testdata/interface/fail_assoc_const_alias.carbon @@ -133,6 +133,8 @@ interface C { // CHECK:STDOUT: witness = (@J2.WithSelf.%J2.WithSelf.F2.decl) // CHECK:STDOUT: // CHECK:STDOUT: !requires: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: generic fn @J2.WithSelf.F2(@J2.%Self: %J2.type) { @@ -200,6 +202,8 @@ interface C { // CHECK:STDOUT: witness = (@C.WithSelf.%C.WithSelf.F.decl, @C.WithSelf.%C.WithSelf.G.decl) // CHECK:STDOUT: // CHECK:STDOUT: !requires: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: generic fn @C.WithSelf.G(@C.%Self: %C.type) { @@ -234,6 +238,8 @@ interface C { // CHECK:STDOUT: %bound_method.loc9_14: = bound_method %self.ref.loc9, %specific_impl_fn.loc9 // CHECK:STDOUT: %C.WithSelf.F.call.loc9: init %empty_tuple.type = call %bound_method.loc9_14(%self.ref.loc9) // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/interface/fail_assoc_const_bad_default.carbon b/toolchain/check/testdata/interface/fail_assoc_const_bad_default.carbon index 06d0ebe63b40..50bdd8610f06 100644 --- a/toolchain/check/testdata/interface/fail_assoc_const_bad_default.carbon +++ b/toolchain/check/testdata/interface/fail_assoc_const_bad_default.carbon @@ -70,6 +70,8 @@ interface I { // CHECK:STDOUT: witness = (@I.WithSelf.%T) // CHECK:STDOUT: // CHECK:STDOUT: !requires: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: specific @I.WithSelf(constants.%Self.37e) {} diff --git a/toolchain/check/testdata/interface/fail_assoc_fn_invalid_use.carbon b/toolchain/check/testdata/interface/fail_assoc_fn_invalid_use.carbon index 154c680e1e08..5400aa8b1048 100644 --- a/toolchain/check/testdata/interface/fail_assoc_fn_invalid_use.carbon +++ b/toolchain/check/testdata/interface/fail_assoc_fn_invalid_use.carbon @@ -100,6 +100,8 @@ fn Use(T:! I) { // CHECK:STDOUT: witness = (@I.WithSelf.%I.WithSelf.F.decl) // CHECK:STDOUT: // CHECK:STDOUT: !requires: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: generic fn @I.WithSelf.F(@I.%Self: %I.type) { @@ -132,6 +134,8 @@ fn Use(T:! I) { // CHECK:STDOUT: %F.ref: %I.assoc_type = name_ref F, @I.WithSelf.%assoc0 [concrete = constants.%assoc0] // CHECK:STDOUT: %impl.elem0.loc13_4.1: @Use.%.loc13_4.2 (%.81d) = impl_witness_access constants.%I.lookup_impl_witness, element0 [symbolic = %impl.elem0.loc13_4.2 (constants.%impl.elem0)] // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/interface/fail_definition_imported.carbon b/toolchain/check/testdata/interface/fail_definition_imported.carbon index bf0c31c0ac0d..576462a65302 100644 --- a/toolchain/check/testdata/interface/fail_definition_imported.carbon +++ b/toolchain/check/testdata/interface/fail_definition_imported.carbon @@ -79,6 +79,8 @@ interface I {} // CHECK:STDOUT: witness = () // CHECK:STDOUT: // CHECK:STDOUT: !requires: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: specific @I.WithSelf(constants.%Self) {} diff --git a/toolchain/check/testdata/interface/fail_duplicate.carbon b/toolchain/check/testdata/interface/fail_duplicate.carbon index 9fbc77449a51..eace70ff9b8e 100644 --- a/toolchain/check/testdata/interface/fail_duplicate.carbon +++ b/toolchain/check/testdata/interface/fail_duplicate.carbon @@ -105,6 +105,8 @@ interface Class { } // CHECK:STDOUT: witness = () // CHECK:STDOUT: // CHECK:STDOUT: !requires: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: interface @Interface.loc13 { @@ -121,6 +123,8 @@ interface Class { } // CHECK:STDOUT: witness = (@Interface.WithSelf.loc13.%Interface.WithSelf.F.decl) // CHECK:STDOUT: // CHECK:STDOUT: !requires: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: generic fn @Interface.WithSelf.F(@Interface.loc13.%Self: %Interface.type.283524.2) { @@ -167,6 +171,8 @@ interface Class { } // CHECK:STDOUT: witness = () // CHECK:STDOUT: // CHECK:STDOUT: !requires: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: interface @Interface.loc13 { @@ -194,6 +200,8 @@ interface Class { } // CHECK:STDOUT: witness = (@Interface.WithSelf.loc13.%Interface.WithSelf.F.decl) // CHECK:STDOUT: // CHECK:STDOUT: !requires: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: generic fn @Interface.WithSelf.F(@Interface.loc13.%Self: %Interface.type.283524.2) { @@ -263,6 +271,8 @@ interface Class { } // CHECK:STDOUT: witness = () // CHECK:STDOUT: // CHECK:STDOUT: !requires: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: class @Class.loc2; diff --git a/toolchain/check/testdata/interface/fail_generic_redeclaration.carbon b/toolchain/check/testdata/interface/fail_generic_redeclaration.carbon index b0ad0263d817..1e308ac0cf7c 100644 --- a/toolchain/check/testdata/interface/fail_generic_redeclaration.carbon +++ b/toolchain/check/testdata/interface/fail_generic_redeclaration.carbon @@ -138,6 +138,8 @@ interface DifferentParams(T:! ()) {} // CHECK:STDOUT: witness = () // CHECK:STDOUT: // CHECK:STDOUT: !requires: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: @@ -157,6 +159,8 @@ interface DifferentParams(T:! ()) {} // CHECK:STDOUT: witness = () // CHECK:STDOUT: // CHECK:STDOUT: !requires: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: generic interface @DifferentParams.loc35(%T.loc35_28.2: type) { @@ -183,6 +187,8 @@ interface DifferentParams(T:! ()) {} // CHECK:STDOUT: witness = () // CHECK:STDOUT: // CHECK:STDOUT: !requires: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/interface/fail_lookup_in_type_type.carbon b/toolchain/check/testdata/interface/fail_lookup_in_type_type.carbon index 8f0f0f62bd97..e68982679c17 100644 --- a/toolchain/check/testdata/interface/fail_lookup_in_type_type.carbon +++ b/toolchain/check/testdata/interface/fail_lookup_in_type_type.carbon @@ -54,6 +54,8 @@ let U: (type where .Self impls type).missing = {}; // CHECK:STDOUT: !entry: // CHECK:STDOUT: %.loc8: %empty_struct_type = struct_literal () [concrete = constants.%empty_struct] // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- fail_lookup_type_where.carbon @@ -93,5 +95,7 @@ let U: (type where .Self impls type).missing = {}; // CHECK:STDOUT: !entry: // CHECK:STDOUT: %.loc8: %empty_struct_type = struct_literal () [concrete = constants.%empty_struct] // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/interface/fail_lookup_undefined.carbon b/toolchain/check/testdata/interface/fail_lookup_undefined.carbon index 231092bd5b77..dfd8c573b445 100644 --- a/toolchain/check/testdata/interface/fail_lookup_undefined.carbon +++ b/toolchain/check/testdata/interface/fail_lookup_undefined.carbon @@ -105,6 +105,8 @@ interface BeingDefined { // CHECK:STDOUT: witness = (@BeingDefined.WithSelf.%BeingDefined.WithSelf.H.decl) // CHECK:STDOUT: // CHECK:STDOUT: !requires: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @F(); @@ -114,6 +116,8 @@ interface BeingDefined { // CHECK:STDOUT: %Undefined.ref: type = name_ref Undefined, file.%Undefined.decl [concrete = constants.%Undefined.type] // CHECK:STDOUT: %G.ref: = name_ref G, [concrete = ] // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: generic fn @BeingDefined.WithSelf.H(@BeingDefined.%Self: %BeingDefined.type) { diff --git a/toolchain/check/testdata/interface/fail_member_lookup.carbon b/toolchain/check/testdata/interface/fail_member_lookup.carbon index 177bbd592f6d..8fba38b83a7e 100644 --- a/toolchain/check/testdata/interface/fail_member_lookup.carbon +++ b/toolchain/check/testdata/interface/fail_member_lookup.carbon @@ -131,6 +131,8 @@ fn G(U:! Different) -> U.(Interface.T); // CHECK:STDOUT: witness = (@Interface.WithSelf.%Interface.WithSelf.F.decl, @Interface.WithSelf.%T) // CHECK:STDOUT: // CHECK:STDOUT: !requires: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: interface @Different { @@ -142,6 +144,8 @@ fn G(U:! Different) -> U.(Interface.T); // CHECK:STDOUT: witness = () // CHECK:STDOUT: // CHECK:STDOUT: !requires: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: generic fn @Interface.WithSelf.F(@Interface.%Self: %Interface.type) { @@ -165,6 +169,8 @@ fn G(U:! Different) -> U.(Interface.T); // CHECK:STDOUT: %v.var_patt: = var_pattern %v.patt [concrete = ] // CHECK:STDOUT: } // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: generic fn @G(%U.loc32_7.2: %Different.type) { diff --git a/toolchain/check/testdata/interface/fail_modifiers.carbon b/toolchain/check/testdata/interface/fail_modifiers.carbon index 70a7cb763cd9..fe9ec5f63885 100644 --- a/toolchain/check/testdata/interface/fail_modifiers.carbon +++ b/toolchain/check/testdata/interface/fail_modifiers.carbon @@ -101,6 +101,8 @@ interface I { // CHECK:STDOUT: witness = () // CHECK:STDOUT: // CHECK:STDOUT: !requires: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: specific @Abstract.WithSelf(constants.%Self) {} @@ -143,6 +145,8 @@ interface I { // CHECK:STDOUT: witness = () // CHECK:STDOUT: // CHECK:STDOUT: !requires: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: specific @Virtual.WithSelf(constants.%Self) {} @@ -209,6 +213,8 @@ interface I { // CHECK:STDOUT: witness = (@I.WithSelf.%I.WithSelf.F.decl) // CHECK:STDOUT: // CHECK:STDOUT: !requires: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: generic fn @I.WithSelf.F(@I.%Self: %I.type) { @@ -278,6 +284,8 @@ interface I { // CHECK:STDOUT: witness = (@I.WithSelf.%I.WithSelf.F.decl) // CHECK:STDOUT: // CHECK:STDOUT: !requires: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: generic fn @I.WithSelf.F(@I.%Self: %I.type) { diff --git a/toolchain/check/testdata/interface/fail_redeclare_member.carbon b/toolchain/check/testdata/interface/fail_redeclare_member.carbon index cb4cb35887d6..61a0cd47dfe8 100644 --- a/toolchain/check/testdata/interface/fail_redeclare_member.carbon +++ b/toolchain/check/testdata/interface/fail_redeclare_member.carbon @@ -57,6 +57,8 @@ interface Interface { // CHECK:STDOUT: witness = (@Interface.WithSelf.%Interface.WithSelf.F.decl.loc16) // CHECK:STDOUT: // CHECK:STDOUT: !requires: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: generic fn @Interface.WithSelf.F(@Interface.%Self: %Interface.type) { diff --git a/toolchain/check/testdata/interface/fail_todo_assoc_const_default.carbon b/toolchain/check/testdata/interface/fail_todo_assoc_const_default.carbon index d96103828ed6..1b8bd50c9e24 100644 --- a/toolchain/check/testdata/interface/fail_todo_assoc_const_default.carbon +++ b/toolchain/check/testdata/interface/fail_todo_assoc_const_default.carbon @@ -112,6 +112,8 @@ interface I { // CHECK:STDOUT: witness = (@I.WithSelf.%T, @I.WithSelf.%N) // CHECK:STDOUT: // CHECK:STDOUT: !requires: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: specific @I.WithSelf(constants.%Self.37e) {} diff --git a/toolchain/check/testdata/interface/fail_todo_define_default_fn_inline.carbon b/toolchain/check/testdata/interface/fail_todo_define_default_fn_inline.carbon index a3cced1bc30b..a4b4922bc05b 100644 --- a/toolchain/check/testdata/interface/fail_todo_define_default_fn_inline.carbon +++ b/toolchain/check/testdata/interface/fail_todo_define_default_fn_inline.carbon @@ -105,6 +105,8 @@ interface Interface { // CHECK:STDOUT: witness = (@Interface.WithSelf.%Interface.WithSelf.F.decl, @Interface.WithSelf.%Interface.WithSelf.G.decl) // CHECK:STDOUT: // CHECK:STDOUT: !requires: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: generic fn @Interface.WithSelf.F(@Interface.%Self: %Interface.type) { @@ -113,6 +115,8 @@ interface Interface { // CHECK:STDOUT: fn() { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/interface/fail_todo_define_default_fn_out_of_line.carbon b/toolchain/check/testdata/interface/fail_todo_define_default_fn_out_of_line.carbon index 61c09bc4561e..1f4290a8875c 100644 --- a/toolchain/check/testdata/interface/fail_todo_define_default_fn_out_of_line.carbon +++ b/toolchain/check/testdata/interface/fail_todo_define_default_fn_out_of_line.carbon @@ -154,6 +154,8 @@ fn Interface.C.F(unused self, U:! type, u: U*) -> U* { return u; } // CHECK:STDOUT: witness = (@Interface.WithSelf.%Interface.WithSelf.F.decl, @Interface.WithSelf.%Interface.WithSelf.G.decl) // CHECK:STDOUT: // CHECK:STDOUT: !requires: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: generic fn @Interface.WithSelf.F(@Interface.%Self: %Interface.type) { @@ -162,6 +164,8 @@ fn Interface.C.F(unused self, U:! type, u: U*) -> U* { return u; } // CHECK:STDOUT: fn() { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: @@ -277,6 +281,8 @@ fn Interface.C.F(unused self, U:! type, u: U*) -> U* { return u; } // CHECK:STDOUT: witness = () // CHECK:STDOUT: // CHECK:STDOUT: !requires: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: generic class @C(@Interface.%Self: %Interface.type) { @@ -367,6 +373,8 @@ fn Interface.C.F(unused self, U:! type, u: U*) -> U* { return u; } // CHECK:STDOUT: %bound_method.loc20_63.2: = bound_method %u.ref, %specific_impl_fn.loc20_63.1 // CHECK:STDOUT: %Copy.WithSelf.Op.call: init @C.F.%ptr.loc14_30.1 (%ptr.18e) = call %bound_method.loc20_63.2(%u.ref) // CHECK:STDOUT: return %Copy.WithSelf.Op.call +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/interface/fail_todo_modifiers.carbon b/toolchain/check/testdata/interface/fail_todo_modifiers.carbon index ceaca3857975..b811c26ac4b4 100644 --- a/toolchain/check/testdata/interface/fail_todo_modifiers.carbon +++ b/toolchain/check/testdata/interface/fail_todo_modifiers.carbon @@ -63,6 +63,8 @@ interface Modifiers { // CHECK:STDOUT: witness = (@Modifiers.WithSelf.%Modifiers.WithSelf.Final.decl, @Modifiers.WithSelf.%Modifiers.WithSelf.Default.decl) // CHECK:STDOUT: // CHECK:STDOUT: !requires: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: generic fn @Modifiers.WithSelf.Final(@Modifiers.%Self: %Modifiers.type) { @@ -71,6 +73,8 @@ interface Modifiers { // CHECK:STDOUT: fn() { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: @@ -80,6 +84,8 @@ interface Modifiers { // CHECK:STDOUT: fn() { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/interface/final.carbon b/toolchain/check/testdata/interface/final.carbon index 4edf45f87669..7121278b4f94 100644 --- a/toolchain/check/testdata/interface/final.carbon +++ b/toolchain/check/testdata/interface/final.carbon @@ -162,6 +162,8 @@ fn Use() { UseJ(C); } // CHECK:STDOUT: witness = (@I.WithSelf.%I.WithSelf.F.decl) // CHECK:STDOUT: // CHECK:STDOUT: !requires: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: interface @J { @@ -173,6 +175,8 @@ fn Use() { UseJ(C); } // CHECK:STDOUT: witness = () // CHECK:STDOUT: // CHECK:STDOUT: !requires: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: generic impl @T.as_type.as.I.impl(%T.loc7_21.2: %J.type) { @@ -224,6 +228,8 @@ fn Use() { UseJ(C); } // CHECK:STDOUT: fn() { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: @@ -249,6 +255,8 @@ fn Use() { UseJ(C); } // CHECK:STDOUT: %specific_impl_fn.loc11_19.1: = specific_impl_function %impl.elem0.loc11_19.1, @I.WithSelf.F(constants.%T.dda) [symbolic = %specific_impl_fn.loc11_19.2 (constants.%specific_impl_fn)] // CHECK:STDOUT: %I.WithSelf.F.call: init %empty_tuple.type = call %specific_impl_fn.loc11_19.1() // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: @@ -273,6 +281,8 @@ fn Use() { UseJ(C); } // CHECK:STDOUT: %UseI.specific_fn.loc12_18.1: = specific_function %UseI.ref, @UseI(constants.%I.facet.39f) [symbolic = %UseI.specific_fn.loc12_18.2 (constants.%UseI.specific_fn.081)] // CHECK:STDOUT: %UseI.call: init %empty_tuple.type = call %UseI.specific_fn.loc12_18.1() // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: @@ -285,6 +295,8 @@ fn Use() { UseJ(C); } // CHECK:STDOUT: %UseJ.specific_fn: = specific_function %UseJ.ref, @UseJ(constants.%J.facet) [concrete = constants.%UseJ.specific_fn] // CHECK:STDOUT: %UseJ.call: init %empty_tuple.type = call %UseJ.specific_fn() // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: specific @I.WithSelf(constants.%Self.37e) { diff --git a/toolchain/check/testdata/interface/generic.carbon b/toolchain/check/testdata/interface/generic.carbon index fa3368172d8b..6f1358de8298 100644 --- a/toolchain/check/testdata/interface/generic.carbon +++ b/toolchain/check/testdata/interface/generic.carbon @@ -225,6 +225,8 @@ fn F(unused T:! Generic((), ())) {} // CHECK:STDOUT: witness = () // CHECK:STDOUT: // CHECK:STDOUT: !requires: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: @@ -260,6 +262,8 @@ fn F(unused T:! Generic((), ())) {} // CHECK:STDOUT: witness = (@WithAssocFn.WithSelf.%WithAssocFn.WithSelf.F.decl) // CHECK:STDOUT: // CHECK:STDOUT: !requires: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: @@ -344,6 +348,8 @@ fn F(unused T:! Generic((), ())) {} // CHECK:STDOUT: %.loc17_15.2: init %X to %return.param = class_init () [concrete = constants.%X.val] // CHECK:STDOUT: %.loc17_16: init %X = converted %.loc17_15.1, %.loc17_15.2 [concrete = constants.%X.val] // CHECK:STDOUT: return %.loc17_16 to %return.param +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: generic fn @Receive(%T.loc24_20.3: %Simple.type.d50) { @@ -356,6 +362,8 @@ fn F(unused T:! Generic((), ())) {} // CHECK:STDOUT: fn() { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: @@ -373,6 +381,8 @@ fn F(unused T:! Generic((), ())) {} // CHECK:STDOUT: %Receive.specific_fn.loc26_3.1: = specific_function %Receive.ref, @Receive(constants.%T.16788c.1) [symbolic = %Receive.specific_fn.loc26_3.2 (constants.%Receive.specific_fn)] // CHECK:STDOUT: %Receive.call: init %empty_tuple.type = call %Receive.specific_fn.loc26_3.1() // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: @@ -561,6 +571,8 @@ fn F(unused T:! Generic((), ())) {} // CHECK:STDOUT: witness = () // CHECK:STDOUT: // CHECK:STDOUT: !requires: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: @@ -600,6 +612,8 @@ fn F(unused T:! Generic((), ())) {} // CHECK:STDOUT: %T.ref: %Generic.type.57d = name_ref T, %T.loc10_7.2 [symbolic = %T.loc10_7.1 (constants.%T.f18)] // CHECK:STDOUT: %T.as_type.loc18_6.1: type = facet_access_type %T.ref [symbolic = %T.as_type.loc18_6.2 (constants.%T.as_type)] // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: @@ -700,6 +714,8 @@ fn F(unused T:! Generic((), ())) {} // CHECK:STDOUT: witness = () // CHECK:STDOUT: // CHECK:STDOUT: !requires: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: @@ -709,6 +725,8 @@ fn F(unused T:! Generic((), ())) {} // CHECK:STDOUT: fn() { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/interface/generic_binding_after_assoc_const.carbon b/toolchain/check/testdata/interface/generic_binding_after_assoc_const.carbon index abb67f79655c..6bf9fc503ca8 100644 --- a/toolchain/check/testdata/interface/generic_binding_after_assoc_const.carbon +++ b/toolchain/check/testdata/interface/generic_binding_after_assoc_const.carbon @@ -84,6 +84,8 @@ interface I { // CHECK:STDOUT: witness = (@I.WithSelf.%I.WithSelf.F.decl, @I.WithSelf.%U, @I.WithSelf.%I.WithSelf.G.decl) // CHECK:STDOUT: // CHECK:STDOUT: !requires: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: generic fn @I.WithSelf.F(@I.%Self: %I.type, %T.loc16_9.2: type) { diff --git a/toolchain/check/testdata/interface/generic_import.carbon b/toolchain/check/testdata/interface/generic_import.carbon index 1e6216aeec53..b926b79ec376 100644 --- a/toolchain/check/testdata/interface/generic_import.carbon +++ b/toolchain/check/testdata/interface/generic_import.carbon @@ -86,6 +86,8 @@ impl C as AddWith(C) { // CHECK:STDOUT: witness = (@AddWith.WithSelf.%AddWith.WithSelf.F.decl) // CHECK:STDOUT: // CHECK:STDOUT: !requires: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: @@ -172,6 +174,8 @@ impl C as AddWith(C) { // CHECK:STDOUT: witness = (imports.%Main.F) // CHECK:STDOUT: // CHECK:STDOUT: !requires: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: @@ -201,6 +205,8 @@ impl C as AddWith(C) { // CHECK:STDOUT: fn @C.as.AddWith.impl.F() { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: specific @AddWith(constants.%T) { diff --git a/toolchain/check/testdata/interface/generic_method.carbon b/toolchain/check/testdata/interface/generic_method.carbon index ddfcf9dee5d9..cbba4a042a45 100644 --- a/toolchain/check/testdata/interface/generic_method.carbon +++ b/toolchain/check/testdata/interface/generic_method.carbon @@ -386,6 +386,8 @@ fn CallIndirect() { // CHECK:STDOUT: witness = (@A.WithSelf.%A.WithSelf.F.decl) // CHECK:STDOUT: // CHECK:STDOUT: !requires: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: @@ -527,6 +529,8 @@ fn CallIndirect() { // CHECK:STDOUT: %.loc17_22.5: init @Y.as.A.impl.F.%tuple.type.loc16 (%tuple.type.316) to %return.param = tuple_init (%.loc17_22.2, %.loc17_22.3, %.loc17_22.4) // CHECK:STDOUT: %.loc17_23: init @Y.as.A.impl.F.%tuple.type.loc16 (%tuple.type.316) = converted %.loc17_22.1, %.loc17_22.5 // CHECK:STDOUT: return %.loc17_23 to %return.param +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: @@ -570,6 +574,8 @@ fn CallIndirect() { // CHECK:STDOUT: %Destroy.Op.bound.loc22: = bound_method %u.var, constants.%Destroy.Op.1a2547.6 // CHECK:STDOUT: %Destroy.Op.call.loc22: init %empty_tuple.type = call %Destroy.Op.bound.loc22(%u.var) // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Destroy.Op.loc23_22.1(%self.param: ref %empty_struct_type) = "no_op"; @@ -577,11 +583,15 @@ fn CallIndirect() { // CHECK:STDOUT: fn @Destroy.Op.loc23_22.2(%self.param: ref %X) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Destroy.Op.loc23_22.3(%self.param: ref %Y) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Destroy.Op.loc23_22.4(%self.param: ref %ptr.415) = "no_op"; @@ -589,11 +599,15 @@ fn CallIndirect() { // CHECK:STDOUT: fn @Destroy.Op.loc23_22.5(%self.param: ref %tuple.type.2cd) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Destroy.Op.loc22(%self.param: ref %Z) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: generic fn @CallGeneric(%T.loc26_17.2: %facet_type) { @@ -659,6 +673,8 @@ fn CallIndirect() { // CHECK:STDOUT: %Destroy.Op.bound: = bound_method %u.var, constants.%Destroy.Op.1a2547.6 // CHECK:STDOUT: %Destroy.Op.call: init %empty_tuple.type = call %Destroy.Op.bound(%u.var) // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: @@ -671,6 +687,8 @@ fn CallIndirect() { // CHECK:STDOUT: %CallGeneric.specific_fn: = specific_function %CallGeneric.ref, @CallGeneric(constants.%facet_value) [concrete = constants.%CallGeneric.specific_fn] // CHECK:STDOUT: %CallGeneric.call: init %empty_tuple.type = call %CallGeneric.specific_fn() // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: specific @A(constants.%T.67d) { @@ -1191,6 +1209,8 @@ fn CallIndirect() { // CHECK:STDOUT: witness = (@A.WithSelf.%A.WithSelf.F.decl) // CHECK:STDOUT: // CHECK:STDOUT: !requires: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: @@ -1340,6 +1360,8 @@ fn CallIndirect() { // CHECK:STDOUT: %.loc17_42.1: ref @tuple.type.as.A.impl.F.%tuple.type.loc17_42.2 (%tuple.type.897) = splice_block %return.param {} // CHECK:STDOUT: %tuple.type.as.A.impl.F.call: init @tuple.type.as.A.impl.F.%tuple.type.loc17_42.2 (%tuple.type.897) to %.loc17_42.1 = call %tuple.type.as.A.impl.F.specific_fn.loc18_12.1(%u.ref) // CHECK:STDOUT: return %tuple.type.as.A.impl.F.call to %return.param +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: @@ -1375,6 +1397,8 @@ fn CallIndirect() { // CHECK:STDOUT: %Destroy.Op.call.loc24_39: init %empty_tuple.type = call %Destroy.Op.bound(%.loc24_39.2) // CHECK:STDOUT: %Destroy.Op.call.loc24_38: init %empty_tuple.type = call constants.%Destroy.Op.bound(constants.%.7dc) // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Destroy.Op.loc24_39.1(%self.param: ref %empty_struct_type) = "no_op"; @@ -1382,31 +1406,43 @@ fn CallIndirect() { // CHECK:STDOUT: fn @Destroy.Op.loc24_39.2(%self.param: ref %X) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Destroy.Op.loc24_39.3(%self.param: ref %Y1) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Destroy.Op.loc24_39.4(%self.param: ref %Y2) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Destroy.Op.loc24_39.5(%self.param: ref %tuple.type.59f) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Destroy.Op.loc24_39.6(%self.param: ref %Z) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Destroy.Op.loc24_39.7(%self.param: ref %tuple.type.d40) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: generic fn @CallGeneric(%T.loc27_17.2: %facet_type) { @@ -1460,6 +1496,8 @@ fn CallIndirect() { // CHECK:STDOUT: %Destroy.WithSelf.Op.call: init %empty_tuple.type = call %bound_method.loc28_12.2(%.loc28_12.2) // CHECK:STDOUT: %Destroy.Op.call: init %empty_tuple.type = call constants.%Destroy.Op.bound(constants.%.7dc) // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: @@ -1476,6 +1514,8 @@ fn CallIndirect() { // CHECK:STDOUT: %CallGeneric.specific_fn: = specific_function %CallGeneric.ref, @CallGeneric(constants.%facet_value) [concrete = constants.%CallGeneric.specific_fn] // CHECK:STDOUT: %CallGeneric.call: init %empty_tuple.type = call %CallGeneric.specific_fn() // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: specific @A(constants.%T.67d) { diff --git a/toolchain/check/testdata/interface/generic_vs_params.carbon b/toolchain/check/testdata/interface/generic_vs_params.carbon index abe314246669..1779f05fe5f7 100644 --- a/toolchain/check/testdata/interface/generic_vs_params.carbon +++ b/toolchain/check/testdata/interface/generic_vs_params.carbon @@ -198,6 +198,8 @@ interface Bar[T:! type] {} // CHECK:STDOUT: witness = () // CHECK:STDOUT: // CHECK:STDOUT: !requires: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: interface @NotGenericButParams { @@ -209,6 +211,8 @@ interface Bar[T:! type] {} // CHECK:STDOUT: witness = () // CHECK:STDOUT: // CHECK:STDOUT: !requires: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: generic interface @GenericAndParams.loc6(%T.loc6_29.2: type) { @@ -228,6 +232,8 @@ interface Bar[T:! type] {} // CHECK:STDOUT: witness = () // CHECK:STDOUT: // CHECK:STDOUT: !requires: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: @@ -246,6 +252,8 @@ interface Bar[T:! type] {} // CHECK:STDOUT: witness = () // CHECK:STDOUT: // CHECK:STDOUT: !requires: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: @@ -267,6 +275,8 @@ interface Bar[T:! type] {} // CHECK:STDOUT: witness = () // CHECK:STDOUT: // CHECK:STDOUT: !requires: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: @@ -477,6 +487,8 @@ interface Bar[T:! type] {} // CHECK:STDOUT: witness = () // CHECK:STDOUT: // CHECK:STDOUT: !requires: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: specific @A.WithSelf(constants.%Self) {} @@ -506,6 +518,8 @@ interface Bar[T:! type] {} // CHECK:STDOUT: witness = () // CHECK:STDOUT: // CHECK:STDOUT: !requires: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: specific @A.WithSelf(constants.%Self) {} @@ -535,6 +549,8 @@ interface Bar[T:! type] {} // CHECK:STDOUT: witness = () // CHECK:STDOUT: // CHECK:STDOUT: !requires: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: specific @Bar.WithSelf(constants.%Self) {} @@ -585,6 +601,8 @@ interface Bar[T:! type] {} // CHECK:STDOUT: witness = () // CHECK:STDOUT: // CHECK:STDOUT: !requires: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/interface/import.carbon b/toolchain/check/testdata/interface/import.carbon index fb376fd9130e..b2ced51ef9fe 100644 --- a/toolchain/check/testdata/interface/import.carbon +++ b/toolchain/check/testdata/interface/import.carbon @@ -130,6 +130,8 @@ var f: ForwardDeclared* = &f_ref.f; // CHECK:STDOUT: witness = () // CHECK:STDOUT: // CHECK:STDOUT: !requires: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: interface @Basic { @@ -150,6 +152,8 @@ var f: ForwardDeclared* = &f_ref.f; // CHECK:STDOUT: witness = (@Basic.WithSelf.%T, @Basic.WithSelf.%Basic.WithSelf.F.decl) // CHECK:STDOUT: // CHECK:STDOUT: !requires: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: interface @ForwardDeclared { @@ -170,6 +174,8 @@ var f: ForwardDeclared* = &f_ref.f; // CHECK:STDOUT: witness = (@ForwardDeclared.WithSelf.%T, @ForwardDeclared.WithSelf.%ForwardDeclared.WithSelf.F.decl) // CHECK:STDOUT: // CHECK:STDOUT: !requires: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: generic fn @Basic.WithSelf.F(@Basic.%Self: %Basic.type) { @@ -190,6 +196,8 @@ var f: ForwardDeclared* = &f_ref.f; // CHECK:STDOUT: %T.as.DefaultOrUnformed.impl.Op.call: init %struct_type.f = call %T.as.DefaultOrUnformed.impl.Op.specific_fn() // CHECK:STDOUT: assign file.%f_ref.var, %T.as.DefaultOrUnformed.impl.Op.call // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: specific @Empty.WithSelf(constants.%Self.d44) {} @@ -371,6 +379,8 @@ var f: ForwardDeclared* = &f_ref.f; // CHECK:STDOUT: witness = () // CHECK:STDOUT: // CHECK:STDOUT: !requires: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: interface @Basic [from "a.carbon"] { @@ -381,6 +391,8 @@ var f: ForwardDeclared* = &f_ref.f; // CHECK:STDOUT: witness = (imports.%Main.T.e1d, imports.%Main.F.a88) // CHECK:STDOUT: // CHECK:STDOUT: !requires: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: interface @ForwardDeclared [from "a.carbon"] { @@ -391,11 +403,15 @@ var f: ForwardDeclared* = &f_ref.f; // CHECK:STDOUT: witness = (imports.%Main.T.c9b, imports.%Main.F.511) // CHECK:STDOUT: // CHECK:STDOUT: !requires: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @UseEmpty(%e.param: %Empty.type) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: generic fn @Basic.WithSelf.F(imports.%Main.import_ref.316a0d.2: %Basic.type) [from "a.carbon"] { @@ -405,6 +421,8 @@ var f: ForwardDeclared* = &f_ref.f; // CHECK:STDOUT: fn @UseBasic(%e.param: %Basic.type) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: generic fn @ForwardDeclared.WithSelf.F(imports.%Main.import_ref.a75fa2.2: %ForwardDeclared.type) [from "a.carbon"] { @@ -414,6 +432,8 @@ var f: ForwardDeclared* = &f_ref.f; // CHECK:STDOUT: fn @UseForwardDeclared(%f.param: %ForwardDeclared.type) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @__global_init() { @@ -428,6 +448,8 @@ var f: ForwardDeclared* = &f_ref.f; // CHECK:STDOUT: %ptr.as.Copy.impl.Op.call: init %ptr.b71 = call %bound_method.loc16_27.2(%addr) [concrete = constants.%addr] // CHECK:STDOUT: assign file.%f.var, %ptr.as.Copy.impl.Op.call // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: specific @Empty.WithSelf(constants.%Self.4e8) { diff --git a/toolchain/check/testdata/interface/import_access.carbon b/toolchain/check/testdata/interface/import_access.carbon index cef997c94087..5b4600d776ce 100644 --- a/toolchain/check/testdata/interface/import_access.carbon +++ b/toolchain/check/testdata/interface/import_access.carbon @@ -175,6 +175,8 @@ private interface Redecl {} // CHECK:STDOUT: witness = () // CHECK:STDOUT: // CHECK:STDOUT: !requires: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: specific @Def.WithSelf(constants.%Self) {} @@ -203,6 +205,8 @@ private interface Redecl {} // CHECK:STDOUT: witness = () // CHECK:STDOUT: // CHECK:STDOUT: !requires: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: specific @ForwardWithDef.WithSelf(constants.%Self) {} @@ -253,11 +257,15 @@ private interface Redecl {} // CHECK:STDOUT: witness = () // CHECK:STDOUT: // CHECK:STDOUT: !requires: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @F(%i.param: %Def.type) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: specific @Def.WithSelf(constants.%Self) { @@ -290,6 +298,8 @@ private interface Redecl {} // CHECK:STDOUT: fn @F(%i.param: ) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- fail_other_def.carbon @@ -328,6 +338,8 @@ private interface Redecl {} // CHECK:STDOUT: fn @F(%i.param: ) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- forward_with_def.impl.carbon @@ -370,11 +382,15 @@ private interface Redecl {} // CHECK:STDOUT: witness = () // CHECK:STDOUT: // CHECK:STDOUT: !requires: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @F(%i.param: %ForwardWithDef.type) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: specific @ForwardWithDef.WithSelf(constants.%Self) { @@ -407,6 +423,8 @@ private interface Redecl {} // CHECK:STDOUT: fn @F(%i.param: ) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- fail_other_forward_with_def.carbon @@ -445,6 +463,8 @@ private interface Redecl {} // CHECK:STDOUT: fn @F(%i.param: ) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- fail_todo_forward.impl.carbon @@ -486,11 +506,15 @@ private interface Redecl {} // CHECK:STDOUT: witness = () // CHECK:STDOUT: // CHECK:STDOUT: !requires: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @F(%i.param: ) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: specific @Forward.WithSelf(constants.%Self) {} @@ -524,6 +548,8 @@ private interface Redecl {} // CHECK:STDOUT: fn @F(%i.param: ) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- fail_other_forward.carbon @@ -562,6 +588,8 @@ private interface Redecl {} // CHECK:STDOUT: fn @F(%i.param: ) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- todo_fail_private_on_redecl.carbon @@ -588,6 +616,8 @@ private interface Redecl {} // CHECK:STDOUT: witness = () // CHECK:STDOUT: // CHECK:STDOUT: !requires: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: specific @Redecl.WithSelf(constants.%Self) {} diff --git a/toolchain/check/testdata/interface/import_interface_decl.carbon b/toolchain/check/testdata/interface/import_interface_decl.carbon index 278f2237b2eb..f66d1e9572d1 100644 --- a/toolchain/check/testdata/interface/import_interface_decl.carbon +++ b/toolchain/check/testdata/interface/import_interface_decl.carbon @@ -74,6 +74,8 @@ impl library "[[@TEST_NAME]]"; // CHECK:STDOUT: witness = () // CHECK:STDOUT: // CHECK:STDOUT: !requires: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: impl @empty_tuple.type.as.B.impl: imports.%Main.import_ref.e5c as imports.%Main.import_ref.21a [from "fail_b.carbon"]; diff --git a/toolchain/check/testdata/interface/incomplete.carbon b/toolchain/check/testdata/interface/incomplete.carbon index 40c20d9df7bc..ee5b35acc197 100644 --- a/toolchain/check/testdata/interface/incomplete.carbon +++ b/toolchain/check/testdata/interface/incomplete.carbon @@ -133,6 +133,8 @@ interface A(T:! type) { // CHECK:STDOUT: witness = (@I.WithSelf.%T) // CHECK:STDOUT: // CHECK:STDOUT: !requires: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: class @C; @@ -198,6 +200,8 @@ interface A(T:! type) { // CHECK:STDOUT: witness = (@I.WithSelf.%T) // CHECK:STDOUT: // CHECK:STDOUT: !requires: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: impl @empty_struct_type.as..impl: %.loc16_7.2 as { @@ -285,6 +289,8 @@ interface A(T:! type) { // CHECK:STDOUT: witness = (@I.WithSelf.%T) // CHECK:STDOUT: // CHECK:STDOUT: !requires: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: class @C; @@ -308,6 +314,8 @@ interface A(T:! type) { // CHECK:STDOUT: %T.ref: %I.assoc_type = name_ref T, @T.%assoc0 [concrete = constants.%assoc0] // CHECK:STDOUT: %impl.elem0.loc11_4.1: %C = impl_witness_access constants.%I.lookup_impl_witness, element0 [symbolic = %impl.elem0.loc11_4.2 (constants.%impl.elem0)] // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: @@ -357,6 +365,8 @@ interface A(T:! type) { // CHECK:STDOUT: witness = () // CHECK:STDOUT: // CHECK:STDOUT: !requires: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: constraint @A; @@ -397,6 +407,8 @@ interface A(T:! type) { // CHECK:STDOUT: witness = () // CHECK:STDOUT: // CHECK:STDOUT: !requires: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: generic require @A.WithSelf.Self.as_type.impls.A.type.require(@A.%Self: %A.type) { @@ -474,6 +486,8 @@ interface A(T:! type) { // CHECK:STDOUT: witness = () // CHECK:STDOUT: // CHECK:STDOUT: !requires: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/interface/local.carbon b/toolchain/check/testdata/interface/local.carbon index fc71f562c446..5a44c8cc1f12 100644 --- a/toolchain/check/testdata/interface/local.carbon +++ b/toolchain/check/testdata/interface/local.carbon @@ -84,6 +84,8 @@ fn F() { // CHECK:STDOUT: witness = (@I.WithSelf.%I.WithSelf.G.decl) // CHECK:STDOUT: // CHECK:STDOUT: !requires: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: impl @empty_tuple.type.as.I.impl: %.loc19_9.2 as %I.ref { @@ -121,6 +123,8 @@ fn F() { // CHECK:STDOUT: %.loc22_4.2: %empty_tuple.type = converted %.loc22_4.1, %empty_tuple [concrete = constants.%empty_tuple] // CHECK:STDOUT: %empty_tuple.type.as.I.impl.G.call: init %empty_tuple.type = call %bound_method(%.loc22_4.2) // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: generic fn @I.WithSelf.G(@I.%Self: %I.type) { @@ -136,6 +140,8 @@ fn F() { // CHECK:STDOUT: fn @empty_tuple.type.as.I.impl.G(%self.param: %empty_tuple.type) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: specific @I.WithSelf(constants.%Self) { diff --git a/toolchain/check/testdata/interface/member_lookup.carbon b/toolchain/check/testdata/interface/member_lookup.carbon index 6110b599e31c..bddf6fc520ae 100644 --- a/toolchain/check/testdata/interface/member_lookup.carbon +++ b/toolchain/check/testdata/interface/member_lookup.carbon @@ -225,6 +225,8 @@ fn AccessMissingConcrete(I:! Interface(i32)) -> i32 { // CHECK:STDOUT: witness = (@Interface.WithSelf.%X) // CHECK:STDOUT: // CHECK:STDOUT: !requires: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: @@ -277,6 +279,8 @@ fn AccessMissingConcrete(I:! Interface(i32)) -> i32 { // CHECK:STDOUT: %bound_method.loc9_11.2: = bound_method %impl.elem0.loc9_11.1, %specific_impl_fn.loc9_11.1 [symbolic = %bound_method.loc9_11.4 (constants.%bound_method.060)] // CHECK:STDOUT: %Copy.WithSelf.Op.call: init @AccessGeneric.%ptr.loc8_50.1 (%ptr.e8f) = call %bound_method.loc9_11.2(%impl.elem0.loc9_11.1) // CHECK:STDOUT: return %Copy.WithSelf.Op.call +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: @@ -305,6 +309,8 @@ fn AccessMissingConcrete(I:! Interface(i32)) -> i32 { // CHECK:STDOUT: %bound_method.loc13_11.2: = bound_method %impl.elem0.loc13_11.1, %specific_fn [symbolic = %bound_method.loc13_11.3 (constants.%bound_method.195)] // CHECK:STDOUT: %ptr.as.Copy.impl.Op.call: init %ptr.d08 = call %bound_method.loc13_11.2(%impl.elem0.loc13_11.1) [symbolic = %impl.elem0.loc13_11.3 (constants.%impl.elem0.3b7)] // CHECK:STDOUT: return %ptr.as.Copy.impl.Op.call +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: @@ -519,6 +525,8 @@ fn AccessMissingConcrete(I:! Interface(i32)) -> i32 { // CHECK:STDOUT: witness = (@Interface.WithSelf.%X) // CHECK:STDOUT: // CHECK:STDOUT: !requires: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: @@ -546,6 +554,8 @@ fn AccessMissingConcrete(I:! Interface(i32)) -> i32 { // CHECK:STDOUT: %.loc13: type = converted %I.ref, %I.as_type.loc13_11.1 [symbolic = %I.as_type.loc13_11.2 (constants.%I.as_type.3c3)] // CHECK:STDOUT: %nonesuch.ref: = name_ref nonesuch, [concrete = ] // CHECK:STDOUT: return to %return.param +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: @@ -563,6 +573,8 @@ fn AccessMissingConcrete(I:! Interface(i32)) -> i32 { // CHECK:STDOUT: %.loc21: type = converted %I.ref, %I.as_type.loc21_11.1 [symbolic = %I.as_type.loc21_11.2 (constants.%I.as_type.307)] // CHECK:STDOUT: %nonesuch.ref: = name_ref nonesuch, [concrete = ] // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/interface/observe.carbon b/toolchain/check/testdata/interface/observe.carbon new file mode 100644 index 000000000000..95c348bae08c --- /dev/null +++ b/toolchain/check/testdata/interface/observe.carbon @@ -0,0 +1,6550 @@ +// 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 +// +// INCLUDE-FILE: toolchain/testing/testdata/min_prelude/convert.carbon +// EXTRA-ARGS: --dump-sem-ir-ranges=if-present +// +// AUTOUPDATE +// TIP: To test this file alone, run: +// TIP: bazel test //toolchain/testing:file_test --test_arg=--file_tests=toolchain/check/testdata/interface/observe.carbon +// TIP: To dump output, run: +// TIP: bazel run //toolchain/testing:file_test -- --dump_output --file_tests=toolchain/check/testdata/interface/observe.carbon + +// --- transitive.carbon +library "[[@TEST_NAME]]"; + +interface P { fn InP(self); } +interface Q { fn InQ(self); } +interface R { fn InR(self); } + +interface Transitive { + let A:! P & Core.Destroy; + let B:! (Q where .Self == A) & Core.Destroy; + let C:! (R where .Self == B) & Core.Destroy; + + fn GetA(self) -> A; + fn TakesC(self, c: C); + + observe A == B == C; +} + +// --- fail_todo_equivalent.carbon +library "[[@TEST_NAME]]"; + +import library "transitive"; + +fn F[T:! Transitive](t: T) { + var a: T.A = t.GetA(); + + // CHECK:STDERR: fail_todo_equivalent.carbon:[[@LINE+7]]:3: error: cannot implicitly convert expression of type `T.(Transitive.A)` to `T.(Transitive.B)` [ConversionFailure] + // CHECK:STDERR: var b: T.B = a; + // CHECK:STDERR: ^~~~~~~~~~ + // CHECK:STDERR: fail_todo_equivalent.carbon:[[@LINE+4]]:3: note: type `T.(Transitive.A)` does not implement interface `Core.ImplicitAs(T.(Transitive.B))` [MissingImplInMemberAccessInContext] + // CHECK:STDERR: var b: T.B = a; + // CHECK:STDERR: ^~~~~~~~~~ + // CHECK:STDERR: + var b: T.B = a; + b.InQ(); + + // CHECK:STDERR: fail_todo_equivalent.carbon:[[@LINE+8]]:3: error: cannot convert type `T.(Transitive.A)` that implements `Core.Destroy & P` into type implementing `R` [ConversionFailureFacetToFacet] + // CHECK:STDERR: a.(T.C.InR)(); + // CHECK:STDERR: ^~~~~~~~~~~~~ + // CHECK:STDERR: fail_todo_equivalent.carbon:[[@LINE-18]]:1: in import [InImport] + // CHECK:STDERR: transitive.carbon:5:15: note: while deducing parameters of generic declared here [DeductionGenericHere] + // CHECK:STDERR: interface R { fn InR(self); } + // CHECK:STDERR: ^~~~~~~~~~~~~ + // CHECK:STDERR: + a.(T.C.InR)(); + // CHECK:STDERR: fail_todo_equivalent.carbon:[[@LINE+7]]:4: error: cannot convert expression of type `T.(Transitive.A)` to `T.(Transitive.C)` with `as` [ConversionFailure] + // CHECK:STDERR: (a as T.C).InR(); + // CHECK:STDERR: ^~~~~~~~ + // CHECK:STDERR: fail_todo_equivalent.carbon:[[@LINE+4]]:4: note: type `T.(Transitive.A)` does not implement interface `Core.As(T.(Transitive.C))` [MissingImplInMemberAccessInContext] + // CHECK:STDERR: (a as T.C).InR(); + // CHECK:STDERR: ^~~~~~~~ + // CHECK:STDERR: + (a as T.C).InR(); +} + +// --- fail_todo_impls.carbon +library "[[@TEST_NAME]]"; + +interface A {} +interface B { require impls A; } +interface C { require impls B; } + +fn RequiresA[T:! A](unused x: T) {} +fn F[T:! C](x: T) { + observe T impls B; + + // CHECK:STDERR: fail_todo_impls.carbon:[[@LINE+7]]:3: error: cannot convert type `T` that implements `C` into type implementing `A` [ConversionFailureFacetToFacet] + // CHECK:STDERR: RequiresA(x); + // CHECK:STDERR: ^~~~~~~~~~~~ + // CHECK:STDERR: fail_todo_impls.carbon:[[@LINE-7]]:1: note: while deducing parameters of generic declared here [DeductionGenericHere] + // CHECK:STDERR: fn RequiresA[T:! A](unused x: T) {} + // CHECK:STDERR: ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + // CHECK:STDERR: + RequiresA(x); +} + +// --- fail_todo_equivalent_impls.carbon +library "[[@TEST_NAME]]"; + +import library "transitive"; + +fn TakesPQR[U:! P & Q & R](unused u: U) {} +fn G[T:! Transitive](t: T) { + var a: T.A = t.GetA(); + + observe T.A == T.B impls Q; + // CHECK:STDERR: fail_todo_equivalent_impls.carbon:[[@LINE+4]]:3: error: cannot access member of interface `Q` in type `T.(Transitive.A)` that does not implement that interface [MissingImplInMemberAccess] + // CHECK:STDERR: a.(Q.InQ)(); + // CHECK:STDERR: ^~~~~~~~~ + // CHECK:STDERR: + a.(Q.InQ)(); + + observe T.A == T.C impls R; + // CHECK:STDERR: fail_todo_equivalent_impls.carbon:[[@LINE+7]]:3: error: cannot convert type `T.(Transitive.A)` that implements `P & Core.Destroy` into type implementing `P & Q & R` [ConversionFailureFacetToFacet] + // CHECK:STDERR: TakesPQR(a); + // CHECK:STDERR: ^~~~~~~~~~~ + // CHECK:STDERR: fail_todo_equivalent_impls.carbon:[[@LINE-15]]:1: note: while deducing parameters of generic declared here [DeductionGenericHere] + // CHECK:STDERR: fn TakesPQR[U:! P & Q & R](unused u: U) {} + // CHECK:STDERR: ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + // CHECK:STDERR: + TakesPQR(a); +} + +// --- fail_equivalent_impls_without_observe.carbon +library "[[@TEST_NAME]]"; + +import library "transitive"; + +fn TakesPQR[U:! P & Q & R](unused u: U) {} +fn G[T:! Transitive](t: T) { + var a: T.A = t.GetA(); + + // CHECK:STDERR: fail_equivalent_impls_without_observe.carbon:[[@LINE+4]]:3: error: cannot access member of interface `Q` in type `T.(Transitive.A)` that does not implement that interface [MissingImplInMemberAccess] + // CHECK:STDERR: a.(Q.InQ)(); + // CHECK:STDERR: ^~~~~~~~~ + // CHECK:STDERR: + a.(Q.InQ)(); + + // CHECK:STDERR: fail_equivalent_impls_without_observe.carbon:[[@LINE+7]]:3: error: cannot convert type `T.(Transitive.A)` that implements `P & Core.Destroy` into type implementing `P & Q & R` [ConversionFailureFacetToFacet] + // CHECK:STDERR: TakesPQR(a); + // CHECK:STDERR: ^~~~~~~~~~~ + // CHECK:STDERR: fail_equivalent_impls_without_observe.carbon:[[@LINE-13]]:1: note: while deducing parameters of generic declared here [DeductionGenericHere] + // CHECK:STDERR: fn TakesPQR[U:! P & Q & R](unused u: U) {} + // CHECK:STDERR: ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + // CHECK:STDERR: + TakesPQR(a); +} + +// --- fail_todo_same_observe_in_both_scopes.carbon +library "[[@TEST_NAME]]"; + +import library "transitive"; + +fn G[T:! Transitive](t: T) { + observe T.A == T.B == T.C; + + var a: T.A = t.GetA(); + // CHECK:STDERR: fail_todo_same_observe_in_both_scopes.carbon:[[@LINE+8]]:3: error: cannot convert type `T.(Transitive.A)` that implements `Core.Destroy & P` into type implementing `R` [ConversionFailureFacetToFacet] + // CHECK:STDERR: a.(T.C.InR)(); + // CHECK:STDERR: ^~~~~~~~~~~~~ + // CHECK:STDERR: fail_todo_same_observe_in_both_scopes.carbon:[[@LINE-9]]:1: in import [InImport] + // CHECK:STDERR: transitive.carbon:5:15: note: while deducing parameters of generic declared here [DeductionGenericHere] + // CHECK:STDERR: interface R { fn InR(self); } + // CHECK:STDERR: ^~~~~~~~~~~~~ + // CHECK:STDERR: + a.(T.C.InR)(); +} + +// --- blanket_impls.carbon +library "[[@TEST_NAME]]"; + +interface A { } +interface B { } +interface C { } +interface D { } + +impl forall [T:! A] T as B { } +impl forall [T:! B] T as C { } +impl forall [T:! C] T as D { } + +fn RequiresB[T:! B](unused x: T) {} +fn RequiresD[T:! D](unused x: T) {} + +fn RequiresA[T:! A](x: T) { + RequiresB(x); + + observe T impls B; + observe T impls C; + RequiresD(x); +} + +// --- fail_todo_nested_functions_in_outer.carbon +library "[[@TEST_NAME]]"; + +interface A {} +interface B {} + +fn RequiresA[T:! A](unused x: T) {} +fn F[T:! A, U:! B where .Self == T]() { + observe T == U; + + fn InnerF(x: U) { + // CHECK:STDERR: fail_todo_nested_functions_in_outer.carbon:[[@LINE+7]]:5: error: cannot convert type `U` that implements `B where...` into type implementing `A` [ConversionFailureFacetToFacet] + // CHECK:STDERR: RequiresA(x); + // CHECK:STDERR: ^~~~~~~~~~~~ + // CHECK:STDERR: fail_todo_nested_functions_in_outer.carbon:[[@LINE-8]]:1: note: while deducing parameters of generic declared here [DeductionGenericHere] + // CHECK:STDERR: fn RequiresA[T:! A](unused x: T) {} + // CHECK:STDERR: ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + // CHECK:STDERR: + RequiresA(x); + } +} + +// --- fail_todo_nested_functions_in_inner.carbon +library "[[@TEST_NAME]]"; + +interface A {} +interface B {} + +fn RequiresA[T:! A](unused x: T) {} +fn F[T:! A, U:! B where .Self == T]() { + + fn InnerF(x: U) { + observe T == U; + + // CHECK:STDERR: fail_todo_nested_functions_in_inner.carbon:[[@LINE+7]]:5: error: cannot convert type `U` that implements `B where...` into type implementing `A` [ConversionFailureFacetToFacet] + // CHECK:STDERR: RequiresA(x); + // CHECK:STDERR: ^~~~~~~~~~~~ + // CHECK:STDERR: fail_todo_nested_functions_in_inner.carbon:[[@LINE-9]]:1: note: while deducing parameters of generic declared here [DeductionGenericHere] + // CHECK:STDERR: fn RequiresA[T:! A](unused x: T) {} + // CHECK:STDERR: ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + // CHECK:STDERR: + RequiresA(x); + } +} + +// --- fail_nested_functions_lexical_order.carbon +library "[[@TEST_NAME]]"; + +interface A {} +interface B {} + +fn RequiresA[T:! A](unused x: T) {} +fn F[T:! A, U:! B where .Self == T]() { + + fn InnerF(x: U) { + // CHECK:STDERR: fail_nested_functions_lexical_order.carbon:[[@LINE+7]]:5: error: cannot convert type `U` that implements `B where...` into type implementing `A` [ConversionFailureFacetToFacet] + // CHECK:STDERR: RequiresA(x); + // CHECK:STDERR: ^~~~~~~~~~~~ + // CHECK:STDERR: fail_nested_functions_lexical_order.carbon:[[@LINE-7]]:1: note: while deducing parameters of generic declared here [DeductionGenericHere] + // CHECK:STDERR: fn RequiresA[T:! A](unused x: T) {} + // CHECK:STDERR: ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + // CHECK:STDERR: + RequiresA(x); + } + + observe T == U; +} + +// --- fail_nested_functions_leak_upward.carbon +library "[[@TEST_NAME]]"; + +interface A {} +interface B {} + +fn RequiresA[T:! A](unused x: T) {} +fn F[T:! A, U:! B where .Self == T](x: U) { + + fn InnerF(unused x: U) { + observe T == U; + } + + // CHECK:STDERR: fail_nested_functions_leak_upward.carbon:[[@LINE+7]]:3: error: cannot convert type `U` that implements `B where...` into type implementing `A` [ConversionFailureFacetToFacet] + // CHECK:STDERR: RequiresA(x); + // CHECK:STDERR: ^~~~~~~~~~~~ + // CHECK:STDERR: fail_nested_functions_leak_upward.carbon:[[@LINE-10]]:1: note: while deducing parameters of generic declared here [DeductionGenericHere] + // CHECK:STDERR: fn RequiresA[T:! A](unused x: T) {} + // CHECK:STDERR: ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + // CHECK:STDERR: + RequiresA(x); +} + +// --- fail_not_observed.carbon +library "[[@TEST_NAME]]"; + +interface A {} +interface B {} + +fn RequiresA[T:! A](unused x: T) {} +fn F[T:! A, U:! B where .Self == T, V:! B](x: U) { + observe T == V; + + // CHECK:STDERR: fail_not_observed.carbon:[[@LINE+7]]:3: error: cannot convert type `U` that implements `B where...` into type implementing `A` [ConversionFailureFacetToFacet] + // CHECK:STDERR: RequiresA(x); + // CHECK:STDERR: ^~~~~~~~~~~~ + // CHECK:STDERR: fail_not_observed.carbon:[[@LINE-7]]:1: note: while deducing parameters of generic declared here [DeductionGenericHere] + // CHECK:STDERR: fn RequiresA[T:! A](unused x: T) {} + // CHECK:STDERR: ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + // CHECK:STDERR: + RequiresA(x); +} + +// --- fail_invalid_equivalent.carbon +library "[[@TEST_NAME]]"; + +interface A {} +interface B {} + +fn TakesA[T:! A](unused x: T) {} +fn F[T:! A, U:! B](x: U) { + observe T == U; + // CHECK:STDERR: fail_invalid_equivalent.carbon:[[@LINE+7]]:3: error: cannot convert type `U` that implements `B` into type implementing `A` [ConversionFailureFacetToFacet] + // CHECK:STDERR: TakesA(x); + // CHECK:STDERR: ^~~~~~~~~ + // CHECK:STDERR: fail_invalid_equivalent.carbon:[[@LINE-6]]:1: note: while deducing parameters of generic declared here [DeductionGenericHere] + // CHECK:STDERR: fn TakesA[T:! A](unused x: T) {} + // CHECK:STDERR: ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + // CHECK:STDERR: + TakesA(x); +} + +// --- fail_wrong_scope_class.carbon +library "[[@TEST_NAME]]"; + +class C(T:! type, U:! type) { + // CHECK:STDERR: fail_wrong_scope_class.carbon:[[@LINE+4]]:3: error: `observe` can only be used in an `interface` or `function` [ObserveInWrongScope] + // CHECK:STDERR: observe T == U; + // CHECK:STDERR: ^~~~~~~ + // CHECK:STDERR: + observe T == U; +} + +// --- fail_wrong_scope_named_constraint.carbon +library "[[@TEST_NAME]]"; + +constraint C(T:! type, U:! type) { + // CHECK:STDERR: fail_wrong_scope_named_constraint.carbon:[[@LINE+4]]:3: error: `observe` can only be used in an `interface` or `function` [ObserveInWrongScope] + // CHECK:STDERR: observe T == U; + // CHECK:STDERR: ^~~~~~~ + // CHECK:STDERR: + observe T == U; +} + +// --- fail_non_facet_type_in_impls.carbon +library "[[@TEST_NAME]]"; + +class C {} +interface A {} + +fn F[T:! A]() { + // CHECK:STDERR: fail_non_facet_type_in_impls.carbon:[[@LINE+4]]:19: error: right argument of `impls` requirement must be a facet type [ImplsOnNonFacetType] + // CHECK:STDERR: observe T impls C; + // CHECK:STDERR: ^ + // CHECK:STDERR: + observe T impls C; +} + +// --- generic_observe.carbon +library "[[@TEST_NAME]]"; + +interface A {} +interface B {} +interface I(T:! A & Core.Destroy) { + let U:! (B where .Self == T) & Core.Destroy; + + fn GetU(self) -> U; + fn TakesT(self, t: T); + + observe T == U; +} + +// --- fail_todo_generic_import.carbon +library "[[@TEST_NAME]]"; + +import library "generic_observe"; + +class C {} +impl C as A {} + +fn F[T:! I(C)](t: T) { + var u: T.U = t.GetU(); + + // CHECK:STDERR: fail_todo_generic_import.carbon:[[@LINE+8]]:3: error: cannot convert type `T.(I(C as A & Core.Destroy).U)` that implements `Core.Destroy & B where...` into type implementing `A & Core.Destroy` [ConversionFailureFacetToFacet] + // CHECK:STDERR: t.TakesT(u); + // CHECK:STDERR: ^~~~~~~~~~~ + // CHECK:STDERR: fail_todo_generic_import.carbon:[[@LINE-11]]:1: in import [InImport] + // CHECK:STDERR: generic_observe.carbon:9:3: note: while deducing parameters of generic declared here [DeductionGenericHere] + // CHECK:STDERR: fn TakesT(self, t: T); + // CHECK:STDERR: ^~~~~~~~~~~~~~~~~~~~~~ + // CHECK:STDERR: + t.TakesT(u); +} + +// CHECK:STDOUT: --- transitive.carbon +// CHECK:STDOUT: +// CHECK:STDOUT: constants { +// CHECK:STDOUT: %P.type: type = facet_type <@P> [concrete] +// CHECK:STDOUT: %Self.801: %P.type = symbolic_binding Self, 0 [symbolic] +// CHECK:STDOUT: %Self.as_type.b49: type = facet_access_type %Self.801 [symbolic] +// CHECK:STDOUT: %pattern_type.fc0: type = pattern_type %Self.as_type.b49 [symbolic] +// CHECK:STDOUT: %self.param_patt.97c: %pattern_type.fc0 = value_param_pattern [symbolic] +// CHECK:STDOUT: %self.patt.090: %pattern_type.fc0 = at_binding_pattern self, %self.param_patt.97c [symbolic] +// CHECK:STDOUT: %P.WithSelf.InP.type: type = fn_type @P.WithSelf.InP, @P.WithSelf(%Self.801) [symbolic] +// CHECK:STDOUT: %P.WithSelf.InP: %P.WithSelf.InP.type = struct_value () [symbolic] +// CHECK:STDOUT: %P.assoc_type: type = assoc_entity_type @P [concrete] +// CHECK:STDOUT: %assoc0.1ba: %P.assoc_type = assoc_entity element0, @P.WithSelf.%P.WithSelf.InP.decl [concrete] +// CHECK:STDOUT: %Q.type: type = facet_type <@Q> [concrete] +// CHECK:STDOUT: %Self.ca9: %Q.type = symbolic_binding Self, 0 [symbolic] +// CHECK:STDOUT: %Self.as_type.7c9: type = facet_access_type %Self.ca9 [symbolic] +// CHECK:STDOUT: %pattern_type.684: type = pattern_type %Self.as_type.7c9 [symbolic] +// CHECK:STDOUT: %self.param_patt.9cf: %pattern_type.684 = value_param_pattern [symbolic] +// CHECK:STDOUT: %self.patt.f63: %pattern_type.684 = at_binding_pattern self, %self.param_patt.9cf [symbolic] +// CHECK:STDOUT: %Q.WithSelf.InQ.type: type = fn_type @Q.WithSelf.InQ, @Q.WithSelf(%Self.ca9) [symbolic] +// CHECK:STDOUT: %Q.WithSelf.InQ: %Q.WithSelf.InQ.type = struct_value () [symbolic] +// CHECK:STDOUT: %Q.assoc_type: type = assoc_entity_type @Q [concrete] +// CHECK:STDOUT: %assoc0.26a: %Q.assoc_type = assoc_entity element0, @Q.WithSelf.%Q.WithSelf.InQ.decl [concrete] +// CHECK:STDOUT: %R.type: type = facet_type <@R> [concrete] +// CHECK:STDOUT: %Self.9c1: %R.type = symbolic_binding Self, 0 [symbolic] +// CHECK:STDOUT: %Self.as_type.85f: type = facet_access_type %Self.9c1 [symbolic] +// CHECK:STDOUT: %pattern_type.ebd: type = pattern_type %Self.as_type.85f [symbolic] +// CHECK:STDOUT: %self.param_patt.659: %pattern_type.ebd = value_param_pattern [symbolic] +// CHECK:STDOUT: %self.patt.da0: %pattern_type.ebd = at_binding_pattern self, %self.param_patt.659 [symbolic] +// CHECK:STDOUT: %R.WithSelf.InR.type: type = fn_type @R.WithSelf.InR, @R.WithSelf(%Self.9c1) [symbolic] +// CHECK:STDOUT: %R.WithSelf.InR: %R.WithSelf.InR.type = struct_value () [symbolic] +// CHECK:STDOUT: %R.assoc_type: type = assoc_entity_type @R [concrete] +// CHECK:STDOUT: %assoc0.782: %R.assoc_type = assoc_entity element0, @R.WithSelf.%R.WithSelf.InR.decl [concrete] +// CHECK:STDOUT: %Transitive.type: type = facet_type <@Transitive> [concrete] +// CHECK:STDOUT: %Self.77c: %Transitive.type = symbolic_binding Self, 0 [symbolic] +// CHECK:STDOUT: %Destroy.type: type = facet_type <@Destroy> [concrete] +// CHECK:STDOUT: %BitAndWith.type.a06: type = generic_interface_type @BitAndWith [concrete] +// CHECK:STDOUT: %BitAndWith.generic: %BitAndWith.type.a06 = struct_value () [concrete] +// CHECK:STDOUT: %facet_type.b1b: type = facet_type <@P & @Destroy> [concrete] +// CHECK:STDOUT: %Transitive.assoc_type: type = assoc_entity_type @Transitive [concrete] +// CHECK:STDOUT: %assoc0.1be: %Transitive.assoc_type = assoc_entity element0, @Transitive.WithSelf.%A [concrete] +// CHECK:STDOUT: %Transitive.lookup_impl_witness: = lookup_impl_witness %Self.77c, @Transitive [symbolic] +// CHECK:STDOUT: %impl.elem0: %facet_type.b1b = impl_witness_access %Transitive.lookup_impl_witness, element0 [symbolic] +// CHECK:STDOUT: %facet_type.130: type = facet_type <@Q & @Destroy where TODO> [concrete] +// CHECK:STDOUT: %assoc1: %Transitive.assoc_type = assoc_entity element1, @Transitive.WithSelf.%B [concrete] +// CHECK:STDOUT: %impl.elem1: %facet_type.130 = impl_witness_access %Transitive.lookup_impl_witness, element1 [symbolic] +// CHECK:STDOUT: %facet_type.4c8: type = facet_type <@R & @Destroy where TODO> [concrete] +// CHECK:STDOUT: %assoc2: %Transitive.assoc_type = assoc_entity element2, @Transitive.WithSelf.%C [concrete] +// CHECK:STDOUT: %Self.as_type.7f2: type = facet_access_type %Self.77c [symbolic] +// CHECK:STDOUT: %pattern_type.b5c: type = pattern_type %Self.as_type.7f2 [symbolic] +// CHECK:STDOUT: %self.param_patt.ae9: %pattern_type.b5c = value_param_pattern [symbolic] +// CHECK:STDOUT: %self.patt.12b: %pattern_type.b5c = at_binding_pattern self, %self.param_patt.ae9 [symbolic] +// CHECK:STDOUT: %as_type.d30: type = facet_access_type %impl.elem0 [symbolic] +// CHECK:STDOUT: %.117: Core.Form = init_form %as_type.d30 [symbolic] +// CHECK:STDOUT: %pattern_type.51a: type = pattern_type %as_type.d30 [symbolic] +// CHECK:STDOUT: %return.param_patt.931: %pattern_type.51a = out_param_pattern [symbolic] +// CHECK:STDOUT: %return.patt.680: %pattern_type.51a = return_slot_pattern %return.param_patt.931, %as_type.d30 [symbolic] +// CHECK:STDOUT: %Transitive.WithSelf.GetA.type: type = fn_type @Transitive.WithSelf.GetA, @Transitive.WithSelf(%Self.77c) [symbolic] +// CHECK:STDOUT: %Transitive.WithSelf.GetA: %Transitive.WithSelf.GetA.type = struct_value () [symbolic] +// CHECK:STDOUT: %assoc3: %Transitive.assoc_type = assoc_entity element3, @Transitive.WithSelf.%Transitive.WithSelf.GetA.decl [concrete] +// CHECK:STDOUT: %impl.elem2: %facet_type.4c8 = impl_witness_access %Transitive.lookup_impl_witness, element2 [symbolic] +// CHECK:STDOUT: %as_type.472: type = facet_access_type %impl.elem2 [symbolic] +// CHECK:STDOUT: %pattern_type.007: type = pattern_type %as_type.472 [symbolic] +// CHECK:STDOUT: %c.param_patt: %pattern_type.007 = value_param_pattern [symbolic] +// CHECK:STDOUT: %c.patt: %pattern_type.007 = at_binding_pattern c, %c.param_patt [symbolic] +// CHECK:STDOUT: %Transitive.WithSelf.TakesC.type: type = fn_type @Transitive.WithSelf.TakesC, @Transitive.WithSelf(%Self.77c) [symbolic] +// CHECK:STDOUT: %Transitive.WithSelf.TakesC: %Transitive.WithSelf.TakesC.type = struct_value () [symbolic] +// CHECK:STDOUT: %assoc4: %Transitive.assoc_type = assoc_entity element4, @Transitive.WithSelf.%Transitive.WithSelf.TakesC.decl [concrete] +// CHECK:STDOUT: %as_type.aed: type = facet_access_type %impl.elem1 [symbolic] +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: imports { +// CHECK:STDOUT: %Core: = namespace file.%Core.import, [concrete] { +// CHECK:STDOUT: .Destroy = %Core.Destroy +// CHECK:STDOUT: .BitAndWith = %Core.BitAndWith +// CHECK:STDOUT: import Core//prelude +// CHECK:STDOUT: import Core//prelude/... +// CHECK:STDOUT: } +// CHECK:STDOUT: %Core.Destroy: type = import_ref Core//prelude/parts/destroy, Destroy, loaded [concrete = constants.%Destroy.type] +// CHECK:STDOUT: %Core.BitAndWith: %BitAndWith.type.a06 = import_ref Core//prelude/parts/as, BitAndWith, loaded [concrete = constants.%BitAndWith.generic] +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: file { +// CHECK:STDOUT: package: = namespace [concrete] { +// CHECK:STDOUT: .Core = imports.%Core +// CHECK:STDOUT: .P = %P.decl +// CHECK:STDOUT: .Q = %Q.decl +// CHECK:STDOUT: .R = %R.decl +// CHECK:STDOUT: .Transitive = %Transitive.decl +// CHECK:STDOUT: } +// CHECK:STDOUT: %Core.import = import Core +// CHECK:STDOUT: %P.decl: type = interface_decl @P [concrete = constants.%P.type] {} {} +// CHECK:STDOUT: %Q.decl: type = interface_decl @Q [concrete = constants.%Q.type] {} {} +// CHECK:STDOUT: %R.decl: type = interface_decl @R [concrete = constants.%R.type] {} {} +// CHECK:STDOUT: %Transitive.decl: type = interface_decl @Transitive [concrete = constants.%Transitive.type] {} {} +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: interface @P { +// CHECK:STDOUT: %Self: %P.type = symbolic_binding Self, 0 [symbolic = constants.%Self.801] +// CHECK:STDOUT: %P.WithSelf.decl = interface_with_self_decl @P [concrete] +// CHECK:STDOUT: +// CHECK:STDOUT: !with Self: +// CHECK:STDOUT: %P.WithSelf.InP.decl: @P.WithSelf.%P.WithSelf.InP.type (%P.WithSelf.InP.type) = fn_decl @P.WithSelf.InP [symbolic = @P.WithSelf.%P.WithSelf.InP (constants.%P.WithSelf.InP)] { +// CHECK:STDOUT: %self.param_patt.loc3_22.1: @P.WithSelf.InP.%pattern_type (%pattern_type.fc0) = value_param_pattern [symbolic = %self.param_patt.loc3_22.2 (constants.%self.param_patt.97c)] +// CHECK:STDOUT: %self.patt.loc3_22.1: @P.WithSelf.InP.%pattern_type (%pattern_type.fc0) = at_binding_pattern self, %self.param_patt.loc3_22.1 [symbolic = %self.patt.loc3_22.2 (constants.%self.patt.090)] +// CHECK:STDOUT: } { +// CHECK:STDOUT: %self.param: @P.WithSelf.InP.%Self.as_type.loc3_22.1 (%Self.as_type.b49) = value_param call_param0 +// CHECK:STDOUT: %.loc3_22.1: type = splice_block %.loc3_22.2 [symbolic = %Self.as_type.loc3_22.1 (constants.%Self.as_type.b49)] { +// CHECK:STDOUT: %Self.ref: %P.type = name_ref Self, @P.%Self [symbolic = %Self (constants.%Self.801)] +// CHECK:STDOUT: %Self.as_type.loc3_22.2: type = facet_access_type %Self.ref [symbolic = %Self.as_type.loc3_22.1 (constants.%Self.as_type.b49)] +// CHECK:STDOUT: %.loc3_22.2: type = converted %Self.ref, %Self.as_type.loc3_22.2 [symbolic = %Self.as_type.loc3_22.1 (constants.%Self.as_type.b49)] +// CHECK:STDOUT: } +// CHECK:STDOUT: %self: @P.WithSelf.InP.%Self.as_type.loc3_22.1 (%Self.as_type.b49) = wrapper_binding self, %self.param +// CHECK:STDOUT: } +// CHECK:STDOUT: %assoc0: %P.assoc_type = assoc_entity element0, %P.WithSelf.InP.decl [concrete = constants.%assoc0.1ba] +// CHECK:STDOUT: +// CHECK:STDOUT: !members: +// CHECK:STDOUT: .Self = %Self +// CHECK:STDOUT: .InP = @P.WithSelf.%assoc0 +// CHECK:STDOUT: witness = (@P.WithSelf.%P.WithSelf.InP.decl) +// CHECK:STDOUT: +// CHECK:STDOUT: !requires: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: interface @Q { +// CHECK:STDOUT: %Self: %Q.type = symbolic_binding Self, 0 [symbolic = constants.%Self.ca9] +// CHECK:STDOUT: %Q.WithSelf.decl = interface_with_self_decl @Q [concrete] +// CHECK:STDOUT: +// CHECK:STDOUT: !with Self: +// CHECK:STDOUT: %Q.WithSelf.InQ.decl: @Q.WithSelf.%Q.WithSelf.InQ.type (%Q.WithSelf.InQ.type) = fn_decl @Q.WithSelf.InQ [symbolic = @Q.WithSelf.%Q.WithSelf.InQ (constants.%Q.WithSelf.InQ)] { +// CHECK:STDOUT: %self.param_patt.loc4_22.1: @Q.WithSelf.InQ.%pattern_type (%pattern_type.684) = value_param_pattern [symbolic = %self.param_patt.loc4_22.2 (constants.%self.param_patt.9cf)] +// CHECK:STDOUT: %self.patt.loc4_22.1: @Q.WithSelf.InQ.%pattern_type (%pattern_type.684) = at_binding_pattern self, %self.param_patt.loc4_22.1 [symbolic = %self.patt.loc4_22.2 (constants.%self.patt.f63)] +// CHECK:STDOUT: } { +// CHECK:STDOUT: %self.param: @Q.WithSelf.InQ.%Self.as_type.loc4_22.1 (%Self.as_type.7c9) = value_param call_param0 +// CHECK:STDOUT: %.loc4_22.1: type = splice_block %.loc4_22.2 [symbolic = %Self.as_type.loc4_22.1 (constants.%Self.as_type.7c9)] { +// CHECK:STDOUT: %Self.ref: %Q.type = name_ref Self, @Q.%Self [symbolic = %Self (constants.%Self.ca9)] +// CHECK:STDOUT: %Self.as_type.loc4_22.2: type = facet_access_type %Self.ref [symbolic = %Self.as_type.loc4_22.1 (constants.%Self.as_type.7c9)] +// CHECK:STDOUT: %.loc4_22.2: type = converted %Self.ref, %Self.as_type.loc4_22.2 [symbolic = %Self.as_type.loc4_22.1 (constants.%Self.as_type.7c9)] +// CHECK:STDOUT: } +// CHECK:STDOUT: %self: @Q.WithSelf.InQ.%Self.as_type.loc4_22.1 (%Self.as_type.7c9) = wrapper_binding self, %self.param +// CHECK:STDOUT: } +// CHECK:STDOUT: %assoc0: %Q.assoc_type = assoc_entity element0, %Q.WithSelf.InQ.decl [concrete = constants.%assoc0.26a] +// CHECK:STDOUT: +// CHECK:STDOUT: !members: +// CHECK:STDOUT: .Self = %Self +// CHECK:STDOUT: .InQ = @Q.WithSelf.%assoc0 +// CHECK:STDOUT: witness = (@Q.WithSelf.%Q.WithSelf.InQ.decl) +// CHECK:STDOUT: +// CHECK:STDOUT: !requires: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: interface @R { +// CHECK:STDOUT: %Self: %R.type = symbolic_binding Self, 0 [symbolic = constants.%Self.9c1] +// CHECK:STDOUT: %R.WithSelf.decl = interface_with_self_decl @R [concrete] +// CHECK:STDOUT: +// CHECK:STDOUT: !with Self: +// CHECK:STDOUT: %R.WithSelf.InR.decl: @R.WithSelf.%R.WithSelf.InR.type (%R.WithSelf.InR.type) = fn_decl @R.WithSelf.InR [symbolic = @R.WithSelf.%R.WithSelf.InR (constants.%R.WithSelf.InR)] { +// CHECK:STDOUT: %self.param_patt.loc5_22.1: @R.WithSelf.InR.%pattern_type (%pattern_type.ebd) = value_param_pattern [symbolic = %self.param_patt.loc5_22.2 (constants.%self.param_patt.659)] +// CHECK:STDOUT: %self.patt.loc5_22.1: @R.WithSelf.InR.%pattern_type (%pattern_type.ebd) = at_binding_pattern self, %self.param_patt.loc5_22.1 [symbolic = %self.patt.loc5_22.2 (constants.%self.patt.da0)] +// CHECK:STDOUT: } { +// CHECK:STDOUT: %self.param: @R.WithSelf.InR.%Self.as_type.loc5_22.1 (%Self.as_type.85f) = value_param call_param0 +// CHECK:STDOUT: %.loc5_22.1: type = splice_block %.loc5_22.2 [symbolic = %Self.as_type.loc5_22.1 (constants.%Self.as_type.85f)] { +// CHECK:STDOUT: %Self.ref: %R.type = name_ref Self, @R.%Self [symbolic = %Self (constants.%Self.9c1)] +// CHECK:STDOUT: %Self.as_type.loc5_22.2: type = facet_access_type %Self.ref [symbolic = %Self.as_type.loc5_22.1 (constants.%Self.as_type.85f)] +// CHECK:STDOUT: %.loc5_22.2: type = converted %Self.ref, %Self.as_type.loc5_22.2 [symbolic = %Self.as_type.loc5_22.1 (constants.%Self.as_type.85f)] +// CHECK:STDOUT: } +// CHECK:STDOUT: %self: @R.WithSelf.InR.%Self.as_type.loc5_22.1 (%Self.as_type.85f) = wrapper_binding self, %self.param +// CHECK:STDOUT: } +// CHECK:STDOUT: %assoc0: %R.assoc_type = assoc_entity element0, %R.WithSelf.InR.decl [concrete = constants.%assoc0.782] +// CHECK:STDOUT: +// CHECK:STDOUT: !members: +// CHECK:STDOUT: .Self = %Self +// CHECK:STDOUT: .InR = @R.WithSelf.%assoc0 +// CHECK:STDOUT: witness = (@R.WithSelf.%R.WithSelf.InR.decl) +// CHECK:STDOUT: +// CHECK:STDOUT: !requires: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: interface @Transitive { +// CHECK:STDOUT: %Self: %Transitive.type = symbolic_binding Self, 0 [symbolic = constants.%Self.77c] +// CHECK:STDOUT: %Transitive.WithSelf.decl = interface_with_self_decl @Transitive [concrete] +// CHECK:STDOUT: +// CHECK:STDOUT: !with Self: +// CHECK:STDOUT: %A: %facet_type.b1b = assoc_const_decl @A [concrete] { +// CHECK:STDOUT: %assoc0: %Transitive.assoc_type = assoc_entity element0, @Transitive.WithSelf.%A [concrete = constants.%assoc0.1be] +// CHECK:STDOUT: } +// CHECK:STDOUT: %B: %facet_type.130 = assoc_const_decl @B [concrete] { +// CHECK:STDOUT: %assoc1: %Transitive.assoc_type = assoc_entity element1, @Transitive.WithSelf.%B [concrete = constants.%assoc1] +// CHECK:STDOUT: } +// CHECK:STDOUT: %C: %facet_type.4c8 = assoc_const_decl @C [concrete] { +// CHECK:STDOUT: %assoc2: %Transitive.assoc_type = assoc_entity element2, @Transitive.WithSelf.%C [concrete = constants.%assoc2] +// CHECK:STDOUT: } +// CHECK:STDOUT: %Transitive.WithSelf.GetA.decl: @Transitive.WithSelf.%Transitive.WithSelf.GetA.type (%Transitive.WithSelf.GetA.type) = fn_decl @Transitive.WithSelf.GetA [symbolic = @Transitive.WithSelf.%Transitive.WithSelf.GetA (constants.%Transitive.WithSelf.GetA)] { +// CHECK:STDOUT: %self.param_patt.loc12_11.1: @Transitive.WithSelf.GetA.%pattern_type.loc12_11 (%pattern_type.b5c) = value_param_pattern [symbolic = %self.param_patt.loc12_11.2 (constants.%self.param_patt.ae9)] +// CHECK:STDOUT: %self.patt.loc12_11.1: @Transitive.WithSelf.GetA.%pattern_type.loc12_11 (%pattern_type.b5c) = at_binding_pattern self, %self.param_patt.loc12_11.1 [symbolic = %self.patt.loc12_11.2 (constants.%self.patt.12b)] +// CHECK:STDOUT: %return.param_patt.loc12_20.1: @Transitive.WithSelf.GetA.%pattern_type.loc12_20 (%pattern_type.51a) = out_param_pattern [symbolic = %return.param_patt.loc12_20.2 (constants.%return.param_patt.931)] +// CHECK:STDOUT: %return.patt.loc12_17.1: @Transitive.WithSelf.GetA.%pattern_type.loc12_20 (%pattern_type.51a) = return_slot_pattern %return.param_patt.loc12_20.1, %.loc12_20.2 [symbolic = %return.patt.loc12_17.2 (constants.%return.patt.680)] +// CHECK:STDOUT: } { +// CHECK:STDOUT: %impl.elem0.loc12_20.2: %facet_type.b1b = impl_witness_access constants.%Transitive.lookup_impl_witness, element0 [symbolic = %impl.elem0.loc12_20.1 (constants.%impl.elem0)] +// CHECK:STDOUT: %A.ref: %facet_type.b1b = name_ref A, %impl.elem0.loc12_20.2 [symbolic = %impl.elem0.loc12_20.1 (constants.%impl.elem0)] +// CHECK:STDOUT: %A.as_type: type = facet_access_type %A.ref [symbolic = %as_type (constants.%as_type.d30)] +// CHECK:STDOUT: %.loc12_20.2: type = converted %A.ref, %A.as_type [symbolic = %as_type (constants.%as_type.d30)] +// CHECK:STDOUT: %.loc12_20.3: Core.Form = init_form %.loc12_20.2 [symbolic = %.loc12_20.1 (constants.%.117)] +// CHECK:STDOUT: %self.param: @Transitive.WithSelf.GetA.%Self.as_type.loc12_11.1 (%Self.as_type.7f2) = value_param call_param0 +// CHECK:STDOUT: %.loc12_11.1: type = splice_block %.loc12_11.2 [symbolic = %Self.as_type.loc12_11.1 (constants.%Self.as_type.7f2)] { +// CHECK:STDOUT: %Self.ref: %Transitive.type = name_ref Self, @Transitive.%Self [symbolic = %Self (constants.%Self.77c)] +// CHECK:STDOUT: %Self.as_type.loc12_11.2: type = facet_access_type %Self.ref [symbolic = %Self.as_type.loc12_11.1 (constants.%Self.as_type.7f2)] +// CHECK:STDOUT: %.loc12_11.2: type = converted %Self.ref, %Self.as_type.loc12_11.2 [symbolic = %Self.as_type.loc12_11.1 (constants.%Self.as_type.7f2)] +// CHECK:STDOUT: } +// CHECK:STDOUT: %self: @Transitive.WithSelf.GetA.%Self.as_type.loc12_11.1 (%Self.as_type.7f2) = wrapper_binding self, %self.param +// CHECK:STDOUT: %return.param: ref @Transitive.WithSelf.GetA.%as_type (%as_type.d30) = out_param call_param1 +// CHECK:STDOUT: %return: ref @Transitive.WithSelf.GetA.%as_type (%as_type.d30) = return_slot %return.param +// CHECK:STDOUT: } +// CHECK:STDOUT: %assoc3: %Transitive.assoc_type = assoc_entity element3, %Transitive.WithSelf.GetA.decl [concrete = constants.%assoc3] +// CHECK:STDOUT: %Transitive.WithSelf.TakesC.decl: @Transitive.WithSelf.%Transitive.WithSelf.TakesC.type (%Transitive.WithSelf.TakesC.type) = fn_decl @Transitive.WithSelf.TakesC [symbolic = @Transitive.WithSelf.%Transitive.WithSelf.TakesC (constants.%Transitive.WithSelf.TakesC)] { +// CHECK:STDOUT: %self.param_patt.loc13_13.1: @Transitive.WithSelf.TakesC.%pattern_type.loc13_13 (%pattern_type.b5c) = value_param_pattern [symbolic = %self.param_patt.loc13_13.2 (constants.%self.param_patt.ae9)] +// CHECK:STDOUT: %self.patt.loc13_13.1: @Transitive.WithSelf.TakesC.%pattern_type.loc13_13 (%pattern_type.b5c) = at_binding_pattern self, %self.param_patt.loc13_13.1 [symbolic = %self.patt.loc13_13.2 (constants.%self.patt.12b)] +// CHECK:STDOUT: %c.param_patt.loc13_20.1: @Transitive.WithSelf.TakesC.%pattern_type.loc13_20 (%pattern_type.007) = value_param_pattern [symbolic = %c.param_patt.loc13_20.2 (constants.%c.param_patt)] +// CHECK:STDOUT: %c.patt.loc13_20.1: @Transitive.WithSelf.TakesC.%pattern_type.loc13_20 (%pattern_type.007) = at_binding_pattern c, %c.param_patt.loc13_20.1 [symbolic = %c.patt.loc13_20.2 (constants.%c.patt)] +// CHECK:STDOUT: } { +// CHECK:STDOUT: %self.param: @Transitive.WithSelf.TakesC.%Self.as_type.loc13_13.1 (%Self.as_type.7f2) = value_param call_param0 +// CHECK:STDOUT: %.loc13_13.1: type = splice_block %.loc13_13.2 [symbolic = %Self.as_type.loc13_13.1 (constants.%Self.as_type.7f2)] { +// CHECK:STDOUT: %Self.ref: %Transitive.type = name_ref Self, @Transitive.%Self [symbolic = %Self (constants.%Self.77c)] +// CHECK:STDOUT: %Self.as_type.loc13_13.2: type = facet_access_type %Self.ref [symbolic = %Self.as_type.loc13_13.1 (constants.%Self.as_type.7f2)] +// CHECK:STDOUT: %.loc13_13.2: type = converted %Self.ref, %Self.as_type.loc13_13.2 [symbolic = %Self.as_type.loc13_13.1 (constants.%Self.as_type.7f2)] +// CHECK:STDOUT: } +// CHECK:STDOUT: %self: @Transitive.WithSelf.TakesC.%Self.as_type.loc13_13.1 (%Self.as_type.7f2) = wrapper_binding self, %self.param +// CHECK:STDOUT: %c.param: @Transitive.WithSelf.TakesC.%as_type (%as_type.472) = value_param call_param1 +// CHECK:STDOUT: %.loc13_22.1: type = splice_block %.loc13_22.2 [symbolic = %as_type (constants.%as_type.472)] { +// CHECK:STDOUT: %impl.elem2.loc13_22.2: %facet_type.4c8 = impl_witness_access constants.%Transitive.lookup_impl_witness, element2 [symbolic = %impl.elem2.loc13_22.1 (constants.%impl.elem2)] +// CHECK:STDOUT: %C.ref: %facet_type.4c8 = name_ref C, %impl.elem2.loc13_22.2 [symbolic = %impl.elem2.loc13_22.1 (constants.%impl.elem2)] +// CHECK:STDOUT: %C.as_type: type = facet_access_type %C.ref [symbolic = %as_type (constants.%as_type.472)] +// CHECK:STDOUT: %.loc13_22.2: type = converted %C.ref, %C.as_type [symbolic = %as_type (constants.%as_type.472)] +// CHECK:STDOUT: } +// CHECK:STDOUT: %c: @Transitive.WithSelf.TakesC.%as_type (%as_type.472) = wrapper_binding c, %c.param +// CHECK:STDOUT: } +// CHECK:STDOUT: %assoc4: %Transitive.assoc_type = assoc_entity element4, %Transitive.WithSelf.TakesC.decl [concrete = constants.%assoc4] +// CHECK:STDOUT: %impl.elem0.loc15: %facet_type.b1b = impl_witness_access constants.%Transitive.lookup_impl_witness, element0 [symbolic = %impl.elem0.loc9 (constants.%impl.elem0)] +// CHECK:STDOUT: %A.ref: %facet_type.b1b = name_ref A, %impl.elem0.loc15 [symbolic = %impl.elem0.loc9 (constants.%impl.elem0)] +// CHECK:STDOUT: %impl.elem1.loc15: %facet_type.130 = impl_witness_access constants.%Transitive.lookup_impl_witness, element1 [symbolic = %impl.elem1.loc10 (constants.%impl.elem1)] +// CHECK:STDOUT: %B.ref: %facet_type.130 = name_ref B, %impl.elem1.loc15 [symbolic = %impl.elem1.loc10 (constants.%impl.elem1)] +// CHECK:STDOUT: %B.as_type.loc15_16.1: type = facet_access_type %B.ref [symbolic = %as_type.loc15_16 (constants.%as_type.aed)] +// CHECK:STDOUT: %.loc15_16.1: type = converted %B.ref, %B.as_type.loc15_16.1 [symbolic = %as_type.loc15_16 (constants.%as_type.aed)] +// CHECK:STDOUT: %A.as_type: type = facet_access_type %A.ref [symbolic = %as_type.loc15_11 (constants.%as_type.d30)] +// CHECK:STDOUT: %.loc15_11: type = converted %A.ref, %A.as_type [symbolic = %as_type.loc15_11 (constants.%as_type.d30)] +// CHECK:STDOUT: %impl.elem2.loc15_21.1: %facet_type.4c8 = impl_witness_access constants.%Transitive.lookup_impl_witness, element2 [symbolic = %impl.elem2.loc15_21.2 (constants.%impl.elem2)] +// CHECK:STDOUT: %C.ref: %facet_type.4c8 = name_ref C, %impl.elem2.loc15_21.1 [symbolic = %impl.elem2.loc15_21.2 (constants.%impl.elem2)] +// CHECK:STDOUT: %C.as_type: type = facet_access_type %C.ref [symbolic = %as_type.loc15_21 (constants.%as_type.472)] +// CHECK:STDOUT: %.loc15_21: type = converted %C.ref, %C.as_type [symbolic = %as_type.loc15_21 (constants.%as_type.472)] +// CHECK:STDOUT: %B.as_type.loc15_16.2: type = facet_access_type %B.ref [symbolic = %as_type.loc15_16 (constants.%as_type.aed)] +// CHECK:STDOUT: %.loc15_16.2: type = converted %B.ref, %B.as_type.loc15_16.2 [symbolic = %as_type.loc15_16 (constants.%as_type.aed)] +// CHECK:STDOUT: %Transitive.observe.decl = observe_decl @Transitive.observe [concrete] +// CHECK:STDOUT: +// CHECK:STDOUT: !members: +// CHECK:STDOUT: .Self = %Self +// CHECK:STDOUT: .P = +// CHECK:STDOUT: .Q = +// CHECK:STDOUT: .R = +// CHECK:STDOUT: .P = +// CHECK:STDOUT: .A = @A.%assoc0 +// CHECK:STDOUT: .Q = +// CHECK:STDOUT: .B = @B.%assoc1 +// CHECK:STDOUT: .R = +// CHECK:STDOUT: .C = @C.%assoc2 +// CHECK:STDOUT: .GetA = @Transitive.WithSelf.%assoc3 +// CHECK:STDOUT: .TakesC = @Transitive.WithSelf.%assoc4 +// CHECK:STDOUT: witness = (@Transitive.WithSelf.%A, @Transitive.WithSelf.%B, @Transitive.WithSelf.%C, @Transitive.WithSelf.%Transitive.WithSelf.GetA.decl, @Transitive.WithSelf.%Transitive.WithSelf.TakesC.decl) +// CHECK:STDOUT: +// CHECK:STDOUT: !requires: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: +// CHECK:STDOUT: @Transitive.observe { +// CHECK:STDOUT: observe constants.%impl.elem0 == constants.%impl.elem1 == constants.%impl.elem2 +// CHECK:STDOUT: } +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: generic fn @P.WithSelf.InP(@P.%Self: %P.type) { +// CHECK:STDOUT: %Self: %P.type = symbolic_binding Self, 0 [symbolic = %Self (constants.%Self.801)] +// CHECK:STDOUT: %Self.as_type.loc3_22.1: type = facet_access_type %Self [symbolic = %Self.as_type.loc3_22.1 (constants.%Self.as_type.b49)] +// CHECK:STDOUT: %pattern_type: type = pattern_type %Self.as_type.loc3_22.1 [symbolic = %pattern_type (constants.%pattern_type.fc0)] +// CHECK:STDOUT: %self.param_patt.loc3_22.2: @P.WithSelf.InP.%pattern_type (%pattern_type.fc0) = value_param_pattern [symbolic = %self.param_patt.loc3_22.2 (constants.%self.param_patt.97c)] +// CHECK:STDOUT: %self.patt.loc3_22.2: @P.WithSelf.InP.%pattern_type (%pattern_type.fc0) = at_binding_pattern self, %self.param_patt.loc3_22.2 [symbolic = %self.patt.loc3_22.2 (constants.%self.patt.090)] +// CHECK:STDOUT: +// CHECK:STDOUT: fn(%self.param: @P.WithSelf.InP.%Self.as_type.loc3_22.1 (%Self.as_type.b49)); +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: generic fn @Q.WithSelf.InQ(@Q.%Self: %Q.type) { +// CHECK:STDOUT: %Self: %Q.type = symbolic_binding Self, 0 [symbolic = %Self (constants.%Self.ca9)] +// CHECK:STDOUT: %Self.as_type.loc4_22.1: type = facet_access_type %Self [symbolic = %Self.as_type.loc4_22.1 (constants.%Self.as_type.7c9)] +// CHECK:STDOUT: %pattern_type: type = pattern_type %Self.as_type.loc4_22.1 [symbolic = %pattern_type (constants.%pattern_type.684)] +// CHECK:STDOUT: %self.param_patt.loc4_22.2: @Q.WithSelf.InQ.%pattern_type (%pattern_type.684) = value_param_pattern [symbolic = %self.param_patt.loc4_22.2 (constants.%self.param_patt.9cf)] +// CHECK:STDOUT: %self.patt.loc4_22.2: @Q.WithSelf.InQ.%pattern_type (%pattern_type.684) = at_binding_pattern self, %self.param_patt.loc4_22.2 [symbolic = %self.patt.loc4_22.2 (constants.%self.patt.f63)] +// CHECK:STDOUT: +// CHECK:STDOUT: fn(%self.param: @Q.WithSelf.InQ.%Self.as_type.loc4_22.1 (%Self.as_type.7c9)); +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: generic fn @R.WithSelf.InR(@R.%Self: %R.type) { +// CHECK:STDOUT: %Self: %R.type = symbolic_binding Self, 0 [symbolic = %Self (constants.%Self.9c1)] +// CHECK:STDOUT: %Self.as_type.loc5_22.1: type = facet_access_type %Self [symbolic = %Self.as_type.loc5_22.1 (constants.%Self.as_type.85f)] +// CHECK:STDOUT: %pattern_type: type = pattern_type %Self.as_type.loc5_22.1 [symbolic = %pattern_type (constants.%pattern_type.ebd)] +// CHECK:STDOUT: %self.param_patt.loc5_22.2: @R.WithSelf.InR.%pattern_type (%pattern_type.ebd) = value_param_pattern [symbolic = %self.param_patt.loc5_22.2 (constants.%self.param_patt.659)] +// CHECK:STDOUT: %self.patt.loc5_22.2: @R.WithSelf.InR.%pattern_type (%pattern_type.ebd) = at_binding_pattern self, %self.param_patt.loc5_22.2 [symbolic = %self.patt.loc5_22.2 (constants.%self.patt.da0)] +// CHECK:STDOUT: +// CHECK:STDOUT: fn(%self.param: @R.WithSelf.InR.%Self.as_type.loc5_22.1 (%Self.as_type.85f)); +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: generic fn @Transitive.WithSelf.GetA(@Transitive.%Self: %Transitive.type) { +// CHECK:STDOUT: %Self: %Transitive.type = symbolic_binding Self, 0 [symbolic = %Self (constants.%Self.77c)] +// CHECK:STDOUT: %Self.as_type.loc12_11.1: type = facet_access_type %Self [symbolic = %Self.as_type.loc12_11.1 (constants.%Self.as_type.7f2)] +// CHECK:STDOUT: %pattern_type.loc12_11: type = pattern_type %Self.as_type.loc12_11.1 [symbolic = %pattern_type.loc12_11 (constants.%pattern_type.b5c)] +// CHECK:STDOUT: %self.param_patt.loc12_11.2: @Transitive.WithSelf.GetA.%pattern_type.loc12_11 (%pattern_type.b5c) = value_param_pattern [symbolic = %self.param_patt.loc12_11.2 (constants.%self.param_patt.ae9)] +// CHECK:STDOUT: %self.patt.loc12_11.2: @Transitive.WithSelf.GetA.%pattern_type.loc12_11 (%pattern_type.b5c) = at_binding_pattern self, %self.param_patt.loc12_11.2 [symbolic = %self.patt.loc12_11.2 (constants.%self.patt.12b)] +// CHECK:STDOUT: %Transitive.lookup_impl_witness: = lookup_impl_witness %Self, @Transitive [symbolic = %Transitive.lookup_impl_witness (constants.%Transitive.lookup_impl_witness)] +// CHECK:STDOUT: %impl.elem0.loc12_20.1: %facet_type.b1b = impl_witness_access %Transitive.lookup_impl_witness, element0 [symbolic = %impl.elem0.loc12_20.1 (constants.%impl.elem0)] +// CHECK:STDOUT: %as_type: type = facet_access_type %impl.elem0.loc12_20.1 [symbolic = %as_type (constants.%as_type.d30)] +// CHECK:STDOUT: %.loc12_20.1: Core.Form = init_form %as_type [symbolic = %.loc12_20.1 (constants.%.117)] +// CHECK:STDOUT: %pattern_type.loc12_20: type = pattern_type %as_type [symbolic = %pattern_type.loc12_20 (constants.%pattern_type.51a)] +// CHECK:STDOUT: %return.param_patt.loc12_20.2: @Transitive.WithSelf.GetA.%pattern_type.loc12_20 (%pattern_type.51a) = out_param_pattern [symbolic = %return.param_patt.loc12_20.2 (constants.%return.param_patt.931)] +// CHECK:STDOUT: %return.patt.loc12_17.2: @Transitive.WithSelf.GetA.%pattern_type.loc12_20 (%pattern_type.51a) = return_slot_pattern %return.param_patt.loc12_20.2, %as_type [symbolic = %return.patt.loc12_17.2 (constants.%return.patt.680)] +// CHECK:STDOUT: +// CHECK:STDOUT: fn(%self.param: @Transitive.WithSelf.GetA.%Self.as_type.loc12_11.1 (%Self.as_type.7f2)) -> out %return.param: @Transitive.WithSelf.GetA.%as_type (%as_type.d30); +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: generic fn @Transitive.WithSelf.TakesC(@Transitive.%Self: %Transitive.type) { +// CHECK:STDOUT: %Self: %Transitive.type = symbolic_binding Self, 0 [symbolic = %Self (constants.%Self.77c)] +// CHECK:STDOUT: %Self.as_type.loc13_13.1: type = facet_access_type %Self [symbolic = %Self.as_type.loc13_13.1 (constants.%Self.as_type.7f2)] +// CHECK:STDOUT: %pattern_type.loc13_13: type = pattern_type %Self.as_type.loc13_13.1 [symbolic = %pattern_type.loc13_13 (constants.%pattern_type.b5c)] +// CHECK:STDOUT: %self.param_patt.loc13_13.2: @Transitive.WithSelf.TakesC.%pattern_type.loc13_13 (%pattern_type.b5c) = value_param_pattern [symbolic = %self.param_patt.loc13_13.2 (constants.%self.param_patt.ae9)] +// CHECK:STDOUT: %self.patt.loc13_13.2: @Transitive.WithSelf.TakesC.%pattern_type.loc13_13 (%pattern_type.b5c) = at_binding_pattern self, %self.param_patt.loc13_13.2 [symbolic = %self.patt.loc13_13.2 (constants.%self.patt.12b)] +// CHECK:STDOUT: %Transitive.lookup_impl_witness: = lookup_impl_witness %Self, @Transitive [symbolic = %Transitive.lookup_impl_witness (constants.%Transitive.lookup_impl_witness)] +// CHECK:STDOUT: %impl.elem2.loc13_22.1: %facet_type.4c8 = impl_witness_access %Transitive.lookup_impl_witness, element2 [symbolic = %impl.elem2.loc13_22.1 (constants.%impl.elem2)] +// CHECK:STDOUT: %as_type: type = facet_access_type %impl.elem2.loc13_22.1 [symbolic = %as_type (constants.%as_type.472)] +// CHECK:STDOUT: %pattern_type.loc13_20: type = pattern_type %as_type [symbolic = %pattern_type.loc13_20 (constants.%pattern_type.007)] +// CHECK:STDOUT: %c.param_patt.loc13_20.2: @Transitive.WithSelf.TakesC.%pattern_type.loc13_20 (%pattern_type.007) = value_param_pattern [symbolic = %c.param_patt.loc13_20.2 (constants.%c.param_patt)] +// CHECK:STDOUT: %c.patt.loc13_20.2: @Transitive.WithSelf.TakesC.%pattern_type.loc13_20 (%pattern_type.007) = at_binding_pattern c, %c.param_patt.loc13_20.2 [symbolic = %c.patt.loc13_20.2 (constants.%c.patt)] +// CHECK:STDOUT: +// CHECK:STDOUT: fn(%self.param: @Transitive.WithSelf.TakesC.%Self.as_type.loc13_13.1 (%Self.as_type.7f2), %c.param: @Transitive.WithSelf.TakesC.%as_type (%as_type.472)); +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: specific @P.WithSelf(constants.%Self.801) { +// CHECK:STDOUT: !definition: +// CHECK:STDOUT: %Self => constants.%Self.801 +// CHECK:STDOUT: %P.WithSelf.InP.type => constants.%P.WithSelf.InP.type +// CHECK:STDOUT: %P.WithSelf.InP => constants.%P.WithSelf.InP +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: specific @P.WithSelf.InP(constants.%Self.801) { +// CHECK:STDOUT: %Self => constants.%Self.801 +// CHECK:STDOUT: %Self.as_type.loc3_22.1 => constants.%Self.as_type.b49 +// CHECK:STDOUT: %pattern_type => constants.%pattern_type.fc0 +// CHECK:STDOUT: %self.param_patt.loc3_22.2 => constants.%self.param_patt.97c +// CHECK:STDOUT: %self.patt.loc3_22.2 => constants.%self.patt.090 +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: specific @Q.WithSelf(constants.%Self.ca9) { +// CHECK:STDOUT: !definition: +// CHECK:STDOUT: %Self => constants.%Self.ca9 +// CHECK:STDOUT: %Q.WithSelf.InQ.type => constants.%Q.WithSelf.InQ.type +// CHECK:STDOUT: %Q.WithSelf.InQ => constants.%Q.WithSelf.InQ +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: specific @Q.WithSelf.InQ(constants.%Self.ca9) { +// CHECK:STDOUT: %Self => constants.%Self.ca9 +// CHECK:STDOUT: %Self.as_type.loc4_22.1 => constants.%Self.as_type.7c9 +// CHECK:STDOUT: %pattern_type => constants.%pattern_type.684 +// CHECK:STDOUT: %self.param_patt.loc4_22.2 => constants.%self.param_patt.9cf +// CHECK:STDOUT: %self.patt.loc4_22.2 => constants.%self.patt.f63 +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: specific @R.WithSelf(constants.%Self.9c1) { +// CHECK:STDOUT: !definition: +// CHECK:STDOUT: %Self => constants.%Self.9c1 +// CHECK:STDOUT: %R.WithSelf.InR.type => constants.%R.WithSelf.InR.type +// CHECK:STDOUT: %R.WithSelf.InR => constants.%R.WithSelf.InR +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: specific @R.WithSelf.InR(constants.%Self.9c1) { +// CHECK:STDOUT: %Self => constants.%Self.9c1 +// CHECK:STDOUT: %Self.as_type.loc5_22.1 => constants.%Self.as_type.85f +// CHECK:STDOUT: %pattern_type => constants.%pattern_type.ebd +// CHECK:STDOUT: %self.param_patt.loc5_22.2 => constants.%self.param_patt.659 +// CHECK:STDOUT: %self.patt.loc5_22.2 => constants.%self.patt.da0 +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: specific @Transitive.WithSelf(constants.%Self.77c) {} +// CHECK:STDOUT: +// CHECK:STDOUT: specific @Transitive.WithSelf.GetA(constants.%Self.77c) { +// CHECK:STDOUT: %Self => constants.%Self.77c +// CHECK:STDOUT: %Self.as_type.loc12_11.1 => constants.%Self.as_type.7f2 +// CHECK:STDOUT: %pattern_type.loc12_11 => constants.%pattern_type.b5c +// CHECK:STDOUT: %self.param_patt.loc12_11.2 => constants.%self.param_patt.ae9 +// CHECK:STDOUT: %self.patt.loc12_11.2 => constants.%self.patt.12b +// CHECK:STDOUT: %Transitive.lookup_impl_witness => constants.%Transitive.lookup_impl_witness +// CHECK:STDOUT: %impl.elem0.loc12_20.1 => constants.%impl.elem0 +// CHECK:STDOUT: %as_type => constants.%as_type.d30 +// CHECK:STDOUT: %.loc12_20.1 => constants.%.117 +// CHECK:STDOUT: %pattern_type.loc12_20 => constants.%pattern_type.51a +// CHECK:STDOUT: %return.param_patt.loc12_20.2 => constants.%return.param_patt.931 +// CHECK:STDOUT: %return.patt.loc12_17.2 => constants.%return.patt.680 +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: specific @Transitive.WithSelf.TakesC(constants.%Self.77c) { +// CHECK:STDOUT: %Self => constants.%Self.77c +// CHECK:STDOUT: %Self.as_type.loc13_13.1 => constants.%Self.as_type.7f2 +// CHECK:STDOUT: %pattern_type.loc13_13 => constants.%pattern_type.b5c +// CHECK:STDOUT: %self.param_patt.loc13_13.2 => constants.%self.param_patt.ae9 +// CHECK:STDOUT: %self.patt.loc13_13.2 => constants.%self.patt.12b +// CHECK:STDOUT: %Transitive.lookup_impl_witness => constants.%Transitive.lookup_impl_witness +// CHECK:STDOUT: %impl.elem2.loc13_22.1 => constants.%impl.elem2 +// CHECK:STDOUT: %as_type => constants.%as_type.472 +// CHECK:STDOUT: %pattern_type.loc13_20 => constants.%pattern_type.007 +// CHECK:STDOUT: %c.param_patt.loc13_20.2 => constants.%c.param_patt +// CHECK:STDOUT: %c.patt.loc13_20.2 => constants.%c.patt +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: --- fail_todo_equivalent.carbon +// CHECK:STDOUT: +// CHECK:STDOUT: constants { +// CHECK:STDOUT: %type: type = facet_type [concrete] +// CHECK:STDOUT: %.Self: %type = symbolic_binding .Self [symbolic_self] +// CHECK:STDOUT: %Transitive.type: type = facet_type <@Transitive> [concrete] +// CHECK:STDOUT: %Self.744: %Transitive.type = symbolic_binding Self, 0 [symbolic] +// CHECK:STDOUT: %Transitive.lookup_impl_witness.ab0b8d.1: = lookup_impl_witness %Self.744, @Transitive [symbolic] +// CHECK:STDOUT: %Destroy.type: type = facet_type <@Destroy> [concrete] +// CHECK:STDOUT: %R.type: type = facet_type <@R> [concrete] +// CHECK:STDOUT: %Self.be6: %R.type = symbolic_binding Self, 0 [symbolic] +// CHECK:STDOUT: %R.WithSelf.InR.type.4bf: type = fn_type @R.WithSelf.InR, @R.WithSelf(%Self.be6) [symbolic] +// CHECK:STDOUT: %R.WithSelf.InR.345: %R.WithSelf.InR.type.4bf = struct_value () [symbolic] +// CHECK:STDOUT: %Self.as_type.b02: type = facet_access_type %Self.be6 [symbolic] +// CHECK:STDOUT: %pattern_type.60e: type = pattern_type %Self.as_type.b02 [symbolic] +// CHECK:STDOUT: %self.param_patt.640: %pattern_type.60e = value_param_pattern [symbolic] +// CHECK:STDOUT: %self.patt.894: %pattern_type.60e = at_binding_pattern self, %self.param_patt.640 [symbolic] +// CHECK:STDOUT: %facet_type.0e9: type = facet_type <@Destroy & @R where TODO> [concrete] +// CHECK:STDOUT: %impl.elem2.279493.1: %facet_type.0e9 = impl_witness_access %Transitive.lookup_impl_witness.ab0b8d.1, element2 [symbolic] +// CHECK:STDOUT: %Q.type: type = facet_type <@Q> [concrete] +// CHECK:STDOUT: %Self.afd: %Q.type = symbolic_binding Self, 0 [symbolic] +// CHECK:STDOUT: %Q.WithSelf.InQ.type.fb9: type = fn_type @Q.WithSelf.InQ, @Q.WithSelf(%Self.afd) [symbolic] +// CHECK:STDOUT: %Q.WithSelf.InQ.daf: %Q.WithSelf.InQ.type.fb9 = struct_value () [symbolic] +// CHECK:STDOUT: %Self.as_type.430: type = facet_access_type %Self.afd [symbolic] +// CHECK:STDOUT: %pattern_type.ade: type = pattern_type %Self.as_type.430 [symbolic] +// CHECK:STDOUT: %self.param_patt.271: %pattern_type.ade = value_param_pattern [symbolic] +// CHECK:STDOUT: %self.patt.b5e: %pattern_type.ade = at_binding_pattern self, %self.param_patt.271 [symbolic] +// CHECK:STDOUT: %facet_type.1b9: type = facet_type <@Destroy & @Q where TODO> [concrete] +// CHECK:STDOUT: %impl.elem1.1413d6.1: %facet_type.1b9 = impl_witness_access %Transitive.lookup_impl_witness.ab0b8d.1, element1 [symbolic] +// CHECK:STDOUT: %eq.be77bc.1 = observe_equivalent %impl.elem1.1413d6.1, %impl.elem2.279493.1 [symbolic] +// CHECK:STDOUT: %as_type.b2aa43.1: type = facet_access_type %impl.elem2.279493.1 [symbolic] +// CHECK:STDOUT: %P.type: type = facet_type <@P> [concrete] +// CHECK:STDOUT: %Self.104: %P.type = symbolic_binding Self, 0 [symbolic] +// CHECK:STDOUT: %P.WithSelf.InP.type: type = fn_type @P.WithSelf.InP, @P.WithSelf(%Self.104) [symbolic] +// CHECK:STDOUT: %P.WithSelf.InP: %P.WithSelf.InP.type = struct_value () [symbolic] +// CHECK:STDOUT: %Self.as_type.cc3: type = facet_access_type %Self.104 [symbolic] +// CHECK:STDOUT: %pattern_type.3ef: type = pattern_type %Self.as_type.cc3 [symbolic] +// CHECK:STDOUT: %self.param_patt.88d: %pattern_type.3ef = value_param_pattern [symbolic] +// CHECK:STDOUT: %self.patt.6de: %pattern_type.3ef = at_binding_pattern self, %self.param_patt.88d [symbolic] +// CHECK:STDOUT: %facet_type.1ff: type = facet_type <@Destroy & @P> [concrete] +// CHECK:STDOUT: %impl.elem0.8aa205.1: %facet_type.1ff = impl_witness_access %Transitive.lookup_impl_witness.ab0b8d.1, element0 [symbolic] +// CHECK:STDOUT: %eq.20ba2e.1 = observe_equivalent %impl.elem0.8aa205.1, %impl.elem1.1413d6.1 [symbolic] +// CHECK:STDOUT: %as_type.a0914b.1: type = facet_access_type %impl.elem0.8aa205.1 [symbolic] +// CHECK:STDOUT: %as_type.f86e2d.1: type = facet_access_type %impl.elem1.1413d6.1 [symbolic] +// CHECK:STDOUT: %Transitive.WithSelf.TakesC.type.d86d9f.1: type = fn_type @Transitive.WithSelf.TakesC, @Transitive.WithSelf(%Self.744) [symbolic] +// CHECK:STDOUT: %Transitive.WithSelf.TakesC.f276cd.1: %Transitive.WithSelf.TakesC.type.d86d9f.1 = struct_value () [symbolic] +// CHECK:STDOUT: %Self.as_type.56c: type = facet_access_type %Self.744 [symbolic] +// CHECK:STDOUT: %pattern_type.68e728.1: type = pattern_type %Self.as_type.56c [symbolic] +// CHECK:STDOUT: %self.param_patt.e90fff.1: %pattern_type.68e728.1 = value_param_pattern [symbolic] +// CHECK:STDOUT: %self.patt.d2dab3.1: %pattern_type.68e728.1 = at_binding_pattern self, %self.param_patt.e90fff.1 [symbolic] +// CHECK:STDOUT: %pattern_type.d96: type = pattern_type %as_type.b2aa43.1 [symbolic] +// CHECK:STDOUT: %c.param_patt: %pattern_type.d96 = value_param_pattern [symbolic] +// CHECK:STDOUT: %c.patt: %pattern_type.d96 = at_binding_pattern c, %c.param_patt [symbolic] +// CHECK:STDOUT: %Transitive.WithSelf.GetA.type.0b3c58.1: type = fn_type @Transitive.WithSelf.GetA, @Transitive.WithSelf(%Self.744) [symbolic] +// CHECK:STDOUT: %Transitive.WithSelf.GetA.e3e09c.1: %Transitive.WithSelf.GetA.type.0b3c58.1 = struct_value () [symbolic] +// CHECK:STDOUT: %pattern_type.77f685.1: type = pattern_type %as_type.a0914b.1 [symbolic] +// CHECK:STDOUT: %return.param_patt.11f0b9.1: %pattern_type.77f685.1 = out_param_pattern [symbolic] +// CHECK:STDOUT: %return.patt.87a9a6.1: %pattern_type.77f685.1 = return_slot_pattern %return.param_patt.11f0b9.1, invalid [symbolic] +// CHECK:STDOUT: %.3ef823.1: Core.Form = init_form %as_type.a0914b.1 [symbolic] +// CHECK:STDOUT: %pattern_type.bd9: type = pattern_type %Transitive.type [concrete] +// CHECK:STDOUT: %T.patt: %pattern_type.bd9 = symbolic_binding_pattern T, 0 [symbolic] +// CHECK:STDOUT: %T: %Transitive.type = symbolic_binding T, 0 [symbolic] +// CHECK:STDOUT: %T.as_type: type = facet_access_type %T [symbolic] +// CHECK:STDOUT: %pattern_type.68e728.2: type = pattern_type %T.as_type [symbolic] +// CHECK:STDOUT: %t.param_patt: %pattern_type.68e728.2 = value_param_pattern [symbolic] +// CHECK:STDOUT: %t.patt: %pattern_type.68e728.2 = at_binding_pattern t, %t.param_patt [symbolic] +// CHECK:STDOUT: %F.type: type = fn_type @F [concrete] +// CHECK:STDOUT: %empty_tuple.type: type = tuple_type () [concrete] +// CHECK:STDOUT: %F: %F.type = struct_value () [concrete] +// CHECK:STDOUT: %require_complete.fbd: = require_complete_type %T.as_type [symbolic] +// CHECK:STDOUT: %Transitive.lookup_impl_witness.ab0b8d.2: = lookup_impl_witness %T, @Transitive [symbolic] +// CHECK:STDOUT: %impl.elem0.8aa205.2: %facet_type.1ff = impl_witness_access %Transitive.lookup_impl_witness.ab0b8d.2, element0 [symbolic] +// CHECK:STDOUT: %impl.elem1.1413d6.2: %facet_type.1b9 = impl_witness_access %Transitive.lookup_impl_witness.ab0b8d.2, element1 [symbolic] +// CHECK:STDOUT: %Transitive.WithSelf.GetA.type.0b3c58.2: type = fn_type @Transitive.WithSelf.GetA, @Transitive.WithSelf(%T) [symbolic] +// CHECK:STDOUT: %Transitive.WithSelf.GetA.e3e09c.2: %Transitive.WithSelf.GetA.type.0b3c58.2 = struct_value () [symbolic] +// CHECK:STDOUT: %Transitive.WithSelf.TakesC.type.d86d9f.2: type = fn_type @Transitive.WithSelf.TakesC, @Transitive.WithSelf(%T) [symbolic] +// CHECK:STDOUT: %Transitive.WithSelf.TakesC.f276cd.2: %Transitive.WithSelf.TakesC.type.d86d9f.2 = struct_value () [symbolic] +// CHECK:STDOUT: %as_type.f86e2d.2: type = facet_access_type %impl.elem1.1413d6.2 [symbolic] +// CHECK:STDOUT: %as_type.a0914b.2: type = facet_access_type %impl.elem0.8aa205.2 [symbolic] +// CHECK:STDOUT: %eq.20ba2e.2 = observe_equivalent %impl.elem0.8aa205.2, %impl.elem1.1413d6.2 [symbolic] +// CHECK:STDOUT: %impl.elem2.279493.2: %facet_type.0e9 = impl_witness_access %Transitive.lookup_impl_witness.ab0b8d.2, element2 [symbolic] +// CHECK:STDOUT: %as_type.b2aa43.2: type = facet_access_type %impl.elem2.279493.2 [symbolic] +// CHECK:STDOUT: %eq.be77bc.2 = observe_equivalent %impl.elem1.1413d6.2, %impl.elem2.279493.2 [symbolic] +// CHECK:STDOUT: %Transitive.assoc_type: type = assoc_entity_type @Transitive [concrete] +// CHECK:STDOUT: %assoc0.e77: %Transitive.assoc_type = assoc_entity element0, imports.%Main.import_ref.0a7 [concrete] +// CHECK:STDOUT: %require_complete.6cf: = require_complete_type %as_type.a0914b.2 [symbolic] +// CHECK:STDOUT: %pattern_type.77f685.2: type = pattern_type %as_type.a0914b.2 [symbolic] +// CHECK:STDOUT: %a.patt: %pattern_type.77f685.2 = ref_binding_pattern a [symbolic] +// CHECK:STDOUT: %a.var_patt: %pattern_type.77f685.2 = var_pattern %a.patt [symbolic] +// CHECK:STDOUT: %assoc3: %Transitive.assoc_type = assoc_entity element3, imports.%Main.import_ref.06c [concrete] +// CHECK:STDOUT: %.657: type = fn_type_with_self_type %Transitive.WithSelf.GetA.type.0b3c58.2, %T [symbolic] +// CHECK:STDOUT: %impl.elem3: %.657 = impl_witness_access %Transitive.lookup_impl_witness.ab0b8d.2, element3 [symbolic] +// CHECK:STDOUT: %self.param_patt.e90fff.2: %pattern_type.68e728.2 = value_param_pattern [symbolic] +// CHECK:STDOUT: %self.patt.d2dab3.2: %pattern_type.68e728.2 = at_binding_pattern self, %self.param_patt.e90fff.2 [symbolic] +// CHECK:STDOUT: %.3ef823.2: Core.Form = init_form %as_type.a0914b.2 [symbolic] +// CHECK:STDOUT: %return.param_patt.11f0b9.2: %pattern_type.77f685.2 = out_param_pattern [symbolic] +// CHECK:STDOUT: %return.patt.87a9a6.2: %pattern_type.77f685.2 = return_slot_pattern %return.param_patt.11f0b9.2, invalid [symbolic] +// CHECK:STDOUT: %specific_impl_fn.72f: = specific_impl_function %impl.elem3, @Transitive.WithSelf.GetA(%T) [symbolic] +// CHECK:STDOUT: %assoc1: %Transitive.assoc_type = assoc_entity element1, imports.%Main.import_ref.dae [concrete] +// CHECK:STDOUT: %require_complete.0ea: = require_complete_type %as_type.f86e2d.2 [symbolic] +// CHECK:STDOUT: %pattern_type.86a: type = pattern_type %as_type.f86e2d.2 [symbolic] +// CHECK:STDOUT: %b.patt: %pattern_type.86a = ref_binding_pattern b [symbolic] +// CHECK:STDOUT: %b.var_patt: %pattern_type.86a = var_pattern %b.patt [symbolic] +// CHECK:STDOUT: %ImplicitAs.type.0ff: type = generic_interface_type @ImplicitAs [concrete] +// CHECK:STDOUT: %ImplicitAs.generic: %ImplicitAs.type.0ff = struct_value () [concrete] +// CHECK:STDOUT: %Dest: type = symbolic_binding Dest, 0 [symbolic] +// CHECK:STDOUT: %ImplicitAs.type.3aa: type = facet_type <@ImplicitAs, @ImplicitAs(%Dest)> [symbolic] +// CHECK:STDOUT: %Self.294: %ImplicitAs.type.3aa = symbolic_binding Self, 1 [symbolic] +// CHECK:STDOUT: %ImplicitAs.assoc_type.fcc: type = assoc_entity_type @ImplicitAs, @ImplicitAs(%Dest) [symbolic] +// CHECK:STDOUT: %ImplicitAs.WithSelf.Convert.type.97e: type = fn_type @ImplicitAs.WithSelf.Convert, @ImplicitAs.WithSelf(%Dest, %Self.294) [symbolic] +// CHECK:STDOUT: %ImplicitAs.WithSelf.Convert.945: %ImplicitAs.WithSelf.Convert.type.97e = struct_value () [symbolic] +// CHECK:STDOUT: %ImplicitAs.type.368: type = facet_type <@ImplicitAs, @ImplicitAs(%as_type.f86e2d.2)> [symbolic] +// CHECK:STDOUT: %ImplicitAs.assoc_type.869: type = assoc_entity_type @ImplicitAs, @ImplicitAs(%as_type.f86e2d.2) [symbolic] +// CHECK:STDOUT: %assoc0.c45: %ImplicitAs.assoc_type.869 = assoc_entity element0, imports.%Core.import_ref.cb2 [symbolic] +// CHECK:STDOUT: %require_complete.a65: = require_complete_type %ImplicitAs.type.368 [symbolic] +// CHECK:STDOUT: %assoc0.0ac: %ImplicitAs.assoc_type.fcc = assoc_entity element0, imports.%Core.import_ref.f9d [symbolic] +// CHECK:STDOUT: %facet_type.aa5: type = facet_type <@Destroy & @Q> [concrete] +// CHECK:STDOUT: %Q.WithSelf.InQ.type.c89: type = fn_type @Q.WithSelf.InQ, @Q.WithSelf(%impl.elem1.1413d6.2) [symbolic] +// CHECK:STDOUT: %Q.WithSelf.InQ.aef: %Q.WithSelf.InQ.type.c89 = struct_value () [symbolic] +// CHECK:STDOUT: %Q.assoc_type: type = assoc_entity_type @Q [concrete] +// CHECK:STDOUT: %assoc0.6a1: %Q.assoc_type = assoc_entity element0, imports.%Main.import_ref.636 [concrete] +// CHECK:STDOUT: %Q.lookup_impl_witness: = lookup_impl_witness %impl.elem1.1413d6.2, @Q [symbolic] +// CHECK:STDOUT: %Q.facet: %Q.type = facet_value %as_type.f86e2d.2, (%Q.lookup_impl_witness) [symbolic] +// CHECK:STDOUT: %Q.WithSelf.InQ.type.0c5: type = fn_type @Q.WithSelf.InQ, @Q.WithSelf(%Q.facet) [symbolic] +// CHECK:STDOUT: %Q.WithSelf.InQ.9e5: %Q.WithSelf.InQ.type.0c5 = struct_value () [symbolic] +// CHECK:STDOUT: %.786: type = fn_type_with_self_type %Q.WithSelf.InQ.type.0c5, %Q.facet [symbolic] +// CHECK:STDOUT: %impl.elem0.8e3: %.786 = impl_witness_access %Q.lookup_impl_witness, element0 [symbolic] +// CHECK:STDOUT: %self.param_patt.321: %pattern_type.86a = value_param_pattern [symbolic] +// CHECK:STDOUT: %self.patt.7e6: %pattern_type.86a = at_binding_pattern self, %self.param_patt.321 [symbolic] +// CHECK:STDOUT: %specific_impl_fn.957: = specific_impl_function %impl.elem0.8e3, @Q.WithSelf.InQ(%Q.facet) [symbolic] +// CHECK:STDOUT: %assoc2: %Transitive.assoc_type = assoc_entity element2, imports.%Main.import_ref.56a [concrete] +// CHECK:STDOUT: %R.WithSelf.InR.type.a87: type = fn_type @R.WithSelf.InR, @R.WithSelf(%impl.elem2.279493.2) [symbolic] +// CHECK:STDOUT: %R.WithSelf.InR.704: %R.WithSelf.InR.type.a87 = struct_value () [symbolic] +// CHECK:STDOUT: %R.assoc_type: type = assoc_entity_type @R [concrete] +// CHECK:STDOUT: %assoc0.e94: %R.assoc_type = assoc_entity element0, imports.%Main.import_ref.8ad [concrete] +// CHECK:STDOUT: %facet_type.fcc: type = facet_type <@Destroy & @R> [concrete] +// CHECK:STDOUT: %R.lookup_impl_witness.aa0: = lookup_impl_witness %impl.elem2.279493.2, @R [symbolic] +// CHECK:STDOUT: %R.facet: %R.type = facet_value %as_type.b2aa43.2, (%R.lookup_impl_witness.aa0) [symbolic] +// CHECK:STDOUT: %R.WithSelf.InR.type.56d: type = fn_type @R.WithSelf.InR, @R.WithSelf(%R.facet) [symbolic] +// CHECK:STDOUT: %R.WithSelf.InR.9a8: %R.WithSelf.InR.type.56d = struct_value () [symbolic] +// CHECK:STDOUT: %.f43: type = fn_type_with_self_type %R.WithSelf.InR.type.56d, %R.facet [symbolic] +// CHECK:STDOUT: %impl.elem0.8cc: %.f43 = impl_witness_access %R.lookup_impl_witness.aa0, element0 [symbolic] +// CHECK:STDOUT: %require_complete.6e3: = require_complete_type %as_type.b2aa43.2 [symbolic] +// CHECK:STDOUT: %As.type.116: type = generic_interface_type @As [concrete] +// CHECK:STDOUT: %As.generic: %As.type.116 = struct_value () [concrete] +// CHECK:STDOUT: %As.type.c5f: type = facet_type <@As, @As(%Dest)> [symbolic] +// CHECK:STDOUT: %Self.37a: %As.type.c5f = symbolic_binding Self, 1 [symbolic] +// CHECK:STDOUT: %As.assoc_type.b40: type = assoc_entity_type @As, @As(%Dest) [symbolic] +// CHECK:STDOUT: %As.WithSelf.Convert.type.ff8: type = fn_type @As.WithSelf.Convert, @As.WithSelf(%Dest, %Self.37a) [symbolic] +// CHECK:STDOUT: %As.WithSelf.Convert.87d: %As.WithSelf.Convert.type.ff8 = struct_value () [symbolic] +// CHECK:STDOUT: %As.type.ccf: type = facet_type <@As, @As(%as_type.b2aa43.2)> [symbolic] +// CHECK:STDOUT: %As.assoc_type.60e: type = assoc_entity_type @As, @As(%as_type.b2aa43.2) [symbolic] +// CHECK:STDOUT: %assoc0.fb9: %As.assoc_type.60e = assoc_entity element0, imports.%Core.import_ref.967 [symbolic] +// CHECK:STDOUT: %require_complete.ee4: = require_complete_type %As.type.ccf [symbolic] +// CHECK:STDOUT: %assoc0.4ec: %As.assoc_type.b40 = assoc_entity element0, imports.%Core.import_ref.47a [symbolic] +// CHECK:STDOUT: %Destroy.lookup_impl_witness.32f: = lookup_impl_witness %impl.elem1.1413d6.2, @Destroy [symbolic] +// CHECK:STDOUT: %Destroy.facet.853: %Destroy.type = facet_value %as_type.f86e2d.2, (%Destroy.lookup_impl_witness.32f) [symbolic] +// CHECK:STDOUT: %Destroy.WithSelf.Op.type.bb2: type = fn_type @Destroy.WithSelf.Op, @Destroy.WithSelf(%Destroy.facet.853) [symbolic] +// CHECK:STDOUT: %.ee0: type = fn_type_with_self_type %Destroy.WithSelf.Op.type.bb2, %Destroy.facet.853 [symbolic] +// CHECK:STDOUT: %impl.elem0.087: %.ee0 = impl_witness_access %Destroy.lookup_impl_witness.32f, element0 [symbolic] +// CHECK:STDOUT: %specific_impl_fn.ef3: = specific_impl_function %impl.elem0.087, @Destroy.WithSelf.Op(%Destroy.facet.853) [symbolic] +// CHECK:STDOUT: %Destroy.lookup_impl_witness.1c9: = lookup_impl_witness %impl.elem0.8aa205.2, @Destroy [symbolic] +// CHECK:STDOUT: %Destroy.facet.27e: %Destroy.type = facet_value %as_type.a0914b.2, (%Destroy.lookup_impl_witness.1c9) [symbolic] +// CHECK:STDOUT: %Destroy.WithSelf.Op.type.74e: type = fn_type @Destroy.WithSelf.Op, @Destroy.WithSelf(%Destroy.facet.27e) [symbolic] +// CHECK:STDOUT: %.569: type = fn_type_with_self_type %Destroy.WithSelf.Op.type.74e, %Destroy.facet.27e [symbolic] +// CHECK:STDOUT: %impl.elem0.95f: %.569 = impl_witness_access %Destroy.lookup_impl_witness.1c9, element0 [symbolic] +// CHECK:STDOUT: %specific_impl_fn.584: = specific_impl_function %impl.elem0.95f, @Destroy.WithSelf.Op(%Destroy.facet.27e) [symbolic] +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: imports { +// CHECK:STDOUT: %Main.P = import_ref Main//transitive, P, unloaded +// CHECK:STDOUT: %Main.Q = import_ref Main//transitive, Q, unloaded +// CHECK:STDOUT: %Main.R = import_ref Main//transitive, R, unloaded +// CHECK:STDOUT: %Main.Transitive: type = import_ref Main//transitive, Transitive, loaded [concrete = constants.%Transitive.type] +// CHECK:STDOUT: %Core.048aa3.1: = namespace file.%Core.import, [concrete] { +// CHECK:STDOUT: .ImplicitAs = %Core.ImplicitAs +// CHECK:STDOUT: .As = %Core.As +// CHECK:STDOUT: .Destroy = %Core.Destroy +// CHECK:STDOUT: import Core//prelude +// CHECK:STDOUT: import Core//prelude/... +// CHECK:STDOUT: } +// CHECK:STDOUT: %Main.import_ref.72c: %Transitive.assoc_type = import_ref Main//transitive, loc8_8, loaded [concrete = constants.%assoc0.e77] +// CHECK:STDOUT: %Main.import_ref.e5e: %Transitive.assoc_type = import_ref Main//transitive, loc9_8, loaded [concrete = constants.%assoc1] +// CHECK:STDOUT: %Main.import_ref.c9c: %Transitive.assoc_type = import_ref Main//transitive, loc10_8, loaded [concrete = constants.%assoc2] +// CHECK:STDOUT: %Main.import_ref.5c5: %Transitive.assoc_type = import_ref Main//transitive, loc12_21, loaded [concrete = constants.%assoc3] +// CHECK:STDOUT: %Main.import_ref.ae2 = import_ref Main//transitive, loc13_24, unloaded +// CHECK:STDOUT: %Main.A = import_ref Main//transitive, A, unloaded +// CHECK:STDOUT: %Main.B = import_ref Main//transitive, B, unloaded +// CHECK:STDOUT: %Main.C = import_ref Main//transitive, C, unloaded +// CHECK:STDOUT: %Main.GetA = import_ref Main//transitive, GetA, unloaded +// CHECK:STDOUT: %Main.TakesC = import_ref Main//transitive, TakesC, unloaded +// CHECK:STDOUT: %Main.import_ref.682: %R.assoc_type = import_ref Main//transitive, loc5_27, loaded [concrete = constants.%assoc0.e94] +// CHECK:STDOUT: %Main.InR = import_ref Main//transitive, InR, unloaded +// CHECK:STDOUT: %Main.import_ref.f6968b.2: %R.type = import_ref Main//transitive, loc5_13, loaded [symbolic = constants.%Self.be6] +// CHECK:STDOUT: %Main.import_ref.659 = import_ref Main//transitive, loc5_13, unloaded +// CHECK:STDOUT: %Main.import_ref.e2a: %Q.assoc_type = import_ref Main//transitive, loc4_27, loaded [concrete = constants.%assoc0.6a1] +// CHECK:STDOUT: %Main.InQ = import_ref Main//transitive, InQ, unloaded +// CHECK:STDOUT: %Main.import_ref.c0a1f5.2: %Q.type = import_ref Main//transitive, loc4_13, loaded [symbolic = constants.%Self.afd] +// CHECK:STDOUT: %Main.import_ref.4f3 = import_ref Main//transitive, loc4_13, unloaded +// CHECK:STDOUT: %Main.import_ref.fec = import_ref Main//transitive, loc3_27, unloaded +// CHECK:STDOUT: %Main.InP = import_ref Main//transitive, InP, unloaded +// CHECK:STDOUT: %Main.import_ref.aef2fa.2: %P.type = import_ref Main//transitive, loc3_13, loaded [symbolic = constants.%Self.104] +// CHECK:STDOUT: %Main.import_ref.96f = import_ref Main//transitive, loc3_13, unloaded +// CHECK:STDOUT: %Main.import_ref.df6636.2: %Transitive.type = import_ref Main//transitive, loc7_22, loaded [symbolic = constants.%Self.744] +// CHECK:STDOUT: %Main.import_ref.df6636.3: %Transitive.type = import_ref Main//transitive, loc7_22, loaded [symbolic = constants.%Self.744] +// CHECK:STDOUT: %Main.import_ref.0d5 = import_ref Main//transitive, loc7_22, unloaded +// CHECK:STDOUT: %Main.import_ref.0a7: %facet_type.1ff = import_ref Main//transitive, loc8_8, loaded [concrete = %A] +// CHECK:STDOUT: %A: %facet_type.1ff = assoc_const_decl @A [concrete] {} +// CHECK:STDOUT: %Main.import_ref.06c: @Transitive.WithSelf.%Transitive.WithSelf.GetA.type (%Transitive.WithSelf.GetA.type.0b3c58.1) = import_ref Main//transitive, loc12_21, loaded [symbolic = @Transitive.WithSelf.%Transitive.WithSelf.GetA (constants.%Transitive.WithSelf.GetA.e3e09c.1)] +// CHECK:STDOUT: %Main.import_ref.dae: %facet_type.1b9 = import_ref Main//transitive, loc9_8, loaded [concrete = %B] +// CHECK:STDOUT: %B: %facet_type.1b9 = assoc_const_decl @B [concrete] {} +// CHECK:STDOUT: %Core.ImplicitAs: %ImplicitAs.type.0ff = import_ref Core//prelude/parts/as, ImplicitAs, loaded [concrete = constants.%ImplicitAs.generic] +// CHECK:STDOUT: %Core.import_ref.484: @ImplicitAs.WithSelf.%ImplicitAs.assoc_type (%ImplicitAs.assoc_type.fcc) = import_ref Core//prelude/parts/as, loc{{\d+_\d+}}, loaded [symbolic = @ImplicitAs.WithSelf.%assoc0 (constants.%assoc0.0ac)] +// CHECK:STDOUT: %Core.import_ref.cb2: @ImplicitAs.WithSelf.%ImplicitAs.WithSelf.Convert.type (%ImplicitAs.WithSelf.Convert.type.97e) = import_ref Core//prelude/parts/as, loc{{\d+_\d+}}, loaded [symbolic = @ImplicitAs.WithSelf.%ImplicitAs.WithSelf.Convert (constants.%ImplicitAs.WithSelf.Convert.945)] +// CHECK:STDOUT: %Core.import_ref.f9d = import_ref Core//prelude/parts/as, loc{{\d+_\d+}}, unloaded +// CHECK:STDOUT: %Main.import_ref.636: @Q.WithSelf.%Q.WithSelf.InQ.type (%Q.WithSelf.InQ.type.fb9) = import_ref Main//transitive, loc4_27, loaded [symbolic = @Q.WithSelf.%Q.WithSelf.InQ (constants.%Q.WithSelf.InQ.daf)] +// CHECK:STDOUT: %Main.import_ref.56a: %facet_type.0e9 = import_ref Main//transitive, loc10_8, loaded [concrete = %C] +// CHECK:STDOUT: %C: %facet_type.0e9 = assoc_const_decl @C [concrete] {} +// CHECK:STDOUT: %Main.import_ref.8ad: @R.WithSelf.%R.WithSelf.InR.type (%R.WithSelf.InR.type.4bf) = import_ref Main//transitive, loc5_27, loaded [symbolic = @R.WithSelf.%R.WithSelf.InR (constants.%R.WithSelf.InR.345)] +// CHECK:STDOUT: %Core.As: %As.type.116 = import_ref Core//prelude/parts/as, As, loaded [concrete = constants.%As.generic] +// CHECK:STDOUT: %Core.import_ref.e36: @As.WithSelf.%As.assoc_type (%As.assoc_type.b40) = import_ref Core//prelude/parts/as, loc{{\d+_\d+}}, loaded [symbolic = @As.WithSelf.%assoc0 (constants.%assoc0.4ec)] +// CHECK:STDOUT: %Core.import_ref.967: @As.WithSelf.%As.WithSelf.Convert.type (%As.WithSelf.Convert.type.ff8) = import_ref Core//prelude/parts/as, loc{{\d+_\d+}}, loaded [symbolic = @As.WithSelf.%As.WithSelf.Convert (constants.%As.WithSelf.Convert.87d)] +// CHECK:STDOUT: %Core.import_ref.47a = import_ref Core//prelude/parts/as, loc{{\d+_\d+}}, unloaded +// CHECK:STDOUT: %Core.Destroy: type = import_ref Core//prelude/parts/destroy, Destroy, loaded [concrete = constants.%Destroy.type] +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: file { +// CHECK:STDOUT: package: = namespace [concrete] { +// CHECK:STDOUT: .P = imports.%Main.P +// CHECK:STDOUT: .Q = imports.%Main.Q +// CHECK:STDOUT: .R = imports.%Main.R +// CHECK:STDOUT: .Transitive = imports.%Main.Transitive +// CHECK:STDOUT: .Core = imports.%Core.048aa3.1 +// CHECK:STDOUT: .F = %F.decl +// CHECK:STDOUT: } +// CHECK:STDOUT: %Core.import = import Core +// CHECK:STDOUT: %default.import = import +// CHECK:STDOUT: %F.decl: %F.type = fn_decl @F [concrete = constants.%F] { +// CHECK:STDOUT: %T.patt.loc5_7.1: %pattern_type.bd9 = symbolic_binding_pattern T, 0 [symbolic = %T.patt.loc5_7.2 (constants.%T.patt)] +// CHECK:STDOUT: %t.param_patt.loc5_23.1: @F.%pattern_type.loc5 (%pattern_type.68e728.2) = value_param_pattern [symbolic = %t.param_patt.loc5_23.2 (constants.%t.param_patt)] +// CHECK:STDOUT: %t.patt.loc5_23.1: @F.%pattern_type.loc5 (%pattern_type.68e728.2) = at_binding_pattern t, %t.param_patt.loc5_23.1 [symbolic = %t.patt.loc5_23.2 (constants.%t.patt)] +// CHECK:STDOUT: } { +// CHECK:STDOUT: %.loc5_10: type = splice_block %Transitive.ref [concrete = constants.%Transitive.type] { +// CHECK:STDOUT: %.Self: %type = symbolic_binding .Self [symbolic_self = constants.%.Self] +// CHECK:STDOUT: %Transitive.ref: type = name_ref Transitive, imports.%Main.Transitive [concrete = constants.%Transitive.type] +// CHECK:STDOUT: } +// CHECK:STDOUT: %T.loc5_7.2: %Transitive.type = symbolic_binding T, 0 [symbolic = %T.loc5_7.1 (constants.%T)] +// CHECK:STDOUT: %t.param: @F.%T.as_type.loc5_25.1 (%T.as_type) = value_param call_param0 +// CHECK:STDOUT: %.loc5_25.1: type = splice_block %.loc5_25.2 [symbolic = %T.as_type.loc5_25.1 (constants.%T.as_type)] { +// CHECK:STDOUT: %T.ref.loc5: %Transitive.type = name_ref T, %T.loc5_7.2 [symbolic = %T.loc5_7.1 (constants.%T)] +// CHECK:STDOUT: %T.as_type.loc5_25.2: type = facet_access_type %T.ref.loc5 [symbolic = %T.as_type.loc5_25.1 (constants.%T.as_type)] +// CHECK:STDOUT: %.loc5_25.2: type = converted %T.ref.loc5, %T.as_type.loc5_25.2 [symbolic = %T.as_type.loc5_25.1 (constants.%T.as_type)] +// CHECK:STDOUT: } +// CHECK:STDOUT: %t: @F.%T.as_type.loc5_25.1 (%T.as_type) = wrapper_binding t, %t.param +// CHECK:STDOUT: } +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: interface @Transitive [from "transitive.carbon"] { +// CHECK:STDOUT: !members: +// CHECK:STDOUT: .Self = imports.%Main.import_ref.0d5 +// CHECK:STDOUT: .A = imports.%Main.import_ref.72c +// CHECK:STDOUT: .B = imports.%Main.import_ref.e5e +// CHECK:STDOUT: .C = imports.%Main.import_ref.c9c +// CHECK:STDOUT: .GetA = imports.%Main.import_ref.5c5 +// CHECK:STDOUT: .TakesC = imports.%Main.import_ref.ae2 +// CHECK:STDOUT: witness = (imports.%Main.A, imports.%Main.B, imports.%Main.C, imports.%Main.GetA, imports.%Main.TakesC) +// CHECK:STDOUT: +// CHECK:STDOUT: !requires: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: +// CHECK:STDOUT: @Transitive.observe { +// CHECK:STDOUT: observe constants.%impl.elem0.8aa205.1 == constants.%impl.elem1.1413d6.1 == constants.%impl.elem2.279493.1 +// CHECK:STDOUT: } +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: interface @R [from "transitive.carbon"] { +// CHECK:STDOUT: !members: +// CHECK:STDOUT: .Self = imports.%Main.import_ref.659 +// CHECK:STDOUT: .InR = imports.%Main.import_ref.682 +// CHECK:STDOUT: witness = (imports.%Main.InR) +// CHECK:STDOUT: +// CHECK:STDOUT: !requires: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: interface @Q [from "transitive.carbon"] { +// CHECK:STDOUT: !members: +// CHECK:STDOUT: .Self = imports.%Main.import_ref.4f3 +// CHECK:STDOUT: .InQ = imports.%Main.import_ref.e2a +// CHECK:STDOUT: witness = (imports.%Main.InQ) +// CHECK:STDOUT: +// CHECK:STDOUT: !requires: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: interface @P [from "transitive.carbon"] { +// CHECK:STDOUT: !members: +// CHECK:STDOUT: .Self = imports.%Main.import_ref.96f +// CHECK:STDOUT: .InP = imports.%Main.import_ref.fec +// CHECK:STDOUT: witness = (imports.%Main.InP) +// CHECK:STDOUT: +// CHECK:STDOUT: !requires: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: generic fn @R.WithSelf.InR(imports.%Main.import_ref.f6968b.2: %R.type) [from "transitive.carbon"] { +// CHECK:STDOUT: %Self: %R.type = symbolic_binding Self, 0 [symbolic = %Self (constants.%Self.be6)] +// CHECK:STDOUT: %Self.as_type: type = facet_access_type %Self [symbolic = %Self.as_type (constants.%Self.as_type.b02)] +// CHECK:STDOUT: %pattern_type: type = pattern_type %Self.as_type [symbolic = %pattern_type (constants.%pattern_type.60e)] +// CHECK:STDOUT: %self.param_patt: @R.WithSelf.InR.%pattern_type (%pattern_type.60e) = value_param_pattern [symbolic = %self.param_patt (constants.%self.param_patt.640)] +// CHECK:STDOUT: %self.patt: @R.WithSelf.InR.%pattern_type (%pattern_type.60e) = at_binding_pattern self, %self.param_patt [symbolic = %self.patt (constants.%self.patt.894)] +// CHECK:STDOUT: +// CHECK:STDOUT: fn; +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: generic fn @Q.WithSelf.InQ(imports.%Main.import_ref.c0a1f5.2: %Q.type) [from "transitive.carbon"] { +// CHECK:STDOUT: %Self: %Q.type = symbolic_binding Self, 0 [symbolic = %Self (constants.%Self.afd)] +// CHECK:STDOUT: %Self.as_type: type = facet_access_type %Self [symbolic = %Self.as_type (constants.%Self.as_type.430)] +// CHECK:STDOUT: %pattern_type: type = pattern_type %Self.as_type [symbolic = %pattern_type (constants.%pattern_type.ade)] +// CHECK:STDOUT: %self.param_patt: @Q.WithSelf.InQ.%pattern_type (%pattern_type.ade) = value_param_pattern [symbolic = %self.param_patt (constants.%self.param_patt.271)] +// CHECK:STDOUT: %self.patt: @Q.WithSelf.InQ.%pattern_type (%pattern_type.ade) = at_binding_pattern self, %self.param_patt [symbolic = %self.patt (constants.%self.patt.b5e)] +// CHECK:STDOUT: +// CHECK:STDOUT: fn; +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: generic fn @P.WithSelf.InP(imports.%Main.import_ref.aef2fa.2: %P.type) [from "transitive.carbon"] { +// CHECK:STDOUT: %Self: %P.type = symbolic_binding Self, 0 [symbolic = %Self (constants.%Self.104)] +// CHECK:STDOUT: %Self.as_type: type = facet_access_type %Self [symbolic = %Self.as_type (constants.%Self.as_type.cc3)] +// CHECK:STDOUT: %pattern_type: type = pattern_type %Self.as_type [symbolic = %pattern_type (constants.%pattern_type.3ef)] +// CHECK:STDOUT: %self.param_patt: @P.WithSelf.InP.%pattern_type (%pattern_type.3ef) = value_param_pattern [symbolic = %self.param_patt (constants.%self.param_patt.88d)] +// CHECK:STDOUT: %self.patt: @P.WithSelf.InP.%pattern_type (%pattern_type.3ef) = at_binding_pattern self, %self.param_patt [symbolic = %self.patt (constants.%self.patt.6de)] +// CHECK:STDOUT: +// CHECK:STDOUT: fn; +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: generic fn @Transitive.WithSelf.TakesC(imports.%Main.import_ref.df6636.2: %Transitive.type) [from "transitive.carbon"] { +// CHECK:STDOUT: %Self: %Transitive.type = symbolic_binding Self, 0 [symbolic = %Self (constants.%Self.744)] +// CHECK:STDOUT: %Self.as_type: type = facet_access_type %Self [symbolic = %Self.as_type (constants.%Self.as_type.56c)] +// CHECK:STDOUT: %pattern_type.1: type = pattern_type %Self.as_type [symbolic = %pattern_type.1 (constants.%pattern_type.68e728.1)] +// CHECK:STDOUT: %self.param_patt: @Transitive.WithSelf.TakesC.%pattern_type.1 (%pattern_type.68e728.1) = value_param_pattern [symbolic = %self.param_patt (constants.%self.param_patt.e90fff.1)] +// CHECK:STDOUT: %self.patt: @Transitive.WithSelf.TakesC.%pattern_type.1 (%pattern_type.68e728.1) = at_binding_pattern self, %self.param_patt [symbolic = %self.patt (constants.%self.patt.d2dab3.1)] +// CHECK:STDOUT: %Transitive.lookup_impl_witness: = lookup_impl_witness %Self, @Transitive [symbolic = %Transitive.lookup_impl_witness (constants.%Transitive.lookup_impl_witness.ab0b8d.1)] +// CHECK:STDOUT: %impl.elem2: %facet_type.0e9 = impl_witness_access %Transitive.lookup_impl_witness, element2 [symbolic = %impl.elem2 (constants.%impl.elem2.279493.1)] +// CHECK:STDOUT: %as_type: type = facet_access_type %impl.elem2 [symbolic = %as_type (constants.%as_type.b2aa43.1)] +// CHECK:STDOUT: %pattern_type.2: type = pattern_type %as_type [symbolic = %pattern_type.2 (constants.%pattern_type.d96)] +// CHECK:STDOUT: %c.param_patt: @Transitive.WithSelf.TakesC.%pattern_type.2 (%pattern_type.d96) = value_param_pattern [symbolic = %c.param_patt (constants.%c.param_patt)] +// CHECK:STDOUT: %c.patt: @Transitive.WithSelf.TakesC.%pattern_type.2 (%pattern_type.d96) = at_binding_pattern c, %c.param_patt [symbolic = %c.patt (constants.%c.patt)] +// CHECK:STDOUT: +// CHECK:STDOUT: fn; +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: generic fn @Transitive.WithSelf.GetA(imports.%Main.import_ref.df6636.3: %Transitive.type) [from "transitive.carbon"] { +// CHECK:STDOUT: %Self: %Transitive.type = symbolic_binding Self, 0 [symbolic = %Self (constants.%Self.744)] +// CHECK:STDOUT: %Self.as_type: type = facet_access_type %Self [symbolic = %Self.as_type (constants.%Self.as_type.56c)] +// CHECK:STDOUT: %pattern_type.1: type = pattern_type %Self.as_type [symbolic = %pattern_type.1 (constants.%pattern_type.68e728.1)] +// CHECK:STDOUT: %self.param_patt: @Transitive.WithSelf.GetA.%pattern_type.1 (%pattern_type.68e728.1) = value_param_pattern [symbolic = %self.param_patt (constants.%self.param_patt.e90fff.1)] +// CHECK:STDOUT: %self.patt: @Transitive.WithSelf.GetA.%pattern_type.1 (%pattern_type.68e728.1) = at_binding_pattern self, %self.param_patt [symbolic = %self.patt (constants.%self.patt.d2dab3.1)] +// CHECK:STDOUT: %Transitive.lookup_impl_witness: = lookup_impl_witness %Self, @Transitive [symbolic = %Transitive.lookup_impl_witness (constants.%Transitive.lookup_impl_witness.ab0b8d.1)] +// CHECK:STDOUT: %impl.elem0: %facet_type.1ff = impl_witness_access %Transitive.lookup_impl_witness, element0 [symbolic = %impl.elem0 (constants.%impl.elem0.8aa205.1)] +// CHECK:STDOUT: %as_type: type = facet_access_type %impl.elem0 [symbolic = %as_type (constants.%as_type.a0914b.1)] +// CHECK:STDOUT: %.1: Core.Form = init_form %as_type [symbolic = %.1 (constants.%.3ef823.1)] +// CHECK:STDOUT: %pattern_type.2: type = pattern_type %as_type [symbolic = %pattern_type.2 (constants.%pattern_type.77f685.1)] +// CHECK:STDOUT: %return.param_patt: @Transitive.WithSelf.GetA.%pattern_type.2 (%pattern_type.77f685.1) = out_param_pattern [symbolic = %return.param_patt (constants.%return.param_patt.11f0b9.1)] +// CHECK:STDOUT: %return.patt: @Transitive.WithSelf.GetA.%pattern_type.2 (%pattern_type.77f685.1) = return_slot_pattern %return.param_patt, invalid [symbolic = %return.patt (constants.%return.patt.87a9a6.1)] +// CHECK:STDOUT: +// CHECK:STDOUT: fn; +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: generic fn @F(%T.loc5_7.2: %Transitive.type) { +// CHECK:STDOUT: %T.patt.loc5_7.2: %pattern_type.bd9 = symbolic_binding_pattern T, 0 [symbolic = %T.patt.loc5_7.2 (constants.%T.patt)] +// CHECK:STDOUT: %T.loc5_7.1: %Transitive.type = symbolic_binding T, 0 [symbolic = %T.loc5_7.1 (constants.%T)] +// CHECK:STDOUT: %T.as_type.loc5_25.1: type = facet_access_type %T.loc5_7.1 [symbolic = %T.as_type.loc5_25.1 (constants.%T.as_type)] +// CHECK:STDOUT: %pattern_type.loc5: type = pattern_type %T.as_type.loc5_25.1 [symbolic = %pattern_type.loc5 (constants.%pattern_type.68e728.2)] +// CHECK:STDOUT: %t.param_patt.loc5_23.2: @F.%pattern_type.loc5 (%pattern_type.68e728.2) = value_param_pattern [symbolic = %t.param_patt.loc5_23.2 (constants.%t.param_patt)] +// CHECK:STDOUT: %t.patt.loc5_23.2: @F.%pattern_type.loc5 (%pattern_type.68e728.2) = at_binding_pattern t, %t.param_patt.loc5_23.2 [symbolic = %t.patt.loc5_23.2 (constants.%t.patt)] +// CHECK:STDOUT: +// CHECK:STDOUT: !definition: +// CHECK:STDOUT: %require_complete.loc5: = require_complete_type %T.as_type.loc5_25.1 [symbolic = %require_complete.loc5 (constants.%require_complete.fbd)] +// CHECK:STDOUT: %Transitive.lookup_impl_witness: = lookup_impl_witness %T.loc5_7.1, @Transitive [symbolic = %Transitive.lookup_impl_witness (constants.%Transitive.lookup_impl_witness.ab0b8d.2)] +// CHECK:STDOUT: %impl.elem0.loc6_11.2: %facet_type.1ff = impl_witness_access %Transitive.lookup_impl_witness, element0 [symbolic = %impl.elem0.loc6_11.2 (constants.%impl.elem0.8aa205.2)] +// CHECK:STDOUT: %as_type.loc6_11.2: type = facet_access_type %impl.elem0.loc6_11.2 [symbolic = %as_type.loc6_11.2 (constants.%as_type.a0914b.2)] +// CHECK:STDOUT: %require_complete.loc6: = require_complete_type %as_type.loc6_11.2 [symbolic = %require_complete.loc6 (constants.%require_complete.6cf)] +// CHECK:STDOUT: %pattern_type.loc6: type = pattern_type %as_type.loc6_11.2 [symbolic = %pattern_type.loc6 (constants.%pattern_type.77f685.2)] +// CHECK:STDOUT: %a.patt.loc6_8.2: @F.%pattern_type.loc6 (%pattern_type.77f685.2) = ref_binding_pattern a [symbolic = %a.patt.loc6_8.2 (constants.%a.patt)] +// CHECK:STDOUT: %a.var_patt.loc6_3.2: @F.%pattern_type.loc6 (%pattern_type.77f685.2) = var_pattern %a.patt.loc6_8.2 [symbolic = %a.var_patt.loc6_3.2 (constants.%a.var_patt)] +// CHECK:STDOUT: %Transitive.WithSelf.GetA.type: type = fn_type @Transitive.WithSelf.GetA, @Transitive.WithSelf(%T.loc5_7.1) [symbolic = %Transitive.WithSelf.GetA.type (constants.%Transitive.WithSelf.GetA.type.0b3c58.2)] +// CHECK:STDOUT: %.loc6_17: type = fn_type_with_self_type %Transitive.WithSelf.GetA.type, %T.loc5_7.1 [symbolic = %.loc6_17 (constants.%.657)] +// CHECK:STDOUT: %impl.elem3.loc6_17.2: @F.%.loc6_17 (%.657) = impl_witness_access %Transitive.lookup_impl_witness, element3 [symbolic = %impl.elem3.loc6_17.2 (constants.%impl.elem3)] +// CHECK:STDOUT: %specific_impl_fn.loc6_17.2: = specific_impl_function %impl.elem3.loc6_17.2, @Transitive.WithSelf.GetA(%T.loc5_7.1) [symbolic = %specific_impl_fn.loc6_17.2 (constants.%specific_impl_fn.72f)] +// CHECK:STDOUT: %impl.elem1.loc15_11.2: %facet_type.1b9 = impl_witness_access %Transitive.lookup_impl_witness, element1 [symbolic = %impl.elem1.loc15_11.2 (constants.%impl.elem1.1413d6.2)] +// CHECK:STDOUT: %as_type.loc15_11.2: type = facet_access_type %impl.elem1.loc15_11.2 [symbolic = %as_type.loc15_11.2 (constants.%as_type.f86e2d.2)] +// CHECK:STDOUT: %require_complete.loc15_11: = require_complete_type %as_type.loc15_11.2 [symbolic = %require_complete.loc15_11 (constants.%require_complete.0ea)] +// CHECK:STDOUT: %pattern_type.loc15: type = pattern_type %as_type.loc15_11.2 [symbolic = %pattern_type.loc15 (constants.%pattern_type.86a)] +// CHECK:STDOUT: %b.patt.loc15_8.2: @F.%pattern_type.loc15 (%pattern_type.86a) = ref_binding_pattern b [symbolic = %b.patt.loc15_8.2 (constants.%b.patt)] +// CHECK:STDOUT: %b.var_patt.loc15_3.2: @F.%pattern_type.loc15 (%pattern_type.86a) = var_pattern %b.patt.loc15_8.2 [symbolic = %b.var_patt.loc15_3.2 (constants.%b.var_patt)] +// CHECK:STDOUT: %ImplicitAs.type.loc15_3.2: type = facet_type <@ImplicitAs, @ImplicitAs(%as_type.loc15_11.2)> [symbolic = %ImplicitAs.type.loc15_3.2 (constants.%ImplicitAs.type.368)] +// CHECK:STDOUT: %require_complete.loc15_3: = require_complete_type %ImplicitAs.type.loc15_3.2 [symbolic = %require_complete.loc15_3 (constants.%require_complete.a65)] +// CHECK:STDOUT: %ImplicitAs.assoc_type: type = assoc_entity_type @ImplicitAs, @ImplicitAs(%as_type.loc15_11.2) [symbolic = %ImplicitAs.assoc_type (constants.%ImplicitAs.assoc_type.869)] +// CHECK:STDOUT: %assoc0.loc15: @F.%ImplicitAs.assoc_type (%ImplicitAs.assoc_type.869) = assoc_entity element0, imports.%Core.import_ref.cb2 [symbolic = %assoc0.loc15 (constants.%assoc0.c45)] +// CHECK:STDOUT: %Q.lookup_impl_witness: = lookup_impl_witness %impl.elem1.loc15_11.2, @Q [symbolic = %Q.lookup_impl_witness (constants.%Q.lookup_impl_witness)] +// CHECK:STDOUT: %Q.facet.loc16_4: %Q.type = facet_value %as_type.loc15_11.2, (%Q.lookup_impl_witness) [symbolic = %Q.facet.loc16_4 (constants.%Q.facet)] +// CHECK:STDOUT: %Q.WithSelf.InQ.type: type = fn_type @Q.WithSelf.InQ, @Q.WithSelf(%Q.facet.loc16_4) [symbolic = %Q.WithSelf.InQ.type (constants.%Q.WithSelf.InQ.type.0c5)] +// CHECK:STDOUT: %.loc16_4: type = fn_type_with_self_type %Q.WithSelf.InQ.type, %Q.facet.loc16_4 [symbolic = %.loc16_4 (constants.%.786)] +// CHECK:STDOUT: %impl.elem0.loc16_4.2: @F.%.loc16_4 (%.786) = impl_witness_access %Q.lookup_impl_witness, element0 [symbolic = %impl.elem0.loc16_4.2 (constants.%impl.elem0.8e3)] +// CHECK:STDOUT: %specific_impl_fn.loc16_4.2: = specific_impl_function %impl.elem0.loc16_4.2, @Q.WithSelf.InQ(%Q.facet.loc16_4) [symbolic = %specific_impl_fn.loc16_4.2 (constants.%specific_impl_fn.957)] +// CHECK:STDOUT: %impl.elem2.loc26_7.2: %facet_type.0e9 = impl_witness_access %Transitive.lookup_impl_witness, element2 [symbolic = %impl.elem2.loc26_7.2 (constants.%impl.elem2.279493.2)] +// CHECK:STDOUT: %as_type.loc26_9.2: type = facet_access_type %impl.elem2.loc26_7.2 [symbolic = %as_type.loc26_9.2 (constants.%as_type.b2aa43.2)] +// CHECK:STDOUT: %R.lookup_impl_witness: = lookup_impl_witness %impl.elem2.loc26_7.2, @R [symbolic = %R.lookup_impl_witness (constants.%R.lookup_impl_witness.aa0)] +// CHECK:STDOUT: %R.facet: %R.type = facet_value %as_type.loc26_9.2, (%R.lookup_impl_witness) [symbolic = %R.facet (constants.%R.facet)] +// CHECK:STDOUT: %R.WithSelf.InR.type: type = fn_type @R.WithSelf.InR, @R.WithSelf(%R.facet) [symbolic = %R.WithSelf.InR.type (constants.%R.WithSelf.InR.type.56d)] +// CHECK:STDOUT: %.loc26_9.2: type = fn_type_with_self_type %R.WithSelf.InR.type, %R.facet [symbolic = %.loc26_9.2 (constants.%.f43)] +// CHECK:STDOUT: %impl.elem0.loc26_9.2: @F.%.loc26_9.2 (%.f43) = impl_witness_access %R.lookup_impl_witness, element0 [symbolic = %impl.elem0.loc26_9.2 (constants.%impl.elem0.8cc)] +// CHECK:STDOUT: %require_complete.loc34_6.1: = require_complete_type %as_type.loc26_9.2 [symbolic = %require_complete.loc34_6.1 (constants.%require_complete.6e3)] +// CHECK:STDOUT: %As.type.loc34_6.2: type = facet_type <@As, @As(%as_type.loc26_9.2)> [symbolic = %As.type.loc34_6.2 (constants.%As.type.ccf)] +// CHECK:STDOUT: %require_complete.loc34_6.2: = require_complete_type %As.type.loc34_6.2 [symbolic = %require_complete.loc34_6.2 (constants.%require_complete.ee4)] +// CHECK:STDOUT: %As.assoc_type: type = assoc_entity_type @As, @As(%as_type.loc26_9.2) [symbolic = %As.assoc_type (constants.%As.assoc_type.60e)] +// CHECK:STDOUT: %assoc0.loc34: @F.%As.assoc_type (%As.assoc_type.60e) = assoc_entity element0, imports.%Core.import_ref.967 [symbolic = %assoc0.loc34 (constants.%assoc0.fb9)] +// CHECK:STDOUT: %Destroy.lookup_impl_witness.loc15: = lookup_impl_witness %impl.elem1.loc15_11.2, @Destroy [symbolic = %Destroy.lookup_impl_witness.loc15 (constants.%Destroy.lookup_impl_witness.32f)] +// CHECK:STDOUT: %Destroy.facet.loc15_3.3: %Destroy.type = facet_value %as_type.loc15_11.2, (%Destroy.lookup_impl_witness.loc15) [symbolic = %Destroy.facet.loc15_3.3 (constants.%Destroy.facet.853)] +// CHECK:STDOUT: %Destroy.WithSelf.Op.type.loc15: type = fn_type @Destroy.WithSelf.Op, @Destroy.WithSelf(%Destroy.facet.loc15_3.3) [symbolic = %Destroy.WithSelf.Op.type.loc15 (constants.%Destroy.WithSelf.Op.type.bb2)] +// CHECK:STDOUT: %.loc15_3.5: type = fn_type_with_self_type %Destroy.WithSelf.Op.type.loc15, %Destroy.facet.loc15_3.3 [symbolic = %.loc15_3.5 (constants.%.ee0)] +// CHECK:STDOUT: %impl.elem0.loc15_3.2: @F.%.loc15_3.5 (%.ee0) = impl_witness_access %Destroy.lookup_impl_witness.loc15, element0 [symbolic = %impl.elem0.loc15_3.2 (constants.%impl.elem0.087)] +// CHECK:STDOUT: %specific_impl_fn.loc15_3.2: = specific_impl_function %impl.elem0.loc15_3.2, @Destroy.WithSelf.Op(%Destroy.facet.loc15_3.3) [symbolic = %specific_impl_fn.loc15_3.2 (constants.%specific_impl_fn.ef3)] +// CHECK:STDOUT: %Destroy.lookup_impl_witness.loc6: = lookup_impl_witness %impl.elem0.loc6_11.2, @Destroy [symbolic = %Destroy.lookup_impl_witness.loc6 (constants.%Destroy.lookup_impl_witness.1c9)] +// CHECK:STDOUT: %Destroy.facet.loc6_3.3: %Destroy.type = facet_value %as_type.loc6_11.2, (%Destroy.lookup_impl_witness.loc6) [symbolic = %Destroy.facet.loc6_3.3 (constants.%Destroy.facet.27e)] +// CHECK:STDOUT: %Destroy.WithSelf.Op.type.loc6: type = fn_type @Destroy.WithSelf.Op, @Destroy.WithSelf(%Destroy.facet.loc6_3.3) [symbolic = %Destroy.WithSelf.Op.type.loc6 (constants.%Destroy.WithSelf.Op.type.74e)] +// CHECK:STDOUT: %.loc6_3.4: type = fn_type_with_self_type %Destroy.WithSelf.Op.type.loc6, %Destroy.facet.loc6_3.3 [symbolic = %.loc6_3.4 (constants.%.569)] +// CHECK:STDOUT: %impl.elem0.loc6_3.2: @F.%.loc6_3.4 (%.569) = impl_witness_access %Destroy.lookup_impl_witness.loc6, element0 [symbolic = %impl.elem0.loc6_3.2 (constants.%impl.elem0.95f)] +// CHECK:STDOUT: %specific_impl_fn.loc6_3.2: = specific_impl_function %impl.elem0.loc6_3.2, @Destroy.WithSelf.Op(%Destroy.facet.loc6_3.3) [symbolic = %specific_impl_fn.loc6_3.2 (constants.%specific_impl_fn.584)] +// CHECK:STDOUT: +// CHECK:STDOUT: fn(%t.param: @F.%T.as_type.loc5_25.1 (%T.as_type)) { +// CHECK:STDOUT: !entry: +// CHECK:STDOUT: %a.var: ref @F.%as_type.loc6_11.2 (%as_type.a0914b.2) = var_storage %a.var_patt.loc6_3.1 +// CHECK:STDOUT: %t.ref: @F.%T.as_type.loc5_25.1 (%T.as_type) = name_ref t, %t +// CHECK:STDOUT: %GetA.ref: %Transitive.assoc_type = name_ref GetA, imports.%Main.import_ref.5c5 [concrete = constants.%assoc3] +// CHECK:STDOUT: %impl.elem3.loc6_17.1: @F.%.loc6_17 (%.657) = impl_witness_access constants.%Transitive.lookup_impl_witness.ab0b8d.2, element3 [symbolic = %impl.elem3.loc6_17.2 (constants.%impl.elem3)] +// CHECK:STDOUT: %bound_method.loc6_17: = bound_method %t.ref, %impl.elem3.loc6_17.1 +// CHECK:STDOUT: %.loc6_23.1: %Transitive.type = converted constants.%T.as_type, constants.%T [symbolic = %T.loc5_7.1 (constants.%T)] +// CHECK:STDOUT: %.loc6_23.2: %Transitive.type = converted constants.%T.as_type, constants.%T [symbolic = %T.loc5_7.1 (constants.%T)] +// CHECK:STDOUT: %specific_impl_fn.loc6_17.1: = specific_impl_function %impl.elem3.loc6_17.1, @Transitive.WithSelf.GetA(constants.%T) [symbolic = %specific_impl_fn.loc6_17.2 (constants.%specific_impl_fn.72f)] +// CHECK:STDOUT: %bound_method.loc6_23: = bound_method %t.ref, %specific_impl_fn.loc6_17.1 +// CHECK:STDOUT: %.loc6_3.1: ref @F.%as_type.loc6_11.2 (%as_type.a0914b.2) = splice_block %a.var {} +// CHECK:STDOUT: %Transitive.WithSelf.GetA.call: init @F.%as_type.loc6_11.2 (%as_type.a0914b.2) to %.loc6_3.1 = call %bound_method.loc6_23(%t.ref) +// CHECK:STDOUT: assign %a.var, %Transitive.WithSelf.GetA.call +// CHECK:STDOUT: %.loc6_11.1: type = splice_block %.loc6_11.3 [symbolic = %as_type.loc6_11.2 (constants.%as_type.a0914b.2)] { +// CHECK:STDOUT: %T.ref.loc6: %Transitive.type = name_ref T, %T.loc5_7.2 [symbolic = %T.loc5_7.1 (constants.%T)] +// CHECK:STDOUT: %T.as_type.loc6: type = facet_access_type %T.ref.loc6 [symbolic = %T.as_type.loc5_25.1 (constants.%T.as_type)] +// CHECK:STDOUT: %.loc6_11.2: type = converted %T.ref.loc6, %T.as_type.loc6 [symbolic = %T.as_type.loc5_25.1 (constants.%T.as_type)] +// CHECK:STDOUT: %A.ref: %Transitive.assoc_type = name_ref A, imports.%Main.import_ref.72c [concrete = constants.%assoc0.e77] +// CHECK:STDOUT: %impl.elem0.loc6_11.1: %facet_type.1ff = impl_witness_access constants.%Transitive.lookup_impl_witness.ab0b8d.2, element0 [symbolic = %impl.elem0.loc6_11.2 (constants.%impl.elem0.8aa205.2)] +// CHECK:STDOUT: %as_type.loc6_11.1: type = facet_access_type %impl.elem0.loc6_11.1 [symbolic = %as_type.loc6_11.2 (constants.%as_type.a0914b.2)] +// CHECK:STDOUT: %.loc6_11.3: type = converted %impl.elem0.loc6_11.1, %as_type.loc6_11.1 [symbolic = %as_type.loc6_11.2 (constants.%as_type.a0914b.2)] +// CHECK:STDOUT: } +// CHECK:STDOUT: %a: ref @F.%as_type.loc6_11.2 (%as_type.a0914b.2) = wrapper_binding a, %a.var +// CHECK:STDOUT: name_binding_decl { +// CHECK:STDOUT: %a.patt.loc6_8.1: @F.%pattern_type.loc6 (%pattern_type.77f685.2) = ref_binding_pattern a [symbolic = %a.patt.loc6_8.2 (constants.%a.patt)] +// CHECK:STDOUT: %a.var_patt.loc6_3.1: @F.%pattern_type.loc6 (%pattern_type.77f685.2) = var_pattern %a.patt.loc6_8.1 [symbolic = %a.var_patt.loc6_3.2 (constants.%a.var_patt)] +// CHECK:STDOUT: } +// CHECK:STDOUT: %b.var: ref @F.%as_type.loc15_11.2 (%as_type.f86e2d.2) = var_storage %b.var_patt.loc15_3.1 +// CHECK:STDOUT: %a.ref.loc15: ref @F.%as_type.loc6_11.2 (%as_type.a0914b.2) = name_ref a, %a +// CHECK:STDOUT: %ImplicitAs.type.loc15_3.1: type = facet_type <@ImplicitAs, @ImplicitAs(constants.%as_type.f86e2d.2)> [symbolic = %ImplicitAs.type.loc15_3.2 (constants.%ImplicitAs.type.368)] +// CHECK:STDOUT: %.loc15_3.1: @F.%ImplicitAs.assoc_type (%ImplicitAs.assoc_type.869) = specific_constant imports.%Core.import_ref.484, @ImplicitAs.WithSelf(constants.%as_type.f86e2d.2, constants.%Self.294) [symbolic = %assoc0.loc15 (constants.%assoc0.c45)] +// CHECK:STDOUT: %Convert.ref.loc15: @F.%ImplicitAs.assoc_type (%ImplicitAs.assoc_type.869) = name_ref Convert, %.loc15_3.1 [symbolic = %assoc0.loc15 (constants.%assoc0.c45)] +// CHECK:STDOUT: %facet_type.loc15: type = facet_type <@Destroy & @Q> [concrete = constants.%facet_type.aa5] +// CHECK:STDOUT: %.loc15_3.2: @F.%as_type.loc15_11.2 (%as_type.f86e2d.2) = converted %a.ref.loc15, [concrete = ] +// CHECK:STDOUT: assign %b.var, +// CHECK:STDOUT: %.loc15_11.1: type = splice_block %.loc15_11.3 [symbolic = %as_type.loc15_11.2 (constants.%as_type.f86e2d.2)] { +// CHECK:STDOUT: %T.ref.loc15: %Transitive.type = name_ref T, %T.loc5_7.2 [symbolic = %T.loc5_7.1 (constants.%T)] +// CHECK:STDOUT: %T.as_type.loc15: type = facet_access_type %T.ref.loc15 [symbolic = %T.as_type.loc5_25.1 (constants.%T.as_type)] +// CHECK:STDOUT: %.loc15_11.2: type = converted %T.ref.loc15, %T.as_type.loc15 [symbolic = %T.as_type.loc5_25.1 (constants.%T.as_type)] +// CHECK:STDOUT: %B.ref: %Transitive.assoc_type = name_ref B, imports.%Main.import_ref.e5e [concrete = constants.%assoc1] +// CHECK:STDOUT: %impl.elem1.loc15_11.1: %facet_type.1b9 = impl_witness_access constants.%Transitive.lookup_impl_witness.ab0b8d.2, element1 [symbolic = %impl.elem1.loc15_11.2 (constants.%impl.elem1.1413d6.2)] +// CHECK:STDOUT: %as_type.loc15_11.1: type = facet_access_type %impl.elem1.loc15_11.1 [symbolic = %as_type.loc15_11.2 (constants.%as_type.f86e2d.2)] +// CHECK:STDOUT: %.loc15_11.3: type = converted %impl.elem1.loc15_11.1, %as_type.loc15_11.1 [symbolic = %as_type.loc15_11.2 (constants.%as_type.f86e2d.2)] +// CHECK:STDOUT: } +// CHECK:STDOUT: %b: ref @F.%as_type.loc15_11.2 (%as_type.f86e2d.2) = wrapper_binding b, %b.var +// CHECK:STDOUT: name_binding_decl { +// CHECK:STDOUT: %b.patt.loc15_8.1: @F.%pattern_type.loc15 (%pattern_type.86a) = ref_binding_pattern b [symbolic = %b.patt.loc15_8.2 (constants.%b.patt)] +// CHECK:STDOUT: %b.var_patt.loc15_3.1: @F.%pattern_type.loc15 (%pattern_type.86a) = var_pattern %b.patt.loc15_8.1 [symbolic = %b.var_patt.loc15_3.2 (constants.%b.var_patt)] +// CHECK:STDOUT: } +// CHECK:STDOUT: %b.ref: ref @F.%as_type.loc15_11.2 (%as_type.f86e2d.2) = name_ref b, %b +// CHECK:STDOUT: %InQ.ref: %Q.assoc_type = name_ref InQ, imports.%Main.import_ref.e2a [concrete = constants.%assoc0.6a1] +// CHECK:STDOUT: %impl.elem0.loc16_4.1: @F.%.loc16_4 (%.786) = impl_witness_access constants.%Q.lookup_impl_witness, element0 [symbolic = %impl.elem0.loc16_4.2 (constants.%impl.elem0.8e3)] +// CHECK:STDOUT: %bound_method.loc16_4: = bound_method %b.ref, %impl.elem0.loc16_4.1 +// CHECK:STDOUT: %Q.facet.loc16_9.1: %Q.type = facet_value constants.%as_type.f86e2d.2, (constants.%Q.lookup_impl_witness) [symbolic = %Q.facet.loc16_4 (constants.%Q.facet)] +// CHECK:STDOUT: %.loc16_9.1: %Q.type = converted constants.%as_type.f86e2d.2, %Q.facet.loc16_9.1 [symbolic = %Q.facet.loc16_4 (constants.%Q.facet)] +// CHECK:STDOUT: %Q.facet.loc16_9.2: %Q.type = facet_value constants.%as_type.f86e2d.2, (constants.%Q.lookup_impl_witness) [symbolic = %Q.facet.loc16_4 (constants.%Q.facet)] +// CHECK:STDOUT: %.loc16_9.2: %Q.type = converted constants.%as_type.f86e2d.2, %Q.facet.loc16_9.2 [symbolic = %Q.facet.loc16_4 (constants.%Q.facet)] +// CHECK:STDOUT: %specific_impl_fn.loc16_4.1: = specific_impl_function %impl.elem0.loc16_4.1, @Q.WithSelf.InQ(constants.%Q.facet) [symbolic = %specific_impl_fn.loc16_4.2 (constants.%specific_impl_fn.957)] +// CHECK:STDOUT: %bound_method.loc16_9: = bound_method %b.ref, %specific_impl_fn.loc16_4.1 +// CHECK:STDOUT: %.loc16_3: @F.%as_type.loc15_11.2 (%as_type.f86e2d.2) = acquire_value %b.ref +// CHECK:STDOUT: %Q.WithSelf.InQ.call: init %empty_tuple.type = call %bound_method.loc16_9(%.loc16_3) +// CHECK:STDOUT: %a.ref.loc26: ref @F.%as_type.loc6_11.2 (%as_type.a0914b.2) = name_ref a, %a +// CHECK:STDOUT: %T.ref.loc26: %Transitive.type = name_ref T, %T.loc5_7.2 [symbolic = %T.loc5_7.1 (constants.%T)] +// CHECK:STDOUT: %T.as_type.loc26: type = facet_access_type %T.ref.loc26 [symbolic = %T.as_type.loc5_25.1 (constants.%T.as_type)] +// CHECK:STDOUT: %.loc26_7: type = converted %T.ref.loc26, %T.as_type.loc26 [symbolic = %T.as_type.loc5_25.1 (constants.%T.as_type)] +// CHECK:STDOUT: %C.ref.loc26: %Transitive.assoc_type = name_ref C, imports.%Main.import_ref.c9c [concrete = constants.%assoc2] +// CHECK:STDOUT: %impl.elem2.loc26_7.1: %facet_type.0e9 = impl_witness_access constants.%Transitive.lookup_impl_witness.ab0b8d.2, element2 [symbolic = %impl.elem2.loc26_7.2 (constants.%impl.elem2.279493.2)] +// CHECK:STDOUT: %as_type.loc26_9.1: type = facet_access_type %impl.elem2.loc26_7.1 [symbolic = %as_type.loc26_9.2 (constants.%as_type.b2aa43.2)] +// CHECK:STDOUT: %.loc26_9.1: type = converted %impl.elem2.loc26_7.1, %as_type.loc26_9.1 [symbolic = %as_type.loc26_9.2 (constants.%as_type.b2aa43.2)] +// CHECK:STDOUT: %InR.ref.loc26: %R.assoc_type = name_ref InR, imports.%Main.import_ref.682 [concrete = constants.%assoc0.e94] +// CHECK:STDOUT: %facet_type.loc26: type = facet_type <@Destroy & @R> [concrete = constants.%facet_type.fcc] +// CHECK:STDOUT: %impl.elem0.loc26_9.1: @F.%.loc26_9.2 (%.f43) = impl_witness_access constants.%R.lookup_impl_witness.aa0, element0 [symbolic = %impl.elem0.loc26_9.2 (constants.%impl.elem0.8cc)] +// CHECK:STDOUT: %bound_method.loc26: = bound_method %a.ref.loc26, %impl.elem0.loc26_9.1 +// CHECK:STDOUT: %a.ref.loc34: ref @F.%as_type.loc6_11.2 (%as_type.a0914b.2) = name_ref a, %a +// CHECK:STDOUT: %T.ref.loc34: %Transitive.type = name_ref T, %T.loc5_7.2 [symbolic = %T.loc5_7.1 (constants.%T)] +// CHECK:STDOUT: %T.as_type.loc34: type = facet_access_type %T.ref.loc34 [symbolic = %T.as_type.loc5_25.1 (constants.%T.as_type)] +// CHECK:STDOUT: %.loc34_10.1: type = converted %T.ref.loc34, %T.as_type.loc34 [symbolic = %T.as_type.loc5_25.1 (constants.%T.as_type)] +// CHECK:STDOUT: %C.ref.loc34: %Transitive.assoc_type = name_ref C, imports.%Main.import_ref.c9c [concrete = constants.%assoc2] +// CHECK:STDOUT: %impl.elem2.loc34: %facet_type.0e9 = impl_witness_access constants.%Transitive.lookup_impl_witness.ab0b8d.2, element2 [symbolic = %impl.elem2.loc26_7.2 (constants.%impl.elem2.279493.2)] +// CHECK:STDOUT: %as_type.loc34: type = facet_access_type %impl.elem2.loc34 [symbolic = %as_type.loc26_9.2 (constants.%as_type.b2aa43.2)] +// CHECK:STDOUT: %.loc34_10.2: type = converted %impl.elem2.loc34, %as_type.loc34 [symbolic = %as_type.loc26_9.2 (constants.%as_type.b2aa43.2)] +// CHECK:STDOUT: %As.type.loc34_6.1: type = facet_type <@As, @As(constants.%as_type.b2aa43.2)> [symbolic = %As.type.loc34_6.2 (constants.%As.type.ccf)] +// CHECK:STDOUT: %.loc34_6.1: @F.%As.assoc_type (%As.assoc_type.60e) = specific_constant imports.%Core.import_ref.e36, @As.WithSelf(constants.%as_type.b2aa43.2, constants.%Self.37a) [symbolic = %assoc0.loc34 (constants.%assoc0.fb9)] +// CHECK:STDOUT: %Convert.ref.loc34: @F.%As.assoc_type (%As.assoc_type.60e) = name_ref Convert, %.loc34_6.1 [symbolic = %assoc0.loc34 (constants.%assoc0.fb9)] +// CHECK:STDOUT: %.loc34_6.2: @F.%as_type.loc26_9.2 (%as_type.b2aa43.2) = converted %a.ref.loc34, [concrete = ] +// CHECK:STDOUT: %InR.ref.loc34: = name_ref InR, [concrete = ] +// CHECK:STDOUT: %impl.elem0.loc15_3.1: @F.%.loc15_3.5 (%.ee0) = impl_witness_access constants.%Destroy.lookup_impl_witness.32f, element0 [symbolic = %impl.elem0.loc15_3.2 (constants.%impl.elem0.087)] +// CHECK:STDOUT: %bound_method.loc15_3.1: = bound_method %b.var, %impl.elem0.loc15_3.1 +// CHECK:STDOUT: %Destroy.facet.loc15_3.1: %Destroy.type = facet_value constants.%as_type.f86e2d.2, (constants.%Destroy.lookup_impl_witness.32f) [symbolic = %Destroy.facet.loc15_3.3 (constants.%Destroy.facet.853)] +// CHECK:STDOUT: %.loc15_3.3: %Destroy.type = converted constants.%as_type.f86e2d.2, %Destroy.facet.loc15_3.1 [symbolic = %Destroy.facet.loc15_3.3 (constants.%Destroy.facet.853)] +// CHECK:STDOUT: %Destroy.facet.loc15_3.2: %Destroy.type = facet_value constants.%as_type.f86e2d.2, (constants.%Destroy.lookup_impl_witness.32f) [symbolic = %Destroy.facet.loc15_3.3 (constants.%Destroy.facet.853)] +// CHECK:STDOUT: %.loc15_3.4: %Destroy.type = converted constants.%as_type.f86e2d.2, %Destroy.facet.loc15_3.2 [symbolic = %Destroy.facet.loc15_3.3 (constants.%Destroy.facet.853)] +// CHECK:STDOUT: %specific_impl_fn.loc15_3.1: = specific_impl_function %impl.elem0.loc15_3.1, @Destroy.WithSelf.Op(constants.%Destroy.facet.853) [symbolic = %specific_impl_fn.loc15_3.2 (constants.%specific_impl_fn.ef3)] +// CHECK:STDOUT: %bound_method.loc15_3.2: = bound_method %b.var, %specific_impl_fn.loc15_3.1 +// CHECK:STDOUT: %Destroy.WithSelf.Op.call.loc15: init %empty_tuple.type = call %bound_method.loc15_3.2(%b.var) +// CHECK:STDOUT: %impl.elem0.loc6_3.1: @F.%.loc6_3.4 (%.569) = impl_witness_access constants.%Destroy.lookup_impl_witness.1c9, element0 [symbolic = %impl.elem0.loc6_3.2 (constants.%impl.elem0.95f)] +// CHECK:STDOUT: %bound_method.loc6_3.1: = bound_method %a.var, %impl.elem0.loc6_3.1 +// CHECK:STDOUT: %Destroy.facet.loc6_3.1: %Destroy.type = facet_value constants.%as_type.a0914b.2, (constants.%Destroy.lookup_impl_witness.1c9) [symbolic = %Destroy.facet.loc6_3.3 (constants.%Destroy.facet.27e)] +// CHECK:STDOUT: %.loc6_3.2: %Destroy.type = converted constants.%as_type.a0914b.2, %Destroy.facet.loc6_3.1 [symbolic = %Destroy.facet.loc6_3.3 (constants.%Destroy.facet.27e)] +// CHECK:STDOUT: %Destroy.facet.loc6_3.2: %Destroy.type = facet_value constants.%as_type.a0914b.2, (constants.%Destroy.lookup_impl_witness.1c9) [symbolic = %Destroy.facet.loc6_3.3 (constants.%Destroy.facet.27e)] +// CHECK:STDOUT: %.loc6_3.3: %Destroy.type = converted constants.%as_type.a0914b.2, %Destroy.facet.loc6_3.2 [symbolic = %Destroy.facet.loc6_3.3 (constants.%Destroy.facet.27e)] +// CHECK:STDOUT: %specific_impl_fn.loc6_3.1: = specific_impl_function %impl.elem0.loc6_3.1, @Destroy.WithSelf.Op(constants.%Destroy.facet.27e) [symbolic = %specific_impl_fn.loc6_3.2 (constants.%specific_impl_fn.584)] +// CHECK:STDOUT: %bound_method.loc6_3.2: = bound_method %a.var, %specific_impl_fn.loc6_3.1 +// CHECK:STDOUT: %Destroy.WithSelf.Op.call.loc6: init %empty_tuple.type = call %bound_method.loc6_3.2(%a.var) +// CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: +// CHECK:STDOUT: } +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: specific @R.WithSelf(constants.%Self.be6) { +// CHECK:STDOUT: !definition: +// CHECK:STDOUT: %Self => constants.%Self.be6 +// CHECK:STDOUT: %R.WithSelf.InR.type => constants.%R.WithSelf.InR.type.4bf +// CHECK:STDOUT: %R.WithSelf.InR => constants.%R.WithSelf.InR.345 +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: specific @R.WithSelf.InR(constants.%Self.be6) { +// CHECK:STDOUT: %Self => constants.%Self.be6 +// CHECK:STDOUT: %Self.as_type => constants.%Self.as_type.b02 +// CHECK:STDOUT: %pattern_type => constants.%pattern_type.60e +// CHECK:STDOUT: %self.param_patt => constants.%self.param_patt.640 +// CHECK:STDOUT: %self.patt => constants.%self.patt.894 +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: specific @Q.WithSelf(constants.%Self.afd) { +// CHECK:STDOUT: !definition: +// CHECK:STDOUT: %Self => constants.%Self.afd +// CHECK:STDOUT: %Q.WithSelf.InQ.type => constants.%Q.WithSelf.InQ.type.fb9 +// CHECK:STDOUT: %Q.WithSelf.InQ => constants.%Q.WithSelf.InQ.daf +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: specific @Q.WithSelf.InQ(constants.%Self.afd) { +// CHECK:STDOUT: %Self => constants.%Self.afd +// CHECK:STDOUT: %Self.as_type => constants.%Self.as_type.430 +// CHECK:STDOUT: %pattern_type => constants.%pattern_type.ade +// CHECK:STDOUT: %self.param_patt => constants.%self.param_patt.271 +// CHECK:STDOUT: %self.patt => constants.%self.patt.b5e +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: specific @P.WithSelf(constants.%Self.104) { +// CHECK:STDOUT: !definition: +// CHECK:STDOUT: %Self => constants.%Self.104 +// CHECK:STDOUT: %P.WithSelf.InP.type => constants.%P.WithSelf.InP.type +// CHECK:STDOUT: %P.WithSelf.InP => constants.%P.WithSelf.InP +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: specific @P.WithSelf.InP(constants.%Self.104) { +// CHECK:STDOUT: %Self => constants.%Self.104 +// CHECK:STDOUT: %Self.as_type => constants.%Self.as_type.cc3 +// CHECK:STDOUT: %pattern_type => constants.%pattern_type.3ef +// CHECK:STDOUT: %self.param_patt => constants.%self.param_patt.88d +// CHECK:STDOUT: %self.patt => constants.%self.patt.6de +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: specific @Transitive.WithSelf(constants.%Self.744) { +// CHECK:STDOUT: !definition: +// CHECK:STDOUT: %Self => constants.%Self.744 +// CHECK:STDOUT: %Transitive.lookup_impl_witness => constants.%Transitive.lookup_impl_witness.ab0b8d.1 +// CHECK:STDOUT: %impl.elem0 => constants.%impl.elem0.8aa205.1 +// CHECK:STDOUT: %impl.elem1 => constants.%impl.elem1.1413d6.1 +// CHECK:STDOUT: %Transitive.WithSelf.GetA.type => constants.%Transitive.WithSelf.GetA.type.0b3c58.1 +// CHECK:STDOUT: %Transitive.WithSelf.GetA => constants.%Transitive.WithSelf.GetA.e3e09c.1 +// CHECK:STDOUT: %Transitive.WithSelf.TakesC.type => constants.%Transitive.WithSelf.TakesC.type.d86d9f.1 +// CHECK:STDOUT: %Transitive.WithSelf.TakesC => constants.%Transitive.WithSelf.TakesC.f276cd.1 +// CHECK:STDOUT: %as_type.1 => constants.%as_type.f86e2d.1 +// CHECK:STDOUT: %as_type.2 => constants.%as_type.a0914b.1 +// CHECK:STDOUT: %eq.1 => constants.%eq.20ba2e.1 +// CHECK:STDOUT: %impl.elem2 => constants.%impl.elem2.279493.1 +// CHECK:STDOUT: %as_type.3 => constants.%as_type.b2aa43.1 +// CHECK:STDOUT: %eq.2 => constants.%eq.be77bc.1 +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: specific @Transitive.WithSelf.TakesC(constants.%Self.744) { +// CHECK:STDOUT: %Self => constants.%Self.744 +// CHECK:STDOUT: %Self.as_type => constants.%Self.as_type.56c +// CHECK:STDOUT: %pattern_type.1 => constants.%pattern_type.68e728.1 +// CHECK:STDOUT: %self.param_patt => constants.%self.param_patt.e90fff.1 +// CHECK:STDOUT: %self.patt => constants.%self.patt.d2dab3.1 +// CHECK:STDOUT: %Transitive.lookup_impl_witness => constants.%Transitive.lookup_impl_witness.ab0b8d.1 +// CHECK:STDOUT: %impl.elem2 => constants.%impl.elem2.279493.1 +// CHECK:STDOUT: %as_type => constants.%as_type.b2aa43.1 +// CHECK:STDOUT: %pattern_type.2 => constants.%pattern_type.d96 +// CHECK:STDOUT: %c.param_patt => constants.%c.param_patt +// CHECK:STDOUT: %c.patt => constants.%c.patt +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: specific @Transitive.WithSelf.GetA(constants.%Self.744) { +// CHECK:STDOUT: %Self => constants.%Self.744 +// CHECK:STDOUT: %Self.as_type => constants.%Self.as_type.56c +// CHECK:STDOUT: %pattern_type.1 => constants.%pattern_type.68e728.1 +// CHECK:STDOUT: %self.param_patt => constants.%self.param_patt.e90fff.1 +// CHECK:STDOUT: %self.patt => constants.%self.patt.d2dab3.1 +// CHECK:STDOUT: %Transitive.lookup_impl_witness => constants.%Transitive.lookup_impl_witness.ab0b8d.1 +// CHECK:STDOUT: %impl.elem0 => constants.%impl.elem0.8aa205.1 +// CHECK:STDOUT: %as_type => constants.%as_type.a0914b.1 +// CHECK:STDOUT: %.1 => constants.%.3ef823.1 +// CHECK:STDOUT: %pattern_type.2 => constants.%pattern_type.77f685.1 +// CHECK:STDOUT: %return.param_patt => constants.%return.param_patt.11f0b9.1 +// CHECK:STDOUT: %return.patt => constants.%return.patt.87a9a6.1 +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: specific @F(constants.%T) { +// CHECK:STDOUT: %T.patt.loc5_7.2 => constants.%T.patt +// CHECK:STDOUT: %T.loc5_7.1 => constants.%T +// CHECK:STDOUT: %T.as_type.loc5_25.1 => constants.%T.as_type +// CHECK:STDOUT: %pattern_type.loc5 => constants.%pattern_type.68e728.2 +// CHECK:STDOUT: %t.param_patt.loc5_23.2 => constants.%t.param_patt +// CHECK:STDOUT: %t.patt.loc5_23.2 => constants.%t.patt +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: specific @Transitive.WithSelf(constants.%T) { +// CHECK:STDOUT: !definition: +// CHECK:STDOUT: %Self => constants.%T +// CHECK:STDOUT: %Transitive.lookup_impl_witness => constants.%Transitive.lookup_impl_witness.ab0b8d.2 +// CHECK:STDOUT: %impl.elem0 => constants.%impl.elem0.8aa205.2 +// CHECK:STDOUT: %impl.elem1 => constants.%impl.elem1.1413d6.2 +// CHECK:STDOUT: %Transitive.WithSelf.GetA.type => constants.%Transitive.WithSelf.GetA.type.0b3c58.2 +// CHECK:STDOUT: %Transitive.WithSelf.GetA => constants.%Transitive.WithSelf.GetA.e3e09c.2 +// CHECK:STDOUT: %Transitive.WithSelf.TakesC.type => constants.%Transitive.WithSelf.TakesC.type.d86d9f.2 +// CHECK:STDOUT: %Transitive.WithSelf.TakesC => constants.%Transitive.WithSelf.TakesC.f276cd.2 +// CHECK:STDOUT: %as_type.1 => constants.%as_type.f86e2d.2 +// CHECK:STDOUT: %as_type.2 => constants.%as_type.a0914b.2 +// CHECK:STDOUT: %eq.1 => constants.%eq.20ba2e.2 +// CHECK:STDOUT: %impl.elem2 => constants.%impl.elem2.279493.2 +// CHECK:STDOUT: %as_type.3 => constants.%as_type.b2aa43.2 +// CHECK:STDOUT: %eq.2 => constants.%eq.be77bc.2 +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: specific @Transitive.WithSelf.GetA(constants.%T) { +// CHECK:STDOUT: %Self => constants.%T +// CHECK:STDOUT: %Self.as_type => constants.%T.as_type +// CHECK:STDOUT: %pattern_type.1 => constants.%pattern_type.68e728.2 +// CHECK:STDOUT: %self.param_patt => constants.%self.param_patt.e90fff.2 +// CHECK:STDOUT: %self.patt => constants.%self.patt.d2dab3.2 +// CHECK:STDOUT: %Transitive.lookup_impl_witness => constants.%Transitive.lookup_impl_witness.ab0b8d.2 +// CHECK:STDOUT: %impl.elem0 => constants.%impl.elem0.8aa205.2 +// CHECK:STDOUT: %as_type => constants.%as_type.a0914b.2 +// CHECK:STDOUT: %.1 => constants.%.3ef823.2 +// CHECK:STDOUT: %pattern_type.2 => constants.%pattern_type.77f685.2 +// CHECK:STDOUT: %return.param_patt => constants.%return.param_patt.11f0b9.2 +// CHECK:STDOUT: %return.patt => constants.%return.patt.87a9a6.2 +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: specific @Q.WithSelf(constants.%impl.elem1.1413d6.2) { +// CHECK:STDOUT: !definition: +// CHECK:STDOUT: %Self => constants.%impl.elem1.1413d6.2 +// CHECK:STDOUT: %Q.WithSelf.InQ.type => constants.%Q.WithSelf.InQ.type.c89 +// CHECK:STDOUT: %Q.WithSelf.InQ => constants.%Q.WithSelf.InQ.aef +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: specific @Q.WithSelf(constants.%Q.facet) { +// CHECK:STDOUT: !definition: +// CHECK:STDOUT: %Self => constants.%Q.facet +// CHECK:STDOUT: %Q.WithSelf.InQ.type => constants.%Q.WithSelf.InQ.type.0c5 +// CHECK:STDOUT: %Q.WithSelf.InQ => constants.%Q.WithSelf.InQ.9e5 +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: specific @Q.WithSelf.InQ(constants.%Q.facet) { +// CHECK:STDOUT: %Self => constants.%Q.facet +// CHECK:STDOUT: %Self.as_type => constants.%as_type.f86e2d.2 +// CHECK:STDOUT: %pattern_type => constants.%pattern_type.86a +// CHECK:STDOUT: %self.param_patt => constants.%self.param_patt.321 +// CHECK:STDOUT: %self.patt => constants.%self.patt.7e6 +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: specific @R.WithSelf(constants.%impl.elem2.279493.2) { +// CHECK:STDOUT: !definition: +// CHECK:STDOUT: %Self => constants.%impl.elem2.279493.2 +// CHECK:STDOUT: %R.WithSelf.InR.type => constants.%R.WithSelf.InR.type.a87 +// CHECK:STDOUT: %R.WithSelf.InR => constants.%R.WithSelf.InR.704 +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: specific @R.WithSelf(constants.%R.facet) { +// CHECK:STDOUT: !definition: +// CHECK:STDOUT: %Self => constants.%R.facet +// CHECK:STDOUT: %R.WithSelf.InR.type => constants.%R.WithSelf.InR.type.56d +// CHECK:STDOUT: %R.WithSelf.InR => constants.%R.WithSelf.InR.9a8 +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: --- fail_todo_impls.carbon +// CHECK:STDOUT: +// CHECK:STDOUT: constants { +// CHECK:STDOUT: %A.type: type = facet_type <@A> [concrete] +// CHECK:STDOUT: %Self.d0c: %A.type = symbolic_binding Self, 0 [symbolic] +// CHECK:STDOUT: %B.type: type = facet_type <@B> [concrete] +// CHECK:STDOUT: %Self.b45: %B.type = symbolic_binding Self, 0 [symbolic] +// CHECK:STDOUT: %Self.as_type.e8c: type = facet_access_type %Self.b45 [symbolic] +// CHECK:STDOUT: %C.type: type = facet_type <@C> [concrete] +// CHECK:STDOUT: %Self.62a: %C.type = symbolic_binding Self, 0 [symbolic] +// CHECK:STDOUT: %Self.as_type.187: type = facet_access_type %Self.62a [symbolic] +// CHECK:STDOUT: %type: type = facet_type [concrete] +// CHECK:STDOUT: %.Self: %type = symbolic_binding .Self [symbolic_self] +// CHECK:STDOUT: %pattern_type.029: type = pattern_type %A.type [concrete] +// CHECK:STDOUT: %T.patt.a4b: %pattern_type.029 = symbolic_binding_pattern T, 0 [symbolic] +// CHECK:STDOUT: %T.626: %A.type = symbolic_binding T, 0 [symbolic] +// CHECK:STDOUT: %T.as_type.3b8: type = facet_access_type %T.626 [symbolic] +// CHECK:STDOUT: %pattern_type.a0e: type = pattern_type %T.as_type.3b8 [symbolic] +// CHECK:STDOUT: %x.param_patt.241: %pattern_type.a0e = value_param_pattern [symbolic] +// CHECK:STDOUT: %x.patt.19b: %pattern_type.a0e = at_binding_pattern x, %x.param_patt.241 [symbolic] +// CHECK:STDOUT: %RequiresA.type: type = fn_type @RequiresA [concrete] +// CHECK:STDOUT: %RequiresA: %RequiresA.type = struct_value () [concrete] +// CHECK:STDOUT: %require_complete.94f: = require_complete_type %T.as_type.3b8 [symbolic] +// CHECK:STDOUT: %pattern_type.647: type = pattern_type %C.type [concrete] +// CHECK:STDOUT: %T.patt.ece: %pattern_type.647 = symbolic_binding_pattern T, 0 [symbolic] +// CHECK:STDOUT: %T.659: %C.type = symbolic_binding T, 0 [symbolic] +// CHECK:STDOUT: %T.as_type.c69: type = facet_access_type %T.659 [symbolic] +// CHECK:STDOUT: %pattern_type.df0: type = pattern_type %T.as_type.c69 [symbolic] +// CHECK:STDOUT: %x.param_patt.948: %pattern_type.df0 = value_param_pattern [symbolic] +// CHECK:STDOUT: %x.patt.f9a: %pattern_type.df0 = at_binding_pattern x, %x.param_patt.948 [symbolic] +// CHECK:STDOUT: %F.type: type = fn_type @F [concrete] +// CHECK:STDOUT: %F: %F.type = struct_value () [concrete] +// CHECK:STDOUT: %require_complete.8a2: = require_complete_type %T.as_type.c69 [symbolic] +// CHECK:STDOUT: %impls = observe_impls %T.659, %B.type [symbolic] +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: imports { +// CHECK:STDOUT: %Core: = namespace file.%Core.import, [concrete] { +// CHECK:STDOUT: import Core//prelude +// CHECK:STDOUT: import Core//prelude/... +// CHECK:STDOUT: } +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: file { +// CHECK:STDOUT: package: = namespace [concrete] { +// CHECK:STDOUT: .Core = imports.%Core +// CHECK:STDOUT: .A = %A.decl +// CHECK:STDOUT: .B = %B.decl +// CHECK:STDOUT: .C = %C.decl +// CHECK:STDOUT: .RequiresA = %RequiresA.decl +// CHECK:STDOUT: .F = %F.decl +// CHECK:STDOUT: } +// CHECK:STDOUT: %Core.import = import Core +// CHECK:STDOUT: %A.decl: type = interface_decl @A [concrete = constants.%A.type] {} {} +// CHECK:STDOUT: %B.decl: type = interface_decl @B [concrete = constants.%B.type] {} {} +// CHECK:STDOUT: %C.decl: type = interface_decl @C [concrete = constants.%C.type] {} {} +// CHECK:STDOUT: %RequiresA.decl: %RequiresA.type = fn_decl @RequiresA [concrete = constants.%RequiresA] { +// CHECK:STDOUT: %T.patt.loc7_15.1: %pattern_type.029 = symbolic_binding_pattern T, 0 [symbolic = %T.patt.loc7_15.2 (constants.%T.patt.a4b)] +// CHECK:STDOUT: %x.param_patt.loc7_29.1: @RequiresA.%pattern_type (%pattern_type.a0e) = value_param_pattern [symbolic = %x.param_patt.loc7_29.2 (constants.%x.param_patt.241)] +// CHECK:STDOUT: %x.patt.loc7_29.1: @RequiresA.%pattern_type (%pattern_type.a0e) = at_binding_pattern x, %x.param_patt.loc7_29.1 [symbolic = %x.patt.loc7_29.2 (constants.%x.patt.19b)] +// CHECK:STDOUT: } { +// CHECK:STDOUT: %.loc7_18: type = splice_block %A.ref [concrete = constants.%A.type] { +// CHECK:STDOUT: %.Self: %type = symbolic_binding .Self [symbolic_self = constants.%.Self] +// CHECK:STDOUT: %A.ref: type = name_ref A, file.%A.decl [concrete = constants.%A.type] +// CHECK:STDOUT: } +// CHECK:STDOUT: %T.loc7_15.2: %A.type = symbolic_binding T, 0 [symbolic = %T.loc7_15.1 (constants.%T.626)] +// CHECK:STDOUT: %x.param: @RequiresA.%T.as_type.loc7_31.1 (%T.as_type.3b8) = value_param call_param0 +// CHECK:STDOUT: %.loc7_31.1: type = splice_block %.loc7_31.2 [symbolic = %T.as_type.loc7_31.1 (constants.%T.as_type.3b8)] { +// CHECK:STDOUT: %T.ref: %A.type = name_ref T, %T.loc7_15.2 [symbolic = %T.loc7_15.1 (constants.%T.626)] +// CHECK:STDOUT: %T.as_type.loc7_31.2: type = facet_access_type %T.ref [symbolic = %T.as_type.loc7_31.1 (constants.%T.as_type.3b8)] +// CHECK:STDOUT: %.loc7_31.2: type = converted %T.ref, %T.as_type.loc7_31.2 [symbolic = %T.as_type.loc7_31.1 (constants.%T.as_type.3b8)] +// CHECK:STDOUT: } +// CHECK:STDOUT: %x: @RequiresA.%T.as_type.loc7_31.1 (%T.as_type.3b8) = wrapper_binding x, %x.param +// CHECK:STDOUT: } +// CHECK:STDOUT: %F.decl: %F.type = fn_decl @F [concrete = constants.%F] { +// CHECK:STDOUT: %T.patt.loc8_7.1: %pattern_type.647 = symbolic_binding_pattern T, 0 [symbolic = %T.patt.loc8_7.2 (constants.%T.patt.ece)] +// CHECK:STDOUT: %x.param_patt.loc8_14.1: @F.%pattern_type (%pattern_type.df0) = value_param_pattern [symbolic = %x.param_patt.loc8_14.2 (constants.%x.param_patt.948)] +// CHECK:STDOUT: %x.patt.loc8_14.1: @F.%pattern_type (%pattern_type.df0) = at_binding_pattern x, %x.param_patt.loc8_14.1 [symbolic = %x.patt.loc8_14.2 (constants.%x.patt.f9a)] +// CHECK:STDOUT: } { +// CHECK:STDOUT: %.loc8_10: type = splice_block %C.ref [concrete = constants.%C.type] { +// CHECK:STDOUT: %.Self: %type = symbolic_binding .Self [symbolic_self = constants.%.Self] +// CHECK:STDOUT: %C.ref: type = name_ref C, file.%C.decl [concrete = constants.%C.type] +// CHECK:STDOUT: } +// CHECK:STDOUT: %T.loc8_7.2: %C.type = symbolic_binding T, 0 [symbolic = %T.loc8_7.1 (constants.%T.659)] +// CHECK:STDOUT: %x.param: @F.%T.as_type.loc8_16.1 (%T.as_type.c69) = value_param call_param0 +// CHECK:STDOUT: %.loc8_16.1: type = splice_block %.loc8_16.2 [symbolic = %T.as_type.loc8_16.1 (constants.%T.as_type.c69)] { +// CHECK:STDOUT: %T.ref.loc8: %C.type = name_ref T, %T.loc8_7.2 [symbolic = %T.loc8_7.1 (constants.%T.659)] +// CHECK:STDOUT: %T.as_type.loc8_16.2: type = facet_access_type %T.ref.loc8 [symbolic = %T.as_type.loc8_16.1 (constants.%T.as_type.c69)] +// CHECK:STDOUT: %.loc8_16.2: type = converted %T.ref.loc8, %T.as_type.loc8_16.2 [symbolic = %T.as_type.loc8_16.1 (constants.%T.as_type.c69)] +// CHECK:STDOUT: } +// CHECK:STDOUT: %x: @F.%T.as_type.loc8_16.1 (%T.as_type.c69) = wrapper_binding x, %x.param +// CHECK:STDOUT: } +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: interface @A { +// CHECK:STDOUT: %Self: %A.type = symbolic_binding Self, 0 [symbolic = constants.%Self.d0c] +// CHECK:STDOUT: %A.WithSelf.decl = interface_with_self_decl @A [concrete] +// CHECK:STDOUT: +// CHECK:STDOUT: !members: +// CHECK:STDOUT: .Self = %Self +// CHECK:STDOUT: witness = () +// CHECK:STDOUT: +// CHECK:STDOUT: !requires: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: interface @B { +// CHECK:STDOUT: %Self: %B.type = symbolic_binding Self, 0 [symbolic = constants.%Self.b45] +// CHECK:STDOUT: %B.WithSelf.decl = interface_with_self_decl @B [concrete] +// CHECK:STDOUT: +// CHECK:STDOUT: !with Self: +// CHECK:STDOUT: %B.WithSelf.Self.as_type.impls.A.type.require.decl = require_decl @B.WithSelf.Self.as_type.impls.A.type.require [concrete] { +// CHECK:STDOUT: require %Self.as_type.loc4_23.1 impls %A.ref +// CHECK:STDOUT: } { +// CHECK:STDOUT: %Self.as_type.loc4_23.1: type = facet_access_type @B.%Self [symbolic = %Self.as_type.loc4_23.2 (constants.%Self.as_type.e8c)] +// CHECK:STDOUT: %A.ref: type = name_ref A, file.%A.decl [concrete = constants.%A.type] +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: !members: +// CHECK:STDOUT: .Self = %Self +// CHECK:STDOUT: .A = +// CHECK:STDOUT: .A = +// CHECK:STDOUT: witness = () +// CHECK:STDOUT: +// CHECK:STDOUT: !requires: +// CHECK:STDOUT: @B.WithSelf.Self.as_type.impls.A.type.require { +// CHECK:STDOUT: require @B.WithSelf.Self.as_type.impls.A.type.require.%Self.as_type.loc4_23.1 impls @B.WithSelf.Self.as_type.impls.A.type.require.%A.ref +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: interface @C { +// CHECK:STDOUT: %Self: %C.type = symbolic_binding Self, 0 [symbolic = constants.%Self.62a] +// CHECK:STDOUT: %C.WithSelf.decl = interface_with_self_decl @C [concrete] +// CHECK:STDOUT: +// CHECK:STDOUT: !with Self: +// CHECK:STDOUT: %C.WithSelf.Self.as_type.impls.B.type.require.decl = require_decl @C.WithSelf.Self.as_type.impls.B.type.require [concrete] { +// CHECK:STDOUT: require %Self.as_type.loc5_23.1 impls %B.ref +// CHECK:STDOUT: } { +// CHECK:STDOUT: %Self.as_type.loc5_23.1: type = facet_access_type @C.%Self [symbolic = %Self.as_type.loc5_23.2 (constants.%Self.as_type.187)] +// CHECK:STDOUT: %B.ref: type = name_ref B, file.%B.decl [concrete = constants.%B.type] +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: !members: +// CHECK:STDOUT: .Self = %Self +// CHECK:STDOUT: .B = +// CHECK:STDOUT: .B = +// CHECK:STDOUT: witness = () +// CHECK:STDOUT: +// CHECK:STDOUT: !requires: +// CHECK:STDOUT: @C.WithSelf.Self.as_type.impls.B.type.require { +// CHECK:STDOUT: require @C.WithSelf.Self.as_type.impls.B.type.require.%Self.as_type.loc5_23.1 impls @C.WithSelf.Self.as_type.impls.B.type.require.%B.ref +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: generic require @B.WithSelf.Self.as_type.impls.A.type.require(@B.%Self: %B.type) { +// CHECK:STDOUT: %Self: %B.type = symbolic_binding Self, 0 [symbolic = %Self (constants.%Self.b45)] +// CHECK:STDOUT: %Self.as_type.loc4_23.2: type = facet_access_type %Self [symbolic = %Self.as_type.loc4_23.2 (constants.%Self.as_type.e8c)] +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: generic require @C.WithSelf.Self.as_type.impls.B.type.require(@C.%Self: %C.type) { +// CHECK:STDOUT: %Self: %C.type = symbolic_binding Self, 0 [symbolic = %Self (constants.%Self.62a)] +// CHECK:STDOUT: %Self.as_type.loc5_23.2: type = facet_access_type %Self [symbolic = %Self.as_type.loc5_23.2 (constants.%Self.as_type.187)] +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: generic fn @RequiresA(%T.loc7_15.2: %A.type) { +// CHECK:STDOUT: %T.patt.loc7_15.2: %pattern_type.029 = symbolic_binding_pattern T, 0 [symbolic = %T.patt.loc7_15.2 (constants.%T.patt.a4b)] +// CHECK:STDOUT: %T.loc7_15.1: %A.type = symbolic_binding T, 0 [symbolic = %T.loc7_15.1 (constants.%T.626)] +// CHECK:STDOUT: %T.as_type.loc7_31.1: type = facet_access_type %T.loc7_15.1 [symbolic = %T.as_type.loc7_31.1 (constants.%T.as_type.3b8)] +// CHECK:STDOUT: %pattern_type: type = pattern_type %T.as_type.loc7_31.1 [symbolic = %pattern_type (constants.%pattern_type.a0e)] +// CHECK:STDOUT: %x.param_patt.loc7_29.2: @RequiresA.%pattern_type (%pattern_type.a0e) = value_param_pattern [symbolic = %x.param_patt.loc7_29.2 (constants.%x.param_patt.241)] +// CHECK:STDOUT: %x.patt.loc7_29.2: @RequiresA.%pattern_type (%pattern_type.a0e) = at_binding_pattern x, %x.param_patt.loc7_29.2 [symbolic = %x.patt.loc7_29.2 (constants.%x.patt.19b)] +// CHECK:STDOUT: +// CHECK:STDOUT: !definition: +// CHECK:STDOUT: %require_complete: = require_complete_type %T.as_type.loc7_31.1 [symbolic = %require_complete (constants.%require_complete.94f)] +// CHECK:STDOUT: +// CHECK:STDOUT: fn(%x.param: @RequiresA.%T.as_type.loc7_31.1 (%T.as_type.3b8)) { +// CHECK:STDOUT: !entry: +// CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: +// CHECK:STDOUT: } +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: generic fn @F(%T.loc8_7.2: %C.type) { +// CHECK:STDOUT: %T.patt.loc8_7.2: %pattern_type.647 = symbolic_binding_pattern T, 0 [symbolic = %T.patt.loc8_7.2 (constants.%T.patt.ece)] +// CHECK:STDOUT: %T.loc8_7.1: %C.type = symbolic_binding T, 0 [symbolic = %T.loc8_7.1 (constants.%T.659)] +// CHECK:STDOUT: %T.as_type.loc8_16.1: type = facet_access_type %T.loc8_7.1 [symbolic = %T.as_type.loc8_16.1 (constants.%T.as_type.c69)] +// CHECK:STDOUT: %pattern_type: type = pattern_type %T.as_type.loc8_16.1 [symbolic = %pattern_type (constants.%pattern_type.df0)] +// CHECK:STDOUT: %x.param_patt.loc8_14.2: @F.%pattern_type (%pattern_type.df0) = value_param_pattern [symbolic = %x.param_patt.loc8_14.2 (constants.%x.param_patt.948)] +// CHECK:STDOUT: %x.patt.loc8_14.2: @F.%pattern_type (%pattern_type.df0) = at_binding_pattern x, %x.param_patt.loc8_14.2 [symbolic = %x.patt.loc8_14.2 (constants.%x.patt.f9a)] +// CHECK:STDOUT: +// CHECK:STDOUT: !definition: +// CHECK:STDOUT: %require_complete: = require_complete_type %T.as_type.loc8_16.1 [symbolic = %require_complete (constants.%require_complete.8a2)] +// CHECK:STDOUT: %impls = observe_impls %T.loc8_7.1, constants.%B.type [symbolic = %impls (constants.%impls)] +// CHECK:STDOUT: +// CHECK:STDOUT: fn(%x.param: @F.%T.as_type.loc8_16.1 (%T.as_type.c69)) { +// CHECK:STDOUT: !entry: +// CHECK:STDOUT: %T.ref.loc9: %C.type = name_ref T, %T.loc8_7.2 [symbolic = %T.loc8_7.1 (constants.%T.659)] +// CHECK:STDOUT: %B.ref: type = name_ref B, file.%B.decl [concrete = constants.%B.type] +// CHECK:STDOUT: %T.as_type.loc9: type = facet_access_type %T.ref.loc9 [symbolic = %T.as_type.loc8_16.1 (constants.%T.as_type.c69)] +// CHECK:STDOUT: %.loc9: type = converted %T.ref.loc9, %T.as_type.loc9 [symbolic = %T.as_type.loc8_16.1 (constants.%T.as_type.c69)] +// CHECK:STDOUT: %F.observe.decl = observe_decl @F.observe [concrete] +// CHECK:STDOUT: %RequiresA.ref: %RequiresA.type = name_ref RequiresA, file.%RequiresA.decl [concrete = constants.%RequiresA] +// CHECK:STDOUT: %x.ref: @F.%T.as_type.loc8_16.1 (%T.as_type.c69) = name_ref x, %x +// CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: +// CHECK:STDOUT: @F.observe { +// CHECK:STDOUT: observe constants.%T.659 impls constants.%B.type +// CHECK:STDOUT: } +// CHECK:STDOUT: } +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: specific @A.WithSelf(constants.%Self.d0c) { +// CHECK:STDOUT: !definition: +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: specific @B.WithSelf(constants.%Self.b45) {} +// CHECK:STDOUT: +// CHECK:STDOUT: specific @B.WithSelf.Self.as_type.impls.A.type.require(constants.%Self.b45) { +// CHECK:STDOUT: %Self => constants.%Self.b45 +// CHECK:STDOUT: %Self.as_type.loc4_23.2 => constants.%Self.as_type.e8c +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: specific @C.WithSelf(constants.%Self.62a) { +// CHECK:STDOUT: !definition: +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: specific @C.WithSelf.Self.as_type.impls.B.type.require(constants.%Self.62a) { +// CHECK:STDOUT: %Self => constants.%Self.62a +// CHECK:STDOUT: %Self.as_type.loc5_23.2 => constants.%Self.as_type.187 +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: specific @RequiresA(constants.%T.626) { +// CHECK:STDOUT: %T.patt.loc7_15.2 => constants.%T.patt.a4b +// CHECK:STDOUT: %T.loc7_15.1 => constants.%T.626 +// CHECK:STDOUT: %T.as_type.loc7_31.1 => constants.%T.as_type.3b8 +// CHECK:STDOUT: %pattern_type => constants.%pattern_type.a0e +// CHECK:STDOUT: %x.param_patt.loc7_29.2 => constants.%x.param_patt.241 +// CHECK:STDOUT: %x.patt.loc7_29.2 => constants.%x.patt.19b +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: specific @F(constants.%T.659) { +// CHECK:STDOUT: %T.patt.loc8_7.2 => constants.%T.patt.ece +// CHECK:STDOUT: %T.loc8_7.1 => constants.%T.659 +// CHECK:STDOUT: %T.as_type.loc8_16.1 => constants.%T.as_type.c69 +// CHECK:STDOUT: %pattern_type => constants.%pattern_type.df0 +// CHECK:STDOUT: %x.param_patt.loc8_14.2 => constants.%x.param_patt.948 +// CHECK:STDOUT: %x.patt.loc8_14.2 => constants.%x.patt.f9a +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: --- fail_todo_equivalent_impls.carbon +// CHECK:STDOUT: +// CHECK:STDOUT: constants { +// CHECK:STDOUT: %type: type = facet_type [concrete] +// CHECK:STDOUT: %.Self: %type = symbolic_binding .Self [symbolic_self] +// CHECK:STDOUT: %P.type: type = facet_type <@P> [concrete] +// CHECK:STDOUT: %Self.104: %P.type = symbolic_binding Self, 0 [symbolic] +// CHECK:STDOUT: %P.WithSelf.InP.type: type = fn_type @P.WithSelf.InP, @P.WithSelf(%Self.104) [symbolic] +// CHECK:STDOUT: %P.WithSelf.InP: %P.WithSelf.InP.type = struct_value () [symbolic] +// CHECK:STDOUT: %Self.as_type.cc3: type = facet_access_type %Self.104 [symbolic] +// CHECK:STDOUT: %pattern_type.3ef: type = pattern_type %Self.as_type.cc3 [symbolic] +// CHECK:STDOUT: %self.param_patt.88d: %pattern_type.3ef = value_param_pattern [symbolic] +// CHECK:STDOUT: %self.patt.6de: %pattern_type.3ef = at_binding_pattern self, %self.param_patt.88d [symbolic] +// CHECK:STDOUT: %Q.type: type = facet_type <@Q> [concrete] +// CHECK:STDOUT: %Self.afd: %Q.type = symbolic_binding Self, 0 [symbolic] +// CHECK:STDOUT: %Q.WithSelf.InQ.type: type = fn_type @Q.WithSelf.InQ, @Q.WithSelf(%Self.afd) [symbolic] +// CHECK:STDOUT: %Q.WithSelf.InQ: %Q.WithSelf.InQ.type = struct_value () [symbolic] +// CHECK:STDOUT: %Self.as_type.430: type = facet_access_type %Self.afd [symbolic] +// CHECK:STDOUT: %pattern_type.ade: type = pattern_type %Self.as_type.430 [symbolic] +// CHECK:STDOUT: %self.param_patt.271: %pattern_type.ade = value_param_pattern [symbolic] +// CHECK:STDOUT: %self.patt.b5e: %pattern_type.ade = at_binding_pattern self, %self.param_patt.271 [symbolic] +// CHECK:STDOUT: %BitAndWith.type.a06: type = generic_interface_type @BitAndWith [concrete] +// CHECK:STDOUT: %empty_tuple.type: type = tuple_type () [concrete] +// CHECK:STDOUT: %BitAndWith.generic: %BitAndWith.type.a06 = struct_value () [concrete] +// CHECK:STDOUT: %BitAndWith.type.802: type = facet_type <@BitAndWith, @BitAndWith(type)> [concrete] +// CHECK:STDOUT: %BitAndWith.impl_witness: = impl_witness imports.%BitAndWith.impl_witness_table [concrete] +// CHECK:STDOUT: %BitAndWith.facet: %BitAndWith.type.802 = facet_value type, (%BitAndWith.impl_witness) [concrete] +// CHECK:STDOUT: %BitAndWith.WithSelf.Op.type.38f: type = fn_type @BitAndWith.WithSelf.Op, @BitAndWith.WithSelf(type, %BitAndWith.facet) [concrete] +// CHECK:STDOUT: %.d56: type = fn_type_with_self_type %BitAndWith.WithSelf.Op.type.38f, %BitAndWith.facet [concrete] +// CHECK:STDOUT: %type.as.BitAndWith.impl.Op.type: type = fn_type @type.as.BitAndWith.impl.Op [concrete] +// CHECK:STDOUT: %type.as.BitAndWith.impl.Op: %type.as.BitAndWith.impl.Op.type = struct_value () [concrete] +// CHECK:STDOUT: %type.as.BitAndWith.impl.Op.bound.dd7: = bound_method %P.type, %type.as.BitAndWith.impl.Op [concrete] +// CHECK:STDOUT: %facet_type.bc0: type = facet_type <@P & @Q> [concrete] +// CHECK:STDOUT: %R.type: type = facet_type <@R> [concrete] +// CHECK:STDOUT: %Self.be6: %R.type = symbolic_binding Self, 0 [symbolic] +// CHECK:STDOUT: %R.WithSelf.InR.type: type = fn_type @R.WithSelf.InR, @R.WithSelf(%Self.be6) [symbolic] +// CHECK:STDOUT: %R.WithSelf.InR: %R.WithSelf.InR.type = struct_value () [symbolic] +// CHECK:STDOUT: %Self.as_type.b02: type = facet_access_type %Self.be6 [symbolic] +// CHECK:STDOUT: %pattern_type.60e: type = pattern_type %Self.as_type.b02 [symbolic] +// CHECK:STDOUT: %self.param_patt.640: %pattern_type.60e = value_param_pattern [symbolic] +// CHECK:STDOUT: %self.patt.894: %pattern_type.60e = at_binding_pattern self, %self.param_patt.640 [symbolic] +// CHECK:STDOUT: %type.as.BitAndWith.impl.Op.bound.588: = bound_method %facet_type.bc0, %type.as.BitAndWith.impl.Op [concrete] +// CHECK:STDOUT: %facet_type.0b6: type = facet_type <@P & @Q & @R> [concrete] +// CHECK:STDOUT: %pattern_type.075: type = pattern_type %facet_type.0b6 [concrete] +// CHECK:STDOUT: %U.patt: %pattern_type.075 = symbolic_binding_pattern U, 0 [symbolic] +// CHECK:STDOUT: %U: %facet_type.0b6 = symbolic_binding U, 0 [symbolic] +// CHECK:STDOUT: %U.as_type: type = facet_access_type %U [symbolic] +// CHECK:STDOUT: %pattern_type.54d: type = pattern_type %U.as_type [symbolic] +// CHECK:STDOUT: %u.param_patt: %pattern_type.54d = value_param_pattern [symbolic] +// CHECK:STDOUT: %u.patt: %pattern_type.54d = at_binding_pattern u, %u.param_patt [symbolic] +// CHECK:STDOUT: %TakesPQR.type: type = fn_type @TakesPQR [concrete] +// CHECK:STDOUT: %TakesPQR: %TakesPQR.type = struct_value () [concrete] +// CHECK:STDOUT: %require_complete.192: = require_complete_type %U.as_type [symbolic] +// CHECK:STDOUT: %Transitive.type: type = facet_type <@Transitive> [concrete] +// CHECK:STDOUT: %Self.744: %Transitive.type = symbolic_binding Self, 0 [symbolic] +// CHECK:STDOUT: %Transitive.lookup_impl_witness.ab0b8d.1: = lookup_impl_witness %Self.744, @Transitive [symbolic] +// CHECK:STDOUT: %Destroy.type: type = facet_type <@Destroy> [concrete] +// CHECK:STDOUT: %facet_type.4c8: type = facet_type <@R & @Destroy where TODO> [concrete] +// CHECK:STDOUT: %impl.elem2.731f97.1: %facet_type.4c8 = impl_witness_access %Transitive.lookup_impl_witness.ab0b8d.1, element2 [symbolic] +// CHECK:STDOUT: %facet_type.130: type = facet_type <@Q & @Destroy where TODO> [concrete] +// CHECK:STDOUT: %impl.elem1.6be46c.1: %facet_type.130 = impl_witness_access %Transitive.lookup_impl_witness.ab0b8d.1, element1 [symbolic] +// CHECK:STDOUT: %eq.033b19.1 = observe_equivalent %impl.elem1.6be46c.1, %impl.elem2.731f97.1 [symbolic] +// CHECK:STDOUT: %as_type.2fadd6.1: type = facet_access_type %impl.elem2.731f97.1 [symbolic] +// CHECK:STDOUT: %facet_type.b1b: type = facet_type <@P & @Destroy> [concrete] +// CHECK:STDOUT: %impl.elem0.0439e7.1: %facet_type.b1b = impl_witness_access %Transitive.lookup_impl_witness.ab0b8d.1, element0 [symbolic] +// CHECK:STDOUT: %eq.4be6e4.1 = observe_equivalent %impl.elem0.0439e7.1, %impl.elem1.6be46c.1 [symbolic] +// CHECK:STDOUT: %as_type.6a024f.1: type = facet_access_type %impl.elem0.0439e7.1 [symbolic] +// CHECK:STDOUT: %as_type.dca436.1: type = facet_access_type %impl.elem1.6be46c.1 [symbolic] +// CHECK:STDOUT: %Transitive.WithSelf.TakesC.type.d86d9f.1: type = fn_type @Transitive.WithSelf.TakesC, @Transitive.WithSelf(%Self.744) [symbolic] +// CHECK:STDOUT: %Transitive.WithSelf.TakesC.f276cd.1: %Transitive.WithSelf.TakesC.type.d86d9f.1 = struct_value () [symbolic] +// CHECK:STDOUT: %Self.as_type.56c: type = facet_access_type %Self.744 [symbolic] +// CHECK:STDOUT: %pattern_type.68e728.1: type = pattern_type %Self.as_type.56c [symbolic] +// CHECK:STDOUT: %self.param_patt.e90fff.1: %pattern_type.68e728.1 = value_param_pattern [symbolic] +// CHECK:STDOUT: %self.patt.d2dab3.1: %pattern_type.68e728.1 = at_binding_pattern self, %self.param_patt.e90fff.1 [symbolic] +// CHECK:STDOUT: %pattern_type.ac0: type = pattern_type %as_type.2fadd6.1 [symbolic] +// CHECK:STDOUT: %c.param_patt: %pattern_type.ac0 = value_param_pattern [symbolic] +// CHECK:STDOUT: %c.patt: %pattern_type.ac0 = at_binding_pattern c, %c.param_patt [symbolic] +// CHECK:STDOUT: %Transitive.WithSelf.GetA.type.0b3c58.1: type = fn_type @Transitive.WithSelf.GetA, @Transitive.WithSelf(%Self.744) [symbolic] +// CHECK:STDOUT: %Transitive.WithSelf.GetA.e3e09c.1: %Transitive.WithSelf.GetA.type.0b3c58.1 = struct_value () [symbolic] +// CHECK:STDOUT: %pattern_type.c73ac0.1: type = pattern_type %as_type.6a024f.1 [symbolic] +// CHECK:STDOUT: %return.param_patt.057e89.1: %pattern_type.c73ac0.1 = out_param_pattern [symbolic] +// CHECK:STDOUT: %return.patt.4e0711.1: %pattern_type.c73ac0.1 = return_slot_pattern %return.param_patt.057e89.1, invalid [symbolic] +// CHECK:STDOUT: %.2b1a45.1: Core.Form = init_form %as_type.6a024f.1 [symbolic] +// CHECK:STDOUT: %pattern_type.bd9: type = pattern_type %Transitive.type [concrete] +// CHECK:STDOUT: %T.patt: %pattern_type.bd9 = symbolic_binding_pattern T, 0 [symbolic] +// CHECK:STDOUT: %T: %Transitive.type = symbolic_binding T, 0 [symbolic] +// CHECK:STDOUT: %T.as_type: type = facet_access_type %T [symbolic] +// CHECK:STDOUT: %pattern_type.68e728.2: type = pattern_type %T.as_type [symbolic] +// CHECK:STDOUT: %t.param_patt: %pattern_type.68e728.2 = value_param_pattern [symbolic] +// CHECK:STDOUT: %t.patt: %pattern_type.68e728.2 = at_binding_pattern t, %t.param_patt [symbolic] +// CHECK:STDOUT: %G.type: type = fn_type @G [concrete] +// CHECK:STDOUT: %G: %G.type = struct_value () [concrete] +// CHECK:STDOUT: %require_complete.fbd: = require_complete_type %T.as_type [symbolic] +// CHECK:STDOUT: %Transitive.lookup_impl_witness.ab0b8d.2: = lookup_impl_witness %T, @Transitive [symbolic] +// CHECK:STDOUT: %impl.elem0.0439e7.2: %facet_type.b1b = impl_witness_access %Transitive.lookup_impl_witness.ab0b8d.2, element0 [symbolic] +// CHECK:STDOUT: %impl.elem1.6be46c.2: %facet_type.130 = impl_witness_access %Transitive.lookup_impl_witness.ab0b8d.2, element1 [symbolic] +// CHECK:STDOUT: %Transitive.WithSelf.GetA.type.0b3c58.2: type = fn_type @Transitive.WithSelf.GetA, @Transitive.WithSelf(%T) [symbolic] +// CHECK:STDOUT: %Transitive.WithSelf.GetA.e3e09c.2: %Transitive.WithSelf.GetA.type.0b3c58.2 = struct_value () [symbolic] +// CHECK:STDOUT: %Transitive.WithSelf.TakesC.type.d86d9f.2: type = fn_type @Transitive.WithSelf.TakesC, @Transitive.WithSelf(%T) [symbolic] +// CHECK:STDOUT: %Transitive.WithSelf.TakesC.f276cd.2: %Transitive.WithSelf.TakesC.type.d86d9f.2 = struct_value () [symbolic] +// CHECK:STDOUT: %as_type.dca436.2: type = facet_access_type %impl.elem1.6be46c.2 [symbolic] +// CHECK:STDOUT: %as_type.6a024f.2: type = facet_access_type %impl.elem0.0439e7.2 [symbolic] +// CHECK:STDOUT: %eq.4be6e4.2 = observe_equivalent %impl.elem0.0439e7.2, %impl.elem1.6be46c.2 [symbolic] +// CHECK:STDOUT: %impl.elem2.731f97.2: %facet_type.4c8 = impl_witness_access %Transitive.lookup_impl_witness.ab0b8d.2, element2 [symbolic] +// CHECK:STDOUT: %as_type.2fadd6.2: type = facet_access_type %impl.elem2.731f97.2 [symbolic] +// CHECK:STDOUT: %eq.033b19.2 = observe_equivalent %impl.elem1.6be46c.2, %impl.elem2.731f97.2 [symbolic] +// CHECK:STDOUT: %Transitive.assoc_type: type = assoc_entity_type @Transitive [concrete] +// CHECK:STDOUT: %assoc0.7cd: %Transitive.assoc_type = assoc_entity element0, imports.%Main.import_ref.d38 [concrete] +// CHECK:STDOUT: %require_complete.c2d: = require_complete_type %as_type.6a024f.2 [symbolic] +// CHECK:STDOUT: %pattern_type.c73ac0.2: type = pattern_type %as_type.6a024f.2 [symbolic] +// CHECK:STDOUT: %a.patt: %pattern_type.c73ac0.2 = ref_binding_pattern a [symbolic] +// CHECK:STDOUT: %a.var_patt: %pattern_type.c73ac0.2 = var_pattern %a.patt [symbolic] +// CHECK:STDOUT: %assoc3: %Transitive.assoc_type = assoc_entity element3, imports.%Main.import_ref.06c [concrete] +// CHECK:STDOUT: %.657: type = fn_type_with_self_type %Transitive.WithSelf.GetA.type.0b3c58.2, %T [symbolic] +// CHECK:STDOUT: %impl.elem3: %.657 = impl_witness_access %Transitive.lookup_impl_witness.ab0b8d.2, element3 [symbolic] +// CHECK:STDOUT: %self.param_patt.e90fff.2: %pattern_type.68e728.2 = value_param_pattern [symbolic] +// CHECK:STDOUT: %self.patt.d2dab3.2: %pattern_type.68e728.2 = at_binding_pattern self, %self.param_patt.e90fff.2 [symbolic] +// CHECK:STDOUT: %.2b1a45.2: Core.Form = init_form %as_type.6a024f.2 [symbolic] +// CHECK:STDOUT: %return.param_patt.057e89.2: %pattern_type.c73ac0.2 = out_param_pattern [symbolic] +// CHECK:STDOUT: %return.patt.4e0711.2: %pattern_type.c73ac0.2 = return_slot_pattern %return.param_patt.057e89.2, invalid [symbolic] +// CHECK:STDOUT: %specific_impl_fn.72f: = specific_impl_function %impl.elem3, @Transitive.WithSelf.GetA(%T) [symbolic] +// CHECK:STDOUT: %assoc1: %Transitive.assoc_type = assoc_entity element1, imports.%Main.import_ref.9f3 [concrete] +// CHECK:STDOUT: %impls.885 = observe_impls %impl.elem1.6be46c.2, %Q.type [symbolic] +// CHECK:STDOUT: %Q.assoc_type: type = assoc_entity_type @Q [concrete] +// CHECK:STDOUT: %assoc0.6a1: %Q.assoc_type = assoc_entity element0, imports.%Main.import_ref.636 [concrete] +// CHECK:STDOUT: %assoc2: %Transitive.assoc_type = assoc_entity element2, imports.%Main.import_ref.a5f [concrete] +// CHECK:STDOUT: %eq.fcd = observe_equivalent %impl.elem0.0439e7.2, %impl.elem2.731f97.2 [symbolic] +// CHECK:STDOUT: %impls.adc = observe_impls %impl.elem2.731f97.2, %R.type [symbolic] +// CHECK:STDOUT: %Destroy.lookup_impl_witness: = lookup_impl_witness %impl.elem0.0439e7.2, @Destroy [symbolic] +// CHECK:STDOUT: %Destroy.facet: %Destroy.type = facet_value %as_type.6a024f.2, (%Destroy.lookup_impl_witness) [symbolic] +// CHECK:STDOUT: %Destroy.WithSelf.Op.type.5e1: type = fn_type @Destroy.WithSelf.Op, @Destroy.WithSelf(%Destroy.facet) [symbolic] +// CHECK:STDOUT: %.e75: type = fn_type_with_self_type %Destroy.WithSelf.Op.type.5e1, %Destroy.facet [symbolic] +// CHECK:STDOUT: %impl.elem0.678: %.e75 = impl_witness_access %Destroy.lookup_impl_witness, element0 [symbolic] +// CHECK:STDOUT: %specific_impl_fn.e8e: = specific_impl_function %impl.elem0.678, @Destroy.WithSelf.Op(%Destroy.facet) [symbolic] +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: imports { +// CHECK:STDOUT: %Main.P: type = import_ref Main//transitive, P, loaded [concrete = constants.%P.type] +// CHECK:STDOUT: %Main.Q: type = import_ref Main//transitive, Q, loaded [concrete = constants.%Q.type] +// CHECK:STDOUT: %Main.R: type = import_ref Main//transitive, R, loaded [concrete = constants.%R.type] +// CHECK:STDOUT: %Main.Transitive: type = import_ref Main//transitive, Transitive, loaded [concrete = constants.%Transitive.type] +// CHECK:STDOUT: %Core.048aa3.1: = namespace file.%Core.import, [concrete] { +// CHECK:STDOUT: .BitAndWith = %Core.BitAndWith +// CHECK:STDOUT: .Destroy = %Core.Destroy +// CHECK:STDOUT: import Core//prelude +// CHECK:STDOUT: import Core//prelude/... +// CHECK:STDOUT: } +// CHECK:STDOUT: %Main.import_ref.fec = import_ref Main//transitive, loc3_27, unloaded +// CHECK:STDOUT: %Main.InP = import_ref Main//transitive, InP, unloaded +// CHECK:STDOUT: %Main.import_ref.aef2fa.2: %P.type = import_ref Main//transitive, loc3_13, loaded [symbolic = constants.%Self.104] +// CHECK:STDOUT: %Main.import_ref.96f = import_ref Main//transitive, loc3_13, unloaded +// CHECK:STDOUT: %Main.import_ref.e2a: %Q.assoc_type = import_ref Main//transitive, loc4_27, loaded [concrete = constants.%assoc0.6a1] +// CHECK:STDOUT: %Main.InQ = import_ref Main//transitive, InQ, unloaded +// CHECK:STDOUT: %Main.import_ref.c0a1f5.2: %Q.type = import_ref Main//transitive, loc4_13, loaded [symbolic = constants.%Self.afd] +// CHECK:STDOUT: %Main.import_ref.4f3 = import_ref Main//transitive, loc4_13, unloaded +// CHECK:STDOUT: %Core.BitAndWith: %BitAndWith.type.a06 = import_ref Core//prelude/parts/as, BitAndWith, loaded [concrete = constants.%BitAndWith.generic] +// CHECK:STDOUT: %Core.import_ref.9c3: %type.as.BitAndWith.impl.Op.type = import_ref Core//prelude/parts/as, loc{{\d+_\d+}}, loaded [concrete = constants.%type.as.BitAndWith.impl.Op] +// CHECK:STDOUT: %BitAndWith.impl_witness_table = impl_witness_table (%Core.import_ref.9c3), @type.as.BitAndWith.impl [concrete] +// CHECK:STDOUT: %Main.import_ref.0ce = import_ref Main//transitive, loc5_27, unloaded +// CHECK:STDOUT: %Main.InR = import_ref Main//transitive, InR, unloaded +// CHECK:STDOUT: %Main.import_ref.f6968b.2: %R.type = import_ref Main//transitive, loc5_13, loaded [symbolic = constants.%Self.be6] +// CHECK:STDOUT: %Main.import_ref.659 = import_ref Main//transitive, loc5_13, unloaded +// CHECK:STDOUT: %Main.import_ref.72c: %Transitive.assoc_type = import_ref Main//transitive, loc8_8, loaded [concrete = constants.%assoc0.7cd] +// CHECK:STDOUT: %Main.import_ref.e5e: %Transitive.assoc_type = import_ref Main//transitive, loc9_8, loaded [concrete = constants.%assoc1] +// CHECK:STDOUT: %Main.import_ref.c9c: %Transitive.assoc_type = import_ref Main//transitive, loc10_8, loaded [concrete = constants.%assoc2] +// CHECK:STDOUT: %Main.import_ref.5c5: %Transitive.assoc_type = import_ref Main//transitive, loc12_21, loaded [concrete = constants.%assoc3] +// CHECK:STDOUT: %Main.import_ref.ae2 = import_ref Main//transitive, loc13_24, unloaded +// CHECK:STDOUT: %Main.A = import_ref Main//transitive, A, unloaded +// CHECK:STDOUT: %Main.B = import_ref Main//transitive, B, unloaded +// CHECK:STDOUT: %Main.C = import_ref Main//transitive, C, unloaded +// CHECK:STDOUT: %Main.GetA = import_ref Main//transitive, GetA, unloaded +// CHECK:STDOUT: %Main.TakesC = import_ref Main//transitive, TakesC, unloaded +// CHECK:STDOUT: %Main.import_ref.df6636.2: %Transitive.type = import_ref Main//transitive, loc7_22, loaded [symbolic = constants.%Self.744] +// CHECK:STDOUT: %Main.import_ref.df6636.3: %Transitive.type = import_ref Main//transitive, loc7_22, loaded [symbolic = constants.%Self.744] +// CHECK:STDOUT: %Main.import_ref.0d5 = import_ref Main//transitive, loc7_22, unloaded +// CHECK:STDOUT: %Main.import_ref.d38: %facet_type.b1b = import_ref Main//transitive, loc8_8, loaded [concrete = %A] +// CHECK:STDOUT: %A: %facet_type.b1b = assoc_const_decl @A [concrete] {} +// CHECK:STDOUT: %Main.import_ref.06c: @Transitive.WithSelf.%Transitive.WithSelf.GetA.type (%Transitive.WithSelf.GetA.type.0b3c58.1) = import_ref Main//transitive, loc12_21, loaded [symbolic = @Transitive.WithSelf.%Transitive.WithSelf.GetA (constants.%Transitive.WithSelf.GetA.e3e09c.1)] +// CHECK:STDOUT: %Main.import_ref.9f3: %facet_type.130 = import_ref Main//transitive, loc9_8, loaded [concrete = %B] +// CHECK:STDOUT: %B: %facet_type.130 = assoc_const_decl @B [concrete] {} +// CHECK:STDOUT: %Main.import_ref.636: @Q.WithSelf.%Q.WithSelf.InQ.type (%Q.WithSelf.InQ.type) = import_ref Main//transitive, loc4_27, loaded [symbolic = @Q.WithSelf.%Q.WithSelf.InQ (constants.%Q.WithSelf.InQ)] +// CHECK:STDOUT: %Main.import_ref.a5f: %facet_type.4c8 = import_ref Main//transitive, loc10_8, loaded [concrete = %C] +// CHECK:STDOUT: %C: %facet_type.4c8 = assoc_const_decl @C [concrete] {} +// CHECK:STDOUT: %Core.Destroy: type = import_ref Core//prelude/parts/destroy, Destroy, loaded [concrete = constants.%Destroy.type] +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: file { +// CHECK:STDOUT: package: = namespace [concrete] { +// CHECK:STDOUT: .P = imports.%Main.P +// CHECK:STDOUT: .Q = imports.%Main.Q +// CHECK:STDOUT: .R = imports.%Main.R +// CHECK:STDOUT: .Transitive = imports.%Main.Transitive +// CHECK:STDOUT: .Core = imports.%Core.048aa3.1 +// CHECK:STDOUT: .TakesPQR = %TakesPQR.decl +// CHECK:STDOUT: .G = %G.decl +// CHECK:STDOUT: } +// CHECK:STDOUT: %Core.import = import Core +// CHECK:STDOUT: %default.import = import +// CHECK:STDOUT: %TakesPQR.decl: %TakesPQR.type = fn_decl @TakesPQR [concrete = constants.%TakesPQR] { +// CHECK:STDOUT: %U.patt.loc5_14.1: %pattern_type.075 = symbolic_binding_pattern U, 0 [symbolic = %U.patt.loc5_14.2 (constants.%U.patt)] +// CHECK:STDOUT: %u.param_patt.loc5_36.1: @TakesPQR.%pattern_type (%pattern_type.54d) = value_param_pattern [symbolic = %u.param_patt.loc5_36.2 (constants.%u.param_patt)] +// CHECK:STDOUT: %u.patt.loc5_36.1: @TakesPQR.%pattern_type (%pattern_type.54d) = at_binding_pattern u, %u.param_patt.loc5_36.1 [symbolic = %u.patt.loc5_36.2 (constants.%u.patt)] +// CHECK:STDOUT: } { +// CHECK:STDOUT: %.loc5_23.1: type = splice_block %.loc5_23.3 [concrete = constants.%facet_type.0b6] { +// CHECK:STDOUT: %.Self: %type = symbolic_binding .Self [symbolic_self = constants.%.Self] +// CHECK:STDOUT: %P.ref: type = name_ref P, imports.%Main.P [concrete = constants.%P.type] +// CHECK:STDOUT: %Q.ref: type = name_ref Q, imports.%Main.Q [concrete = constants.%Q.type] +// CHECK:STDOUT: %impl.elem0.loc5_19: %.d56 = impl_witness_access constants.%BitAndWith.impl_witness, element0 [concrete = constants.%type.as.BitAndWith.impl.Op] +// CHECK:STDOUT: %bound_method.loc5_19: = bound_method %P.ref, %impl.elem0.loc5_19 [concrete = constants.%type.as.BitAndWith.impl.Op.bound.dd7] +// CHECK:STDOUT: %type.as.BitAndWith.impl.Op.call.loc5_19: init type = call %bound_method.loc5_19(%P.ref, %Q.ref) [concrete = constants.%facet_type.bc0] +// CHECK:STDOUT: %R.ref: type = name_ref R, imports.%Main.R [concrete = constants.%R.type] +// CHECK:STDOUT: %impl.elem0.loc5_23: %.d56 = impl_witness_access constants.%BitAndWith.impl_witness, element0 [concrete = constants.%type.as.BitAndWith.impl.Op] +// CHECK:STDOUT: %bound_method.loc5_23: = bound_method %type.as.BitAndWith.impl.Op.call.loc5_19, %impl.elem0.loc5_23 [concrete = constants.%type.as.BitAndWith.impl.Op.bound.588] +// CHECK:STDOUT: %.loc5_19.1: type = value_of_initializer %type.as.BitAndWith.impl.Op.call.loc5_19 [concrete = constants.%facet_type.bc0] +// CHECK:STDOUT: %.loc5_19.2: type = converted %type.as.BitAndWith.impl.Op.call.loc5_19, %.loc5_19.1 [concrete = constants.%facet_type.bc0] +// CHECK:STDOUT: %type.as.BitAndWith.impl.Op.call.loc5_23: init type = call %bound_method.loc5_23(%.loc5_19.2, %R.ref) [concrete = constants.%facet_type.0b6] +// CHECK:STDOUT: %.loc5_23.2: type = value_of_initializer %type.as.BitAndWith.impl.Op.call.loc5_23 [concrete = constants.%facet_type.0b6] +// CHECK:STDOUT: %.loc5_23.3: type = converted %type.as.BitAndWith.impl.Op.call.loc5_23, %.loc5_23.2 [concrete = constants.%facet_type.0b6] +// CHECK:STDOUT: } +// CHECK:STDOUT: %U.loc5_14.2: %facet_type.0b6 = symbolic_binding U, 0 [symbolic = %U.loc5_14.1 (constants.%U)] +// CHECK:STDOUT: %u.param: @TakesPQR.%U.as_type.loc5_38.1 (%U.as_type) = value_param call_param0 +// CHECK:STDOUT: %.loc5_38.1: type = splice_block %.loc5_38.2 [symbolic = %U.as_type.loc5_38.1 (constants.%U.as_type)] { +// CHECK:STDOUT: %U.ref: %facet_type.0b6 = name_ref U, %U.loc5_14.2 [symbolic = %U.loc5_14.1 (constants.%U)] +// CHECK:STDOUT: %U.as_type.loc5_38.2: type = facet_access_type %U.ref [symbolic = %U.as_type.loc5_38.1 (constants.%U.as_type)] +// CHECK:STDOUT: %.loc5_38.2: type = converted %U.ref, %U.as_type.loc5_38.2 [symbolic = %U.as_type.loc5_38.1 (constants.%U.as_type)] +// CHECK:STDOUT: } +// CHECK:STDOUT: %u: @TakesPQR.%U.as_type.loc5_38.1 (%U.as_type) = wrapper_binding u, %u.param +// CHECK:STDOUT: } +// CHECK:STDOUT: %G.decl: %G.type = fn_decl @G [concrete = constants.%G] { +// CHECK:STDOUT: %T.patt.loc6_7.1: %pattern_type.bd9 = symbolic_binding_pattern T, 0 [symbolic = %T.patt.loc6_7.2 (constants.%T.patt)] +// CHECK:STDOUT: %t.param_patt.loc6_23.1: @G.%pattern_type.loc6 (%pattern_type.68e728.2) = value_param_pattern [symbolic = %t.param_patt.loc6_23.2 (constants.%t.param_patt)] +// CHECK:STDOUT: %t.patt.loc6_23.1: @G.%pattern_type.loc6 (%pattern_type.68e728.2) = at_binding_pattern t, %t.param_patt.loc6_23.1 [symbolic = %t.patt.loc6_23.2 (constants.%t.patt)] +// CHECK:STDOUT: } { +// CHECK:STDOUT: %.loc6_10: type = splice_block %Transitive.ref [concrete = constants.%Transitive.type] { +// CHECK:STDOUT: %.Self: %type = symbolic_binding .Self [symbolic_self = constants.%.Self] +// CHECK:STDOUT: %Transitive.ref: type = name_ref Transitive, imports.%Main.Transitive [concrete = constants.%Transitive.type] +// CHECK:STDOUT: } +// CHECK:STDOUT: %T.loc6_7.2: %Transitive.type = symbolic_binding T, 0 [symbolic = %T.loc6_7.1 (constants.%T)] +// CHECK:STDOUT: %t.param: @G.%T.as_type.loc6_25.1 (%T.as_type) = value_param call_param0 +// CHECK:STDOUT: %.loc6_25.1: type = splice_block %.loc6_25.2 [symbolic = %T.as_type.loc6_25.1 (constants.%T.as_type)] { +// CHECK:STDOUT: %T.ref.loc6: %Transitive.type = name_ref T, %T.loc6_7.2 [symbolic = %T.loc6_7.1 (constants.%T)] +// CHECK:STDOUT: %T.as_type.loc6_25.2: type = facet_access_type %T.ref.loc6 [symbolic = %T.as_type.loc6_25.1 (constants.%T.as_type)] +// CHECK:STDOUT: %.loc6_25.2: type = converted %T.ref.loc6, %T.as_type.loc6_25.2 [symbolic = %T.as_type.loc6_25.1 (constants.%T.as_type)] +// CHECK:STDOUT: } +// CHECK:STDOUT: %t: @G.%T.as_type.loc6_25.1 (%T.as_type) = wrapper_binding t, %t.param +// CHECK:STDOUT: } +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: interface @P [from "transitive.carbon"] { +// CHECK:STDOUT: !members: +// CHECK:STDOUT: .Self = imports.%Main.import_ref.96f +// CHECK:STDOUT: .InP = imports.%Main.import_ref.fec +// CHECK:STDOUT: witness = (imports.%Main.InP) +// CHECK:STDOUT: +// CHECK:STDOUT: !requires: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: interface @Q [from "transitive.carbon"] { +// CHECK:STDOUT: !members: +// CHECK:STDOUT: .Self = imports.%Main.import_ref.4f3 +// CHECK:STDOUT: .InQ = imports.%Main.import_ref.e2a +// CHECK:STDOUT: witness = (imports.%Main.InQ) +// CHECK:STDOUT: +// CHECK:STDOUT: !requires: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: interface @R [from "transitive.carbon"] { +// CHECK:STDOUT: !members: +// CHECK:STDOUT: .Self = imports.%Main.import_ref.659 +// CHECK:STDOUT: .InR = imports.%Main.import_ref.0ce +// CHECK:STDOUT: witness = (imports.%Main.InR) +// CHECK:STDOUT: +// CHECK:STDOUT: !requires: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: interface @Transitive [from "transitive.carbon"] { +// CHECK:STDOUT: !members: +// CHECK:STDOUT: .Self = imports.%Main.import_ref.0d5 +// CHECK:STDOUT: .A = imports.%Main.import_ref.72c +// CHECK:STDOUT: .B = imports.%Main.import_ref.e5e +// CHECK:STDOUT: .C = imports.%Main.import_ref.c9c +// CHECK:STDOUT: .GetA = imports.%Main.import_ref.5c5 +// CHECK:STDOUT: .TakesC = imports.%Main.import_ref.ae2 +// CHECK:STDOUT: witness = (imports.%Main.A, imports.%Main.B, imports.%Main.C, imports.%Main.GetA, imports.%Main.TakesC) +// CHECK:STDOUT: +// CHECK:STDOUT: !requires: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: +// CHECK:STDOUT: @Transitive.observe { +// CHECK:STDOUT: observe constants.%impl.elem0.0439e7.1 == constants.%impl.elem1.6be46c.1 == constants.%impl.elem2.731f97.1 +// CHECK:STDOUT: } +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: generic fn @P.WithSelf.InP(imports.%Main.import_ref.aef2fa.2: %P.type) [from "transitive.carbon"] { +// CHECK:STDOUT: %Self: %P.type = symbolic_binding Self, 0 [symbolic = %Self (constants.%Self.104)] +// CHECK:STDOUT: %Self.as_type: type = facet_access_type %Self [symbolic = %Self.as_type (constants.%Self.as_type.cc3)] +// CHECK:STDOUT: %pattern_type: type = pattern_type %Self.as_type [symbolic = %pattern_type (constants.%pattern_type.3ef)] +// CHECK:STDOUT: %self.param_patt: @P.WithSelf.InP.%pattern_type (%pattern_type.3ef) = value_param_pattern [symbolic = %self.param_patt (constants.%self.param_patt.88d)] +// CHECK:STDOUT: %self.patt: @P.WithSelf.InP.%pattern_type (%pattern_type.3ef) = at_binding_pattern self, %self.param_patt [symbolic = %self.patt (constants.%self.patt.6de)] +// CHECK:STDOUT: +// CHECK:STDOUT: fn; +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: generic fn @Q.WithSelf.InQ(imports.%Main.import_ref.c0a1f5.2: %Q.type) [from "transitive.carbon"] { +// CHECK:STDOUT: %Self: %Q.type = symbolic_binding Self, 0 [symbolic = %Self (constants.%Self.afd)] +// CHECK:STDOUT: %Self.as_type: type = facet_access_type %Self [symbolic = %Self.as_type (constants.%Self.as_type.430)] +// CHECK:STDOUT: %pattern_type: type = pattern_type %Self.as_type [symbolic = %pattern_type (constants.%pattern_type.ade)] +// CHECK:STDOUT: %self.param_patt: @Q.WithSelf.InQ.%pattern_type (%pattern_type.ade) = value_param_pattern [symbolic = %self.param_patt (constants.%self.param_patt.271)] +// CHECK:STDOUT: %self.patt: @Q.WithSelf.InQ.%pattern_type (%pattern_type.ade) = at_binding_pattern self, %self.param_patt [symbolic = %self.patt (constants.%self.patt.b5e)] +// CHECK:STDOUT: +// CHECK:STDOUT: fn; +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: generic fn @R.WithSelf.InR(imports.%Main.import_ref.f6968b.2: %R.type) [from "transitive.carbon"] { +// CHECK:STDOUT: %Self: %R.type = symbolic_binding Self, 0 [symbolic = %Self (constants.%Self.be6)] +// CHECK:STDOUT: %Self.as_type: type = facet_access_type %Self [symbolic = %Self.as_type (constants.%Self.as_type.b02)] +// CHECK:STDOUT: %pattern_type: type = pattern_type %Self.as_type [symbolic = %pattern_type (constants.%pattern_type.60e)] +// CHECK:STDOUT: %self.param_patt: @R.WithSelf.InR.%pattern_type (%pattern_type.60e) = value_param_pattern [symbolic = %self.param_patt (constants.%self.param_patt.640)] +// CHECK:STDOUT: %self.patt: @R.WithSelf.InR.%pattern_type (%pattern_type.60e) = at_binding_pattern self, %self.param_patt [symbolic = %self.patt (constants.%self.patt.894)] +// CHECK:STDOUT: +// CHECK:STDOUT: fn; +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: generic fn @TakesPQR(%U.loc5_14.2: %facet_type.0b6) { +// CHECK:STDOUT: %U.patt.loc5_14.2: %pattern_type.075 = symbolic_binding_pattern U, 0 [symbolic = %U.patt.loc5_14.2 (constants.%U.patt)] +// CHECK:STDOUT: %U.loc5_14.1: %facet_type.0b6 = symbolic_binding U, 0 [symbolic = %U.loc5_14.1 (constants.%U)] +// CHECK:STDOUT: %U.as_type.loc5_38.1: type = facet_access_type %U.loc5_14.1 [symbolic = %U.as_type.loc5_38.1 (constants.%U.as_type)] +// CHECK:STDOUT: %pattern_type: type = pattern_type %U.as_type.loc5_38.1 [symbolic = %pattern_type (constants.%pattern_type.54d)] +// CHECK:STDOUT: %u.param_patt.loc5_36.2: @TakesPQR.%pattern_type (%pattern_type.54d) = value_param_pattern [symbolic = %u.param_patt.loc5_36.2 (constants.%u.param_patt)] +// CHECK:STDOUT: %u.patt.loc5_36.2: @TakesPQR.%pattern_type (%pattern_type.54d) = at_binding_pattern u, %u.param_patt.loc5_36.2 [symbolic = %u.patt.loc5_36.2 (constants.%u.patt)] +// CHECK:STDOUT: +// CHECK:STDOUT: !definition: +// CHECK:STDOUT: %require_complete: = require_complete_type %U.as_type.loc5_38.1 [symbolic = %require_complete (constants.%require_complete.192)] +// CHECK:STDOUT: +// CHECK:STDOUT: fn(%u.param: @TakesPQR.%U.as_type.loc5_38.1 (%U.as_type)) { +// CHECK:STDOUT: !entry: +// CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: +// CHECK:STDOUT: } +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: generic fn @Transitive.WithSelf.TakesC(imports.%Main.import_ref.df6636.2: %Transitive.type) [from "transitive.carbon"] { +// CHECK:STDOUT: %Self: %Transitive.type = symbolic_binding Self, 0 [symbolic = %Self (constants.%Self.744)] +// CHECK:STDOUT: %Self.as_type: type = facet_access_type %Self [symbolic = %Self.as_type (constants.%Self.as_type.56c)] +// CHECK:STDOUT: %pattern_type.1: type = pattern_type %Self.as_type [symbolic = %pattern_type.1 (constants.%pattern_type.68e728.1)] +// CHECK:STDOUT: %self.param_patt: @Transitive.WithSelf.TakesC.%pattern_type.1 (%pattern_type.68e728.1) = value_param_pattern [symbolic = %self.param_patt (constants.%self.param_patt.e90fff.1)] +// CHECK:STDOUT: %self.patt: @Transitive.WithSelf.TakesC.%pattern_type.1 (%pattern_type.68e728.1) = at_binding_pattern self, %self.param_patt [symbolic = %self.patt (constants.%self.patt.d2dab3.1)] +// CHECK:STDOUT: %Transitive.lookup_impl_witness: = lookup_impl_witness %Self, @Transitive [symbolic = %Transitive.lookup_impl_witness (constants.%Transitive.lookup_impl_witness.ab0b8d.1)] +// CHECK:STDOUT: %impl.elem2: %facet_type.4c8 = impl_witness_access %Transitive.lookup_impl_witness, element2 [symbolic = %impl.elem2 (constants.%impl.elem2.731f97.1)] +// CHECK:STDOUT: %as_type: type = facet_access_type %impl.elem2 [symbolic = %as_type (constants.%as_type.2fadd6.1)] +// CHECK:STDOUT: %pattern_type.2: type = pattern_type %as_type [symbolic = %pattern_type.2 (constants.%pattern_type.ac0)] +// CHECK:STDOUT: %c.param_patt: @Transitive.WithSelf.TakesC.%pattern_type.2 (%pattern_type.ac0) = value_param_pattern [symbolic = %c.param_patt (constants.%c.param_patt)] +// CHECK:STDOUT: %c.patt: @Transitive.WithSelf.TakesC.%pattern_type.2 (%pattern_type.ac0) = at_binding_pattern c, %c.param_patt [symbolic = %c.patt (constants.%c.patt)] +// CHECK:STDOUT: +// CHECK:STDOUT: fn; +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: generic fn @Transitive.WithSelf.GetA(imports.%Main.import_ref.df6636.3: %Transitive.type) [from "transitive.carbon"] { +// CHECK:STDOUT: %Self: %Transitive.type = symbolic_binding Self, 0 [symbolic = %Self (constants.%Self.744)] +// CHECK:STDOUT: %Self.as_type: type = facet_access_type %Self [symbolic = %Self.as_type (constants.%Self.as_type.56c)] +// CHECK:STDOUT: %pattern_type.1: type = pattern_type %Self.as_type [symbolic = %pattern_type.1 (constants.%pattern_type.68e728.1)] +// CHECK:STDOUT: %self.param_patt: @Transitive.WithSelf.GetA.%pattern_type.1 (%pattern_type.68e728.1) = value_param_pattern [symbolic = %self.param_patt (constants.%self.param_patt.e90fff.1)] +// CHECK:STDOUT: %self.patt: @Transitive.WithSelf.GetA.%pattern_type.1 (%pattern_type.68e728.1) = at_binding_pattern self, %self.param_patt [symbolic = %self.patt (constants.%self.patt.d2dab3.1)] +// CHECK:STDOUT: %Transitive.lookup_impl_witness: = lookup_impl_witness %Self, @Transitive [symbolic = %Transitive.lookup_impl_witness (constants.%Transitive.lookup_impl_witness.ab0b8d.1)] +// CHECK:STDOUT: %impl.elem0: %facet_type.b1b = impl_witness_access %Transitive.lookup_impl_witness, element0 [symbolic = %impl.elem0 (constants.%impl.elem0.0439e7.1)] +// CHECK:STDOUT: %as_type: type = facet_access_type %impl.elem0 [symbolic = %as_type (constants.%as_type.6a024f.1)] +// CHECK:STDOUT: %.1: Core.Form = init_form %as_type [symbolic = %.1 (constants.%.2b1a45.1)] +// CHECK:STDOUT: %pattern_type.2: type = pattern_type %as_type [symbolic = %pattern_type.2 (constants.%pattern_type.c73ac0.1)] +// CHECK:STDOUT: %return.param_patt: @Transitive.WithSelf.GetA.%pattern_type.2 (%pattern_type.c73ac0.1) = out_param_pattern [symbolic = %return.param_patt (constants.%return.param_patt.057e89.1)] +// CHECK:STDOUT: %return.patt: @Transitive.WithSelf.GetA.%pattern_type.2 (%pattern_type.c73ac0.1) = return_slot_pattern %return.param_patt, invalid [symbolic = %return.patt (constants.%return.patt.4e0711.1)] +// CHECK:STDOUT: +// CHECK:STDOUT: fn; +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: generic fn @G(%T.loc6_7.2: %Transitive.type) { +// CHECK:STDOUT: %T.patt.loc6_7.2: %pattern_type.bd9 = symbolic_binding_pattern T, 0 [symbolic = %T.patt.loc6_7.2 (constants.%T.patt)] +// CHECK:STDOUT: %T.loc6_7.1: %Transitive.type = symbolic_binding T, 0 [symbolic = %T.loc6_7.1 (constants.%T)] +// CHECK:STDOUT: %T.as_type.loc6_25.1: type = facet_access_type %T.loc6_7.1 [symbolic = %T.as_type.loc6_25.1 (constants.%T.as_type)] +// CHECK:STDOUT: %pattern_type.loc6: type = pattern_type %T.as_type.loc6_25.1 [symbolic = %pattern_type.loc6 (constants.%pattern_type.68e728.2)] +// CHECK:STDOUT: %t.param_patt.loc6_23.2: @G.%pattern_type.loc6 (%pattern_type.68e728.2) = value_param_pattern [symbolic = %t.param_patt.loc6_23.2 (constants.%t.param_patt)] +// CHECK:STDOUT: %t.patt.loc6_23.2: @G.%pattern_type.loc6 (%pattern_type.68e728.2) = at_binding_pattern t, %t.param_patt.loc6_23.2 [symbolic = %t.patt.loc6_23.2 (constants.%t.patt)] +// CHECK:STDOUT: +// CHECK:STDOUT: !definition: +// CHECK:STDOUT: %require_complete.loc6: = require_complete_type %T.as_type.loc6_25.1 [symbolic = %require_complete.loc6 (constants.%require_complete.fbd)] +// CHECK:STDOUT: %Transitive.lookup_impl_witness: = lookup_impl_witness %T.loc6_7.1, @Transitive [symbolic = %Transitive.lookup_impl_witness (constants.%Transitive.lookup_impl_witness.ab0b8d.2)] +// CHECK:STDOUT: %impl.elem0.loc7_11.2: %facet_type.b1b = impl_witness_access %Transitive.lookup_impl_witness, element0 [symbolic = %impl.elem0.loc7_11.2 (constants.%impl.elem0.0439e7.2)] +// CHECK:STDOUT: %as_type.loc7_11.2: type = facet_access_type %impl.elem0.loc7_11.2 [symbolic = %as_type.loc7_11.2 (constants.%as_type.6a024f.2)] +// CHECK:STDOUT: %require_complete.loc7: = require_complete_type %as_type.loc7_11.2 [symbolic = %require_complete.loc7 (constants.%require_complete.c2d)] +// CHECK:STDOUT: %pattern_type.loc7: type = pattern_type %as_type.loc7_11.2 [symbolic = %pattern_type.loc7 (constants.%pattern_type.c73ac0.2)] +// CHECK:STDOUT: %a.patt.loc7_8.2: @G.%pattern_type.loc7 (%pattern_type.c73ac0.2) = ref_binding_pattern a [symbolic = %a.patt.loc7_8.2 (constants.%a.patt)] +// CHECK:STDOUT: %a.var_patt.loc7_3.2: @G.%pattern_type.loc7 (%pattern_type.c73ac0.2) = var_pattern %a.patt.loc7_8.2 [symbolic = %a.var_patt.loc7_3.2 (constants.%a.var_patt)] +// CHECK:STDOUT: %Transitive.WithSelf.GetA.type: type = fn_type @Transitive.WithSelf.GetA, @Transitive.WithSelf(%T.loc6_7.1) [symbolic = %Transitive.WithSelf.GetA.type (constants.%Transitive.WithSelf.GetA.type.0b3c58.2)] +// CHECK:STDOUT: %.loc7_17: type = fn_type_with_self_type %Transitive.WithSelf.GetA.type, %T.loc6_7.1 [symbolic = %.loc7_17 (constants.%.657)] +// CHECK:STDOUT: %impl.elem3.loc7_17.2: @G.%.loc7_17 (%.657) = impl_witness_access %Transitive.lookup_impl_witness, element3 [symbolic = %impl.elem3.loc7_17.2 (constants.%impl.elem3)] +// CHECK:STDOUT: %specific_impl_fn.loc7_17.2: = specific_impl_function %impl.elem3.loc7_17.2, @Transitive.WithSelf.GetA(%T.loc6_7.1) [symbolic = %specific_impl_fn.loc7_17.2 (constants.%specific_impl_fn.72f)] +// CHECK:STDOUT: %impl.elem1.loc9_19.2: %facet_type.130 = impl_witness_access %Transitive.lookup_impl_witness, element1 [symbolic = %impl.elem1.loc9_19.2 (constants.%impl.elem1.6be46c.2)] +// CHECK:STDOUT: %as_type.loc9_19.3: type = facet_access_type %impl.elem1.loc9_19.2 [symbolic = %as_type.loc9_19.3 (constants.%as_type.dca436.2)] +// CHECK:STDOUT: %eq.loc9 = observe_equivalent %impl.elem0.loc7_11.2, %impl.elem1.loc9_19.2 [symbolic = %eq.loc9 (constants.%eq.4be6e4.2)] +// CHECK:STDOUT: %impls.loc9 = observe_impls %impl.elem1.loc9_19.2, constants.%Q.type [symbolic = %impls.loc9 (constants.%impls.885)] +// CHECK:STDOUT: %impl.elem2.loc16_19.2: %facet_type.4c8 = impl_witness_access %Transitive.lookup_impl_witness, element2 [symbolic = %impl.elem2.loc16_19.2 (constants.%impl.elem2.731f97.2)] +// CHECK:STDOUT: %as_type.loc16_19.3: type = facet_access_type %impl.elem2.loc16_19.2 [symbolic = %as_type.loc16_19.3 (constants.%as_type.2fadd6.2)] +// CHECK:STDOUT: %eq.loc16 = observe_equivalent %impl.elem0.loc7_11.2, %impl.elem2.loc16_19.2 [symbolic = %eq.loc16 (constants.%eq.fcd)] +// CHECK:STDOUT: %impls.loc16 = observe_impls %impl.elem2.loc16_19.2, constants.%R.type [symbolic = %impls.loc16 (constants.%impls.adc)] +// CHECK:STDOUT: %Destroy.lookup_impl_witness: = lookup_impl_witness %impl.elem0.loc7_11.2, @Destroy [symbolic = %Destroy.lookup_impl_witness (constants.%Destroy.lookup_impl_witness)] +// CHECK:STDOUT: %Destroy.facet.loc7_3.3: %Destroy.type = facet_value %as_type.loc7_11.2, (%Destroy.lookup_impl_witness) [symbolic = %Destroy.facet.loc7_3.3 (constants.%Destroy.facet)] +// CHECK:STDOUT: %Destroy.WithSelf.Op.type: type = fn_type @Destroy.WithSelf.Op, @Destroy.WithSelf(%Destroy.facet.loc7_3.3) [symbolic = %Destroy.WithSelf.Op.type (constants.%Destroy.WithSelf.Op.type.5e1)] +// CHECK:STDOUT: %.loc7_3.4: type = fn_type_with_self_type %Destroy.WithSelf.Op.type, %Destroy.facet.loc7_3.3 [symbolic = %.loc7_3.4 (constants.%.e75)] +// CHECK:STDOUT: %impl.elem0.loc7_3.2: @G.%.loc7_3.4 (%.e75) = impl_witness_access %Destroy.lookup_impl_witness, element0 [symbolic = %impl.elem0.loc7_3.2 (constants.%impl.elem0.678)] +// CHECK:STDOUT: %specific_impl_fn.loc7_3.2: = specific_impl_function %impl.elem0.loc7_3.2, @Destroy.WithSelf.Op(%Destroy.facet.loc7_3.3) [symbolic = %specific_impl_fn.loc7_3.2 (constants.%specific_impl_fn.e8e)] +// CHECK:STDOUT: +// CHECK:STDOUT: fn(%t.param: @G.%T.as_type.loc6_25.1 (%T.as_type)) { +// CHECK:STDOUT: !entry: +// CHECK:STDOUT: %a.var: ref @G.%as_type.loc7_11.2 (%as_type.6a024f.2) = var_storage %a.var_patt.loc7_3.1 +// CHECK:STDOUT: %t.ref: @G.%T.as_type.loc6_25.1 (%T.as_type) = name_ref t, %t +// CHECK:STDOUT: %GetA.ref: %Transitive.assoc_type = name_ref GetA, imports.%Main.import_ref.5c5 [concrete = constants.%assoc3] +// CHECK:STDOUT: %impl.elem3.loc7_17.1: @G.%.loc7_17 (%.657) = impl_witness_access constants.%Transitive.lookup_impl_witness.ab0b8d.2, element3 [symbolic = %impl.elem3.loc7_17.2 (constants.%impl.elem3)] +// CHECK:STDOUT: %bound_method.loc7_17: = bound_method %t.ref, %impl.elem3.loc7_17.1 +// CHECK:STDOUT: %.loc7_23.1: %Transitive.type = converted constants.%T.as_type, constants.%T [symbolic = %T.loc6_7.1 (constants.%T)] +// CHECK:STDOUT: %.loc7_23.2: %Transitive.type = converted constants.%T.as_type, constants.%T [symbolic = %T.loc6_7.1 (constants.%T)] +// CHECK:STDOUT: %specific_impl_fn.loc7_17.1: = specific_impl_function %impl.elem3.loc7_17.1, @Transitive.WithSelf.GetA(constants.%T) [symbolic = %specific_impl_fn.loc7_17.2 (constants.%specific_impl_fn.72f)] +// CHECK:STDOUT: %bound_method.loc7_23: = bound_method %t.ref, %specific_impl_fn.loc7_17.1 +// CHECK:STDOUT: %.loc7_3.1: ref @G.%as_type.loc7_11.2 (%as_type.6a024f.2) = splice_block %a.var {} +// CHECK:STDOUT: %Transitive.WithSelf.GetA.call: init @G.%as_type.loc7_11.2 (%as_type.6a024f.2) to %.loc7_3.1 = call %bound_method.loc7_23(%t.ref) +// CHECK:STDOUT: assign %a.var, %Transitive.WithSelf.GetA.call +// CHECK:STDOUT: %.loc7_11.1: type = splice_block %.loc7_11.3 [symbolic = %as_type.loc7_11.2 (constants.%as_type.6a024f.2)] { +// CHECK:STDOUT: %T.ref.loc7: %Transitive.type = name_ref T, %T.loc6_7.2 [symbolic = %T.loc6_7.1 (constants.%T)] +// CHECK:STDOUT: %T.as_type.loc7: type = facet_access_type %T.ref.loc7 [symbolic = %T.as_type.loc6_25.1 (constants.%T.as_type)] +// CHECK:STDOUT: %.loc7_11.2: type = converted %T.ref.loc7, %T.as_type.loc7 [symbolic = %T.as_type.loc6_25.1 (constants.%T.as_type)] +// CHECK:STDOUT: %A.ref.loc7: %Transitive.assoc_type = name_ref A, imports.%Main.import_ref.72c [concrete = constants.%assoc0.7cd] +// CHECK:STDOUT: %impl.elem0.loc7_11.1: %facet_type.b1b = impl_witness_access constants.%Transitive.lookup_impl_witness.ab0b8d.2, element0 [symbolic = %impl.elem0.loc7_11.2 (constants.%impl.elem0.0439e7.2)] +// CHECK:STDOUT: %as_type.loc7_11.1: type = facet_access_type %impl.elem0.loc7_11.1 [symbolic = %as_type.loc7_11.2 (constants.%as_type.6a024f.2)] +// CHECK:STDOUT: %.loc7_11.3: type = converted %impl.elem0.loc7_11.1, %as_type.loc7_11.1 [symbolic = %as_type.loc7_11.2 (constants.%as_type.6a024f.2)] +// CHECK:STDOUT: } +// CHECK:STDOUT: %a: ref @G.%as_type.loc7_11.2 (%as_type.6a024f.2) = wrapper_binding a, %a.var +// CHECK:STDOUT: name_binding_decl { +// CHECK:STDOUT: %a.patt.loc7_8.1: @G.%pattern_type.loc7 (%pattern_type.c73ac0.2) = ref_binding_pattern a [symbolic = %a.patt.loc7_8.2 (constants.%a.patt)] +// CHECK:STDOUT: %a.var_patt.loc7_3.1: @G.%pattern_type.loc7 (%pattern_type.c73ac0.2) = var_pattern %a.patt.loc7_8.1 [symbolic = %a.var_patt.loc7_3.2 (constants.%a.var_patt)] +// CHECK:STDOUT: } +// CHECK:STDOUT: %T.ref.loc9_11: %Transitive.type = name_ref T, %T.loc6_7.2 [symbolic = %T.loc6_7.1 (constants.%T)] +// CHECK:STDOUT: %T.as_type.loc9_12: type = facet_access_type %T.ref.loc9_11 [symbolic = %T.as_type.loc6_25.1 (constants.%T.as_type)] +// CHECK:STDOUT: %.loc9_12.1: type = converted %T.ref.loc9_11, %T.as_type.loc9_12 [symbolic = %T.as_type.loc6_25.1 (constants.%T.as_type)] +// CHECK:STDOUT: %A.ref.loc9: %Transitive.assoc_type = name_ref A, imports.%Main.import_ref.72c [concrete = constants.%assoc0.7cd] +// CHECK:STDOUT: %impl.elem0.loc9: %facet_type.b1b = impl_witness_access constants.%Transitive.lookup_impl_witness.ab0b8d.2, element0 [symbolic = %impl.elem0.loc7_11.2 (constants.%impl.elem0.0439e7.2)] +// CHECK:STDOUT: %T.ref.loc9_18: %Transitive.type = name_ref T, %T.loc6_7.2 [symbolic = %T.loc6_7.1 (constants.%T)] +// CHECK:STDOUT: %T.as_type.loc9_19: type = facet_access_type %T.ref.loc9_18 [symbolic = %T.as_type.loc6_25.1 (constants.%T.as_type)] +// CHECK:STDOUT: %.loc9_19.1: type = converted %T.ref.loc9_18, %T.as_type.loc9_19 [symbolic = %T.as_type.loc6_25.1 (constants.%T.as_type)] +// CHECK:STDOUT: %B.ref: %Transitive.assoc_type = name_ref B, imports.%Main.import_ref.e5e [concrete = constants.%assoc1] +// CHECK:STDOUT: %impl.elem1.loc9_19.1: %facet_type.130 = impl_witness_access constants.%Transitive.lookup_impl_witness.ab0b8d.2, element1 [symbolic = %impl.elem1.loc9_19.2 (constants.%impl.elem1.6be46c.2)] +// CHECK:STDOUT: %as_type.loc9_19.1: type = facet_access_type %impl.elem1.loc9_19.1 [symbolic = %as_type.loc9_19.3 (constants.%as_type.dca436.2)] +// CHECK:STDOUT: %.loc9_19.2: type = converted %impl.elem1.loc9_19.1, %as_type.loc9_19.1 [symbolic = %as_type.loc9_19.3 (constants.%as_type.dca436.2)] +// CHECK:STDOUT: %as_type.loc9_12: type = facet_access_type %impl.elem0.loc9 [symbolic = %as_type.loc7_11.2 (constants.%as_type.6a024f.2)] +// CHECK:STDOUT: %.loc9_12.2: type = converted %impl.elem0.loc9, %as_type.loc9_12 [symbolic = %as_type.loc7_11.2 (constants.%as_type.6a024f.2)] +// CHECK:STDOUT: %Q.ref.loc9: type = name_ref Q, imports.%Main.Q [concrete = constants.%Q.type] +// CHECK:STDOUT: %as_type.loc9_19.2: type = facet_access_type %impl.elem1.loc9_19.1 [symbolic = %as_type.loc9_19.3 (constants.%as_type.dca436.2)] +// CHECK:STDOUT: %.loc9_19.3: type = converted %impl.elem1.loc9_19.1, %as_type.loc9_19.2 [symbolic = %as_type.loc9_19.3 (constants.%as_type.dca436.2)] +// CHECK:STDOUT: %G.observe.decl.loc9 = observe_decl @G.observe.loc9 [concrete] +// CHECK:STDOUT: %a.ref.loc14: ref @G.%as_type.loc7_11.2 (%as_type.6a024f.2) = name_ref a, %a +// CHECK:STDOUT: %Q.ref.loc14: type = name_ref Q, imports.%Main.Q [concrete = constants.%Q.type] +// CHECK:STDOUT: %InQ.ref: %Q.assoc_type = name_ref InQ, imports.%Main.import_ref.e2a [concrete = constants.%assoc0.6a1] +// CHECK:STDOUT: %T.ref.loc16_11: %Transitive.type = name_ref T, %T.loc6_7.2 [symbolic = %T.loc6_7.1 (constants.%T)] +// CHECK:STDOUT: %T.as_type.loc16_12: type = facet_access_type %T.ref.loc16_11 [symbolic = %T.as_type.loc6_25.1 (constants.%T.as_type)] +// CHECK:STDOUT: %.loc16_12.1: type = converted %T.ref.loc16_11, %T.as_type.loc16_12 [symbolic = %T.as_type.loc6_25.1 (constants.%T.as_type)] +// CHECK:STDOUT: %A.ref.loc16: %Transitive.assoc_type = name_ref A, imports.%Main.import_ref.72c [concrete = constants.%assoc0.7cd] +// CHECK:STDOUT: %impl.elem0.loc16: %facet_type.b1b = impl_witness_access constants.%Transitive.lookup_impl_witness.ab0b8d.2, element0 [symbolic = %impl.elem0.loc7_11.2 (constants.%impl.elem0.0439e7.2)] +// CHECK:STDOUT: %T.ref.loc16_18: %Transitive.type = name_ref T, %T.loc6_7.2 [symbolic = %T.loc6_7.1 (constants.%T)] +// CHECK:STDOUT: %T.as_type.loc16_19: type = facet_access_type %T.ref.loc16_18 [symbolic = %T.as_type.loc6_25.1 (constants.%T.as_type)] +// CHECK:STDOUT: %.loc16_19.1: type = converted %T.ref.loc16_18, %T.as_type.loc16_19 [symbolic = %T.as_type.loc6_25.1 (constants.%T.as_type)] +// CHECK:STDOUT: %C.ref: %Transitive.assoc_type = name_ref C, imports.%Main.import_ref.c9c [concrete = constants.%assoc2] +// CHECK:STDOUT: %impl.elem2.loc16_19.1: %facet_type.4c8 = impl_witness_access constants.%Transitive.lookup_impl_witness.ab0b8d.2, element2 [symbolic = %impl.elem2.loc16_19.2 (constants.%impl.elem2.731f97.2)] +// CHECK:STDOUT: %as_type.loc16_19.1: type = facet_access_type %impl.elem2.loc16_19.1 [symbolic = %as_type.loc16_19.3 (constants.%as_type.2fadd6.2)] +// CHECK:STDOUT: %.loc16_19.2: type = converted %impl.elem2.loc16_19.1, %as_type.loc16_19.1 [symbolic = %as_type.loc16_19.3 (constants.%as_type.2fadd6.2)] +// CHECK:STDOUT: %as_type.loc16_12: type = facet_access_type %impl.elem0.loc16 [symbolic = %as_type.loc7_11.2 (constants.%as_type.6a024f.2)] +// CHECK:STDOUT: %.loc16_12.2: type = converted %impl.elem0.loc16, %as_type.loc16_12 [symbolic = %as_type.loc7_11.2 (constants.%as_type.6a024f.2)] +// CHECK:STDOUT: %R.ref: type = name_ref R, imports.%Main.R [concrete = constants.%R.type] +// CHECK:STDOUT: %as_type.loc16_19.2: type = facet_access_type %impl.elem2.loc16_19.1 [symbolic = %as_type.loc16_19.3 (constants.%as_type.2fadd6.2)] +// CHECK:STDOUT: %.loc16_19.3: type = converted %impl.elem2.loc16_19.1, %as_type.loc16_19.2 [symbolic = %as_type.loc16_19.3 (constants.%as_type.2fadd6.2)] +// CHECK:STDOUT: %G.observe.decl.loc16 = observe_decl @G.observe.loc16 [concrete] +// CHECK:STDOUT: %TakesPQR.ref: %TakesPQR.type = name_ref TakesPQR, file.%TakesPQR.decl [concrete = constants.%TakesPQR] +// CHECK:STDOUT: %a.ref.loc24: ref @G.%as_type.loc7_11.2 (%as_type.6a024f.2) = name_ref a, %a +// CHECK:STDOUT: %impl.elem0.loc7_3.1: @G.%.loc7_3.4 (%.e75) = impl_witness_access constants.%Destroy.lookup_impl_witness, element0 [symbolic = %impl.elem0.loc7_3.2 (constants.%impl.elem0.678)] +// CHECK:STDOUT: %bound_method.loc7_3.1: = bound_method %a.var, %impl.elem0.loc7_3.1 +// CHECK:STDOUT: %Destroy.facet.loc7_3.1: %Destroy.type = facet_value constants.%as_type.6a024f.2, (constants.%Destroy.lookup_impl_witness) [symbolic = %Destroy.facet.loc7_3.3 (constants.%Destroy.facet)] +// CHECK:STDOUT: %.loc7_3.2: %Destroy.type = converted constants.%as_type.6a024f.2, %Destroy.facet.loc7_3.1 [symbolic = %Destroy.facet.loc7_3.3 (constants.%Destroy.facet)] +// CHECK:STDOUT: %Destroy.facet.loc7_3.2: %Destroy.type = facet_value constants.%as_type.6a024f.2, (constants.%Destroy.lookup_impl_witness) [symbolic = %Destroy.facet.loc7_3.3 (constants.%Destroy.facet)] +// CHECK:STDOUT: %.loc7_3.3: %Destroy.type = converted constants.%as_type.6a024f.2, %Destroy.facet.loc7_3.2 [symbolic = %Destroy.facet.loc7_3.3 (constants.%Destroy.facet)] +// CHECK:STDOUT: %specific_impl_fn.loc7_3.1: = specific_impl_function %impl.elem0.loc7_3.1, @Destroy.WithSelf.Op(constants.%Destroy.facet) [symbolic = %specific_impl_fn.loc7_3.2 (constants.%specific_impl_fn.e8e)] +// CHECK:STDOUT: %bound_method.loc7_3.2: = bound_method %a.var, %specific_impl_fn.loc7_3.1 +// CHECK:STDOUT: %Destroy.WithSelf.Op.call: init %empty_tuple.type = call %bound_method.loc7_3.2(%a.var) +// CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: +// CHECK:STDOUT: @G.observe.loc9 { +// CHECK:STDOUT: observe constants.%impl.elem0.0439e7.2 == constants.%impl.elem1.6be46c.2 impls constants.%Q.type +// CHECK:STDOUT: } +// CHECK:STDOUT: @G.observe.loc16 { +// CHECK:STDOUT: observe constants.%impl.elem0.0439e7.2 == constants.%impl.elem2.731f97.2 impls constants.%R.type +// CHECK:STDOUT: } +// CHECK:STDOUT: } +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: specific @P.WithSelf(constants.%Self.104) { +// CHECK:STDOUT: !definition: +// CHECK:STDOUT: %Self => constants.%Self.104 +// CHECK:STDOUT: %P.WithSelf.InP.type => constants.%P.WithSelf.InP.type +// CHECK:STDOUT: %P.WithSelf.InP => constants.%P.WithSelf.InP +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: specific @P.WithSelf.InP(constants.%Self.104) { +// CHECK:STDOUT: %Self => constants.%Self.104 +// CHECK:STDOUT: %Self.as_type => constants.%Self.as_type.cc3 +// CHECK:STDOUT: %pattern_type => constants.%pattern_type.3ef +// CHECK:STDOUT: %self.param_patt => constants.%self.param_patt.88d +// CHECK:STDOUT: %self.patt => constants.%self.patt.6de +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: specific @Q.WithSelf(constants.%Self.afd) { +// CHECK:STDOUT: !definition: +// CHECK:STDOUT: %Self => constants.%Self.afd +// CHECK:STDOUT: %Q.WithSelf.InQ.type => constants.%Q.WithSelf.InQ.type +// CHECK:STDOUT: %Q.WithSelf.InQ => constants.%Q.WithSelf.InQ +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: specific @Q.WithSelf.InQ(constants.%Self.afd) { +// CHECK:STDOUT: %Self => constants.%Self.afd +// CHECK:STDOUT: %Self.as_type => constants.%Self.as_type.430 +// CHECK:STDOUT: %pattern_type => constants.%pattern_type.ade +// CHECK:STDOUT: %self.param_patt => constants.%self.param_patt.271 +// CHECK:STDOUT: %self.patt => constants.%self.patt.b5e +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: specific @R.WithSelf(constants.%Self.be6) { +// CHECK:STDOUT: !definition: +// CHECK:STDOUT: %Self => constants.%Self.be6 +// CHECK:STDOUT: %R.WithSelf.InR.type => constants.%R.WithSelf.InR.type +// CHECK:STDOUT: %R.WithSelf.InR => constants.%R.WithSelf.InR +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: specific @R.WithSelf.InR(constants.%Self.be6) { +// CHECK:STDOUT: %Self => constants.%Self.be6 +// CHECK:STDOUT: %Self.as_type => constants.%Self.as_type.b02 +// CHECK:STDOUT: %pattern_type => constants.%pattern_type.60e +// CHECK:STDOUT: %self.param_patt => constants.%self.param_patt.640 +// CHECK:STDOUT: %self.patt => constants.%self.patt.894 +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: specific @TakesPQR(constants.%U) { +// CHECK:STDOUT: %U.patt.loc5_14.2 => constants.%U.patt +// CHECK:STDOUT: %U.loc5_14.1 => constants.%U +// CHECK:STDOUT: %U.as_type.loc5_38.1 => constants.%U.as_type +// CHECK:STDOUT: %pattern_type => constants.%pattern_type.54d +// CHECK:STDOUT: %u.param_patt.loc5_36.2 => constants.%u.param_patt +// CHECK:STDOUT: %u.patt.loc5_36.2 => constants.%u.patt +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: specific @Transitive.WithSelf(constants.%Self.744) { +// CHECK:STDOUT: !definition: +// CHECK:STDOUT: %Self => constants.%Self.744 +// CHECK:STDOUT: %Transitive.lookup_impl_witness => constants.%Transitive.lookup_impl_witness.ab0b8d.1 +// CHECK:STDOUT: %impl.elem0 => constants.%impl.elem0.0439e7.1 +// CHECK:STDOUT: %impl.elem1 => constants.%impl.elem1.6be46c.1 +// CHECK:STDOUT: %Transitive.WithSelf.GetA.type => constants.%Transitive.WithSelf.GetA.type.0b3c58.1 +// CHECK:STDOUT: %Transitive.WithSelf.GetA => constants.%Transitive.WithSelf.GetA.e3e09c.1 +// CHECK:STDOUT: %Transitive.WithSelf.TakesC.type => constants.%Transitive.WithSelf.TakesC.type.d86d9f.1 +// CHECK:STDOUT: %Transitive.WithSelf.TakesC => constants.%Transitive.WithSelf.TakesC.f276cd.1 +// CHECK:STDOUT: %as_type.1 => constants.%as_type.dca436.1 +// CHECK:STDOUT: %as_type.2 => constants.%as_type.6a024f.1 +// CHECK:STDOUT: %eq.1 => constants.%eq.4be6e4.1 +// CHECK:STDOUT: %impl.elem2 => constants.%impl.elem2.731f97.1 +// CHECK:STDOUT: %as_type.3 => constants.%as_type.2fadd6.1 +// CHECK:STDOUT: %eq.2 => constants.%eq.033b19.1 +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: specific @Transitive.WithSelf.TakesC(constants.%Self.744) { +// CHECK:STDOUT: %Self => constants.%Self.744 +// CHECK:STDOUT: %Self.as_type => constants.%Self.as_type.56c +// CHECK:STDOUT: %pattern_type.1 => constants.%pattern_type.68e728.1 +// CHECK:STDOUT: %self.param_patt => constants.%self.param_patt.e90fff.1 +// CHECK:STDOUT: %self.patt => constants.%self.patt.d2dab3.1 +// CHECK:STDOUT: %Transitive.lookup_impl_witness => constants.%Transitive.lookup_impl_witness.ab0b8d.1 +// CHECK:STDOUT: %impl.elem2 => constants.%impl.elem2.731f97.1 +// CHECK:STDOUT: %as_type => constants.%as_type.2fadd6.1 +// CHECK:STDOUT: %pattern_type.2 => constants.%pattern_type.ac0 +// CHECK:STDOUT: %c.param_patt => constants.%c.param_patt +// CHECK:STDOUT: %c.patt => constants.%c.patt +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: specific @Transitive.WithSelf.GetA(constants.%Self.744) { +// CHECK:STDOUT: %Self => constants.%Self.744 +// CHECK:STDOUT: %Self.as_type => constants.%Self.as_type.56c +// CHECK:STDOUT: %pattern_type.1 => constants.%pattern_type.68e728.1 +// CHECK:STDOUT: %self.param_patt => constants.%self.param_patt.e90fff.1 +// CHECK:STDOUT: %self.patt => constants.%self.patt.d2dab3.1 +// CHECK:STDOUT: %Transitive.lookup_impl_witness => constants.%Transitive.lookup_impl_witness.ab0b8d.1 +// CHECK:STDOUT: %impl.elem0 => constants.%impl.elem0.0439e7.1 +// CHECK:STDOUT: %as_type => constants.%as_type.6a024f.1 +// CHECK:STDOUT: %.1 => constants.%.2b1a45.1 +// CHECK:STDOUT: %pattern_type.2 => constants.%pattern_type.c73ac0.1 +// CHECK:STDOUT: %return.param_patt => constants.%return.param_patt.057e89.1 +// CHECK:STDOUT: %return.patt => constants.%return.patt.4e0711.1 +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: specific @G(constants.%T) { +// CHECK:STDOUT: %T.patt.loc6_7.2 => constants.%T.patt +// CHECK:STDOUT: %T.loc6_7.1 => constants.%T +// CHECK:STDOUT: %T.as_type.loc6_25.1 => constants.%T.as_type +// CHECK:STDOUT: %pattern_type.loc6 => constants.%pattern_type.68e728.2 +// CHECK:STDOUT: %t.param_patt.loc6_23.2 => constants.%t.param_patt +// CHECK:STDOUT: %t.patt.loc6_23.2 => constants.%t.patt +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: specific @Transitive.WithSelf(constants.%T) { +// CHECK:STDOUT: !definition: +// CHECK:STDOUT: %Self => constants.%T +// CHECK:STDOUT: %Transitive.lookup_impl_witness => constants.%Transitive.lookup_impl_witness.ab0b8d.2 +// CHECK:STDOUT: %impl.elem0 => constants.%impl.elem0.0439e7.2 +// CHECK:STDOUT: %impl.elem1 => constants.%impl.elem1.6be46c.2 +// CHECK:STDOUT: %Transitive.WithSelf.GetA.type => constants.%Transitive.WithSelf.GetA.type.0b3c58.2 +// CHECK:STDOUT: %Transitive.WithSelf.GetA => constants.%Transitive.WithSelf.GetA.e3e09c.2 +// CHECK:STDOUT: %Transitive.WithSelf.TakesC.type => constants.%Transitive.WithSelf.TakesC.type.d86d9f.2 +// CHECK:STDOUT: %Transitive.WithSelf.TakesC => constants.%Transitive.WithSelf.TakesC.f276cd.2 +// CHECK:STDOUT: %as_type.1 => constants.%as_type.dca436.2 +// CHECK:STDOUT: %as_type.2 => constants.%as_type.6a024f.2 +// CHECK:STDOUT: %eq.1 => constants.%eq.4be6e4.2 +// CHECK:STDOUT: %impl.elem2 => constants.%impl.elem2.731f97.2 +// CHECK:STDOUT: %as_type.3 => constants.%as_type.2fadd6.2 +// CHECK:STDOUT: %eq.2 => constants.%eq.033b19.2 +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: specific @Transitive.WithSelf.GetA(constants.%T) { +// CHECK:STDOUT: %Self => constants.%T +// CHECK:STDOUT: %Self.as_type => constants.%T.as_type +// CHECK:STDOUT: %pattern_type.1 => constants.%pattern_type.68e728.2 +// CHECK:STDOUT: %self.param_patt => constants.%self.param_patt.e90fff.2 +// CHECK:STDOUT: %self.patt => constants.%self.patt.d2dab3.2 +// CHECK:STDOUT: %Transitive.lookup_impl_witness => constants.%Transitive.lookup_impl_witness.ab0b8d.2 +// CHECK:STDOUT: %impl.elem0 => constants.%impl.elem0.0439e7.2 +// CHECK:STDOUT: %as_type => constants.%as_type.6a024f.2 +// CHECK:STDOUT: %.1 => constants.%.2b1a45.2 +// CHECK:STDOUT: %pattern_type.2 => constants.%pattern_type.c73ac0.2 +// CHECK:STDOUT: %return.param_patt => constants.%return.param_patt.057e89.2 +// CHECK:STDOUT: %return.patt => constants.%return.patt.4e0711.2 +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: --- fail_equivalent_impls_without_observe.carbon +// CHECK:STDOUT: +// CHECK:STDOUT: constants { +// CHECK:STDOUT: %type: type = facet_type [concrete] +// CHECK:STDOUT: %.Self: %type = symbolic_binding .Self [symbolic_self] +// CHECK:STDOUT: %P.type: type = facet_type <@P> [concrete] +// CHECK:STDOUT: %Self.104: %P.type = symbolic_binding Self, 0 [symbolic] +// CHECK:STDOUT: %P.WithSelf.InP.type: type = fn_type @P.WithSelf.InP, @P.WithSelf(%Self.104) [symbolic] +// CHECK:STDOUT: %P.WithSelf.InP: %P.WithSelf.InP.type = struct_value () [symbolic] +// CHECK:STDOUT: %Self.as_type.cc3: type = facet_access_type %Self.104 [symbolic] +// CHECK:STDOUT: %pattern_type.3ef: type = pattern_type %Self.as_type.cc3 [symbolic] +// CHECK:STDOUT: %self.param_patt.88d: %pattern_type.3ef = value_param_pattern [symbolic] +// CHECK:STDOUT: %self.patt.6de: %pattern_type.3ef = at_binding_pattern self, %self.param_patt.88d [symbolic] +// CHECK:STDOUT: %Q.type: type = facet_type <@Q> [concrete] +// CHECK:STDOUT: %Self.afd: %Q.type = symbolic_binding Self, 0 [symbolic] +// CHECK:STDOUT: %Q.WithSelf.InQ.type: type = fn_type @Q.WithSelf.InQ, @Q.WithSelf(%Self.afd) [symbolic] +// CHECK:STDOUT: %Q.WithSelf.InQ: %Q.WithSelf.InQ.type = struct_value () [symbolic] +// CHECK:STDOUT: %Self.as_type.430: type = facet_access_type %Self.afd [symbolic] +// CHECK:STDOUT: %pattern_type.ade: type = pattern_type %Self.as_type.430 [symbolic] +// CHECK:STDOUT: %self.param_patt.271: %pattern_type.ade = value_param_pattern [symbolic] +// CHECK:STDOUT: %self.patt.b5e: %pattern_type.ade = at_binding_pattern self, %self.param_patt.271 [symbolic] +// CHECK:STDOUT: %BitAndWith.type.a06: type = generic_interface_type @BitAndWith [concrete] +// CHECK:STDOUT: %empty_tuple.type: type = tuple_type () [concrete] +// CHECK:STDOUT: %BitAndWith.generic: %BitAndWith.type.a06 = struct_value () [concrete] +// CHECK:STDOUT: %BitAndWith.type.802: type = facet_type <@BitAndWith, @BitAndWith(type)> [concrete] +// CHECK:STDOUT: %BitAndWith.impl_witness: = impl_witness imports.%BitAndWith.impl_witness_table [concrete] +// CHECK:STDOUT: %BitAndWith.facet: %BitAndWith.type.802 = facet_value type, (%BitAndWith.impl_witness) [concrete] +// CHECK:STDOUT: %BitAndWith.WithSelf.Op.type.38f: type = fn_type @BitAndWith.WithSelf.Op, @BitAndWith.WithSelf(type, %BitAndWith.facet) [concrete] +// CHECK:STDOUT: %.d56: type = fn_type_with_self_type %BitAndWith.WithSelf.Op.type.38f, %BitAndWith.facet [concrete] +// CHECK:STDOUT: %type.as.BitAndWith.impl.Op.type: type = fn_type @type.as.BitAndWith.impl.Op [concrete] +// CHECK:STDOUT: %type.as.BitAndWith.impl.Op: %type.as.BitAndWith.impl.Op.type = struct_value () [concrete] +// CHECK:STDOUT: %type.as.BitAndWith.impl.Op.bound.dd7: = bound_method %P.type, %type.as.BitAndWith.impl.Op [concrete] +// CHECK:STDOUT: %facet_type.bc0: type = facet_type <@P & @Q> [concrete] +// CHECK:STDOUT: %R.type: type = facet_type <@R> [concrete] +// CHECK:STDOUT: %Self.be6: %R.type = symbolic_binding Self, 0 [symbolic] +// CHECK:STDOUT: %R.WithSelf.InR.type: type = fn_type @R.WithSelf.InR, @R.WithSelf(%Self.be6) [symbolic] +// CHECK:STDOUT: %R.WithSelf.InR: %R.WithSelf.InR.type = struct_value () [symbolic] +// CHECK:STDOUT: %Self.as_type.b02: type = facet_access_type %Self.be6 [symbolic] +// CHECK:STDOUT: %pattern_type.60e: type = pattern_type %Self.as_type.b02 [symbolic] +// CHECK:STDOUT: %self.param_patt.640: %pattern_type.60e = value_param_pattern [symbolic] +// CHECK:STDOUT: %self.patt.894: %pattern_type.60e = at_binding_pattern self, %self.param_patt.640 [symbolic] +// CHECK:STDOUT: %type.as.BitAndWith.impl.Op.bound.588: = bound_method %facet_type.bc0, %type.as.BitAndWith.impl.Op [concrete] +// CHECK:STDOUT: %facet_type.0b6: type = facet_type <@P & @Q & @R> [concrete] +// CHECK:STDOUT: %pattern_type.075: type = pattern_type %facet_type.0b6 [concrete] +// CHECK:STDOUT: %U.patt: %pattern_type.075 = symbolic_binding_pattern U, 0 [symbolic] +// CHECK:STDOUT: %U: %facet_type.0b6 = symbolic_binding U, 0 [symbolic] +// CHECK:STDOUT: %U.as_type: type = facet_access_type %U [symbolic] +// CHECK:STDOUT: %pattern_type.54d: type = pattern_type %U.as_type [symbolic] +// CHECK:STDOUT: %u.param_patt: %pattern_type.54d = value_param_pattern [symbolic] +// CHECK:STDOUT: %u.patt: %pattern_type.54d = at_binding_pattern u, %u.param_patt [symbolic] +// CHECK:STDOUT: %TakesPQR.type: type = fn_type @TakesPQR [concrete] +// CHECK:STDOUT: %TakesPQR: %TakesPQR.type = struct_value () [concrete] +// CHECK:STDOUT: %require_complete.192: = require_complete_type %U.as_type [symbolic] +// CHECK:STDOUT: %Transitive.type: type = facet_type <@Transitive> [concrete] +// CHECK:STDOUT: %Self.744: %Transitive.type = symbolic_binding Self, 0 [symbolic] +// CHECK:STDOUT: %Transitive.lookup_impl_witness.ab0b8d.1: = lookup_impl_witness %Self.744, @Transitive [symbolic] +// CHECK:STDOUT: %Destroy.type: type = facet_type <@Destroy> [concrete] +// CHECK:STDOUT: %facet_type.4c8: type = facet_type <@R & @Destroy where TODO> [concrete] +// CHECK:STDOUT: %impl.elem2.731f97.1: %facet_type.4c8 = impl_witness_access %Transitive.lookup_impl_witness.ab0b8d.1, element2 [symbolic] +// CHECK:STDOUT: %facet_type.130: type = facet_type <@Q & @Destroy where TODO> [concrete] +// CHECK:STDOUT: %impl.elem1.6be46c.1: %facet_type.130 = impl_witness_access %Transitive.lookup_impl_witness.ab0b8d.1, element1 [symbolic] +// CHECK:STDOUT: %eq.033b19.1 = observe_equivalent %impl.elem1.6be46c.1, %impl.elem2.731f97.1 [symbolic] +// CHECK:STDOUT: %as_type.2fadd6.1: type = facet_access_type %impl.elem2.731f97.1 [symbolic] +// CHECK:STDOUT: %facet_type.b1b: type = facet_type <@P & @Destroy> [concrete] +// CHECK:STDOUT: %impl.elem0.0439e7.1: %facet_type.b1b = impl_witness_access %Transitive.lookup_impl_witness.ab0b8d.1, element0 [symbolic] +// CHECK:STDOUT: %eq.4be6e4.1 = observe_equivalent %impl.elem0.0439e7.1, %impl.elem1.6be46c.1 [symbolic] +// CHECK:STDOUT: %as_type.6a024f.1: type = facet_access_type %impl.elem0.0439e7.1 [symbolic] +// CHECK:STDOUT: %as_type.dca436.1: type = facet_access_type %impl.elem1.6be46c.1 [symbolic] +// CHECK:STDOUT: %Transitive.WithSelf.TakesC.type.d86d9f.1: type = fn_type @Transitive.WithSelf.TakesC, @Transitive.WithSelf(%Self.744) [symbolic] +// CHECK:STDOUT: %Transitive.WithSelf.TakesC.f276cd.1: %Transitive.WithSelf.TakesC.type.d86d9f.1 = struct_value () [symbolic] +// CHECK:STDOUT: %Self.as_type.56c: type = facet_access_type %Self.744 [symbolic] +// CHECK:STDOUT: %pattern_type.68e728.1: type = pattern_type %Self.as_type.56c [symbolic] +// CHECK:STDOUT: %self.param_patt.e90fff.1: %pattern_type.68e728.1 = value_param_pattern [symbolic] +// CHECK:STDOUT: %self.patt.d2dab3.1: %pattern_type.68e728.1 = at_binding_pattern self, %self.param_patt.e90fff.1 [symbolic] +// CHECK:STDOUT: %pattern_type.ac0: type = pattern_type %as_type.2fadd6.1 [symbolic] +// CHECK:STDOUT: %c.param_patt: %pattern_type.ac0 = value_param_pattern [symbolic] +// CHECK:STDOUT: %c.patt: %pattern_type.ac0 = at_binding_pattern c, %c.param_patt [symbolic] +// CHECK:STDOUT: %Transitive.WithSelf.GetA.type.0b3c58.1: type = fn_type @Transitive.WithSelf.GetA, @Transitive.WithSelf(%Self.744) [symbolic] +// CHECK:STDOUT: %Transitive.WithSelf.GetA.e3e09c.1: %Transitive.WithSelf.GetA.type.0b3c58.1 = struct_value () [symbolic] +// CHECK:STDOUT: %pattern_type.c73ac0.1: type = pattern_type %as_type.6a024f.1 [symbolic] +// CHECK:STDOUT: %return.param_patt.057e89.1: %pattern_type.c73ac0.1 = out_param_pattern [symbolic] +// CHECK:STDOUT: %return.patt.4e0711.1: %pattern_type.c73ac0.1 = return_slot_pattern %return.param_patt.057e89.1, invalid [symbolic] +// CHECK:STDOUT: %.2b1a45.1: Core.Form = init_form %as_type.6a024f.1 [symbolic] +// CHECK:STDOUT: %pattern_type.bd9: type = pattern_type %Transitive.type [concrete] +// CHECK:STDOUT: %T.patt: %pattern_type.bd9 = symbolic_binding_pattern T, 0 [symbolic] +// CHECK:STDOUT: %T: %Transitive.type = symbolic_binding T, 0 [symbolic] +// CHECK:STDOUT: %T.as_type: type = facet_access_type %T [symbolic] +// CHECK:STDOUT: %pattern_type.68e728.2: type = pattern_type %T.as_type [symbolic] +// CHECK:STDOUT: %t.param_patt: %pattern_type.68e728.2 = value_param_pattern [symbolic] +// CHECK:STDOUT: %t.patt: %pattern_type.68e728.2 = at_binding_pattern t, %t.param_patt [symbolic] +// CHECK:STDOUT: %G.type: type = fn_type @G [concrete] +// CHECK:STDOUT: %G: %G.type = struct_value () [concrete] +// CHECK:STDOUT: %require_complete.fbd: = require_complete_type %T.as_type [symbolic] +// CHECK:STDOUT: %Transitive.lookup_impl_witness.ab0b8d.2: = lookup_impl_witness %T, @Transitive [symbolic] +// CHECK:STDOUT: %impl.elem0.0439e7.2: %facet_type.b1b = impl_witness_access %Transitive.lookup_impl_witness.ab0b8d.2, element0 [symbolic] +// CHECK:STDOUT: %impl.elem1.6be46c.2: %facet_type.130 = impl_witness_access %Transitive.lookup_impl_witness.ab0b8d.2, element1 [symbolic] +// CHECK:STDOUT: %Transitive.WithSelf.GetA.type.0b3c58.2: type = fn_type @Transitive.WithSelf.GetA, @Transitive.WithSelf(%T) [symbolic] +// CHECK:STDOUT: %Transitive.WithSelf.GetA.e3e09c.2: %Transitive.WithSelf.GetA.type.0b3c58.2 = struct_value () [symbolic] +// CHECK:STDOUT: %Transitive.WithSelf.TakesC.type.d86d9f.2: type = fn_type @Transitive.WithSelf.TakesC, @Transitive.WithSelf(%T) [symbolic] +// CHECK:STDOUT: %Transitive.WithSelf.TakesC.f276cd.2: %Transitive.WithSelf.TakesC.type.d86d9f.2 = struct_value () [symbolic] +// CHECK:STDOUT: %as_type.dca436.2: type = facet_access_type %impl.elem1.6be46c.2 [symbolic] +// CHECK:STDOUT: %as_type.6a024f.2: type = facet_access_type %impl.elem0.0439e7.2 [symbolic] +// CHECK:STDOUT: %eq.4be6e4.2 = observe_equivalent %impl.elem0.0439e7.2, %impl.elem1.6be46c.2 [symbolic] +// CHECK:STDOUT: %impl.elem2.731f97.2: %facet_type.4c8 = impl_witness_access %Transitive.lookup_impl_witness.ab0b8d.2, element2 [symbolic] +// CHECK:STDOUT: %as_type.2fadd6.2: type = facet_access_type %impl.elem2.731f97.2 [symbolic] +// CHECK:STDOUT: %eq.033b19.2 = observe_equivalent %impl.elem1.6be46c.2, %impl.elem2.731f97.2 [symbolic] +// CHECK:STDOUT: %Transitive.assoc_type: type = assoc_entity_type @Transitive [concrete] +// CHECK:STDOUT: %assoc0.7cd: %Transitive.assoc_type = assoc_entity element0, imports.%Main.import_ref.d38 [concrete] +// CHECK:STDOUT: %require_complete.c2d: = require_complete_type %as_type.6a024f.2 [symbolic] +// CHECK:STDOUT: %pattern_type.c73ac0.2: type = pattern_type %as_type.6a024f.2 [symbolic] +// CHECK:STDOUT: %a.patt: %pattern_type.c73ac0.2 = ref_binding_pattern a [symbolic] +// CHECK:STDOUT: %a.var_patt: %pattern_type.c73ac0.2 = var_pattern %a.patt [symbolic] +// CHECK:STDOUT: %assoc3: %Transitive.assoc_type = assoc_entity element3, imports.%Main.import_ref.06c [concrete] +// CHECK:STDOUT: %.657: type = fn_type_with_self_type %Transitive.WithSelf.GetA.type.0b3c58.2, %T [symbolic] +// CHECK:STDOUT: %impl.elem3: %.657 = impl_witness_access %Transitive.lookup_impl_witness.ab0b8d.2, element3 [symbolic] +// CHECK:STDOUT: %self.param_patt.e90fff.2: %pattern_type.68e728.2 = value_param_pattern [symbolic] +// CHECK:STDOUT: %self.patt.d2dab3.2: %pattern_type.68e728.2 = at_binding_pattern self, %self.param_patt.e90fff.2 [symbolic] +// CHECK:STDOUT: %.2b1a45.2: Core.Form = init_form %as_type.6a024f.2 [symbolic] +// CHECK:STDOUT: %return.param_patt.057e89.2: %pattern_type.c73ac0.2 = out_param_pattern [symbolic] +// CHECK:STDOUT: %return.patt.4e0711.2: %pattern_type.c73ac0.2 = return_slot_pattern %return.param_patt.057e89.2, invalid [symbolic] +// CHECK:STDOUT: %specific_impl_fn.72f: = specific_impl_function %impl.elem3, @Transitive.WithSelf.GetA(%T) [symbolic] +// CHECK:STDOUT: %Q.assoc_type: type = assoc_entity_type @Q [concrete] +// CHECK:STDOUT: %assoc0.6a1: %Q.assoc_type = assoc_entity element0, imports.%Main.import_ref.636 [concrete] +// CHECK:STDOUT: %Destroy.lookup_impl_witness: = lookup_impl_witness %impl.elem0.0439e7.2, @Destroy [symbolic] +// CHECK:STDOUT: %Destroy.facet: %Destroy.type = facet_value %as_type.6a024f.2, (%Destroy.lookup_impl_witness) [symbolic] +// CHECK:STDOUT: %Destroy.WithSelf.Op.type.5e1: type = fn_type @Destroy.WithSelf.Op, @Destroy.WithSelf(%Destroy.facet) [symbolic] +// CHECK:STDOUT: %.e75: type = fn_type_with_self_type %Destroy.WithSelf.Op.type.5e1, %Destroy.facet [symbolic] +// CHECK:STDOUT: %impl.elem0.678: %.e75 = impl_witness_access %Destroy.lookup_impl_witness, element0 [symbolic] +// CHECK:STDOUT: %specific_impl_fn.e8e: = specific_impl_function %impl.elem0.678, @Destroy.WithSelf.Op(%Destroy.facet) [symbolic] +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: imports { +// CHECK:STDOUT: %Main.P: type = import_ref Main//transitive, P, loaded [concrete = constants.%P.type] +// CHECK:STDOUT: %Main.Q: type = import_ref Main//transitive, Q, loaded [concrete = constants.%Q.type] +// CHECK:STDOUT: %Main.R: type = import_ref Main//transitive, R, loaded [concrete = constants.%R.type] +// CHECK:STDOUT: %Main.Transitive: type = import_ref Main//transitive, Transitive, loaded [concrete = constants.%Transitive.type] +// CHECK:STDOUT: %Core.048aa3.1: = namespace file.%Core.import, [concrete] { +// CHECK:STDOUT: .BitAndWith = %Core.BitAndWith +// CHECK:STDOUT: .Destroy = %Core.Destroy +// CHECK:STDOUT: import Core//prelude +// CHECK:STDOUT: import Core//prelude/... +// CHECK:STDOUT: } +// CHECK:STDOUT: %Main.import_ref.fec = import_ref Main//transitive, loc3_27, unloaded +// CHECK:STDOUT: %Main.InP = import_ref Main//transitive, InP, unloaded +// CHECK:STDOUT: %Main.import_ref.aef2fa.2: %P.type = import_ref Main//transitive, loc3_13, loaded [symbolic = constants.%Self.104] +// CHECK:STDOUT: %Main.import_ref.96f = import_ref Main//transitive, loc3_13, unloaded +// CHECK:STDOUT: %Main.import_ref.e2a: %Q.assoc_type = import_ref Main//transitive, loc4_27, loaded [concrete = constants.%assoc0.6a1] +// CHECK:STDOUT: %Main.InQ = import_ref Main//transitive, InQ, unloaded +// CHECK:STDOUT: %Main.import_ref.c0a1f5.2: %Q.type = import_ref Main//transitive, loc4_13, loaded [symbolic = constants.%Self.afd] +// CHECK:STDOUT: %Main.import_ref.4f3 = import_ref Main//transitive, loc4_13, unloaded +// CHECK:STDOUT: %Core.BitAndWith: %BitAndWith.type.a06 = import_ref Core//prelude/parts/as, BitAndWith, loaded [concrete = constants.%BitAndWith.generic] +// CHECK:STDOUT: %Core.import_ref.9c3: %type.as.BitAndWith.impl.Op.type = import_ref Core//prelude/parts/as, loc{{\d+_\d+}}, loaded [concrete = constants.%type.as.BitAndWith.impl.Op] +// CHECK:STDOUT: %BitAndWith.impl_witness_table = impl_witness_table (%Core.import_ref.9c3), @type.as.BitAndWith.impl [concrete] +// CHECK:STDOUT: %Main.import_ref.0ce = import_ref Main//transitive, loc5_27, unloaded +// CHECK:STDOUT: %Main.InR = import_ref Main//transitive, InR, unloaded +// CHECK:STDOUT: %Main.import_ref.f6968b.2: %R.type = import_ref Main//transitive, loc5_13, loaded [symbolic = constants.%Self.be6] +// CHECK:STDOUT: %Main.import_ref.659 = import_ref Main//transitive, loc5_13, unloaded +// CHECK:STDOUT: %Main.import_ref.72c: %Transitive.assoc_type = import_ref Main//transitive, loc8_8, loaded [concrete = constants.%assoc0.7cd] +// CHECK:STDOUT: %Main.import_ref.f7f = import_ref Main//transitive, loc9_8, unloaded +// CHECK:STDOUT: %Main.import_ref.71d = import_ref Main//transitive, loc10_8, unloaded +// CHECK:STDOUT: %Main.import_ref.5c5: %Transitive.assoc_type = import_ref Main//transitive, loc12_21, loaded [concrete = constants.%assoc3] +// CHECK:STDOUT: %Main.import_ref.ae2 = import_ref Main//transitive, loc13_24, unloaded +// CHECK:STDOUT: %Main.A = import_ref Main//transitive, A, unloaded +// CHECK:STDOUT: %Main.B = import_ref Main//transitive, B, unloaded +// CHECK:STDOUT: %Main.C = import_ref Main//transitive, C, unloaded +// CHECK:STDOUT: %Main.GetA = import_ref Main//transitive, GetA, unloaded +// CHECK:STDOUT: %Main.TakesC = import_ref Main//transitive, TakesC, unloaded +// CHECK:STDOUT: %Main.import_ref.df6636.2: %Transitive.type = import_ref Main//transitive, loc7_22, loaded [symbolic = constants.%Self.744] +// CHECK:STDOUT: %Main.import_ref.df6636.3: %Transitive.type = import_ref Main//transitive, loc7_22, loaded [symbolic = constants.%Self.744] +// CHECK:STDOUT: %Main.import_ref.0d5 = import_ref Main//transitive, loc7_22, unloaded +// CHECK:STDOUT: %Main.import_ref.d38: %facet_type.b1b = import_ref Main//transitive, loc8_8, loaded [concrete = %A] +// CHECK:STDOUT: %A: %facet_type.b1b = assoc_const_decl @A [concrete] {} +// CHECK:STDOUT: %Main.import_ref.06c: @Transitive.WithSelf.%Transitive.WithSelf.GetA.type (%Transitive.WithSelf.GetA.type.0b3c58.1) = import_ref Main//transitive, loc12_21, loaded [symbolic = @Transitive.WithSelf.%Transitive.WithSelf.GetA (constants.%Transitive.WithSelf.GetA.e3e09c.1)] +// CHECK:STDOUT: %Main.import_ref.636: @Q.WithSelf.%Q.WithSelf.InQ.type (%Q.WithSelf.InQ.type) = import_ref Main//transitive, loc4_27, loaded [symbolic = @Q.WithSelf.%Q.WithSelf.InQ (constants.%Q.WithSelf.InQ)] +// CHECK:STDOUT: %Core.Destroy: type = import_ref Core//prelude/parts/destroy, Destroy, loaded [concrete = constants.%Destroy.type] +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: file { +// CHECK:STDOUT: package: = namespace [concrete] { +// CHECK:STDOUT: .P = imports.%Main.P +// CHECK:STDOUT: .Q = imports.%Main.Q +// CHECK:STDOUT: .R = imports.%Main.R +// CHECK:STDOUT: .Transitive = imports.%Main.Transitive +// CHECK:STDOUT: .Core = imports.%Core.048aa3.1 +// CHECK:STDOUT: .TakesPQR = %TakesPQR.decl +// CHECK:STDOUT: .G = %G.decl +// CHECK:STDOUT: } +// CHECK:STDOUT: %Core.import = import Core +// CHECK:STDOUT: %default.import = import +// CHECK:STDOUT: %TakesPQR.decl: %TakesPQR.type = fn_decl @TakesPQR [concrete = constants.%TakesPQR] { +// CHECK:STDOUT: %U.patt.loc5_14.1: %pattern_type.075 = symbolic_binding_pattern U, 0 [symbolic = %U.patt.loc5_14.2 (constants.%U.patt)] +// CHECK:STDOUT: %u.param_patt.loc5_36.1: @TakesPQR.%pattern_type (%pattern_type.54d) = value_param_pattern [symbolic = %u.param_patt.loc5_36.2 (constants.%u.param_patt)] +// CHECK:STDOUT: %u.patt.loc5_36.1: @TakesPQR.%pattern_type (%pattern_type.54d) = at_binding_pattern u, %u.param_patt.loc5_36.1 [symbolic = %u.patt.loc5_36.2 (constants.%u.patt)] +// CHECK:STDOUT: } { +// CHECK:STDOUT: %.loc5_23.1: type = splice_block %.loc5_23.3 [concrete = constants.%facet_type.0b6] { +// CHECK:STDOUT: %.Self: %type = symbolic_binding .Self [symbolic_self = constants.%.Self] +// CHECK:STDOUT: %P.ref: type = name_ref P, imports.%Main.P [concrete = constants.%P.type] +// CHECK:STDOUT: %Q.ref: type = name_ref Q, imports.%Main.Q [concrete = constants.%Q.type] +// CHECK:STDOUT: %impl.elem0.loc5_19: %.d56 = impl_witness_access constants.%BitAndWith.impl_witness, element0 [concrete = constants.%type.as.BitAndWith.impl.Op] +// CHECK:STDOUT: %bound_method.loc5_19: = bound_method %P.ref, %impl.elem0.loc5_19 [concrete = constants.%type.as.BitAndWith.impl.Op.bound.dd7] +// CHECK:STDOUT: %type.as.BitAndWith.impl.Op.call.loc5_19: init type = call %bound_method.loc5_19(%P.ref, %Q.ref) [concrete = constants.%facet_type.bc0] +// CHECK:STDOUT: %R.ref: type = name_ref R, imports.%Main.R [concrete = constants.%R.type] +// CHECK:STDOUT: %impl.elem0.loc5_23: %.d56 = impl_witness_access constants.%BitAndWith.impl_witness, element0 [concrete = constants.%type.as.BitAndWith.impl.Op] +// CHECK:STDOUT: %bound_method.loc5_23: = bound_method %type.as.BitAndWith.impl.Op.call.loc5_19, %impl.elem0.loc5_23 [concrete = constants.%type.as.BitAndWith.impl.Op.bound.588] +// CHECK:STDOUT: %.loc5_19.1: type = value_of_initializer %type.as.BitAndWith.impl.Op.call.loc5_19 [concrete = constants.%facet_type.bc0] +// CHECK:STDOUT: %.loc5_19.2: type = converted %type.as.BitAndWith.impl.Op.call.loc5_19, %.loc5_19.1 [concrete = constants.%facet_type.bc0] +// CHECK:STDOUT: %type.as.BitAndWith.impl.Op.call.loc5_23: init type = call %bound_method.loc5_23(%.loc5_19.2, %R.ref) [concrete = constants.%facet_type.0b6] +// CHECK:STDOUT: %.loc5_23.2: type = value_of_initializer %type.as.BitAndWith.impl.Op.call.loc5_23 [concrete = constants.%facet_type.0b6] +// CHECK:STDOUT: %.loc5_23.3: type = converted %type.as.BitAndWith.impl.Op.call.loc5_23, %.loc5_23.2 [concrete = constants.%facet_type.0b6] +// CHECK:STDOUT: } +// CHECK:STDOUT: %U.loc5_14.2: %facet_type.0b6 = symbolic_binding U, 0 [symbolic = %U.loc5_14.1 (constants.%U)] +// CHECK:STDOUT: %u.param: @TakesPQR.%U.as_type.loc5_38.1 (%U.as_type) = value_param call_param0 +// CHECK:STDOUT: %.loc5_38.1: type = splice_block %.loc5_38.2 [symbolic = %U.as_type.loc5_38.1 (constants.%U.as_type)] { +// CHECK:STDOUT: %U.ref: %facet_type.0b6 = name_ref U, %U.loc5_14.2 [symbolic = %U.loc5_14.1 (constants.%U)] +// CHECK:STDOUT: %U.as_type.loc5_38.2: type = facet_access_type %U.ref [symbolic = %U.as_type.loc5_38.1 (constants.%U.as_type)] +// CHECK:STDOUT: %.loc5_38.2: type = converted %U.ref, %U.as_type.loc5_38.2 [symbolic = %U.as_type.loc5_38.1 (constants.%U.as_type)] +// CHECK:STDOUT: } +// CHECK:STDOUT: %u: @TakesPQR.%U.as_type.loc5_38.1 (%U.as_type) = wrapper_binding u, %u.param +// CHECK:STDOUT: } +// CHECK:STDOUT: %G.decl: %G.type = fn_decl @G [concrete = constants.%G] { +// CHECK:STDOUT: %T.patt.loc6_7.1: %pattern_type.bd9 = symbolic_binding_pattern T, 0 [symbolic = %T.patt.loc6_7.2 (constants.%T.patt)] +// CHECK:STDOUT: %t.param_patt.loc6_23.1: @G.%pattern_type.loc6 (%pattern_type.68e728.2) = value_param_pattern [symbolic = %t.param_patt.loc6_23.2 (constants.%t.param_patt)] +// CHECK:STDOUT: %t.patt.loc6_23.1: @G.%pattern_type.loc6 (%pattern_type.68e728.2) = at_binding_pattern t, %t.param_patt.loc6_23.1 [symbolic = %t.patt.loc6_23.2 (constants.%t.patt)] +// CHECK:STDOUT: } { +// CHECK:STDOUT: %.loc6_10: type = splice_block %Transitive.ref [concrete = constants.%Transitive.type] { +// CHECK:STDOUT: %.Self: %type = symbolic_binding .Self [symbolic_self = constants.%.Self] +// CHECK:STDOUT: %Transitive.ref: type = name_ref Transitive, imports.%Main.Transitive [concrete = constants.%Transitive.type] +// CHECK:STDOUT: } +// CHECK:STDOUT: %T.loc6_7.2: %Transitive.type = symbolic_binding T, 0 [symbolic = %T.loc6_7.1 (constants.%T)] +// CHECK:STDOUT: %t.param: @G.%T.as_type.loc6_25.1 (%T.as_type) = value_param call_param0 +// CHECK:STDOUT: %.loc6_25.1: type = splice_block %.loc6_25.2 [symbolic = %T.as_type.loc6_25.1 (constants.%T.as_type)] { +// CHECK:STDOUT: %T.ref.loc6: %Transitive.type = name_ref T, %T.loc6_7.2 [symbolic = %T.loc6_7.1 (constants.%T)] +// CHECK:STDOUT: %T.as_type.loc6_25.2: type = facet_access_type %T.ref.loc6 [symbolic = %T.as_type.loc6_25.1 (constants.%T.as_type)] +// CHECK:STDOUT: %.loc6_25.2: type = converted %T.ref.loc6, %T.as_type.loc6_25.2 [symbolic = %T.as_type.loc6_25.1 (constants.%T.as_type)] +// CHECK:STDOUT: } +// CHECK:STDOUT: %t: @G.%T.as_type.loc6_25.1 (%T.as_type) = wrapper_binding t, %t.param +// CHECK:STDOUT: } +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: interface @P [from "transitive.carbon"] { +// CHECK:STDOUT: !members: +// CHECK:STDOUT: .Self = imports.%Main.import_ref.96f +// CHECK:STDOUT: .InP = imports.%Main.import_ref.fec +// CHECK:STDOUT: witness = (imports.%Main.InP) +// CHECK:STDOUT: +// CHECK:STDOUT: !requires: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: interface @Q [from "transitive.carbon"] { +// CHECK:STDOUT: !members: +// CHECK:STDOUT: .Self = imports.%Main.import_ref.4f3 +// CHECK:STDOUT: .InQ = imports.%Main.import_ref.e2a +// CHECK:STDOUT: witness = (imports.%Main.InQ) +// CHECK:STDOUT: +// CHECK:STDOUT: !requires: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: interface @R [from "transitive.carbon"] { +// CHECK:STDOUT: !members: +// CHECK:STDOUT: .Self = imports.%Main.import_ref.659 +// CHECK:STDOUT: .InR = imports.%Main.import_ref.0ce +// CHECK:STDOUT: witness = (imports.%Main.InR) +// CHECK:STDOUT: +// CHECK:STDOUT: !requires: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: interface @Transitive [from "transitive.carbon"] { +// CHECK:STDOUT: !members: +// CHECK:STDOUT: .Self = imports.%Main.import_ref.0d5 +// CHECK:STDOUT: .A = imports.%Main.import_ref.72c +// CHECK:STDOUT: .B = imports.%Main.import_ref.f7f +// CHECK:STDOUT: .C = imports.%Main.import_ref.71d +// CHECK:STDOUT: .GetA = imports.%Main.import_ref.5c5 +// CHECK:STDOUT: .TakesC = imports.%Main.import_ref.ae2 +// CHECK:STDOUT: witness = (imports.%Main.A, imports.%Main.B, imports.%Main.C, imports.%Main.GetA, imports.%Main.TakesC) +// CHECK:STDOUT: +// CHECK:STDOUT: !requires: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: +// CHECK:STDOUT: @Transitive.observe { +// CHECK:STDOUT: observe constants.%impl.elem0.0439e7.1 == constants.%impl.elem1.6be46c.1 == constants.%impl.elem2.731f97.1 +// CHECK:STDOUT: } +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: generic fn @P.WithSelf.InP(imports.%Main.import_ref.aef2fa.2: %P.type) [from "transitive.carbon"] { +// CHECK:STDOUT: %Self: %P.type = symbolic_binding Self, 0 [symbolic = %Self (constants.%Self.104)] +// CHECK:STDOUT: %Self.as_type: type = facet_access_type %Self [symbolic = %Self.as_type (constants.%Self.as_type.cc3)] +// CHECK:STDOUT: %pattern_type: type = pattern_type %Self.as_type [symbolic = %pattern_type (constants.%pattern_type.3ef)] +// CHECK:STDOUT: %self.param_patt: @P.WithSelf.InP.%pattern_type (%pattern_type.3ef) = value_param_pattern [symbolic = %self.param_patt (constants.%self.param_patt.88d)] +// CHECK:STDOUT: %self.patt: @P.WithSelf.InP.%pattern_type (%pattern_type.3ef) = at_binding_pattern self, %self.param_patt [symbolic = %self.patt (constants.%self.patt.6de)] +// CHECK:STDOUT: +// CHECK:STDOUT: fn; +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: generic fn @Q.WithSelf.InQ(imports.%Main.import_ref.c0a1f5.2: %Q.type) [from "transitive.carbon"] { +// CHECK:STDOUT: %Self: %Q.type = symbolic_binding Self, 0 [symbolic = %Self (constants.%Self.afd)] +// CHECK:STDOUT: %Self.as_type: type = facet_access_type %Self [symbolic = %Self.as_type (constants.%Self.as_type.430)] +// CHECK:STDOUT: %pattern_type: type = pattern_type %Self.as_type [symbolic = %pattern_type (constants.%pattern_type.ade)] +// CHECK:STDOUT: %self.param_patt: @Q.WithSelf.InQ.%pattern_type (%pattern_type.ade) = value_param_pattern [symbolic = %self.param_patt (constants.%self.param_patt.271)] +// CHECK:STDOUT: %self.patt: @Q.WithSelf.InQ.%pattern_type (%pattern_type.ade) = at_binding_pattern self, %self.param_patt [symbolic = %self.patt (constants.%self.patt.b5e)] +// CHECK:STDOUT: +// CHECK:STDOUT: fn; +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: generic fn @R.WithSelf.InR(imports.%Main.import_ref.f6968b.2: %R.type) [from "transitive.carbon"] { +// CHECK:STDOUT: %Self: %R.type = symbolic_binding Self, 0 [symbolic = %Self (constants.%Self.be6)] +// CHECK:STDOUT: %Self.as_type: type = facet_access_type %Self [symbolic = %Self.as_type (constants.%Self.as_type.b02)] +// CHECK:STDOUT: %pattern_type: type = pattern_type %Self.as_type [symbolic = %pattern_type (constants.%pattern_type.60e)] +// CHECK:STDOUT: %self.param_patt: @R.WithSelf.InR.%pattern_type (%pattern_type.60e) = value_param_pattern [symbolic = %self.param_patt (constants.%self.param_patt.640)] +// CHECK:STDOUT: %self.patt: @R.WithSelf.InR.%pattern_type (%pattern_type.60e) = at_binding_pattern self, %self.param_patt [symbolic = %self.patt (constants.%self.patt.894)] +// CHECK:STDOUT: +// CHECK:STDOUT: fn; +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: generic fn @TakesPQR(%U.loc5_14.2: %facet_type.0b6) { +// CHECK:STDOUT: %U.patt.loc5_14.2: %pattern_type.075 = symbolic_binding_pattern U, 0 [symbolic = %U.patt.loc5_14.2 (constants.%U.patt)] +// CHECK:STDOUT: %U.loc5_14.1: %facet_type.0b6 = symbolic_binding U, 0 [symbolic = %U.loc5_14.1 (constants.%U)] +// CHECK:STDOUT: %U.as_type.loc5_38.1: type = facet_access_type %U.loc5_14.1 [symbolic = %U.as_type.loc5_38.1 (constants.%U.as_type)] +// CHECK:STDOUT: %pattern_type: type = pattern_type %U.as_type.loc5_38.1 [symbolic = %pattern_type (constants.%pattern_type.54d)] +// CHECK:STDOUT: %u.param_patt.loc5_36.2: @TakesPQR.%pattern_type (%pattern_type.54d) = value_param_pattern [symbolic = %u.param_patt.loc5_36.2 (constants.%u.param_patt)] +// CHECK:STDOUT: %u.patt.loc5_36.2: @TakesPQR.%pattern_type (%pattern_type.54d) = at_binding_pattern u, %u.param_patt.loc5_36.2 [symbolic = %u.patt.loc5_36.2 (constants.%u.patt)] +// CHECK:STDOUT: +// CHECK:STDOUT: !definition: +// CHECK:STDOUT: %require_complete: = require_complete_type %U.as_type.loc5_38.1 [symbolic = %require_complete (constants.%require_complete.192)] +// CHECK:STDOUT: +// CHECK:STDOUT: fn(%u.param: @TakesPQR.%U.as_type.loc5_38.1 (%U.as_type)) { +// CHECK:STDOUT: !entry: +// CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: +// CHECK:STDOUT: } +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: generic fn @Transitive.WithSelf.TakesC(imports.%Main.import_ref.df6636.2: %Transitive.type) [from "transitive.carbon"] { +// CHECK:STDOUT: %Self: %Transitive.type = symbolic_binding Self, 0 [symbolic = %Self (constants.%Self.744)] +// CHECK:STDOUT: %Self.as_type: type = facet_access_type %Self [symbolic = %Self.as_type (constants.%Self.as_type.56c)] +// CHECK:STDOUT: %pattern_type.1: type = pattern_type %Self.as_type [symbolic = %pattern_type.1 (constants.%pattern_type.68e728.1)] +// CHECK:STDOUT: %self.param_patt: @Transitive.WithSelf.TakesC.%pattern_type.1 (%pattern_type.68e728.1) = value_param_pattern [symbolic = %self.param_patt (constants.%self.param_patt.e90fff.1)] +// CHECK:STDOUT: %self.patt: @Transitive.WithSelf.TakesC.%pattern_type.1 (%pattern_type.68e728.1) = at_binding_pattern self, %self.param_patt [symbolic = %self.patt (constants.%self.patt.d2dab3.1)] +// CHECK:STDOUT: %Transitive.lookup_impl_witness: = lookup_impl_witness %Self, @Transitive [symbolic = %Transitive.lookup_impl_witness (constants.%Transitive.lookup_impl_witness.ab0b8d.1)] +// CHECK:STDOUT: %impl.elem2: %facet_type.4c8 = impl_witness_access %Transitive.lookup_impl_witness, element2 [symbolic = %impl.elem2 (constants.%impl.elem2.731f97.1)] +// CHECK:STDOUT: %as_type: type = facet_access_type %impl.elem2 [symbolic = %as_type (constants.%as_type.2fadd6.1)] +// CHECK:STDOUT: %pattern_type.2: type = pattern_type %as_type [symbolic = %pattern_type.2 (constants.%pattern_type.ac0)] +// CHECK:STDOUT: %c.param_patt: @Transitive.WithSelf.TakesC.%pattern_type.2 (%pattern_type.ac0) = value_param_pattern [symbolic = %c.param_patt (constants.%c.param_patt)] +// CHECK:STDOUT: %c.patt: @Transitive.WithSelf.TakesC.%pattern_type.2 (%pattern_type.ac0) = at_binding_pattern c, %c.param_patt [symbolic = %c.patt (constants.%c.patt)] +// CHECK:STDOUT: +// CHECK:STDOUT: fn; +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: generic fn @Transitive.WithSelf.GetA(imports.%Main.import_ref.df6636.3: %Transitive.type) [from "transitive.carbon"] { +// CHECK:STDOUT: %Self: %Transitive.type = symbolic_binding Self, 0 [symbolic = %Self (constants.%Self.744)] +// CHECK:STDOUT: %Self.as_type: type = facet_access_type %Self [symbolic = %Self.as_type (constants.%Self.as_type.56c)] +// CHECK:STDOUT: %pattern_type.1: type = pattern_type %Self.as_type [symbolic = %pattern_type.1 (constants.%pattern_type.68e728.1)] +// CHECK:STDOUT: %self.param_patt: @Transitive.WithSelf.GetA.%pattern_type.1 (%pattern_type.68e728.1) = value_param_pattern [symbolic = %self.param_patt (constants.%self.param_patt.e90fff.1)] +// CHECK:STDOUT: %self.patt: @Transitive.WithSelf.GetA.%pattern_type.1 (%pattern_type.68e728.1) = at_binding_pattern self, %self.param_patt [symbolic = %self.patt (constants.%self.patt.d2dab3.1)] +// CHECK:STDOUT: %Transitive.lookup_impl_witness: = lookup_impl_witness %Self, @Transitive [symbolic = %Transitive.lookup_impl_witness (constants.%Transitive.lookup_impl_witness.ab0b8d.1)] +// CHECK:STDOUT: %impl.elem0: %facet_type.b1b = impl_witness_access %Transitive.lookup_impl_witness, element0 [symbolic = %impl.elem0 (constants.%impl.elem0.0439e7.1)] +// CHECK:STDOUT: %as_type: type = facet_access_type %impl.elem0 [symbolic = %as_type (constants.%as_type.6a024f.1)] +// CHECK:STDOUT: %.1: Core.Form = init_form %as_type [symbolic = %.1 (constants.%.2b1a45.1)] +// CHECK:STDOUT: %pattern_type.2: type = pattern_type %as_type [symbolic = %pattern_type.2 (constants.%pattern_type.c73ac0.1)] +// CHECK:STDOUT: %return.param_patt: @Transitive.WithSelf.GetA.%pattern_type.2 (%pattern_type.c73ac0.1) = out_param_pattern [symbolic = %return.param_patt (constants.%return.param_patt.057e89.1)] +// CHECK:STDOUT: %return.patt: @Transitive.WithSelf.GetA.%pattern_type.2 (%pattern_type.c73ac0.1) = return_slot_pattern %return.param_patt, invalid [symbolic = %return.patt (constants.%return.patt.4e0711.1)] +// CHECK:STDOUT: +// CHECK:STDOUT: fn; +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: generic fn @G(%T.loc6_7.2: %Transitive.type) { +// CHECK:STDOUT: %T.patt.loc6_7.2: %pattern_type.bd9 = symbolic_binding_pattern T, 0 [symbolic = %T.patt.loc6_7.2 (constants.%T.patt)] +// CHECK:STDOUT: %T.loc6_7.1: %Transitive.type = symbolic_binding T, 0 [symbolic = %T.loc6_7.1 (constants.%T)] +// CHECK:STDOUT: %T.as_type.loc6_25.1: type = facet_access_type %T.loc6_7.1 [symbolic = %T.as_type.loc6_25.1 (constants.%T.as_type)] +// CHECK:STDOUT: %pattern_type.loc6: type = pattern_type %T.as_type.loc6_25.1 [symbolic = %pattern_type.loc6 (constants.%pattern_type.68e728.2)] +// CHECK:STDOUT: %t.param_patt.loc6_23.2: @G.%pattern_type.loc6 (%pattern_type.68e728.2) = value_param_pattern [symbolic = %t.param_patt.loc6_23.2 (constants.%t.param_patt)] +// CHECK:STDOUT: %t.patt.loc6_23.2: @G.%pattern_type.loc6 (%pattern_type.68e728.2) = at_binding_pattern t, %t.param_patt.loc6_23.2 [symbolic = %t.patt.loc6_23.2 (constants.%t.patt)] +// CHECK:STDOUT: +// CHECK:STDOUT: !definition: +// CHECK:STDOUT: %require_complete.loc6: = require_complete_type %T.as_type.loc6_25.1 [symbolic = %require_complete.loc6 (constants.%require_complete.fbd)] +// CHECK:STDOUT: %Transitive.lookup_impl_witness: = lookup_impl_witness %T.loc6_7.1, @Transitive [symbolic = %Transitive.lookup_impl_witness (constants.%Transitive.lookup_impl_witness.ab0b8d.2)] +// CHECK:STDOUT: %impl.elem0.loc7_11.2: %facet_type.b1b = impl_witness_access %Transitive.lookup_impl_witness, element0 [symbolic = %impl.elem0.loc7_11.2 (constants.%impl.elem0.0439e7.2)] +// CHECK:STDOUT: %as_type.loc7_11.2: type = facet_access_type %impl.elem0.loc7_11.2 [symbolic = %as_type.loc7_11.2 (constants.%as_type.6a024f.2)] +// CHECK:STDOUT: %require_complete.loc7: = require_complete_type %as_type.loc7_11.2 [symbolic = %require_complete.loc7 (constants.%require_complete.c2d)] +// CHECK:STDOUT: %pattern_type.loc7: type = pattern_type %as_type.loc7_11.2 [symbolic = %pattern_type.loc7 (constants.%pattern_type.c73ac0.2)] +// CHECK:STDOUT: %a.patt.loc7_8.2: @G.%pattern_type.loc7 (%pattern_type.c73ac0.2) = ref_binding_pattern a [symbolic = %a.patt.loc7_8.2 (constants.%a.patt)] +// CHECK:STDOUT: %a.var_patt.loc7_3.2: @G.%pattern_type.loc7 (%pattern_type.c73ac0.2) = var_pattern %a.patt.loc7_8.2 [symbolic = %a.var_patt.loc7_3.2 (constants.%a.var_patt)] +// CHECK:STDOUT: %Transitive.WithSelf.GetA.type: type = fn_type @Transitive.WithSelf.GetA, @Transitive.WithSelf(%T.loc6_7.1) [symbolic = %Transitive.WithSelf.GetA.type (constants.%Transitive.WithSelf.GetA.type.0b3c58.2)] +// CHECK:STDOUT: %.loc7_17: type = fn_type_with_self_type %Transitive.WithSelf.GetA.type, %T.loc6_7.1 [symbolic = %.loc7_17 (constants.%.657)] +// CHECK:STDOUT: %impl.elem3.loc7_17.2: @G.%.loc7_17 (%.657) = impl_witness_access %Transitive.lookup_impl_witness, element3 [symbolic = %impl.elem3.loc7_17.2 (constants.%impl.elem3)] +// CHECK:STDOUT: %specific_impl_fn.loc7_17.2: = specific_impl_function %impl.elem3.loc7_17.2, @Transitive.WithSelf.GetA(%T.loc6_7.1) [symbolic = %specific_impl_fn.loc7_17.2 (constants.%specific_impl_fn.72f)] +// CHECK:STDOUT: %Destroy.lookup_impl_witness: = lookup_impl_witness %impl.elem0.loc7_11.2, @Destroy [symbolic = %Destroy.lookup_impl_witness (constants.%Destroy.lookup_impl_witness)] +// CHECK:STDOUT: %Destroy.facet.loc7_3.3: %Destroy.type = facet_value %as_type.loc7_11.2, (%Destroy.lookup_impl_witness) [symbolic = %Destroy.facet.loc7_3.3 (constants.%Destroy.facet)] +// CHECK:STDOUT: %Destroy.WithSelf.Op.type: type = fn_type @Destroy.WithSelf.Op, @Destroy.WithSelf(%Destroy.facet.loc7_3.3) [symbolic = %Destroy.WithSelf.Op.type (constants.%Destroy.WithSelf.Op.type.5e1)] +// CHECK:STDOUT: %.loc7_3.4: type = fn_type_with_self_type %Destroy.WithSelf.Op.type, %Destroy.facet.loc7_3.3 [symbolic = %.loc7_3.4 (constants.%.e75)] +// CHECK:STDOUT: %impl.elem0.loc7_3.2: @G.%.loc7_3.4 (%.e75) = impl_witness_access %Destroy.lookup_impl_witness, element0 [symbolic = %impl.elem0.loc7_3.2 (constants.%impl.elem0.678)] +// CHECK:STDOUT: %specific_impl_fn.loc7_3.2: = specific_impl_function %impl.elem0.loc7_3.2, @Destroy.WithSelf.Op(%Destroy.facet.loc7_3.3) [symbolic = %specific_impl_fn.loc7_3.2 (constants.%specific_impl_fn.e8e)] +// CHECK:STDOUT: +// CHECK:STDOUT: fn(%t.param: @G.%T.as_type.loc6_25.1 (%T.as_type)) { +// CHECK:STDOUT: !entry: +// CHECK:STDOUT: %a.var: ref @G.%as_type.loc7_11.2 (%as_type.6a024f.2) = var_storage %a.var_patt.loc7_3.1 +// CHECK:STDOUT: %t.ref: @G.%T.as_type.loc6_25.1 (%T.as_type) = name_ref t, %t +// CHECK:STDOUT: %GetA.ref: %Transitive.assoc_type = name_ref GetA, imports.%Main.import_ref.5c5 [concrete = constants.%assoc3] +// CHECK:STDOUT: %impl.elem3.loc7_17.1: @G.%.loc7_17 (%.657) = impl_witness_access constants.%Transitive.lookup_impl_witness.ab0b8d.2, element3 [symbolic = %impl.elem3.loc7_17.2 (constants.%impl.elem3)] +// CHECK:STDOUT: %bound_method.loc7_17: = bound_method %t.ref, %impl.elem3.loc7_17.1 +// CHECK:STDOUT: %.loc7_23.1: %Transitive.type = converted constants.%T.as_type, constants.%T [symbolic = %T.loc6_7.1 (constants.%T)] +// CHECK:STDOUT: %.loc7_23.2: %Transitive.type = converted constants.%T.as_type, constants.%T [symbolic = %T.loc6_7.1 (constants.%T)] +// CHECK:STDOUT: %specific_impl_fn.loc7_17.1: = specific_impl_function %impl.elem3.loc7_17.1, @Transitive.WithSelf.GetA(constants.%T) [symbolic = %specific_impl_fn.loc7_17.2 (constants.%specific_impl_fn.72f)] +// CHECK:STDOUT: %bound_method.loc7_23: = bound_method %t.ref, %specific_impl_fn.loc7_17.1 +// CHECK:STDOUT: %.loc7_3.1: ref @G.%as_type.loc7_11.2 (%as_type.6a024f.2) = splice_block %a.var {} +// CHECK:STDOUT: %Transitive.WithSelf.GetA.call: init @G.%as_type.loc7_11.2 (%as_type.6a024f.2) to %.loc7_3.1 = call %bound_method.loc7_23(%t.ref) +// CHECK:STDOUT: assign %a.var, %Transitive.WithSelf.GetA.call +// CHECK:STDOUT: %.loc7_11.1: type = splice_block %.loc7_11.3 [symbolic = %as_type.loc7_11.2 (constants.%as_type.6a024f.2)] { +// CHECK:STDOUT: %T.ref.loc7: %Transitive.type = name_ref T, %T.loc6_7.2 [symbolic = %T.loc6_7.1 (constants.%T)] +// CHECK:STDOUT: %T.as_type.loc7: type = facet_access_type %T.ref.loc7 [symbolic = %T.as_type.loc6_25.1 (constants.%T.as_type)] +// CHECK:STDOUT: %.loc7_11.2: type = converted %T.ref.loc7, %T.as_type.loc7 [symbolic = %T.as_type.loc6_25.1 (constants.%T.as_type)] +// CHECK:STDOUT: %A.ref: %Transitive.assoc_type = name_ref A, imports.%Main.import_ref.72c [concrete = constants.%assoc0.7cd] +// CHECK:STDOUT: %impl.elem0.loc7_11.1: %facet_type.b1b = impl_witness_access constants.%Transitive.lookup_impl_witness.ab0b8d.2, element0 [symbolic = %impl.elem0.loc7_11.2 (constants.%impl.elem0.0439e7.2)] +// CHECK:STDOUT: %as_type.loc7_11.1: type = facet_access_type %impl.elem0.loc7_11.1 [symbolic = %as_type.loc7_11.2 (constants.%as_type.6a024f.2)] +// CHECK:STDOUT: %.loc7_11.3: type = converted %impl.elem0.loc7_11.1, %as_type.loc7_11.1 [symbolic = %as_type.loc7_11.2 (constants.%as_type.6a024f.2)] +// CHECK:STDOUT: } +// CHECK:STDOUT: %a: ref @G.%as_type.loc7_11.2 (%as_type.6a024f.2) = wrapper_binding a, %a.var +// CHECK:STDOUT: name_binding_decl { +// CHECK:STDOUT: %a.patt.loc7_8.1: @G.%pattern_type.loc7 (%pattern_type.c73ac0.2) = ref_binding_pattern a [symbolic = %a.patt.loc7_8.2 (constants.%a.patt)] +// CHECK:STDOUT: %a.var_patt.loc7_3.1: @G.%pattern_type.loc7 (%pattern_type.c73ac0.2) = var_pattern %a.patt.loc7_8.1 [symbolic = %a.var_patt.loc7_3.2 (constants.%a.var_patt)] +// CHECK:STDOUT: } +// CHECK:STDOUT: %a.ref.loc13: ref @G.%as_type.loc7_11.2 (%as_type.6a024f.2) = name_ref a, %a +// CHECK:STDOUT: %Q.ref: type = name_ref Q, imports.%Main.Q [concrete = constants.%Q.type] +// CHECK:STDOUT: %InQ.ref: %Q.assoc_type = name_ref InQ, imports.%Main.import_ref.e2a [concrete = constants.%assoc0.6a1] +// CHECK:STDOUT: %TakesPQR.ref: %TakesPQR.type = name_ref TakesPQR, file.%TakesPQR.decl [concrete = constants.%TakesPQR] +// CHECK:STDOUT: %a.ref.loc22: ref @G.%as_type.loc7_11.2 (%as_type.6a024f.2) = name_ref a, %a +// CHECK:STDOUT: %impl.elem0.loc7_3.1: @G.%.loc7_3.4 (%.e75) = impl_witness_access constants.%Destroy.lookup_impl_witness, element0 [symbolic = %impl.elem0.loc7_3.2 (constants.%impl.elem0.678)] +// CHECK:STDOUT: %bound_method.loc7_3.1: = bound_method %a.var, %impl.elem0.loc7_3.1 +// CHECK:STDOUT: %Destroy.facet.loc7_3.1: %Destroy.type = facet_value constants.%as_type.6a024f.2, (constants.%Destroy.lookup_impl_witness) [symbolic = %Destroy.facet.loc7_3.3 (constants.%Destroy.facet)] +// CHECK:STDOUT: %.loc7_3.2: %Destroy.type = converted constants.%as_type.6a024f.2, %Destroy.facet.loc7_3.1 [symbolic = %Destroy.facet.loc7_3.3 (constants.%Destroy.facet)] +// CHECK:STDOUT: %Destroy.facet.loc7_3.2: %Destroy.type = facet_value constants.%as_type.6a024f.2, (constants.%Destroy.lookup_impl_witness) [symbolic = %Destroy.facet.loc7_3.3 (constants.%Destroy.facet)] +// CHECK:STDOUT: %.loc7_3.3: %Destroy.type = converted constants.%as_type.6a024f.2, %Destroy.facet.loc7_3.2 [symbolic = %Destroy.facet.loc7_3.3 (constants.%Destroy.facet)] +// CHECK:STDOUT: %specific_impl_fn.loc7_3.1: = specific_impl_function %impl.elem0.loc7_3.1, @Destroy.WithSelf.Op(constants.%Destroy.facet) [symbolic = %specific_impl_fn.loc7_3.2 (constants.%specific_impl_fn.e8e)] +// CHECK:STDOUT: %bound_method.loc7_3.2: = bound_method %a.var, %specific_impl_fn.loc7_3.1 +// CHECK:STDOUT: %Destroy.WithSelf.Op.call: init %empty_tuple.type = call %bound_method.loc7_3.2(%a.var) +// CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: +// CHECK:STDOUT: } +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: specific @P.WithSelf(constants.%Self.104) { +// CHECK:STDOUT: !definition: +// CHECK:STDOUT: %Self => constants.%Self.104 +// CHECK:STDOUT: %P.WithSelf.InP.type => constants.%P.WithSelf.InP.type +// CHECK:STDOUT: %P.WithSelf.InP => constants.%P.WithSelf.InP +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: specific @P.WithSelf.InP(constants.%Self.104) { +// CHECK:STDOUT: %Self => constants.%Self.104 +// CHECK:STDOUT: %Self.as_type => constants.%Self.as_type.cc3 +// CHECK:STDOUT: %pattern_type => constants.%pattern_type.3ef +// CHECK:STDOUT: %self.param_patt => constants.%self.param_patt.88d +// CHECK:STDOUT: %self.patt => constants.%self.patt.6de +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: specific @Q.WithSelf(constants.%Self.afd) { +// CHECK:STDOUT: !definition: +// CHECK:STDOUT: %Self => constants.%Self.afd +// CHECK:STDOUT: %Q.WithSelf.InQ.type => constants.%Q.WithSelf.InQ.type +// CHECK:STDOUT: %Q.WithSelf.InQ => constants.%Q.WithSelf.InQ +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: specific @Q.WithSelf.InQ(constants.%Self.afd) { +// CHECK:STDOUT: %Self => constants.%Self.afd +// CHECK:STDOUT: %Self.as_type => constants.%Self.as_type.430 +// CHECK:STDOUT: %pattern_type => constants.%pattern_type.ade +// CHECK:STDOUT: %self.param_patt => constants.%self.param_patt.271 +// CHECK:STDOUT: %self.patt => constants.%self.patt.b5e +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: specific @R.WithSelf(constants.%Self.be6) { +// CHECK:STDOUT: !definition: +// CHECK:STDOUT: %Self => constants.%Self.be6 +// CHECK:STDOUT: %R.WithSelf.InR.type => constants.%R.WithSelf.InR.type +// CHECK:STDOUT: %R.WithSelf.InR => constants.%R.WithSelf.InR +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: specific @R.WithSelf.InR(constants.%Self.be6) { +// CHECK:STDOUT: %Self => constants.%Self.be6 +// CHECK:STDOUT: %Self.as_type => constants.%Self.as_type.b02 +// CHECK:STDOUT: %pattern_type => constants.%pattern_type.60e +// CHECK:STDOUT: %self.param_patt => constants.%self.param_patt.640 +// CHECK:STDOUT: %self.patt => constants.%self.patt.894 +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: specific @TakesPQR(constants.%U) { +// CHECK:STDOUT: %U.patt.loc5_14.2 => constants.%U.patt +// CHECK:STDOUT: %U.loc5_14.1 => constants.%U +// CHECK:STDOUT: %U.as_type.loc5_38.1 => constants.%U.as_type +// CHECK:STDOUT: %pattern_type => constants.%pattern_type.54d +// CHECK:STDOUT: %u.param_patt.loc5_36.2 => constants.%u.param_patt +// CHECK:STDOUT: %u.patt.loc5_36.2 => constants.%u.patt +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: specific @Transitive.WithSelf(constants.%Self.744) { +// CHECK:STDOUT: !definition: +// CHECK:STDOUT: %Self => constants.%Self.744 +// CHECK:STDOUT: %Transitive.lookup_impl_witness => constants.%Transitive.lookup_impl_witness.ab0b8d.1 +// CHECK:STDOUT: %impl.elem0 => constants.%impl.elem0.0439e7.1 +// CHECK:STDOUT: %impl.elem1 => constants.%impl.elem1.6be46c.1 +// CHECK:STDOUT: %Transitive.WithSelf.GetA.type => constants.%Transitive.WithSelf.GetA.type.0b3c58.1 +// CHECK:STDOUT: %Transitive.WithSelf.GetA => constants.%Transitive.WithSelf.GetA.e3e09c.1 +// CHECK:STDOUT: %Transitive.WithSelf.TakesC.type => constants.%Transitive.WithSelf.TakesC.type.d86d9f.1 +// CHECK:STDOUT: %Transitive.WithSelf.TakesC => constants.%Transitive.WithSelf.TakesC.f276cd.1 +// CHECK:STDOUT: %as_type.1 => constants.%as_type.dca436.1 +// CHECK:STDOUT: %as_type.2 => constants.%as_type.6a024f.1 +// CHECK:STDOUT: %eq.1 => constants.%eq.4be6e4.1 +// CHECK:STDOUT: %impl.elem2 => constants.%impl.elem2.731f97.1 +// CHECK:STDOUT: %as_type.3 => constants.%as_type.2fadd6.1 +// CHECK:STDOUT: %eq.2 => constants.%eq.033b19.1 +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: specific @Transitive.WithSelf.TakesC(constants.%Self.744) { +// CHECK:STDOUT: %Self => constants.%Self.744 +// CHECK:STDOUT: %Self.as_type => constants.%Self.as_type.56c +// CHECK:STDOUT: %pattern_type.1 => constants.%pattern_type.68e728.1 +// CHECK:STDOUT: %self.param_patt => constants.%self.param_patt.e90fff.1 +// CHECK:STDOUT: %self.patt => constants.%self.patt.d2dab3.1 +// CHECK:STDOUT: %Transitive.lookup_impl_witness => constants.%Transitive.lookup_impl_witness.ab0b8d.1 +// CHECK:STDOUT: %impl.elem2 => constants.%impl.elem2.731f97.1 +// CHECK:STDOUT: %as_type => constants.%as_type.2fadd6.1 +// CHECK:STDOUT: %pattern_type.2 => constants.%pattern_type.ac0 +// CHECK:STDOUT: %c.param_patt => constants.%c.param_patt +// CHECK:STDOUT: %c.patt => constants.%c.patt +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: specific @Transitive.WithSelf.GetA(constants.%Self.744) { +// CHECK:STDOUT: %Self => constants.%Self.744 +// CHECK:STDOUT: %Self.as_type => constants.%Self.as_type.56c +// CHECK:STDOUT: %pattern_type.1 => constants.%pattern_type.68e728.1 +// CHECK:STDOUT: %self.param_patt => constants.%self.param_patt.e90fff.1 +// CHECK:STDOUT: %self.patt => constants.%self.patt.d2dab3.1 +// CHECK:STDOUT: %Transitive.lookup_impl_witness => constants.%Transitive.lookup_impl_witness.ab0b8d.1 +// CHECK:STDOUT: %impl.elem0 => constants.%impl.elem0.0439e7.1 +// CHECK:STDOUT: %as_type => constants.%as_type.6a024f.1 +// CHECK:STDOUT: %.1 => constants.%.2b1a45.1 +// CHECK:STDOUT: %pattern_type.2 => constants.%pattern_type.c73ac0.1 +// CHECK:STDOUT: %return.param_patt => constants.%return.param_patt.057e89.1 +// CHECK:STDOUT: %return.patt => constants.%return.patt.4e0711.1 +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: specific @G(constants.%T) { +// CHECK:STDOUT: %T.patt.loc6_7.2 => constants.%T.patt +// CHECK:STDOUT: %T.loc6_7.1 => constants.%T +// CHECK:STDOUT: %T.as_type.loc6_25.1 => constants.%T.as_type +// CHECK:STDOUT: %pattern_type.loc6 => constants.%pattern_type.68e728.2 +// CHECK:STDOUT: %t.param_patt.loc6_23.2 => constants.%t.param_patt +// CHECK:STDOUT: %t.patt.loc6_23.2 => constants.%t.patt +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: specific @Transitive.WithSelf(constants.%T) { +// CHECK:STDOUT: !definition: +// CHECK:STDOUT: %Self => constants.%T +// CHECK:STDOUT: %Transitive.lookup_impl_witness => constants.%Transitive.lookup_impl_witness.ab0b8d.2 +// CHECK:STDOUT: %impl.elem0 => constants.%impl.elem0.0439e7.2 +// CHECK:STDOUT: %impl.elem1 => constants.%impl.elem1.6be46c.2 +// CHECK:STDOUT: %Transitive.WithSelf.GetA.type => constants.%Transitive.WithSelf.GetA.type.0b3c58.2 +// CHECK:STDOUT: %Transitive.WithSelf.GetA => constants.%Transitive.WithSelf.GetA.e3e09c.2 +// CHECK:STDOUT: %Transitive.WithSelf.TakesC.type => constants.%Transitive.WithSelf.TakesC.type.d86d9f.2 +// CHECK:STDOUT: %Transitive.WithSelf.TakesC => constants.%Transitive.WithSelf.TakesC.f276cd.2 +// CHECK:STDOUT: %as_type.1 => constants.%as_type.dca436.2 +// CHECK:STDOUT: %as_type.2 => constants.%as_type.6a024f.2 +// CHECK:STDOUT: %eq.1 => constants.%eq.4be6e4.2 +// CHECK:STDOUT: %impl.elem2 => constants.%impl.elem2.731f97.2 +// CHECK:STDOUT: %as_type.3 => constants.%as_type.2fadd6.2 +// CHECK:STDOUT: %eq.2 => constants.%eq.033b19.2 +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: specific @Transitive.WithSelf.GetA(constants.%T) { +// CHECK:STDOUT: %Self => constants.%T +// CHECK:STDOUT: %Self.as_type => constants.%T.as_type +// CHECK:STDOUT: %pattern_type.1 => constants.%pattern_type.68e728.2 +// CHECK:STDOUT: %self.param_patt => constants.%self.param_patt.e90fff.2 +// CHECK:STDOUT: %self.patt => constants.%self.patt.d2dab3.2 +// CHECK:STDOUT: %Transitive.lookup_impl_witness => constants.%Transitive.lookup_impl_witness.ab0b8d.2 +// CHECK:STDOUT: %impl.elem0 => constants.%impl.elem0.0439e7.2 +// CHECK:STDOUT: %as_type => constants.%as_type.6a024f.2 +// CHECK:STDOUT: %.1 => constants.%.2b1a45.2 +// CHECK:STDOUT: %pattern_type.2 => constants.%pattern_type.c73ac0.2 +// CHECK:STDOUT: %return.param_patt => constants.%return.param_patt.057e89.2 +// CHECK:STDOUT: %return.patt => constants.%return.patt.4e0711.2 +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: --- fail_todo_same_observe_in_both_scopes.carbon +// CHECK:STDOUT: +// CHECK:STDOUT: constants { +// CHECK:STDOUT: %type: type = facet_type [concrete] +// CHECK:STDOUT: %.Self: %type = symbolic_binding .Self [symbolic_self] +// CHECK:STDOUT: %Transitive.type: type = facet_type <@Transitive> [concrete] +// CHECK:STDOUT: %Self.744: %Transitive.type = symbolic_binding Self, 0 [symbolic] +// CHECK:STDOUT: %Transitive.lookup_impl_witness.ab0b8d.1: = lookup_impl_witness %Self.744, @Transitive [symbolic] +// CHECK:STDOUT: %Destroy.type: type = facet_type <@Destroy> [concrete] +// CHECK:STDOUT: %R.type: type = facet_type <@R> [concrete] +// CHECK:STDOUT: %Self.be6: %R.type = symbolic_binding Self, 0 [symbolic] +// CHECK:STDOUT: %R.WithSelf.InR.type.4bf: type = fn_type @R.WithSelf.InR, @R.WithSelf(%Self.be6) [symbolic] +// CHECK:STDOUT: %R.WithSelf.InR.345: %R.WithSelf.InR.type.4bf = struct_value () [symbolic] +// CHECK:STDOUT: %Self.as_type.b02: type = facet_access_type %Self.be6 [symbolic] +// CHECK:STDOUT: %pattern_type.60e: type = pattern_type %Self.as_type.b02 [symbolic] +// CHECK:STDOUT: %self.param_patt.640: %pattern_type.60e = value_param_pattern [symbolic] +// CHECK:STDOUT: %self.patt.894: %pattern_type.60e = at_binding_pattern self, %self.param_patt.640 [symbolic] +// CHECK:STDOUT: %facet_type.0e9: type = facet_type <@Destroy & @R where TODO> [concrete] +// CHECK:STDOUT: %impl.elem2.279493.1: %facet_type.0e9 = impl_witness_access %Transitive.lookup_impl_witness.ab0b8d.1, element2 [symbolic] +// CHECK:STDOUT: %Q.type: type = facet_type <@Q> [concrete] +// CHECK:STDOUT: %Self.afd: %Q.type = symbolic_binding Self, 0 [symbolic] +// CHECK:STDOUT: %Q.WithSelf.InQ.type: type = fn_type @Q.WithSelf.InQ, @Q.WithSelf(%Self.afd) [symbolic] +// CHECK:STDOUT: %Q.WithSelf.InQ: %Q.WithSelf.InQ.type = struct_value () [symbolic] +// CHECK:STDOUT: %Self.as_type.430: type = facet_access_type %Self.afd [symbolic] +// CHECK:STDOUT: %pattern_type.ade: type = pattern_type %Self.as_type.430 [symbolic] +// CHECK:STDOUT: %self.param_patt.271: %pattern_type.ade = value_param_pattern [symbolic] +// CHECK:STDOUT: %self.patt.b5e: %pattern_type.ade = at_binding_pattern self, %self.param_patt.271 [symbolic] +// CHECK:STDOUT: %facet_type.1b9: type = facet_type <@Destroy & @Q where TODO> [concrete] +// CHECK:STDOUT: %impl.elem1.1413d6.1: %facet_type.1b9 = impl_witness_access %Transitive.lookup_impl_witness.ab0b8d.1, element1 [symbolic] +// CHECK:STDOUT: %eq.be77bc.1 = observe_equivalent %impl.elem1.1413d6.1, %impl.elem2.279493.1 [symbolic] +// CHECK:STDOUT: %as_type.b2aa43.1: type = facet_access_type %impl.elem2.279493.1 [symbolic] +// CHECK:STDOUT: %P.type: type = facet_type <@P> [concrete] +// CHECK:STDOUT: %Self.104: %P.type = symbolic_binding Self, 0 [symbolic] +// CHECK:STDOUT: %P.WithSelf.InP.type: type = fn_type @P.WithSelf.InP, @P.WithSelf(%Self.104) [symbolic] +// CHECK:STDOUT: %P.WithSelf.InP: %P.WithSelf.InP.type = struct_value () [symbolic] +// CHECK:STDOUT: %Self.as_type.cc3: type = facet_access_type %Self.104 [symbolic] +// CHECK:STDOUT: %pattern_type.3ef: type = pattern_type %Self.as_type.cc3 [symbolic] +// CHECK:STDOUT: %self.param_patt.88d: %pattern_type.3ef = value_param_pattern [symbolic] +// CHECK:STDOUT: %self.patt.6de: %pattern_type.3ef = at_binding_pattern self, %self.param_patt.88d [symbolic] +// CHECK:STDOUT: %facet_type.1ff: type = facet_type <@Destroy & @P> [concrete] +// CHECK:STDOUT: %impl.elem0.8aa205.1: %facet_type.1ff = impl_witness_access %Transitive.lookup_impl_witness.ab0b8d.1, element0 [symbolic] +// CHECK:STDOUT: %eq.20ba2e.1 = observe_equivalent %impl.elem0.8aa205.1, %impl.elem1.1413d6.1 [symbolic] +// CHECK:STDOUT: %as_type.a0914b.1: type = facet_access_type %impl.elem0.8aa205.1 [symbolic] +// CHECK:STDOUT: %as_type.f86e2d.1: type = facet_access_type %impl.elem1.1413d6.1 [symbolic] +// CHECK:STDOUT: %Transitive.WithSelf.TakesC.type.d86d9f.1: type = fn_type @Transitive.WithSelf.TakesC, @Transitive.WithSelf(%Self.744) [symbolic] +// CHECK:STDOUT: %Transitive.WithSelf.TakesC.f276cd.1: %Transitive.WithSelf.TakesC.type.d86d9f.1 = struct_value () [symbolic] +// CHECK:STDOUT: %Self.as_type.56c: type = facet_access_type %Self.744 [symbolic] +// CHECK:STDOUT: %pattern_type.68e728.1: type = pattern_type %Self.as_type.56c [symbolic] +// CHECK:STDOUT: %self.param_patt.e90fff.1: %pattern_type.68e728.1 = value_param_pattern [symbolic] +// CHECK:STDOUT: %self.patt.d2dab3.1: %pattern_type.68e728.1 = at_binding_pattern self, %self.param_patt.e90fff.1 [symbolic] +// CHECK:STDOUT: %pattern_type.d96: type = pattern_type %as_type.b2aa43.1 [symbolic] +// CHECK:STDOUT: %c.param_patt: %pattern_type.d96 = value_param_pattern [symbolic] +// CHECK:STDOUT: %c.patt: %pattern_type.d96 = at_binding_pattern c, %c.param_patt [symbolic] +// CHECK:STDOUT: %Transitive.WithSelf.GetA.type.0b3c58.1: type = fn_type @Transitive.WithSelf.GetA, @Transitive.WithSelf(%Self.744) [symbolic] +// CHECK:STDOUT: %Transitive.WithSelf.GetA.e3e09c.1: %Transitive.WithSelf.GetA.type.0b3c58.1 = struct_value () [symbolic] +// CHECK:STDOUT: %pattern_type.77f685.1: type = pattern_type %as_type.a0914b.1 [symbolic] +// CHECK:STDOUT: %return.param_patt.11f0b9.1: %pattern_type.77f685.1 = out_param_pattern [symbolic] +// CHECK:STDOUT: %return.patt.87a9a6.1: %pattern_type.77f685.1 = return_slot_pattern %return.param_patt.11f0b9.1, invalid [symbolic] +// CHECK:STDOUT: %.3ef823.1: Core.Form = init_form %as_type.a0914b.1 [symbolic] +// CHECK:STDOUT: %pattern_type.bd9: type = pattern_type %Transitive.type [concrete] +// CHECK:STDOUT: %T.patt: %pattern_type.bd9 = symbolic_binding_pattern T, 0 [symbolic] +// CHECK:STDOUT: %T: %Transitive.type = symbolic_binding T, 0 [symbolic] +// CHECK:STDOUT: %T.as_type: type = facet_access_type %T [symbolic] +// CHECK:STDOUT: %pattern_type.68e728.2: type = pattern_type %T.as_type [symbolic] +// CHECK:STDOUT: %t.param_patt: %pattern_type.68e728.2 = value_param_pattern [symbolic] +// CHECK:STDOUT: %t.patt: %pattern_type.68e728.2 = at_binding_pattern t, %t.param_patt [symbolic] +// CHECK:STDOUT: %G.type: type = fn_type @G [concrete] +// CHECK:STDOUT: %empty_tuple.type: type = tuple_type () [concrete] +// CHECK:STDOUT: %G: %G.type = struct_value () [concrete] +// CHECK:STDOUT: %require_complete.fbd: = require_complete_type %T.as_type [symbolic] +// CHECK:STDOUT: %Transitive.lookup_impl_witness.ab0b8d.2: = lookup_impl_witness %T, @Transitive [symbolic] +// CHECK:STDOUT: %impl.elem0.8aa205.2: %facet_type.1ff = impl_witness_access %Transitive.lookup_impl_witness.ab0b8d.2, element0 [symbolic] +// CHECK:STDOUT: %impl.elem1.1413d6.2: %facet_type.1b9 = impl_witness_access %Transitive.lookup_impl_witness.ab0b8d.2, element1 [symbolic] +// CHECK:STDOUT: %Transitive.WithSelf.GetA.type.0b3c58.2: type = fn_type @Transitive.WithSelf.GetA, @Transitive.WithSelf(%T) [symbolic] +// CHECK:STDOUT: %Transitive.WithSelf.GetA.e3e09c.2: %Transitive.WithSelf.GetA.type.0b3c58.2 = struct_value () [symbolic] +// CHECK:STDOUT: %Transitive.WithSelf.TakesC.type.d86d9f.2: type = fn_type @Transitive.WithSelf.TakesC, @Transitive.WithSelf(%T) [symbolic] +// CHECK:STDOUT: %Transitive.WithSelf.TakesC.f276cd.2: %Transitive.WithSelf.TakesC.type.d86d9f.2 = struct_value () [symbolic] +// CHECK:STDOUT: %as_type.f86e2d.2: type = facet_access_type %impl.elem1.1413d6.2 [symbolic] +// CHECK:STDOUT: %as_type.a0914b.2: type = facet_access_type %impl.elem0.8aa205.2 [symbolic] +// CHECK:STDOUT: %eq.20ba2e.2 = observe_equivalent %impl.elem0.8aa205.2, %impl.elem1.1413d6.2 [symbolic] +// CHECK:STDOUT: %impl.elem2.279493.2: %facet_type.0e9 = impl_witness_access %Transitive.lookup_impl_witness.ab0b8d.2, element2 [symbolic] +// CHECK:STDOUT: %as_type.b2aa43.2: type = facet_access_type %impl.elem2.279493.2 [symbolic] +// CHECK:STDOUT: %eq.be77bc.2 = observe_equivalent %impl.elem1.1413d6.2, %impl.elem2.279493.2 [symbolic] +// CHECK:STDOUT: %Transitive.assoc_type: type = assoc_entity_type @Transitive [concrete] +// CHECK:STDOUT: %assoc0.e77: %Transitive.assoc_type = assoc_entity element0, imports.%Main.import_ref.0a7 [concrete] +// CHECK:STDOUT: %assoc1: %Transitive.assoc_type = assoc_entity element1, imports.%Main.import_ref.dae [concrete] +// CHECK:STDOUT: %assoc2: %Transitive.assoc_type = assoc_entity element2, imports.%Main.import_ref.56a [concrete] +// CHECK:STDOUT: %require_complete.6cf: = require_complete_type %as_type.a0914b.2 [symbolic] +// CHECK:STDOUT: %pattern_type.77f685.2: type = pattern_type %as_type.a0914b.2 [symbolic] +// CHECK:STDOUT: %a.patt: %pattern_type.77f685.2 = ref_binding_pattern a [symbolic] +// CHECK:STDOUT: %a.var_patt: %pattern_type.77f685.2 = var_pattern %a.patt [symbolic] +// CHECK:STDOUT: %assoc3: %Transitive.assoc_type = assoc_entity element3, imports.%Main.import_ref.06c [concrete] +// CHECK:STDOUT: %.657: type = fn_type_with_self_type %Transitive.WithSelf.GetA.type.0b3c58.2, %T [symbolic] +// CHECK:STDOUT: %impl.elem3: %.657 = impl_witness_access %Transitive.lookup_impl_witness.ab0b8d.2, element3 [symbolic] +// CHECK:STDOUT: %self.param_patt.e90fff.2: %pattern_type.68e728.2 = value_param_pattern [symbolic] +// CHECK:STDOUT: %self.patt.d2dab3.2: %pattern_type.68e728.2 = at_binding_pattern self, %self.param_patt.e90fff.2 [symbolic] +// CHECK:STDOUT: %.3ef823.2: Core.Form = init_form %as_type.a0914b.2 [symbolic] +// CHECK:STDOUT: %return.param_patt.11f0b9.2: %pattern_type.77f685.2 = out_param_pattern [symbolic] +// CHECK:STDOUT: %return.patt.87a9a6.2: %pattern_type.77f685.2 = return_slot_pattern %return.param_patt.11f0b9.2, invalid [symbolic] +// CHECK:STDOUT: %specific_impl_fn.72f: = specific_impl_function %impl.elem3, @Transitive.WithSelf.GetA(%T) [symbolic] +// CHECK:STDOUT: %R.WithSelf.InR.type.a87: type = fn_type @R.WithSelf.InR, @R.WithSelf(%impl.elem2.279493.2) [symbolic] +// CHECK:STDOUT: %R.WithSelf.InR.704: %R.WithSelf.InR.type.a87 = struct_value () [symbolic] +// CHECK:STDOUT: %R.assoc_type: type = assoc_entity_type @R [concrete] +// CHECK:STDOUT: %assoc0.e94: %R.assoc_type = assoc_entity element0, imports.%Main.import_ref.8ad [concrete] +// CHECK:STDOUT: %facet_type.fcc: type = facet_type <@Destroy & @R> [concrete] +// CHECK:STDOUT: %R.lookup_impl_witness.aa0: = lookup_impl_witness %impl.elem2.279493.2, @R [symbolic] +// CHECK:STDOUT: %R.facet: %R.type = facet_value %as_type.b2aa43.2, (%R.lookup_impl_witness.aa0) [symbolic] +// CHECK:STDOUT: %R.WithSelf.InR.type.56d: type = fn_type @R.WithSelf.InR, @R.WithSelf(%R.facet) [symbolic] +// CHECK:STDOUT: %R.WithSelf.InR.9a8: %R.WithSelf.InR.type.56d = struct_value () [symbolic] +// CHECK:STDOUT: %.f43: type = fn_type_with_self_type %R.WithSelf.InR.type.56d, %R.facet [symbolic] +// CHECK:STDOUT: %impl.elem0.8cc: %.f43 = impl_witness_access %R.lookup_impl_witness.aa0, element0 [symbolic] +// CHECK:STDOUT: %Destroy.lookup_impl_witness: = lookup_impl_witness %impl.elem0.8aa205.2, @Destroy [symbolic] +// CHECK:STDOUT: %Destroy.facet: %Destroy.type = facet_value %as_type.a0914b.2, (%Destroy.lookup_impl_witness) [symbolic] +// CHECK:STDOUT: %Destroy.WithSelf.Op.type.74e: type = fn_type @Destroy.WithSelf.Op, @Destroy.WithSelf(%Destroy.facet) [symbolic] +// CHECK:STDOUT: %.569: type = fn_type_with_self_type %Destroy.WithSelf.Op.type.74e, %Destroy.facet [symbolic] +// CHECK:STDOUT: %impl.elem0.95f: %.569 = impl_witness_access %Destroy.lookup_impl_witness, element0 [symbolic] +// CHECK:STDOUT: %specific_impl_fn.584: = specific_impl_function %impl.elem0.95f, @Destroy.WithSelf.Op(%Destroy.facet) [symbolic] +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: imports { +// CHECK:STDOUT: %Main.P = import_ref Main//transitive, P, unloaded +// CHECK:STDOUT: %Main.Q = import_ref Main//transitive, Q, unloaded +// CHECK:STDOUT: %Main.R = import_ref Main//transitive, R, unloaded +// CHECK:STDOUT: %Main.Transitive: type = import_ref Main//transitive, Transitive, loaded [concrete = constants.%Transitive.type] +// CHECK:STDOUT: %Core.048aa3.1: = namespace file.%Core.import, [concrete] { +// CHECK:STDOUT: .Destroy = %Core.Destroy +// CHECK:STDOUT: import Core//prelude +// CHECK:STDOUT: import Core//prelude/... +// CHECK:STDOUT: } +// CHECK:STDOUT: %Main.import_ref.72c: %Transitive.assoc_type = import_ref Main//transitive, loc8_8, loaded [concrete = constants.%assoc0.e77] +// CHECK:STDOUT: %Main.import_ref.e5e: %Transitive.assoc_type = import_ref Main//transitive, loc9_8, loaded [concrete = constants.%assoc1] +// CHECK:STDOUT: %Main.import_ref.c9c: %Transitive.assoc_type = import_ref Main//transitive, loc10_8, loaded [concrete = constants.%assoc2] +// CHECK:STDOUT: %Main.import_ref.5c5: %Transitive.assoc_type = import_ref Main//transitive, loc12_21, loaded [concrete = constants.%assoc3] +// CHECK:STDOUT: %Main.import_ref.ae2 = import_ref Main//transitive, loc13_24, unloaded +// CHECK:STDOUT: %Main.A = import_ref Main//transitive, A, unloaded +// CHECK:STDOUT: %Main.B = import_ref Main//transitive, B, unloaded +// CHECK:STDOUT: %Main.C = import_ref Main//transitive, C, unloaded +// CHECK:STDOUT: %Main.GetA = import_ref Main//transitive, GetA, unloaded +// CHECK:STDOUT: %Main.TakesC = import_ref Main//transitive, TakesC, unloaded +// CHECK:STDOUT: %Main.import_ref.682: %R.assoc_type = import_ref Main//transitive, loc5_27, loaded [concrete = constants.%assoc0.e94] +// CHECK:STDOUT: %Main.InR = import_ref Main//transitive, InR, unloaded +// CHECK:STDOUT: %Main.import_ref.f6968b.2: %R.type = import_ref Main//transitive, loc5_13, loaded [symbolic = constants.%Self.be6] +// CHECK:STDOUT: %Main.import_ref.659 = import_ref Main//transitive, loc5_13, unloaded +// CHECK:STDOUT: %Main.import_ref.849 = import_ref Main//transitive, loc4_27, unloaded +// CHECK:STDOUT: %Main.InQ = import_ref Main//transitive, InQ, unloaded +// CHECK:STDOUT: %Main.import_ref.c0a1f5.2: %Q.type = import_ref Main//transitive, loc4_13, loaded [symbolic = constants.%Self.afd] +// CHECK:STDOUT: %Main.import_ref.4f3 = import_ref Main//transitive, loc4_13, unloaded +// CHECK:STDOUT: %Main.import_ref.fec = import_ref Main//transitive, loc3_27, unloaded +// CHECK:STDOUT: %Main.InP = import_ref Main//transitive, InP, unloaded +// CHECK:STDOUT: %Main.import_ref.aef2fa.2: %P.type = import_ref Main//transitive, loc3_13, loaded [symbolic = constants.%Self.104] +// CHECK:STDOUT: %Main.import_ref.96f = import_ref Main//transitive, loc3_13, unloaded +// CHECK:STDOUT: %Main.import_ref.df6636.2: %Transitive.type = import_ref Main//transitive, loc7_22, loaded [symbolic = constants.%Self.744] +// CHECK:STDOUT: %Main.import_ref.df6636.3: %Transitive.type = import_ref Main//transitive, loc7_22, loaded [symbolic = constants.%Self.744] +// CHECK:STDOUT: %Main.import_ref.0d5 = import_ref Main//transitive, loc7_22, unloaded +// CHECK:STDOUT: %Main.import_ref.0a7: %facet_type.1ff = import_ref Main//transitive, loc8_8, loaded [concrete = %A] +// CHECK:STDOUT: %A: %facet_type.1ff = assoc_const_decl @A [concrete] {} +// CHECK:STDOUT: %Main.import_ref.dae: %facet_type.1b9 = import_ref Main//transitive, loc9_8, loaded [concrete = %B] +// CHECK:STDOUT: %B: %facet_type.1b9 = assoc_const_decl @B [concrete] {} +// CHECK:STDOUT: %Main.import_ref.56a: %facet_type.0e9 = import_ref Main//transitive, loc10_8, loaded [concrete = %C] +// CHECK:STDOUT: %C: %facet_type.0e9 = assoc_const_decl @C [concrete] {} +// CHECK:STDOUT: %Main.import_ref.06c: @Transitive.WithSelf.%Transitive.WithSelf.GetA.type (%Transitive.WithSelf.GetA.type.0b3c58.1) = import_ref Main//transitive, loc12_21, loaded [symbolic = @Transitive.WithSelf.%Transitive.WithSelf.GetA (constants.%Transitive.WithSelf.GetA.e3e09c.1)] +// CHECK:STDOUT: %Main.import_ref.8ad: @R.WithSelf.%R.WithSelf.InR.type (%R.WithSelf.InR.type.4bf) = import_ref Main//transitive, loc5_27, loaded [symbolic = @R.WithSelf.%R.WithSelf.InR (constants.%R.WithSelf.InR.345)] +// CHECK:STDOUT: %Core.Destroy: type = import_ref Core//prelude/parts/destroy, Destroy, loaded [concrete = constants.%Destroy.type] +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: file { +// CHECK:STDOUT: package: = namespace [concrete] { +// CHECK:STDOUT: .P = imports.%Main.P +// CHECK:STDOUT: .Q = imports.%Main.Q +// CHECK:STDOUT: .R = imports.%Main.R +// CHECK:STDOUT: .Transitive = imports.%Main.Transitive +// CHECK:STDOUT: .Core = imports.%Core.048aa3.1 +// CHECK:STDOUT: .G = %G.decl +// CHECK:STDOUT: } +// CHECK:STDOUT: %Core.import = import Core +// CHECK:STDOUT: %default.import = import +// CHECK:STDOUT: %G.decl: %G.type = fn_decl @G [concrete = constants.%G] { +// CHECK:STDOUT: %T.patt.loc5_7.1: %pattern_type.bd9 = symbolic_binding_pattern T, 0 [symbolic = %T.patt.loc5_7.2 (constants.%T.patt)] +// CHECK:STDOUT: %t.param_patt.loc5_23.1: @G.%pattern_type.loc5 (%pattern_type.68e728.2) = value_param_pattern [symbolic = %t.param_patt.loc5_23.2 (constants.%t.param_patt)] +// CHECK:STDOUT: %t.patt.loc5_23.1: @G.%pattern_type.loc5 (%pattern_type.68e728.2) = at_binding_pattern t, %t.param_patt.loc5_23.1 [symbolic = %t.patt.loc5_23.2 (constants.%t.patt)] +// CHECK:STDOUT: } { +// CHECK:STDOUT: %.loc5_10: type = splice_block %Transitive.ref [concrete = constants.%Transitive.type] { +// CHECK:STDOUT: %.Self: %type = symbolic_binding .Self [symbolic_self = constants.%.Self] +// CHECK:STDOUT: %Transitive.ref: type = name_ref Transitive, imports.%Main.Transitive [concrete = constants.%Transitive.type] +// CHECK:STDOUT: } +// CHECK:STDOUT: %T.loc5_7.2: %Transitive.type = symbolic_binding T, 0 [symbolic = %T.loc5_7.1 (constants.%T)] +// CHECK:STDOUT: %t.param: @G.%T.as_type.loc5_25.1 (%T.as_type) = value_param call_param0 +// CHECK:STDOUT: %.loc5_25.1: type = splice_block %.loc5_25.2 [symbolic = %T.as_type.loc5_25.1 (constants.%T.as_type)] { +// CHECK:STDOUT: %T.ref.loc5: %Transitive.type = name_ref T, %T.loc5_7.2 [symbolic = %T.loc5_7.1 (constants.%T)] +// CHECK:STDOUT: %T.as_type.loc5_25.2: type = facet_access_type %T.ref.loc5 [symbolic = %T.as_type.loc5_25.1 (constants.%T.as_type)] +// CHECK:STDOUT: %.loc5_25.2: type = converted %T.ref.loc5, %T.as_type.loc5_25.2 [symbolic = %T.as_type.loc5_25.1 (constants.%T.as_type)] +// CHECK:STDOUT: } +// CHECK:STDOUT: %t: @G.%T.as_type.loc5_25.1 (%T.as_type) = wrapper_binding t, %t.param +// CHECK:STDOUT: } +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: interface @Transitive [from "transitive.carbon"] { +// CHECK:STDOUT: !members: +// CHECK:STDOUT: .Self = imports.%Main.import_ref.0d5 +// CHECK:STDOUT: .A = imports.%Main.import_ref.72c +// CHECK:STDOUT: .B = imports.%Main.import_ref.e5e +// CHECK:STDOUT: .C = imports.%Main.import_ref.c9c +// CHECK:STDOUT: .GetA = imports.%Main.import_ref.5c5 +// CHECK:STDOUT: .TakesC = imports.%Main.import_ref.ae2 +// CHECK:STDOUT: witness = (imports.%Main.A, imports.%Main.B, imports.%Main.C, imports.%Main.GetA, imports.%Main.TakesC) +// CHECK:STDOUT: +// CHECK:STDOUT: !requires: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: +// CHECK:STDOUT: @Transitive.observe { +// CHECK:STDOUT: observe constants.%impl.elem0.8aa205.1 == constants.%impl.elem1.1413d6.1 == constants.%impl.elem2.279493.1 +// CHECK:STDOUT: } +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: interface @R [from "transitive.carbon"] { +// CHECK:STDOUT: !members: +// CHECK:STDOUT: .Self = imports.%Main.import_ref.659 +// CHECK:STDOUT: .InR = imports.%Main.import_ref.682 +// CHECK:STDOUT: witness = (imports.%Main.InR) +// CHECK:STDOUT: +// CHECK:STDOUT: !requires: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: interface @Q [from "transitive.carbon"] { +// CHECK:STDOUT: !members: +// CHECK:STDOUT: .Self = imports.%Main.import_ref.4f3 +// CHECK:STDOUT: .InQ = imports.%Main.import_ref.849 +// CHECK:STDOUT: witness = (imports.%Main.InQ) +// CHECK:STDOUT: +// CHECK:STDOUT: !requires: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: interface @P [from "transitive.carbon"] { +// CHECK:STDOUT: !members: +// CHECK:STDOUT: .Self = imports.%Main.import_ref.96f +// CHECK:STDOUT: .InP = imports.%Main.import_ref.fec +// CHECK:STDOUT: witness = (imports.%Main.InP) +// CHECK:STDOUT: +// CHECK:STDOUT: !requires: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: generic fn @R.WithSelf.InR(imports.%Main.import_ref.f6968b.2: %R.type) [from "transitive.carbon"] { +// CHECK:STDOUT: %Self: %R.type = symbolic_binding Self, 0 [symbolic = %Self (constants.%Self.be6)] +// CHECK:STDOUT: %Self.as_type: type = facet_access_type %Self [symbolic = %Self.as_type (constants.%Self.as_type.b02)] +// CHECK:STDOUT: %pattern_type: type = pattern_type %Self.as_type [symbolic = %pattern_type (constants.%pattern_type.60e)] +// CHECK:STDOUT: %self.param_patt: @R.WithSelf.InR.%pattern_type (%pattern_type.60e) = value_param_pattern [symbolic = %self.param_patt (constants.%self.param_patt.640)] +// CHECK:STDOUT: %self.patt: @R.WithSelf.InR.%pattern_type (%pattern_type.60e) = at_binding_pattern self, %self.param_patt [symbolic = %self.patt (constants.%self.patt.894)] +// CHECK:STDOUT: +// CHECK:STDOUT: fn; +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: generic fn @Q.WithSelf.InQ(imports.%Main.import_ref.c0a1f5.2: %Q.type) [from "transitive.carbon"] { +// CHECK:STDOUT: %Self: %Q.type = symbolic_binding Self, 0 [symbolic = %Self (constants.%Self.afd)] +// CHECK:STDOUT: %Self.as_type: type = facet_access_type %Self [symbolic = %Self.as_type (constants.%Self.as_type.430)] +// CHECK:STDOUT: %pattern_type: type = pattern_type %Self.as_type [symbolic = %pattern_type (constants.%pattern_type.ade)] +// CHECK:STDOUT: %self.param_patt: @Q.WithSelf.InQ.%pattern_type (%pattern_type.ade) = value_param_pattern [symbolic = %self.param_patt (constants.%self.param_patt.271)] +// CHECK:STDOUT: %self.patt: @Q.WithSelf.InQ.%pattern_type (%pattern_type.ade) = at_binding_pattern self, %self.param_patt [symbolic = %self.patt (constants.%self.patt.b5e)] +// CHECK:STDOUT: +// CHECK:STDOUT: fn; +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: generic fn @P.WithSelf.InP(imports.%Main.import_ref.aef2fa.2: %P.type) [from "transitive.carbon"] { +// CHECK:STDOUT: %Self: %P.type = symbolic_binding Self, 0 [symbolic = %Self (constants.%Self.104)] +// CHECK:STDOUT: %Self.as_type: type = facet_access_type %Self [symbolic = %Self.as_type (constants.%Self.as_type.cc3)] +// CHECK:STDOUT: %pattern_type: type = pattern_type %Self.as_type [symbolic = %pattern_type (constants.%pattern_type.3ef)] +// CHECK:STDOUT: %self.param_patt: @P.WithSelf.InP.%pattern_type (%pattern_type.3ef) = value_param_pattern [symbolic = %self.param_patt (constants.%self.param_patt.88d)] +// CHECK:STDOUT: %self.patt: @P.WithSelf.InP.%pattern_type (%pattern_type.3ef) = at_binding_pattern self, %self.param_patt [symbolic = %self.patt (constants.%self.patt.6de)] +// CHECK:STDOUT: +// CHECK:STDOUT: fn; +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: generic fn @Transitive.WithSelf.TakesC(imports.%Main.import_ref.df6636.2: %Transitive.type) [from "transitive.carbon"] { +// CHECK:STDOUT: %Self: %Transitive.type = symbolic_binding Self, 0 [symbolic = %Self (constants.%Self.744)] +// CHECK:STDOUT: %Self.as_type: type = facet_access_type %Self [symbolic = %Self.as_type (constants.%Self.as_type.56c)] +// CHECK:STDOUT: %pattern_type.1: type = pattern_type %Self.as_type [symbolic = %pattern_type.1 (constants.%pattern_type.68e728.1)] +// CHECK:STDOUT: %self.param_patt: @Transitive.WithSelf.TakesC.%pattern_type.1 (%pattern_type.68e728.1) = value_param_pattern [symbolic = %self.param_patt (constants.%self.param_patt.e90fff.1)] +// CHECK:STDOUT: %self.patt: @Transitive.WithSelf.TakesC.%pattern_type.1 (%pattern_type.68e728.1) = at_binding_pattern self, %self.param_patt [symbolic = %self.patt (constants.%self.patt.d2dab3.1)] +// CHECK:STDOUT: %Transitive.lookup_impl_witness: = lookup_impl_witness %Self, @Transitive [symbolic = %Transitive.lookup_impl_witness (constants.%Transitive.lookup_impl_witness.ab0b8d.1)] +// CHECK:STDOUT: %impl.elem2: %facet_type.0e9 = impl_witness_access %Transitive.lookup_impl_witness, element2 [symbolic = %impl.elem2 (constants.%impl.elem2.279493.1)] +// CHECK:STDOUT: %as_type: type = facet_access_type %impl.elem2 [symbolic = %as_type (constants.%as_type.b2aa43.1)] +// CHECK:STDOUT: %pattern_type.2: type = pattern_type %as_type [symbolic = %pattern_type.2 (constants.%pattern_type.d96)] +// CHECK:STDOUT: %c.param_patt: @Transitive.WithSelf.TakesC.%pattern_type.2 (%pattern_type.d96) = value_param_pattern [symbolic = %c.param_patt (constants.%c.param_patt)] +// CHECK:STDOUT: %c.patt: @Transitive.WithSelf.TakesC.%pattern_type.2 (%pattern_type.d96) = at_binding_pattern c, %c.param_patt [symbolic = %c.patt (constants.%c.patt)] +// CHECK:STDOUT: +// CHECK:STDOUT: fn; +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: generic fn @Transitive.WithSelf.GetA(imports.%Main.import_ref.df6636.3: %Transitive.type) [from "transitive.carbon"] { +// CHECK:STDOUT: %Self: %Transitive.type = symbolic_binding Self, 0 [symbolic = %Self (constants.%Self.744)] +// CHECK:STDOUT: %Self.as_type: type = facet_access_type %Self [symbolic = %Self.as_type (constants.%Self.as_type.56c)] +// CHECK:STDOUT: %pattern_type.1: type = pattern_type %Self.as_type [symbolic = %pattern_type.1 (constants.%pattern_type.68e728.1)] +// CHECK:STDOUT: %self.param_patt: @Transitive.WithSelf.GetA.%pattern_type.1 (%pattern_type.68e728.1) = value_param_pattern [symbolic = %self.param_patt (constants.%self.param_patt.e90fff.1)] +// CHECK:STDOUT: %self.patt: @Transitive.WithSelf.GetA.%pattern_type.1 (%pattern_type.68e728.1) = at_binding_pattern self, %self.param_patt [symbolic = %self.patt (constants.%self.patt.d2dab3.1)] +// CHECK:STDOUT: %Transitive.lookup_impl_witness: = lookup_impl_witness %Self, @Transitive [symbolic = %Transitive.lookup_impl_witness (constants.%Transitive.lookup_impl_witness.ab0b8d.1)] +// CHECK:STDOUT: %impl.elem0: %facet_type.1ff = impl_witness_access %Transitive.lookup_impl_witness, element0 [symbolic = %impl.elem0 (constants.%impl.elem0.8aa205.1)] +// CHECK:STDOUT: %as_type: type = facet_access_type %impl.elem0 [symbolic = %as_type (constants.%as_type.a0914b.1)] +// CHECK:STDOUT: %.1: Core.Form = init_form %as_type [symbolic = %.1 (constants.%.3ef823.1)] +// CHECK:STDOUT: %pattern_type.2: type = pattern_type %as_type [symbolic = %pattern_type.2 (constants.%pattern_type.77f685.1)] +// CHECK:STDOUT: %return.param_patt: @Transitive.WithSelf.GetA.%pattern_type.2 (%pattern_type.77f685.1) = out_param_pattern [symbolic = %return.param_patt (constants.%return.param_patt.11f0b9.1)] +// CHECK:STDOUT: %return.patt: @Transitive.WithSelf.GetA.%pattern_type.2 (%pattern_type.77f685.1) = return_slot_pattern %return.param_patt, invalid [symbolic = %return.patt (constants.%return.patt.87a9a6.1)] +// CHECK:STDOUT: +// CHECK:STDOUT: fn; +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: generic fn @G(%T.loc5_7.2: %Transitive.type) { +// CHECK:STDOUT: %T.patt.loc5_7.2: %pattern_type.bd9 = symbolic_binding_pattern T, 0 [symbolic = %T.patt.loc5_7.2 (constants.%T.patt)] +// CHECK:STDOUT: %T.loc5_7.1: %Transitive.type = symbolic_binding T, 0 [symbolic = %T.loc5_7.1 (constants.%T)] +// CHECK:STDOUT: %T.as_type.loc5_25.1: type = facet_access_type %T.loc5_7.1 [symbolic = %T.as_type.loc5_25.1 (constants.%T.as_type)] +// CHECK:STDOUT: %pattern_type.loc5: type = pattern_type %T.as_type.loc5_25.1 [symbolic = %pattern_type.loc5 (constants.%pattern_type.68e728.2)] +// CHECK:STDOUT: %t.param_patt.loc5_23.2: @G.%pattern_type.loc5 (%pattern_type.68e728.2) = value_param_pattern [symbolic = %t.param_patt.loc5_23.2 (constants.%t.param_patt)] +// CHECK:STDOUT: %t.patt.loc5_23.2: @G.%pattern_type.loc5 (%pattern_type.68e728.2) = at_binding_pattern t, %t.param_patt.loc5_23.2 [symbolic = %t.patt.loc5_23.2 (constants.%t.patt)] +// CHECK:STDOUT: +// CHECK:STDOUT: !definition: +// CHECK:STDOUT: %require_complete.loc5: = require_complete_type %T.as_type.loc5_25.1 [symbolic = %require_complete.loc5 (constants.%require_complete.fbd)] +// CHECK:STDOUT: %Transitive.lookup_impl_witness: = lookup_impl_witness %T.loc5_7.1, @Transitive [symbolic = %Transitive.lookup_impl_witness (constants.%Transitive.lookup_impl_witness.ab0b8d.2)] +// CHECK:STDOUT: %impl.elem0.loc6_12.2: %facet_type.1ff = impl_witness_access %Transitive.lookup_impl_witness, element0 [symbolic = %impl.elem0.loc6_12.2 (constants.%impl.elem0.8aa205.2)] +// CHECK:STDOUT: %impl.elem1.loc6_19.2: %facet_type.1b9 = impl_witness_access %Transitive.lookup_impl_witness, element1 [symbolic = %impl.elem1.loc6_19.2 (constants.%impl.elem1.1413d6.2)] +// CHECK:STDOUT: %as_type.loc6_19.3: type = facet_access_type %impl.elem1.loc6_19.2 [symbolic = %as_type.loc6_19.3 (constants.%as_type.f86e2d.2)] +// CHECK:STDOUT: %as_type.loc6_12.2: type = facet_access_type %impl.elem0.loc6_12.2 [symbolic = %as_type.loc6_12.2 (constants.%as_type.a0914b.2)] +// CHECK:STDOUT: %eq.loc6_15 = observe_equivalent %impl.elem0.loc6_12.2, %impl.elem1.loc6_19.2 [symbolic = %eq.loc6_15 (constants.%eq.20ba2e.2)] +// CHECK:STDOUT: %impl.elem2.loc6_26.2: %facet_type.0e9 = impl_witness_access %Transitive.lookup_impl_witness, element2 [symbolic = %impl.elem2.loc6_26.2 (constants.%impl.elem2.279493.2)] +// CHECK:STDOUT: %as_type.loc6_26.2: type = facet_access_type %impl.elem2.loc6_26.2 [symbolic = %as_type.loc6_26.2 (constants.%as_type.b2aa43.2)] +// CHECK:STDOUT: %eq.loc6_22 = observe_equivalent %impl.elem1.loc6_19.2, %impl.elem2.loc6_26.2 [symbolic = %eq.loc6_22 (constants.%eq.be77bc.2)] +// CHECK:STDOUT: %require_complete.loc8: = require_complete_type %as_type.loc6_12.2 [symbolic = %require_complete.loc8 (constants.%require_complete.6cf)] +// CHECK:STDOUT: %pattern_type.loc8: type = pattern_type %as_type.loc6_12.2 [symbolic = %pattern_type.loc8 (constants.%pattern_type.77f685.2)] +// CHECK:STDOUT: %a.patt.loc8_8.2: @G.%pattern_type.loc8 (%pattern_type.77f685.2) = ref_binding_pattern a [symbolic = %a.patt.loc8_8.2 (constants.%a.patt)] +// CHECK:STDOUT: %a.var_patt.loc8_3.2: @G.%pattern_type.loc8 (%pattern_type.77f685.2) = var_pattern %a.patt.loc8_8.2 [symbolic = %a.var_patt.loc8_3.2 (constants.%a.var_patt)] +// CHECK:STDOUT: %Transitive.WithSelf.GetA.type: type = fn_type @Transitive.WithSelf.GetA, @Transitive.WithSelf(%T.loc5_7.1) [symbolic = %Transitive.WithSelf.GetA.type (constants.%Transitive.WithSelf.GetA.type.0b3c58.2)] +// CHECK:STDOUT: %.loc8_17: type = fn_type_with_self_type %Transitive.WithSelf.GetA.type, %T.loc5_7.1 [symbolic = %.loc8_17 (constants.%.657)] +// CHECK:STDOUT: %impl.elem3.loc8_17.2: @G.%.loc8_17 (%.657) = impl_witness_access %Transitive.lookup_impl_witness, element3 [symbolic = %impl.elem3.loc8_17.2 (constants.%impl.elem3)] +// CHECK:STDOUT: %specific_impl_fn.loc8_17.2: = specific_impl_function %impl.elem3.loc8_17.2, @Transitive.WithSelf.GetA(%T.loc5_7.1) [symbolic = %specific_impl_fn.loc8_17.2 (constants.%specific_impl_fn.72f)] +// CHECK:STDOUT: %R.lookup_impl_witness: = lookup_impl_witness %impl.elem2.loc6_26.2, @R [symbolic = %R.lookup_impl_witness (constants.%R.lookup_impl_witness.aa0)] +// CHECK:STDOUT: %R.facet: %R.type = facet_value %as_type.loc6_26.2, (%R.lookup_impl_witness) [symbolic = %R.facet (constants.%R.facet)] +// CHECK:STDOUT: %R.WithSelf.InR.type: type = fn_type @R.WithSelf.InR, @R.WithSelf(%R.facet) [symbolic = %R.WithSelf.InR.type (constants.%R.WithSelf.InR.type.56d)] +// CHECK:STDOUT: %.loc17_9.2: type = fn_type_with_self_type %R.WithSelf.InR.type, %R.facet [symbolic = %.loc17_9.2 (constants.%.f43)] +// CHECK:STDOUT: %impl.elem0.loc17_9.2: @G.%.loc17_9.2 (%.f43) = impl_witness_access %R.lookup_impl_witness, element0 [symbolic = %impl.elem0.loc17_9.2 (constants.%impl.elem0.8cc)] +// CHECK:STDOUT: %Destroy.lookup_impl_witness: = lookup_impl_witness %impl.elem0.loc6_12.2, @Destroy [symbolic = %Destroy.lookup_impl_witness (constants.%Destroy.lookup_impl_witness)] +// CHECK:STDOUT: %Destroy.facet.loc8_3.3: %Destroy.type = facet_value %as_type.loc6_12.2, (%Destroy.lookup_impl_witness) [symbolic = %Destroy.facet.loc8_3.3 (constants.%Destroy.facet)] +// CHECK:STDOUT: %Destroy.WithSelf.Op.type: type = fn_type @Destroy.WithSelf.Op, @Destroy.WithSelf(%Destroy.facet.loc8_3.3) [symbolic = %Destroy.WithSelf.Op.type (constants.%Destroy.WithSelf.Op.type.74e)] +// CHECK:STDOUT: %.loc8_3.4: type = fn_type_with_self_type %Destroy.WithSelf.Op.type, %Destroy.facet.loc8_3.3 [symbolic = %.loc8_3.4 (constants.%.569)] +// CHECK:STDOUT: %impl.elem0.loc8_3.2: @G.%.loc8_3.4 (%.569) = impl_witness_access %Destroy.lookup_impl_witness, element0 [symbolic = %impl.elem0.loc8_3.2 (constants.%impl.elem0.95f)] +// CHECK:STDOUT: %specific_impl_fn.loc8_3.2: = specific_impl_function %impl.elem0.loc8_3.2, @Destroy.WithSelf.Op(%Destroy.facet.loc8_3.3) [symbolic = %specific_impl_fn.loc8_3.2 (constants.%specific_impl_fn.584)] +// CHECK:STDOUT: +// CHECK:STDOUT: fn(%t.param: @G.%T.as_type.loc5_25.1 (%T.as_type)) { +// CHECK:STDOUT: !entry: +// CHECK:STDOUT: %T.ref.loc6_11: %Transitive.type = name_ref T, %T.loc5_7.2 [symbolic = %T.loc5_7.1 (constants.%T)] +// CHECK:STDOUT: %T.as_type.loc6_12: type = facet_access_type %T.ref.loc6_11 [symbolic = %T.as_type.loc5_25.1 (constants.%T.as_type)] +// CHECK:STDOUT: %.loc6_12.1: type = converted %T.ref.loc6_11, %T.as_type.loc6_12 [symbolic = %T.as_type.loc5_25.1 (constants.%T.as_type)] +// CHECK:STDOUT: %A.ref.loc6: %Transitive.assoc_type = name_ref A, imports.%Main.import_ref.72c [concrete = constants.%assoc0.e77] +// CHECK:STDOUT: %impl.elem0.loc6_12.1: %facet_type.1ff = impl_witness_access constants.%Transitive.lookup_impl_witness.ab0b8d.2, element0 [symbolic = %impl.elem0.loc6_12.2 (constants.%impl.elem0.8aa205.2)] +// CHECK:STDOUT: %T.ref.loc6_18: %Transitive.type = name_ref T, %T.loc5_7.2 [symbolic = %T.loc5_7.1 (constants.%T)] +// CHECK:STDOUT: %T.as_type.loc6_19: type = facet_access_type %T.ref.loc6_18 [symbolic = %T.as_type.loc5_25.1 (constants.%T.as_type)] +// CHECK:STDOUT: %.loc6_19.1: type = converted %T.ref.loc6_18, %T.as_type.loc6_19 [symbolic = %T.as_type.loc5_25.1 (constants.%T.as_type)] +// CHECK:STDOUT: %B.ref: %Transitive.assoc_type = name_ref B, imports.%Main.import_ref.e5e [concrete = constants.%assoc1] +// CHECK:STDOUT: %impl.elem1.loc6_19.1: %facet_type.1b9 = impl_witness_access constants.%Transitive.lookup_impl_witness.ab0b8d.2, element1 [symbolic = %impl.elem1.loc6_19.2 (constants.%impl.elem1.1413d6.2)] +// CHECK:STDOUT: %as_type.loc6_19.1: type = facet_access_type %impl.elem1.loc6_19.1 [symbolic = %as_type.loc6_19.3 (constants.%as_type.f86e2d.2)] +// CHECK:STDOUT: %.loc6_19.2: type = converted %impl.elem1.loc6_19.1, %as_type.loc6_19.1 [symbolic = %as_type.loc6_19.3 (constants.%as_type.f86e2d.2)] +// CHECK:STDOUT: %as_type.loc6_12.1: type = facet_access_type %impl.elem0.loc6_12.1 [symbolic = %as_type.loc6_12.2 (constants.%as_type.a0914b.2)] +// CHECK:STDOUT: %.loc6_12.2: type = converted %impl.elem0.loc6_12.1, %as_type.loc6_12.1 [symbolic = %as_type.loc6_12.2 (constants.%as_type.a0914b.2)] +// CHECK:STDOUT: %T.ref.loc6_25: %Transitive.type = name_ref T, %T.loc5_7.2 [symbolic = %T.loc5_7.1 (constants.%T)] +// CHECK:STDOUT: %T.as_type.loc6_26: type = facet_access_type %T.ref.loc6_25 [symbolic = %T.as_type.loc5_25.1 (constants.%T.as_type)] +// CHECK:STDOUT: %.loc6_26.1: type = converted %T.ref.loc6_25, %T.as_type.loc6_26 [symbolic = %T.as_type.loc5_25.1 (constants.%T.as_type)] +// CHECK:STDOUT: %C.ref.loc6: %Transitive.assoc_type = name_ref C, imports.%Main.import_ref.c9c [concrete = constants.%assoc2] +// CHECK:STDOUT: %impl.elem2.loc6_26.1: %facet_type.0e9 = impl_witness_access constants.%Transitive.lookup_impl_witness.ab0b8d.2, element2 [symbolic = %impl.elem2.loc6_26.2 (constants.%impl.elem2.279493.2)] +// CHECK:STDOUT: %as_type.loc6_26.1: type = facet_access_type %impl.elem2.loc6_26.1 [symbolic = %as_type.loc6_26.2 (constants.%as_type.b2aa43.2)] +// CHECK:STDOUT: %.loc6_26.2: type = converted %impl.elem2.loc6_26.1, %as_type.loc6_26.1 [symbolic = %as_type.loc6_26.2 (constants.%as_type.b2aa43.2)] +// CHECK:STDOUT: %as_type.loc6_19.2: type = facet_access_type %impl.elem1.loc6_19.1 [symbolic = %as_type.loc6_19.3 (constants.%as_type.f86e2d.2)] +// CHECK:STDOUT: %.loc6_19.3: type = converted %impl.elem1.loc6_19.1, %as_type.loc6_19.2 [symbolic = %as_type.loc6_19.3 (constants.%as_type.f86e2d.2)] +// CHECK:STDOUT: %G.observe.decl = observe_decl @G.observe [concrete] +// CHECK:STDOUT: %a.var: ref @G.%as_type.loc6_12.2 (%as_type.a0914b.2) = var_storage %a.var_patt.loc8_3.1 +// CHECK:STDOUT: %t.ref: @G.%T.as_type.loc5_25.1 (%T.as_type) = name_ref t, %t +// CHECK:STDOUT: %GetA.ref: %Transitive.assoc_type = name_ref GetA, imports.%Main.import_ref.5c5 [concrete = constants.%assoc3] +// CHECK:STDOUT: %impl.elem3.loc8_17.1: @G.%.loc8_17 (%.657) = impl_witness_access constants.%Transitive.lookup_impl_witness.ab0b8d.2, element3 [symbolic = %impl.elem3.loc8_17.2 (constants.%impl.elem3)] +// CHECK:STDOUT: %bound_method.loc8_17: = bound_method %t.ref, %impl.elem3.loc8_17.1 +// CHECK:STDOUT: %.loc8_23.1: %Transitive.type = converted constants.%T.as_type, constants.%T [symbolic = %T.loc5_7.1 (constants.%T)] +// CHECK:STDOUT: %.loc8_23.2: %Transitive.type = converted constants.%T.as_type, constants.%T [symbolic = %T.loc5_7.1 (constants.%T)] +// CHECK:STDOUT: %specific_impl_fn.loc8_17.1: = specific_impl_function %impl.elem3.loc8_17.1, @Transitive.WithSelf.GetA(constants.%T) [symbolic = %specific_impl_fn.loc8_17.2 (constants.%specific_impl_fn.72f)] +// CHECK:STDOUT: %bound_method.loc8_23: = bound_method %t.ref, %specific_impl_fn.loc8_17.1 +// CHECK:STDOUT: %.loc8_3.1: ref @G.%as_type.loc6_12.2 (%as_type.a0914b.2) = splice_block %a.var {} +// CHECK:STDOUT: %Transitive.WithSelf.GetA.call: init @G.%as_type.loc6_12.2 (%as_type.a0914b.2) to %.loc8_3.1 = call %bound_method.loc8_23(%t.ref) +// CHECK:STDOUT: assign %a.var, %Transitive.WithSelf.GetA.call +// CHECK:STDOUT: %.loc8_11.1: type = splice_block %.loc8_11.3 [symbolic = %as_type.loc6_12.2 (constants.%as_type.a0914b.2)] { +// CHECK:STDOUT: %T.ref.loc8: %Transitive.type = name_ref T, %T.loc5_7.2 [symbolic = %T.loc5_7.1 (constants.%T)] +// CHECK:STDOUT: %T.as_type.loc8: type = facet_access_type %T.ref.loc8 [symbolic = %T.as_type.loc5_25.1 (constants.%T.as_type)] +// CHECK:STDOUT: %.loc8_11.2: type = converted %T.ref.loc8, %T.as_type.loc8 [symbolic = %T.as_type.loc5_25.1 (constants.%T.as_type)] +// CHECK:STDOUT: %A.ref.loc8: %Transitive.assoc_type = name_ref A, imports.%Main.import_ref.72c [concrete = constants.%assoc0.e77] +// CHECK:STDOUT: %impl.elem0.loc8_11: %facet_type.1ff = impl_witness_access constants.%Transitive.lookup_impl_witness.ab0b8d.2, element0 [symbolic = %impl.elem0.loc6_12.2 (constants.%impl.elem0.8aa205.2)] +// CHECK:STDOUT: %as_type.loc8: type = facet_access_type %impl.elem0.loc8_11 [symbolic = %as_type.loc6_12.2 (constants.%as_type.a0914b.2)] +// CHECK:STDOUT: %.loc8_11.3: type = converted %impl.elem0.loc8_11, %as_type.loc8 [symbolic = %as_type.loc6_12.2 (constants.%as_type.a0914b.2)] +// CHECK:STDOUT: } +// CHECK:STDOUT: %a: ref @G.%as_type.loc6_12.2 (%as_type.a0914b.2) = wrapper_binding a, %a.var +// CHECK:STDOUT: name_binding_decl { +// CHECK:STDOUT: %a.patt.loc8_8.1: @G.%pattern_type.loc8 (%pattern_type.77f685.2) = ref_binding_pattern a [symbolic = %a.patt.loc8_8.2 (constants.%a.patt)] +// CHECK:STDOUT: %a.var_patt.loc8_3.1: @G.%pattern_type.loc8 (%pattern_type.77f685.2) = var_pattern %a.patt.loc8_8.1 [symbolic = %a.var_patt.loc8_3.2 (constants.%a.var_patt)] +// CHECK:STDOUT: } +// CHECK:STDOUT: %a.ref: ref @G.%as_type.loc6_12.2 (%as_type.a0914b.2) = name_ref a, %a +// CHECK:STDOUT: %T.ref.loc17: %Transitive.type = name_ref T, %T.loc5_7.2 [symbolic = %T.loc5_7.1 (constants.%T)] +// CHECK:STDOUT: %T.as_type.loc17: type = facet_access_type %T.ref.loc17 [symbolic = %T.as_type.loc5_25.1 (constants.%T.as_type)] +// CHECK:STDOUT: %.loc17_7: type = converted %T.ref.loc17, %T.as_type.loc17 [symbolic = %T.as_type.loc5_25.1 (constants.%T.as_type)] +// CHECK:STDOUT: %C.ref.loc17: %Transitive.assoc_type = name_ref C, imports.%Main.import_ref.c9c [concrete = constants.%assoc2] +// CHECK:STDOUT: %impl.elem2.loc17: %facet_type.0e9 = impl_witness_access constants.%Transitive.lookup_impl_witness.ab0b8d.2, element2 [symbolic = %impl.elem2.loc6_26.2 (constants.%impl.elem2.279493.2)] +// CHECK:STDOUT: %as_type.loc17: type = facet_access_type %impl.elem2.loc17 [symbolic = %as_type.loc6_26.2 (constants.%as_type.b2aa43.2)] +// CHECK:STDOUT: %.loc17_9.1: type = converted %impl.elem2.loc17, %as_type.loc17 [symbolic = %as_type.loc6_26.2 (constants.%as_type.b2aa43.2)] +// CHECK:STDOUT: %InR.ref: %R.assoc_type = name_ref InR, imports.%Main.import_ref.682 [concrete = constants.%assoc0.e94] +// CHECK:STDOUT: %facet_type: type = facet_type <@Destroy & @R> [concrete = constants.%facet_type.fcc] +// CHECK:STDOUT: %impl.elem0.loc17_9.1: @G.%.loc17_9.2 (%.f43) = impl_witness_access constants.%R.lookup_impl_witness.aa0, element0 [symbolic = %impl.elem0.loc17_9.2 (constants.%impl.elem0.8cc)] +// CHECK:STDOUT: %bound_method.loc17: = bound_method %a.ref, %impl.elem0.loc17_9.1 +// CHECK:STDOUT: %impl.elem0.loc8_3.1: @G.%.loc8_3.4 (%.569) = impl_witness_access constants.%Destroy.lookup_impl_witness, element0 [symbolic = %impl.elem0.loc8_3.2 (constants.%impl.elem0.95f)] +// CHECK:STDOUT: %bound_method.loc8_3.1: = bound_method %a.var, %impl.elem0.loc8_3.1 +// CHECK:STDOUT: %Destroy.facet.loc8_3.1: %Destroy.type = facet_value constants.%as_type.a0914b.2, (constants.%Destroy.lookup_impl_witness) [symbolic = %Destroy.facet.loc8_3.3 (constants.%Destroy.facet)] +// CHECK:STDOUT: %.loc8_3.2: %Destroy.type = converted constants.%as_type.a0914b.2, %Destroy.facet.loc8_3.1 [symbolic = %Destroy.facet.loc8_3.3 (constants.%Destroy.facet)] +// CHECK:STDOUT: %Destroy.facet.loc8_3.2: %Destroy.type = facet_value constants.%as_type.a0914b.2, (constants.%Destroy.lookup_impl_witness) [symbolic = %Destroy.facet.loc8_3.3 (constants.%Destroy.facet)] +// CHECK:STDOUT: %.loc8_3.3: %Destroy.type = converted constants.%as_type.a0914b.2, %Destroy.facet.loc8_3.2 [symbolic = %Destroy.facet.loc8_3.3 (constants.%Destroy.facet)] +// CHECK:STDOUT: %specific_impl_fn.loc8_3.1: = specific_impl_function %impl.elem0.loc8_3.1, @Destroy.WithSelf.Op(constants.%Destroy.facet) [symbolic = %specific_impl_fn.loc8_3.2 (constants.%specific_impl_fn.584)] +// CHECK:STDOUT: %bound_method.loc8_3.2: = bound_method %a.var, %specific_impl_fn.loc8_3.1 +// CHECK:STDOUT: %Destroy.WithSelf.Op.call: init %empty_tuple.type = call %bound_method.loc8_3.2(%a.var) +// CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: +// CHECK:STDOUT: @G.observe { +// CHECK:STDOUT: observe constants.%impl.elem0.8aa205.2 == constants.%impl.elem1.1413d6.2 == constants.%impl.elem2.279493.2 +// CHECK:STDOUT: } +// CHECK:STDOUT: } +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: specific @R.WithSelf(constants.%Self.be6) { +// CHECK:STDOUT: !definition: +// CHECK:STDOUT: %Self => constants.%Self.be6 +// CHECK:STDOUT: %R.WithSelf.InR.type => constants.%R.WithSelf.InR.type.4bf +// CHECK:STDOUT: %R.WithSelf.InR => constants.%R.WithSelf.InR.345 +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: specific @R.WithSelf.InR(constants.%Self.be6) { +// CHECK:STDOUT: %Self => constants.%Self.be6 +// CHECK:STDOUT: %Self.as_type => constants.%Self.as_type.b02 +// CHECK:STDOUT: %pattern_type => constants.%pattern_type.60e +// CHECK:STDOUT: %self.param_patt => constants.%self.param_patt.640 +// CHECK:STDOUT: %self.patt => constants.%self.patt.894 +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: specific @Q.WithSelf(constants.%Self.afd) { +// CHECK:STDOUT: !definition: +// CHECK:STDOUT: %Self => constants.%Self.afd +// CHECK:STDOUT: %Q.WithSelf.InQ.type => constants.%Q.WithSelf.InQ.type +// CHECK:STDOUT: %Q.WithSelf.InQ => constants.%Q.WithSelf.InQ +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: specific @Q.WithSelf.InQ(constants.%Self.afd) { +// CHECK:STDOUT: %Self => constants.%Self.afd +// CHECK:STDOUT: %Self.as_type => constants.%Self.as_type.430 +// CHECK:STDOUT: %pattern_type => constants.%pattern_type.ade +// CHECK:STDOUT: %self.param_patt => constants.%self.param_patt.271 +// CHECK:STDOUT: %self.patt => constants.%self.patt.b5e +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: specific @P.WithSelf(constants.%Self.104) { +// CHECK:STDOUT: !definition: +// CHECK:STDOUT: %Self => constants.%Self.104 +// CHECK:STDOUT: %P.WithSelf.InP.type => constants.%P.WithSelf.InP.type +// CHECK:STDOUT: %P.WithSelf.InP => constants.%P.WithSelf.InP +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: specific @P.WithSelf.InP(constants.%Self.104) { +// CHECK:STDOUT: %Self => constants.%Self.104 +// CHECK:STDOUT: %Self.as_type => constants.%Self.as_type.cc3 +// CHECK:STDOUT: %pattern_type => constants.%pattern_type.3ef +// CHECK:STDOUT: %self.param_patt => constants.%self.param_patt.88d +// CHECK:STDOUT: %self.patt => constants.%self.patt.6de +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: specific @Transitive.WithSelf(constants.%Self.744) { +// CHECK:STDOUT: !definition: +// CHECK:STDOUT: %Self => constants.%Self.744 +// CHECK:STDOUT: %Transitive.lookup_impl_witness => constants.%Transitive.lookup_impl_witness.ab0b8d.1 +// CHECK:STDOUT: %impl.elem0 => constants.%impl.elem0.8aa205.1 +// CHECK:STDOUT: %impl.elem1 => constants.%impl.elem1.1413d6.1 +// CHECK:STDOUT: %Transitive.WithSelf.GetA.type => constants.%Transitive.WithSelf.GetA.type.0b3c58.1 +// CHECK:STDOUT: %Transitive.WithSelf.GetA => constants.%Transitive.WithSelf.GetA.e3e09c.1 +// CHECK:STDOUT: %Transitive.WithSelf.TakesC.type => constants.%Transitive.WithSelf.TakesC.type.d86d9f.1 +// CHECK:STDOUT: %Transitive.WithSelf.TakesC => constants.%Transitive.WithSelf.TakesC.f276cd.1 +// CHECK:STDOUT: %as_type.1 => constants.%as_type.f86e2d.1 +// CHECK:STDOUT: %as_type.2 => constants.%as_type.a0914b.1 +// CHECK:STDOUT: %eq.1 => constants.%eq.20ba2e.1 +// CHECK:STDOUT: %impl.elem2 => constants.%impl.elem2.279493.1 +// CHECK:STDOUT: %as_type.3 => constants.%as_type.b2aa43.1 +// CHECK:STDOUT: %eq.2 => constants.%eq.be77bc.1 +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: specific @Transitive.WithSelf.TakesC(constants.%Self.744) { +// CHECK:STDOUT: %Self => constants.%Self.744 +// CHECK:STDOUT: %Self.as_type => constants.%Self.as_type.56c +// CHECK:STDOUT: %pattern_type.1 => constants.%pattern_type.68e728.1 +// CHECK:STDOUT: %self.param_patt => constants.%self.param_patt.e90fff.1 +// CHECK:STDOUT: %self.patt => constants.%self.patt.d2dab3.1 +// CHECK:STDOUT: %Transitive.lookup_impl_witness => constants.%Transitive.lookup_impl_witness.ab0b8d.1 +// CHECK:STDOUT: %impl.elem2 => constants.%impl.elem2.279493.1 +// CHECK:STDOUT: %as_type => constants.%as_type.b2aa43.1 +// CHECK:STDOUT: %pattern_type.2 => constants.%pattern_type.d96 +// CHECK:STDOUT: %c.param_patt => constants.%c.param_patt +// CHECK:STDOUT: %c.patt => constants.%c.patt +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: specific @Transitive.WithSelf.GetA(constants.%Self.744) { +// CHECK:STDOUT: %Self => constants.%Self.744 +// CHECK:STDOUT: %Self.as_type => constants.%Self.as_type.56c +// CHECK:STDOUT: %pattern_type.1 => constants.%pattern_type.68e728.1 +// CHECK:STDOUT: %self.param_patt => constants.%self.param_patt.e90fff.1 +// CHECK:STDOUT: %self.patt => constants.%self.patt.d2dab3.1 +// CHECK:STDOUT: %Transitive.lookup_impl_witness => constants.%Transitive.lookup_impl_witness.ab0b8d.1 +// CHECK:STDOUT: %impl.elem0 => constants.%impl.elem0.8aa205.1 +// CHECK:STDOUT: %as_type => constants.%as_type.a0914b.1 +// CHECK:STDOUT: %.1 => constants.%.3ef823.1 +// CHECK:STDOUT: %pattern_type.2 => constants.%pattern_type.77f685.1 +// CHECK:STDOUT: %return.param_patt => constants.%return.param_patt.11f0b9.1 +// CHECK:STDOUT: %return.patt => constants.%return.patt.87a9a6.1 +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: specific @G(constants.%T) { +// CHECK:STDOUT: %T.patt.loc5_7.2 => constants.%T.patt +// CHECK:STDOUT: %T.loc5_7.1 => constants.%T +// CHECK:STDOUT: %T.as_type.loc5_25.1 => constants.%T.as_type +// CHECK:STDOUT: %pattern_type.loc5 => constants.%pattern_type.68e728.2 +// CHECK:STDOUT: %t.param_patt.loc5_23.2 => constants.%t.param_patt +// CHECK:STDOUT: %t.patt.loc5_23.2 => constants.%t.patt +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: specific @Transitive.WithSelf(constants.%T) { +// CHECK:STDOUT: !definition: +// CHECK:STDOUT: %Self => constants.%T +// CHECK:STDOUT: %Transitive.lookup_impl_witness => constants.%Transitive.lookup_impl_witness.ab0b8d.2 +// CHECK:STDOUT: %impl.elem0 => constants.%impl.elem0.8aa205.2 +// CHECK:STDOUT: %impl.elem1 => constants.%impl.elem1.1413d6.2 +// CHECK:STDOUT: %Transitive.WithSelf.GetA.type => constants.%Transitive.WithSelf.GetA.type.0b3c58.2 +// CHECK:STDOUT: %Transitive.WithSelf.GetA => constants.%Transitive.WithSelf.GetA.e3e09c.2 +// CHECK:STDOUT: %Transitive.WithSelf.TakesC.type => constants.%Transitive.WithSelf.TakesC.type.d86d9f.2 +// CHECK:STDOUT: %Transitive.WithSelf.TakesC => constants.%Transitive.WithSelf.TakesC.f276cd.2 +// CHECK:STDOUT: %as_type.1 => constants.%as_type.f86e2d.2 +// CHECK:STDOUT: %as_type.2 => constants.%as_type.a0914b.2 +// CHECK:STDOUT: %eq.1 => constants.%eq.20ba2e.2 +// CHECK:STDOUT: %impl.elem2 => constants.%impl.elem2.279493.2 +// CHECK:STDOUT: %as_type.3 => constants.%as_type.b2aa43.2 +// CHECK:STDOUT: %eq.2 => constants.%eq.be77bc.2 +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: specific @Transitive.WithSelf.GetA(constants.%T) { +// CHECK:STDOUT: %Self => constants.%T +// CHECK:STDOUT: %Self.as_type => constants.%T.as_type +// CHECK:STDOUT: %pattern_type.1 => constants.%pattern_type.68e728.2 +// CHECK:STDOUT: %self.param_patt => constants.%self.param_patt.e90fff.2 +// CHECK:STDOUT: %self.patt => constants.%self.patt.d2dab3.2 +// CHECK:STDOUT: %Transitive.lookup_impl_witness => constants.%Transitive.lookup_impl_witness.ab0b8d.2 +// CHECK:STDOUT: %impl.elem0 => constants.%impl.elem0.8aa205.2 +// CHECK:STDOUT: %as_type => constants.%as_type.a0914b.2 +// CHECK:STDOUT: %.1 => constants.%.3ef823.2 +// CHECK:STDOUT: %pattern_type.2 => constants.%pattern_type.77f685.2 +// CHECK:STDOUT: %return.param_patt => constants.%return.param_patt.11f0b9.2 +// CHECK:STDOUT: %return.patt => constants.%return.patt.87a9a6.2 +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: specific @R.WithSelf(constants.%impl.elem2.279493.2) { +// CHECK:STDOUT: !definition: +// CHECK:STDOUT: %Self => constants.%impl.elem2.279493.2 +// CHECK:STDOUT: %R.WithSelf.InR.type => constants.%R.WithSelf.InR.type.a87 +// CHECK:STDOUT: %R.WithSelf.InR => constants.%R.WithSelf.InR.704 +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: specific @R.WithSelf(constants.%R.facet) { +// CHECK:STDOUT: !definition: +// CHECK:STDOUT: %Self => constants.%R.facet +// CHECK:STDOUT: %R.WithSelf.InR.type => constants.%R.WithSelf.InR.type.56d +// CHECK:STDOUT: %R.WithSelf.InR => constants.%R.WithSelf.InR.9a8 +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: --- blanket_impls.carbon +// CHECK:STDOUT: +// CHECK:STDOUT: constants { +// CHECK:STDOUT: %A.type: type = facet_type <@A> [concrete] +// CHECK:STDOUT: %Self.d0c: %A.type = symbolic_binding Self, 0 [symbolic] +// CHECK:STDOUT: %B.type: type = facet_type <@B> [concrete] +// CHECK:STDOUT: %Self.b45: %B.type = symbolic_binding Self, 0 [symbolic] +// CHECK:STDOUT: %C.type: type = facet_type <@C> [concrete] +// CHECK:STDOUT: %Self.62a: %C.type = symbolic_binding Self, 0 [symbolic] +// CHECK:STDOUT: %D.type: type = facet_type <@D> [concrete] +// CHECK:STDOUT: %Self.e2d: %D.type = symbolic_binding Self, 0 [symbolic] +// CHECK:STDOUT: %type: type = facet_type [concrete] +// CHECK:STDOUT: %.Self: %type = symbolic_binding .Self [symbolic_self] +// CHECK:STDOUT: %pattern_type.029: type = pattern_type %A.type [concrete] +// CHECK:STDOUT: %T.patt.a4b: %pattern_type.029 = symbolic_binding_pattern T, 0 [symbolic] +// CHECK:STDOUT: %T.626: %A.type = symbolic_binding T, 0 [symbolic] +// CHECK:STDOUT: %T.as_type.3b8: type = facet_access_type %T.626 [symbolic] +// CHECK:STDOUT: %B.impl_witness: = impl_witness @T.as_type.as.B.impl.%B.impl_witness_table, @T.as_type.as.B.impl(%T.626) [symbolic] +// CHECK:STDOUT: %B.facet.c04: %B.type = facet_value %T.as_type.3b8, (%B.impl_witness) [symbolic] +// CHECK:STDOUT: %pattern_type.7b5: type = pattern_type %B.type [concrete] +// CHECK:STDOUT: %T.patt.ca5: %pattern_type.7b5 = symbolic_binding_pattern T, 0 [symbolic] +// CHECK:STDOUT: %T.ed4: %B.type = symbolic_binding T, 0 [symbolic] +// CHECK:STDOUT: %T.as_type.4de: type = facet_access_type %T.ed4 [symbolic] +// CHECK:STDOUT: %C.impl_witness.9e3: = impl_witness @T.as_type.as.C.impl.%C.impl_witness_table, @T.as_type.as.C.impl(%T.ed4) [symbolic] +// CHECK:STDOUT: %C.facet.355: %C.type = facet_value %T.as_type.4de, (%C.impl_witness.9e3) [symbolic] +// CHECK:STDOUT: %pattern_type.647: type = pattern_type %C.type [concrete] +// CHECK:STDOUT: %T.patt.ece: %pattern_type.647 = symbolic_binding_pattern T, 0 [symbolic] +// CHECK:STDOUT: %T.659: %C.type = symbolic_binding T, 0 [symbolic] +// CHECK:STDOUT: %T.as_type.c69: type = facet_access_type %T.659 [symbolic] +// CHECK:STDOUT: %D.impl_witness.8a1: = impl_witness @T.as_type.as.D.impl.%D.impl_witness_table, @T.as_type.as.D.impl(%T.659) [symbolic] +// CHECK:STDOUT: %D.facet.3d0: %D.type = facet_value %T.as_type.c69, (%D.impl_witness.8a1) [symbolic] +// CHECK:STDOUT: %pattern_type.c89: type = pattern_type %T.as_type.4de [symbolic] +// CHECK:STDOUT: %x.param_patt.1d2: %pattern_type.c89 = value_param_pattern [symbolic] +// CHECK:STDOUT: %x.patt.3a5: %pattern_type.c89 = at_binding_pattern x, %x.param_patt.1d2 [symbolic] +// CHECK:STDOUT: %RequiresB.type: type = fn_type @RequiresB [concrete] +// CHECK:STDOUT: %empty_tuple.type: type = tuple_type () [concrete] +// CHECK:STDOUT: %RequiresB: %RequiresB.type = struct_value () [concrete] +// CHECK:STDOUT: %require_complete.346: = require_complete_type %T.as_type.4de [symbolic] +// CHECK:STDOUT: %pattern_type.549: type = pattern_type %D.type [concrete] +// CHECK:STDOUT: %T.patt.604: %pattern_type.549 = symbolic_binding_pattern T, 0 [symbolic] +// CHECK:STDOUT: %T.3dd: %D.type = symbolic_binding T, 0 [symbolic] +// CHECK:STDOUT: %T.as_type.8cd: type = facet_access_type %T.3dd [symbolic] +// CHECK:STDOUT: %pattern_type.86b: type = pattern_type %T.as_type.8cd [symbolic] +// CHECK:STDOUT: %x.param_patt.2ab: %pattern_type.86b = value_param_pattern [symbolic] +// CHECK:STDOUT: %x.patt.a712ca.1: %pattern_type.86b = at_binding_pattern x, %x.param_patt.2ab [symbolic] +// CHECK:STDOUT: %x.patt.a712ca.2: %pattern_type.86b = at_binding_pattern x, %x.param_patt.2ab [symbolic] +// CHECK:STDOUT: %RequiresD.type: type = fn_type @RequiresD [concrete] +// CHECK:STDOUT: %RequiresD: %RequiresD.type = struct_value () [concrete] +// CHECK:STDOUT: %require_complete.904: = require_complete_type %T.as_type.8cd [symbolic] +// CHECK:STDOUT: %pattern_type.a0e: type = pattern_type %T.as_type.3b8 [symbolic] +// CHECK:STDOUT: %x.param_patt.241: %pattern_type.a0e = value_param_pattern [symbolic] +// CHECK:STDOUT: %x.patt.19b9f1.1: %pattern_type.a0e = at_binding_pattern x, %x.param_patt.241 [symbolic] +// CHECK:STDOUT: %RequiresA.type: type = fn_type @RequiresA [concrete] +// CHECK:STDOUT: %RequiresA: %RequiresA.type = struct_value () [concrete] +// CHECK:STDOUT: %require_complete.94f: = require_complete_type %T.as_type.3b8 [symbolic] +// CHECK:STDOUT: %B.lookup_impl_witness: = lookup_impl_witness %T.626, @B [symbolic] +// CHECK:STDOUT: %.714: require_specific_def_type = require_specific_def @T.as_type.as.B.impl(%T.626) [symbolic] +// CHECK:STDOUT: %B.facet.c85: %B.type = facet_value %T.as_type.3b8, (%B.lookup_impl_witness) [symbolic] +// CHECK:STDOUT: %x.patt.19b9f1.2: %pattern_type.a0e = at_binding_pattern x, %x.param_patt.241 [symbolic] +// CHECK:STDOUT: %RequiresB.specific_fn: = specific_function %RequiresB, @RequiresB(%B.facet.c85) [symbolic] +// CHECK:STDOUT: %impls.be1 = observe_impls %T.626, %B.type [symbolic] +// CHECK:STDOUT: %impls.86f = observe_impls %T.626, %C.type [symbolic] +// CHECK:STDOUT: %D.lookup_impl_witness: = lookup_impl_witness %T.626, @D [symbolic] +// CHECK:STDOUT: %C.lookup_impl_witness: = lookup_impl_witness %T.626, @C [symbolic] +// CHECK:STDOUT: %C.impl_witness.f05: = impl_witness @T.as_type.as.C.impl.%C.impl_witness_table, @T.as_type.as.C.impl(%B.facet.c85) [symbolic] +// CHECK:STDOUT: %C.facet.124: %C.type = facet_value %T.as_type.3b8, (%C.lookup_impl_witness) [symbolic] +// CHECK:STDOUT: %D.impl_witness.049: = impl_witness @T.as_type.as.D.impl.%D.impl_witness_table, @T.as_type.as.D.impl(%C.facet.124) [symbolic] +// CHECK:STDOUT: %.f88: require_specific_def_type = require_specific_def @T.as_type.as.D.impl(%C.facet.124) [symbolic] +// CHECK:STDOUT: %D.facet.5cf: %D.type = facet_value %T.as_type.3b8, (%D.lookup_impl_witness) [symbolic] +// CHECK:STDOUT: %RequiresD.specific_fn: = specific_function %RequiresD, @RequiresD(%D.facet.5cf) [symbolic] +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: imports { +// CHECK:STDOUT: %Core: = namespace file.%Core.import, [concrete] { +// CHECK:STDOUT: import Core//prelude +// CHECK:STDOUT: import Core//prelude/... +// CHECK:STDOUT: } +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: file { +// CHECK:STDOUT: package: = namespace [concrete] { +// CHECK:STDOUT: .Core = imports.%Core +// CHECK:STDOUT: .A = %A.decl +// CHECK:STDOUT: .B = %B.decl +// CHECK:STDOUT: .C = %C.decl +// CHECK:STDOUT: .D = %D.decl +// CHECK:STDOUT: .RequiresB = %RequiresB.decl +// CHECK:STDOUT: .RequiresD = %RequiresD.decl +// CHECK:STDOUT: .RequiresA = %RequiresA.decl +// CHECK:STDOUT: } +// CHECK:STDOUT: %Core.import = import Core +// CHECK:STDOUT: %A.decl: type = interface_decl @A [concrete = constants.%A.type] {} {} +// CHECK:STDOUT: %B.decl: type = interface_decl @B [concrete = constants.%B.type] {} {} +// CHECK:STDOUT: %C.decl: type = interface_decl @C [concrete = constants.%C.type] {} {} +// CHECK:STDOUT: %D.decl: type = interface_decl @D [concrete = constants.%D.type] {} {} +// CHECK:STDOUT: impl_decl @T.as_type.as.B.impl [concrete] { +// CHECK:STDOUT: %T.patt.loc8_15.1: %pattern_type.029 = symbolic_binding_pattern T, 0 [symbolic = %T.patt.loc8_15.2 (constants.%T.patt.a4b)] +// CHECK:STDOUT: } { +// CHECK:STDOUT: %T.ref: %A.type = name_ref T, %T.loc8_15.1 [symbolic = %T.loc8_15.2 (constants.%T.626)] +// CHECK:STDOUT: %T.as_type.loc8_21.1: type = facet_access_type %T.ref [symbolic = %T.as_type.loc8_21.2 (constants.%T.as_type.3b8)] +// CHECK:STDOUT: %.loc8_21: type = converted %T.ref, %T.as_type.loc8_21.1 [symbolic = %T.as_type.loc8_21.2 (constants.%T.as_type.3b8)] +// CHECK:STDOUT: %B.ref: type = name_ref B, file.%B.decl [concrete = constants.%B.type] +// CHECK:STDOUT: %.loc8_18: type = splice_block %A.ref [concrete = constants.%A.type] { +// CHECK:STDOUT: %.Self: %type = symbolic_binding .Self [symbolic_self = constants.%.Self] +// CHECK:STDOUT: %A.ref: type = name_ref A, file.%A.decl [concrete = constants.%A.type] +// CHECK:STDOUT: } +// CHECK:STDOUT: %T.loc8_15.1: %A.type = symbolic_binding T, 0 [symbolic = %T.loc8_15.2 (constants.%T.626)] +// CHECK:STDOUT: } +// CHECK:STDOUT: impl_decl @T.as_type.as.C.impl [concrete] { +// CHECK:STDOUT: %T.patt.loc9_15.1: %pattern_type.7b5 = symbolic_binding_pattern T, 0 [symbolic = %T.patt.loc9_15.2 (constants.%T.patt.ca5)] +// CHECK:STDOUT: } { +// CHECK:STDOUT: %T.ref: %B.type = name_ref T, %T.loc9_15.1 [symbolic = %T.loc9_15.2 (constants.%T.ed4)] +// CHECK:STDOUT: %T.as_type.loc9_21.1: type = facet_access_type %T.ref [symbolic = %T.as_type.loc9_21.2 (constants.%T.as_type.4de)] +// CHECK:STDOUT: %.loc9_21: type = converted %T.ref, %T.as_type.loc9_21.1 [symbolic = %T.as_type.loc9_21.2 (constants.%T.as_type.4de)] +// CHECK:STDOUT: %C.ref: type = name_ref C, file.%C.decl [concrete = constants.%C.type] +// CHECK:STDOUT: %.loc9_18: type = splice_block %B.ref [concrete = constants.%B.type] { +// CHECK:STDOUT: %.Self: %type = symbolic_binding .Self [symbolic_self = constants.%.Self] +// CHECK:STDOUT: %B.ref: type = name_ref B, file.%B.decl [concrete = constants.%B.type] +// CHECK:STDOUT: } +// CHECK:STDOUT: %T.loc9_15.1: %B.type = symbolic_binding T, 0 [symbolic = %T.loc9_15.2 (constants.%T.ed4)] +// CHECK:STDOUT: } +// CHECK:STDOUT: impl_decl @T.as_type.as.D.impl [concrete] { +// CHECK:STDOUT: %T.patt.loc10_15.1: %pattern_type.647 = symbolic_binding_pattern T, 0 [symbolic = %T.patt.loc10_15.2 (constants.%T.patt.ece)] +// CHECK:STDOUT: } { +// CHECK:STDOUT: %T.ref: %C.type = name_ref T, %T.loc10_15.1 [symbolic = %T.loc10_15.2 (constants.%T.659)] +// CHECK:STDOUT: %T.as_type.loc10_21.1: type = facet_access_type %T.ref [symbolic = %T.as_type.loc10_21.2 (constants.%T.as_type.c69)] +// CHECK:STDOUT: %.loc10_21: type = converted %T.ref, %T.as_type.loc10_21.1 [symbolic = %T.as_type.loc10_21.2 (constants.%T.as_type.c69)] +// CHECK:STDOUT: %D.ref: type = name_ref D, file.%D.decl [concrete = constants.%D.type] +// CHECK:STDOUT: %.loc10_18: type = splice_block %C.ref [concrete = constants.%C.type] { +// CHECK:STDOUT: %.Self: %type = symbolic_binding .Self [symbolic_self = constants.%.Self] +// CHECK:STDOUT: %C.ref: type = name_ref C, file.%C.decl [concrete = constants.%C.type] +// CHECK:STDOUT: } +// CHECK:STDOUT: %T.loc10_15.1: %C.type = symbolic_binding T, 0 [symbolic = %T.loc10_15.2 (constants.%T.659)] +// CHECK:STDOUT: } +// CHECK:STDOUT: %RequiresB.decl: %RequiresB.type = fn_decl @RequiresB [concrete = constants.%RequiresB] { +// CHECK:STDOUT: %T.patt.loc12_15.1: %pattern_type.7b5 = symbolic_binding_pattern T, 0 [symbolic = %T.patt.loc12_15.2 (constants.%T.patt.ca5)] +// CHECK:STDOUT: %x.param_patt.loc12_29.1: @RequiresB.%pattern_type (%pattern_type.c89) = value_param_pattern [symbolic = %x.param_patt.loc12_29.2 (constants.%x.param_patt.1d2)] +// CHECK:STDOUT: %x.patt.loc12_29.1: @RequiresB.%pattern_type (%pattern_type.c89) = at_binding_pattern x, %x.param_patt.loc12_29.1 [symbolic = %x.patt.loc12_29.2 (constants.%x.patt.3a5)] +// CHECK:STDOUT: } { +// CHECK:STDOUT: %.loc12_18: type = splice_block %B.ref [concrete = constants.%B.type] { +// CHECK:STDOUT: %.Self: %type = symbolic_binding .Self [symbolic_self = constants.%.Self] +// CHECK:STDOUT: %B.ref: type = name_ref B, file.%B.decl [concrete = constants.%B.type] +// CHECK:STDOUT: } +// CHECK:STDOUT: %T.loc12_15.2: %B.type = symbolic_binding T, 0 [symbolic = %T.loc12_15.1 (constants.%T.ed4)] +// CHECK:STDOUT: %x.param: @RequiresB.%T.as_type.loc12_31.1 (%T.as_type.4de) = value_param call_param0 +// CHECK:STDOUT: %.loc12_31.1: type = splice_block %.loc12_31.2 [symbolic = %T.as_type.loc12_31.1 (constants.%T.as_type.4de)] { +// CHECK:STDOUT: %T.ref: %B.type = name_ref T, %T.loc12_15.2 [symbolic = %T.loc12_15.1 (constants.%T.ed4)] +// CHECK:STDOUT: %T.as_type.loc12_31.2: type = facet_access_type %T.ref [symbolic = %T.as_type.loc12_31.1 (constants.%T.as_type.4de)] +// CHECK:STDOUT: %.loc12_31.2: type = converted %T.ref, %T.as_type.loc12_31.2 [symbolic = %T.as_type.loc12_31.1 (constants.%T.as_type.4de)] +// CHECK:STDOUT: } +// CHECK:STDOUT: %x: @RequiresB.%T.as_type.loc12_31.1 (%T.as_type.4de) = wrapper_binding x, %x.param +// CHECK:STDOUT: } +// CHECK:STDOUT: %RequiresD.decl: %RequiresD.type = fn_decl @RequiresD [concrete = constants.%RequiresD] { +// CHECK:STDOUT: %T.patt.loc13_15.1: %pattern_type.549 = symbolic_binding_pattern T, 0 [symbolic = %T.patt.loc13_15.2 (constants.%T.patt.604)] +// CHECK:STDOUT: %x.param_patt.loc13_29.1: @RequiresD.%pattern_type (%pattern_type.86b) = value_param_pattern [symbolic = %x.param_patt.loc13_29.2 (constants.%x.param_patt.2ab)] +// CHECK:STDOUT: %x.patt.loc13_29.1: @RequiresD.%pattern_type (%pattern_type.86b) = at_binding_pattern x, %x.param_patt.loc13_29.1 [symbolic = %x.patt.loc13_29.2 (constants.%x.patt.a712ca.1)] +// CHECK:STDOUT: } { +// CHECK:STDOUT: %.loc13_18: type = splice_block %D.ref [concrete = constants.%D.type] { +// CHECK:STDOUT: %.Self: %type = symbolic_binding .Self [symbolic_self = constants.%.Self] +// CHECK:STDOUT: %D.ref: type = name_ref D, file.%D.decl [concrete = constants.%D.type] +// CHECK:STDOUT: } +// CHECK:STDOUT: %T.loc13_15.2: %D.type = symbolic_binding T, 0 [symbolic = %T.loc13_15.1 (constants.%T.3dd)] +// CHECK:STDOUT: %x.param: @RequiresD.%T.as_type.loc13_31.1 (%T.as_type.8cd) = value_param call_param0 +// CHECK:STDOUT: %.loc13_31.1: type = splice_block %.loc13_31.2 [symbolic = %T.as_type.loc13_31.1 (constants.%T.as_type.8cd)] { +// CHECK:STDOUT: %T.ref: %D.type = name_ref T, %T.loc13_15.2 [symbolic = %T.loc13_15.1 (constants.%T.3dd)] +// CHECK:STDOUT: %T.as_type.loc13_31.2: type = facet_access_type %T.ref [symbolic = %T.as_type.loc13_31.1 (constants.%T.as_type.8cd)] +// CHECK:STDOUT: %.loc13_31.2: type = converted %T.ref, %T.as_type.loc13_31.2 [symbolic = %T.as_type.loc13_31.1 (constants.%T.as_type.8cd)] +// CHECK:STDOUT: } +// CHECK:STDOUT: %x: @RequiresD.%T.as_type.loc13_31.1 (%T.as_type.8cd) = wrapper_binding x, %x.param +// CHECK:STDOUT: } +// CHECK:STDOUT: %RequiresA.decl: %RequiresA.type = fn_decl @RequiresA [concrete = constants.%RequiresA] { +// CHECK:STDOUT: %T.patt.loc15_15.1: %pattern_type.029 = symbolic_binding_pattern T, 0 [symbolic = %T.patt.loc15_15.2 (constants.%T.patt.a4b)] +// CHECK:STDOUT: %x.param_patt.loc15_22.1: @RequiresA.%pattern_type (%pattern_type.a0e) = value_param_pattern [symbolic = %x.param_patt.loc15_22.2 (constants.%x.param_patt.241)] +// CHECK:STDOUT: %x.patt.loc15_22.1: @RequiresA.%pattern_type (%pattern_type.a0e) = at_binding_pattern x, %x.param_patt.loc15_22.1 [symbolic = %x.patt.loc15_22.2 (constants.%x.patt.19b9f1.1)] +// CHECK:STDOUT: } { +// CHECK:STDOUT: %.loc15_18: type = splice_block %A.ref [concrete = constants.%A.type] { +// CHECK:STDOUT: %.Self: %type = symbolic_binding .Self [symbolic_self = constants.%.Self] +// CHECK:STDOUT: %A.ref: type = name_ref A, file.%A.decl [concrete = constants.%A.type] +// CHECK:STDOUT: } +// CHECK:STDOUT: %T.loc15_15.2: %A.type = symbolic_binding T, 0 [symbolic = %T.loc15_15.1 (constants.%T.626)] +// CHECK:STDOUT: %x.param: @RequiresA.%T.as_type.loc15_24.1 (%T.as_type.3b8) = value_param call_param0 +// CHECK:STDOUT: %.loc15_24.1: type = splice_block %.loc15_24.2 [symbolic = %T.as_type.loc15_24.1 (constants.%T.as_type.3b8)] { +// CHECK:STDOUT: %T.ref.loc15: %A.type = name_ref T, %T.loc15_15.2 [symbolic = %T.loc15_15.1 (constants.%T.626)] +// CHECK:STDOUT: %T.as_type.loc15_24.2: type = facet_access_type %T.ref.loc15 [symbolic = %T.as_type.loc15_24.1 (constants.%T.as_type.3b8)] +// CHECK:STDOUT: %.loc15_24.2: type = converted %T.ref.loc15, %T.as_type.loc15_24.2 [symbolic = %T.as_type.loc15_24.1 (constants.%T.as_type.3b8)] +// CHECK:STDOUT: } +// CHECK:STDOUT: %x: @RequiresA.%T.as_type.loc15_24.1 (%T.as_type.3b8) = wrapper_binding x, %x.param +// CHECK:STDOUT: } +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: interface @A { +// CHECK:STDOUT: %Self: %A.type = symbolic_binding Self, 0 [symbolic = constants.%Self.d0c] +// CHECK:STDOUT: %A.WithSelf.decl = interface_with_self_decl @A [concrete] +// CHECK:STDOUT: +// CHECK:STDOUT: !members: +// CHECK:STDOUT: .Self = %Self +// CHECK:STDOUT: witness = () +// CHECK:STDOUT: +// CHECK:STDOUT: !requires: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: interface @B { +// CHECK:STDOUT: %Self: %B.type = symbolic_binding Self, 0 [symbolic = constants.%Self.b45] +// CHECK:STDOUT: %B.WithSelf.decl = interface_with_self_decl @B [concrete] +// CHECK:STDOUT: +// CHECK:STDOUT: !members: +// CHECK:STDOUT: .Self = %Self +// CHECK:STDOUT: witness = () +// CHECK:STDOUT: +// CHECK:STDOUT: !requires: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: interface @C { +// CHECK:STDOUT: %Self: %C.type = symbolic_binding Self, 0 [symbolic = constants.%Self.62a] +// CHECK:STDOUT: %C.WithSelf.decl = interface_with_self_decl @C [concrete] +// CHECK:STDOUT: +// CHECK:STDOUT: !members: +// CHECK:STDOUT: .Self = %Self +// CHECK:STDOUT: witness = () +// CHECK:STDOUT: +// CHECK:STDOUT: !requires: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: interface @D { +// CHECK:STDOUT: %Self: %D.type = symbolic_binding Self, 0 [symbolic = constants.%Self.e2d] +// CHECK:STDOUT: %D.WithSelf.decl = interface_with_self_decl @D [concrete] +// CHECK:STDOUT: +// CHECK:STDOUT: !members: +// CHECK:STDOUT: .Self = %Self +// CHECK:STDOUT: witness = () +// CHECK:STDOUT: +// CHECK:STDOUT: !requires: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: generic impl @T.as_type.as.B.impl(%T.loc8_15.1: %A.type) { +// CHECK:STDOUT: %T.patt.loc8_15.2: %pattern_type.029 = symbolic_binding_pattern T, 0 [symbolic = %T.patt.loc8_15.2 (constants.%T.patt.a4b)] +// CHECK:STDOUT: %T.loc8_15.2: %A.type = symbolic_binding T, 0 [symbolic = %T.loc8_15.2 (constants.%T.626)] +// CHECK:STDOUT: %T.as_type.loc8_21.2: type = facet_access_type %T.loc8_15.2 [symbolic = %T.as_type.loc8_21.2 (constants.%T.as_type.3b8)] +// CHECK:STDOUT: %B.impl_witness.loc8_28.2: = impl_witness %B.impl_witness_table, @T.as_type.as.B.impl(%T.loc8_15.2) [symbolic = %B.impl_witness.loc8_28.2 (constants.%B.impl_witness)] +// CHECK:STDOUT: +// CHECK:STDOUT: !definition: +// CHECK:STDOUT: +// CHECK:STDOUT: impl: %.loc8_21 as %B.ref { +// CHECK:STDOUT: %B.impl_witness_table = impl_witness_table (), @T.as_type.as.B.impl [concrete] +// CHECK:STDOUT: %B.impl_witness.loc8_28.1: = impl_witness %B.impl_witness_table, @T.as_type.as.B.impl(constants.%T.626) [symbolic = %B.impl_witness.loc8_28.2 (constants.%B.impl_witness)] +// CHECK:STDOUT: +// CHECK:STDOUT: !members: +// CHECK:STDOUT: extend %B.ref +// CHECK:STDOUT: witness = %B.impl_witness.loc8_28.1 +// CHECK:STDOUT: } +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: generic impl @T.as_type.as.C.impl(%T.loc9_15.1: %B.type) { +// CHECK:STDOUT: %T.patt.loc9_15.2: %pattern_type.7b5 = symbolic_binding_pattern T, 0 [symbolic = %T.patt.loc9_15.2 (constants.%T.patt.ca5)] +// CHECK:STDOUT: %T.loc9_15.2: %B.type = symbolic_binding T, 0 [symbolic = %T.loc9_15.2 (constants.%T.ed4)] +// CHECK:STDOUT: %T.as_type.loc9_21.2: type = facet_access_type %T.loc9_15.2 [symbolic = %T.as_type.loc9_21.2 (constants.%T.as_type.4de)] +// CHECK:STDOUT: %C.impl_witness.loc9_28.2: = impl_witness %C.impl_witness_table, @T.as_type.as.C.impl(%T.loc9_15.2) [symbolic = %C.impl_witness.loc9_28.2 (constants.%C.impl_witness.9e3)] +// CHECK:STDOUT: +// CHECK:STDOUT: !definition: +// CHECK:STDOUT: +// CHECK:STDOUT: impl: %.loc9_21 as %C.ref { +// CHECK:STDOUT: %C.impl_witness_table = impl_witness_table (), @T.as_type.as.C.impl [concrete] +// CHECK:STDOUT: %C.impl_witness.loc9_28.1: = impl_witness %C.impl_witness_table, @T.as_type.as.C.impl(constants.%T.ed4) [symbolic = %C.impl_witness.loc9_28.2 (constants.%C.impl_witness.9e3)] +// CHECK:STDOUT: +// CHECK:STDOUT: !members: +// CHECK:STDOUT: extend %C.ref +// CHECK:STDOUT: witness = %C.impl_witness.loc9_28.1 +// CHECK:STDOUT: } +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: generic impl @T.as_type.as.D.impl(%T.loc10_15.1: %C.type) { +// CHECK:STDOUT: %T.patt.loc10_15.2: %pattern_type.647 = symbolic_binding_pattern T, 0 [symbolic = %T.patt.loc10_15.2 (constants.%T.patt.ece)] +// CHECK:STDOUT: %T.loc10_15.2: %C.type = symbolic_binding T, 0 [symbolic = %T.loc10_15.2 (constants.%T.659)] +// CHECK:STDOUT: %T.as_type.loc10_21.2: type = facet_access_type %T.loc10_15.2 [symbolic = %T.as_type.loc10_21.2 (constants.%T.as_type.c69)] +// CHECK:STDOUT: %D.impl_witness.loc10_28.2: = impl_witness %D.impl_witness_table, @T.as_type.as.D.impl(%T.loc10_15.2) [symbolic = %D.impl_witness.loc10_28.2 (constants.%D.impl_witness.8a1)] +// CHECK:STDOUT: +// CHECK:STDOUT: !definition: +// CHECK:STDOUT: +// CHECK:STDOUT: impl: %.loc10_21 as %D.ref { +// CHECK:STDOUT: %D.impl_witness_table = impl_witness_table (), @T.as_type.as.D.impl [concrete] +// CHECK:STDOUT: %D.impl_witness.loc10_28.1: = impl_witness %D.impl_witness_table, @T.as_type.as.D.impl(constants.%T.659) [symbolic = %D.impl_witness.loc10_28.2 (constants.%D.impl_witness.8a1)] +// CHECK:STDOUT: +// CHECK:STDOUT: !members: +// CHECK:STDOUT: extend %D.ref +// CHECK:STDOUT: witness = %D.impl_witness.loc10_28.1 +// CHECK:STDOUT: } +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: generic fn @RequiresB(%T.loc12_15.2: %B.type) { +// CHECK:STDOUT: %T.patt.loc12_15.2: %pattern_type.7b5 = symbolic_binding_pattern T, 0 [symbolic = %T.patt.loc12_15.2 (constants.%T.patt.ca5)] +// CHECK:STDOUT: %T.loc12_15.1: %B.type = symbolic_binding T, 0 [symbolic = %T.loc12_15.1 (constants.%T.ed4)] +// CHECK:STDOUT: %T.as_type.loc12_31.1: type = facet_access_type %T.loc12_15.1 [symbolic = %T.as_type.loc12_31.1 (constants.%T.as_type.4de)] +// CHECK:STDOUT: %pattern_type: type = pattern_type %T.as_type.loc12_31.1 [symbolic = %pattern_type (constants.%pattern_type.c89)] +// CHECK:STDOUT: %x.param_patt.loc12_29.2: @RequiresB.%pattern_type (%pattern_type.c89) = value_param_pattern [symbolic = %x.param_patt.loc12_29.2 (constants.%x.param_patt.1d2)] +// CHECK:STDOUT: %x.patt.loc12_29.2: @RequiresB.%pattern_type (%pattern_type.c89) = at_binding_pattern x, %x.param_patt.loc12_29.2 [symbolic = %x.patt.loc12_29.2 (constants.%x.patt.3a5)] +// CHECK:STDOUT: +// CHECK:STDOUT: !definition: +// CHECK:STDOUT: %require_complete: = require_complete_type %T.as_type.loc12_31.1 [symbolic = %require_complete (constants.%require_complete.346)] +// CHECK:STDOUT: +// CHECK:STDOUT: fn(%x.param: @RequiresB.%T.as_type.loc12_31.1 (%T.as_type.4de)) { +// CHECK:STDOUT: !entry: +// CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: +// CHECK:STDOUT: } +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: generic fn @RequiresD(%T.loc13_15.2: %D.type) { +// CHECK:STDOUT: %T.patt.loc13_15.2: %pattern_type.549 = symbolic_binding_pattern T, 0 [symbolic = %T.patt.loc13_15.2 (constants.%T.patt.604)] +// CHECK:STDOUT: %T.loc13_15.1: %D.type = symbolic_binding T, 0 [symbolic = %T.loc13_15.1 (constants.%T.3dd)] +// CHECK:STDOUT: %T.as_type.loc13_31.1: type = facet_access_type %T.loc13_15.1 [symbolic = %T.as_type.loc13_31.1 (constants.%T.as_type.8cd)] +// CHECK:STDOUT: %pattern_type: type = pattern_type %T.as_type.loc13_31.1 [symbolic = %pattern_type (constants.%pattern_type.86b)] +// CHECK:STDOUT: %x.param_patt.loc13_29.2: @RequiresD.%pattern_type (%pattern_type.86b) = value_param_pattern [symbolic = %x.param_patt.loc13_29.2 (constants.%x.param_patt.2ab)] +// CHECK:STDOUT: %x.patt.loc13_29.2: @RequiresD.%pattern_type (%pattern_type.86b) = at_binding_pattern x, %x.param_patt.loc13_29.2 [symbolic = %x.patt.loc13_29.2 (constants.%x.patt.a712ca.1)] +// CHECK:STDOUT: +// CHECK:STDOUT: !definition: +// CHECK:STDOUT: %require_complete: = require_complete_type %T.as_type.loc13_31.1 [symbolic = %require_complete (constants.%require_complete.904)] +// CHECK:STDOUT: +// CHECK:STDOUT: fn(%x.param: @RequiresD.%T.as_type.loc13_31.1 (%T.as_type.8cd)) { +// CHECK:STDOUT: !entry: +// CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: +// CHECK:STDOUT: } +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: generic fn @RequiresA(%T.loc15_15.2: %A.type) { +// CHECK:STDOUT: %T.patt.loc15_15.2: %pattern_type.029 = symbolic_binding_pattern T, 0 [symbolic = %T.patt.loc15_15.2 (constants.%T.patt.a4b)] +// CHECK:STDOUT: %T.loc15_15.1: %A.type = symbolic_binding T, 0 [symbolic = %T.loc15_15.1 (constants.%T.626)] +// CHECK:STDOUT: %T.as_type.loc15_24.1: type = facet_access_type %T.loc15_15.1 [symbolic = %T.as_type.loc15_24.1 (constants.%T.as_type.3b8)] +// CHECK:STDOUT: %pattern_type: type = pattern_type %T.as_type.loc15_24.1 [symbolic = %pattern_type (constants.%pattern_type.a0e)] +// CHECK:STDOUT: %x.param_patt.loc15_22.2: @RequiresA.%pattern_type (%pattern_type.a0e) = value_param_pattern [symbolic = %x.param_patt.loc15_22.2 (constants.%x.param_patt.241)] +// CHECK:STDOUT: %x.patt.loc15_22.2: @RequiresA.%pattern_type (%pattern_type.a0e) = at_binding_pattern x, %x.param_patt.loc15_22.2 [symbolic = %x.patt.loc15_22.2 (constants.%x.patt.19b9f1.1)] +// CHECK:STDOUT: +// CHECK:STDOUT: !definition: +// CHECK:STDOUT: %require_complete: = require_complete_type %T.as_type.loc15_24.1 [symbolic = %require_complete (constants.%require_complete.94f)] +// CHECK:STDOUT: %.loc16_14.3: require_specific_def_type = require_specific_def @T.as_type.as.B.impl(%T.loc15_15.1) [symbolic = %.loc16_14.3 (constants.%.714)] +// CHECK:STDOUT: %B.lookup_impl_witness: = lookup_impl_witness %T.loc15_15.1, @B [symbolic = %B.lookup_impl_witness (constants.%B.lookup_impl_witness)] +// CHECK:STDOUT: %B.facet.loc16_14.3: %B.type = facet_value %T.as_type.loc15_24.1, (%B.lookup_impl_witness) [symbolic = %B.facet.loc16_14.3 (constants.%B.facet.c85)] +// CHECK:STDOUT: %RequiresB.specific_fn.loc16_3.2: = specific_function constants.%RequiresB, @RequiresB(%B.facet.loc16_14.3) [symbolic = %RequiresB.specific_fn.loc16_3.2 (constants.%RequiresB.specific_fn)] +// CHECK:STDOUT: %impls.loc18 = observe_impls %T.loc15_15.1, constants.%B.type [symbolic = %impls.loc18 (constants.%impls.be1)] +// CHECK:STDOUT: %impls.loc19 = observe_impls %T.loc15_15.1, constants.%C.type [symbolic = %impls.loc19 (constants.%impls.86f)] +// CHECK:STDOUT: %C.lookup_impl_witness: = lookup_impl_witness %T.loc15_15.1, @C [symbolic = %C.lookup_impl_witness (constants.%C.lookup_impl_witness)] +// CHECK:STDOUT: %C.facet: %C.type = facet_value %T.as_type.loc15_24.1, (%C.lookup_impl_witness) [symbolic = %C.facet (constants.%C.facet.124)] +// CHECK:STDOUT: %.loc20_14.3: require_specific_def_type = require_specific_def @T.as_type.as.D.impl(%C.facet) [symbolic = %.loc20_14.3 (constants.%.f88)] +// CHECK:STDOUT: %D.lookup_impl_witness: = lookup_impl_witness %T.loc15_15.1, @D [symbolic = %D.lookup_impl_witness (constants.%D.lookup_impl_witness)] +// CHECK:STDOUT: %D.facet.loc20_14.3: %D.type = facet_value %T.as_type.loc15_24.1, (%D.lookup_impl_witness) [symbolic = %D.facet.loc20_14.3 (constants.%D.facet.5cf)] +// CHECK:STDOUT: %RequiresD.specific_fn.loc20_3.2: = specific_function constants.%RequiresD, @RequiresD(%D.facet.loc20_14.3) [symbolic = %RequiresD.specific_fn.loc20_3.2 (constants.%RequiresD.specific_fn)] +// CHECK:STDOUT: +// CHECK:STDOUT: fn(%x.param: @RequiresA.%T.as_type.loc15_24.1 (%T.as_type.3b8)) { +// CHECK:STDOUT: !entry: +// CHECK:STDOUT: %RequiresB.ref: %RequiresB.type = name_ref RequiresB, file.%RequiresB.decl [concrete = constants.%RequiresB] +// CHECK:STDOUT: %x.ref.loc16: @RequiresA.%T.as_type.loc15_24.1 (%T.as_type.3b8) = name_ref x, %x +// CHECK:STDOUT: %B.facet.loc16_14.1: %B.type = facet_value constants.%T.as_type.3b8, (constants.%B.lookup_impl_witness) [symbolic = %B.facet.loc16_14.3 (constants.%B.facet.c85)] +// CHECK:STDOUT: %.loc16_14.1: %B.type = converted constants.%T.as_type.3b8, %B.facet.loc16_14.1 [symbolic = %B.facet.loc16_14.3 (constants.%B.facet.c85)] +// CHECK:STDOUT: %B.facet.loc16_14.2: %B.type = facet_value constants.%T.as_type.3b8, (constants.%B.lookup_impl_witness) [symbolic = %B.facet.loc16_14.3 (constants.%B.facet.c85)] +// CHECK:STDOUT: %.loc16_14.2: %B.type = converted constants.%T.as_type.3b8, %B.facet.loc16_14.2 [symbolic = %B.facet.loc16_14.3 (constants.%B.facet.c85)] +// CHECK:STDOUT: %RequiresB.specific_fn.loc16_3.1: = specific_function %RequiresB.ref, @RequiresB(constants.%B.facet.c85) [symbolic = %RequiresB.specific_fn.loc16_3.2 (constants.%RequiresB.specific_fn)] +// CHECK:STDOUT: %RequiresB.call: init %empty_tuple.type = call %RequiresB.specific_fn.loc16_3.1(%x.ref.loc16) +// CHECK:STDOUT: %T.ref.loc18: %A.type = name_ref T, %T.loc15_15.2 [symbolic = %T.loc15_15.1 (constants.%T.626)] +// CHECK:STDOUT: %B.ref: type = name_ref B, file.%B.decl [concrete = constants.%B.type] +// CHECK:STDOUT: %T.as_type.loc18: type = facet_access_type %T.ref.loc18 [symbolic = %T.as_type.loc15_24.1 (constants.%T.as_type.3b8)] +// CHECK:STDOUT: %.loc18: type = converted %T.ref.loc18, %T.as_type.loc18 [symbolic = %T.as_type.loc15_24.1 (constants.%T.as_type.3b8)] +// CHECK:STDOUT: %RequiresA.observe.decl.loc18 = observe_decl @RequiresA.observe.loc18 [concrete] +// CHECK:STDOUT: %T.ref.loc19: %A.type = name_ref T, %T.loc15_15.2 [symbolic = %T.loc15_15.1 (constants.%T.626)] +// CHECK:STDOUT: %C.ref: type = name_ref C, file.%C.decl [concrete = constants.%C.type] +// CHECK:STDOUT: %T.as_type.loc19: type = facet_access_type %T.ref.loc19 [symbolic = %T.as_type.loc15_24.1 (constants.%T.as_type.3b8)] +// CHECK:STDOUT: %.loc19: type = converted %T.ref.loc19, %T.as_type.loc19 [symbolic = %T.as_type.loc15_24.1 (constants.%T.as_type.3b8)] +// CHECK:STDOUT: %RequiresA.observe.decl.loc19 = observe_decl @RequiresA.observe.loc19 [concrete] +// CHECK:STDOUT: %RequiresD.ref: %RequiresD.type = name_ref RequiresD, file.%RequiresD.decl [concrete = constants.%RequiresD] +// CHECK:STDOUT: %x.ref.loc20: @RequiresA.%T.as_type.loc15_24.1 (%T.as_type.3b8) = name_ref x, %x +// CHECK:STDOUT: %D.facet.loc20_14.1: %D.type = facet_value constants.%T.as_type.3b8, (constants.%D.lookup_impl_witness) [symbolic = %D.facet.loc20_14.3 (constants.%D.facet.5cf)] +// CHECK:STDOUT: %.loc20_14.1: %D.type = converted constants.%T.as_type.3b8, %D.facet.loc20_14.1 [symbolic = %D.facet.loc20_14.3 (constants.%D.facet.5cf)] +// CHECK:STDOUT: %D.facet.loc20_14.2: %D.type = facet_value constants.%T.as_type.3b8, (constants.%D.lookup_impl_witness) [symbolic = %D.facet.loc20_14.3 (constants.%D.facet.5cf)] +// CHECK:STDOUT: %.loc20_14.2: %D.type = converted constants.%T.as_type.3b8, %D.facet.loc20_14.2 [symbolic = %D.facet.loc20_14.3 (constants.%D.facet.5cf)] +// CHECK:STDOUT: %RequiresD.specific_fn.loc20_3.1: = specific_function %RequiresD.ref, @RequiresD(constants.%D.facet.5cf) [symbolic = %RequiresD.specific_fn.loc20_3.2 (constants.%RequiresD.specific_fn)] +// CHECK:STDOUT: %RequiresD.call: init %empty_tuple.type = call %RequiresD.specific_fn.loc20_3.1(%x.ref.loc20) +// CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: +// CHECK:STDOUT: @RequiresA.observe.loc18 { +// CHECK:STDOUT: observe constants.%T.626 impls constants.%B.type +// CHECK:STDOUT: } +// CHECK:STDOUT: @RequiresA.observe.loc19 { +// CHECK:STDOUT: observe constants.%T.626 impls constants.%C.type +// CHECK:STDOUT: } +// CHECK:STDOUT: } +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: specific @A.WithSelf(constants.%Self.d0c) { +// CHECK:STDOUT: !definition: +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: specific @B.WithSelf(constants.%Self.b45) { +// CHECK:STDOUT: !definition: +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: specific @C.WithSelf(constants.%Self.62a) { +// CHECK:STDOUT: !definition: +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: specific @D.WithSelf(constants.%Self.e2d) { +// CHECK:STDOUT: !definition: +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: specific @T.as_type.as.B.impl(constants.%T.626) { +// CHECK:STDOUT: %T.patt.loc8_15.2 => constants.%T.patt.a4b +// CHECK:STDOUT: %T.loc8_15.2 => constants.%T.626 +// CHECK:STDOUT: %T.as_type.loc8_21.2 => constants.%T.as_type.3b8 +// CHECK:STDOUT: %B.impl_witness.loc8_28.2 => constants.%B.impl_witness +// CHECK:STDOUT: +// CHECK:STDOUT: !definition: +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: specific @B.WithSelf(constants.%B.facet.c04) { +// CHECK:STDOUT: !definition: +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: specific @T.as_type.as.C.impl(constants.%T.ed4) { +// CHECK:STDOUT: %T.patt.loc9_15.2 => constants.%T.patt.ca5 +// CHECK:STDOUT: %T.loc9_15.2 => constants.%T.ed4 +// CHECK:STDOUT: %T.as_type.loc9_21.2 => constants.%T.as_type.4de +// CHECK:STDOUT: %C.impl_witness.loc9_28.2 => constants.%C.impl_witness.9e3 +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: specific @C.WithSelf(constants.%C.facet.355) { +// CHECK:STDOUT: !definition: +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: specific @T.as_type.as.D.impl(constants.%T.659) { +// CHECK:STDOUT: %T.patt.loc10_15.2 => constants.%T.patt.ece +// CHECK:STDOUT: %T.loc10_15.2 => constants.%T.659 +// CHECK:STDOUT: %T.as_type.loc10_21.2 => constants.%T.as_type.c69 +// CHECK:STDOUT: %D.impl_witness.loc10_28.2 => constants.%D.impl_witness.8a1 +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: specific @D.WithSelf(constants.%D.facet.3d0) { +// CHECK:STDOUT: !definition: +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: specific @RequiresB(constants.%T.ed4) { +// CHECK:STDOUT: %T.patt.loc12_15.2 => constants.%T.patt.ca5 +// CHECK:STDOUT: %T.loc12_15.1 => constants.%T.ed4 +// CHECK:STDOUT: %T.as_type.loc12_31.1 => constants.%T.as_type.4de +// CHECK:STDOUT: %pattern_type => constants.%pattern_type.c89 +// CHECK:STDOUT: %x.param_patt.loc12_29.2 => constants.%x.param_patt.1d2 +// CHECK:STDOUT: %x.patt.loc12_29.2 => constants.%x.patt.3a5 +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: specific @RequiresD(constants.%T.3dd) { +// CHECK:STDOUT: %T.patt.loc13_15.2 => constants.%T.patt.604 +// CHECK:STDOUT: %T.loc13_15.1 => constants.%T.3dd +// CHECK:STDOUT: %T.as_type.loc13_31.1 => constants.%T.as_type.8cd +// CHECK:STDOUT: %pattern_type => constants.%pattern_type.86b +// CHECK:STDOUT: %x.param_patt.loc13_29.2 => constants.%x.param_patt.2ab +// CHECK:STDOUT: %x.patt.loc13_29.2 => constants.%x.patt.a712ca.2 +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: specific @RequiresA(constants.%T.626) { +// CHECK:STDOUT: %T.patt.loc15_15.2 => constants.%T.patt.a4b +// CHECK:STDOUT: %T.loc15_15.1 => constants.%T.626 +// CHECK:STDOUT: %T.as_type.loc15_24.1 => constants.%T.as_type.3b8 +// CHECK:STDOUT: %pattern_type => constants.%pattern_type.a0e +// CHECK:STDOUT: %x.param_patt.loc15_22.2 => constants.%x.param_patt.241 +// CHECK:STDOUT: %x.patt.loc15_22.2 => constants.%x.patt.19b9f1.1 +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: specific @RequiresB(constants.%B.facet.c85) { +// CHECK:STDOUT: %T.patt.loc12_15.2 => constants.%T.patt.ca5 +// CHECK:STDOUT: %T.loc12_15.1 => constants.%B.facet.c85 +// CHECK:STDOUT: %T.as_type.loc12_31.1 => constants.%T.as_type.3b8 +// CHECK:STDOUT: %pattern_type => constants.%pattern_type.a0e +// CHECK:STDOUT: %x.param_patt.loc12_29.2 => constants.%x.param_patt.241 +// CHECK:STDOUT: %x.patt.loc12_29.2 => constants.%x.patt.19b9f1.2 +// CHECK:STDOUT: +// CHECK:STDOUT: !definition: +// CHECK:STDOUT: %require_complete => constants.%require_complete.94f +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: specific @T.as_type.as.C.impl(constants.%B.facet.c85) { +// CHECK:STDOUT: %T.patt.loc9_15.2 => constants.%T.patt.ca5 +// CHECK:STDOUT: %T.loc9_15.2 => constants.%B.facet.c85 +// CHECK:STDOUT: %T.as_type.loc9_21.2 => constants.%T.as_type.3b8 +// CHECK:STDOUT: %C.impl_witness.loc9_28.2 => constants.%C.impl_witness.f05 +// CHECK:STDOUT: +// CHECK:STDOUT: !definition: +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: specific @T.as_type.as.D.impl(constants.%C.facet.124) { +// CHECK:STDOUT: %T.patt.loc10_15.2 => constants.%T.patt.ece +// CHECK:STDOUT: %T.loc10_15.2 => constants.%C.facet.124 +// CHECK:STDOUT: %T.as_type.loc10_21.2 => constants.%T.as_type.3b8 +// CHECK:STDOUT: %D.impl_witness.loc10_28.2 => constants.%D.impl_witness.049 +// CHECK:STDOUT: +// CHECK:STDOUT: !definition: +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: specific @RequiresD(constants.%D.facet.5cf) { +// CHECK:STDOUT: %T.patt.loc13_15.2 => constants.%T.patt.604 +// CHECK:STDOUT: %T.loc13_15.1 => constants.%D.facet.5cf +// CHECK:STDOUT: %T.as_type.loc13_31.1 => constants.%T.as_type.3b8 +// CHECK:STDOUT: %pattern_type => constants.%pattern_type.a0e +// CHECK:STDOUT: %x.param_patt.loc13_29.2 => constants.%x.param_patt.241 +// CHECK:STDOUT: %x.patt.loc13_29.2 => constants.%x.patt.19b9f1.2 +// CHECK:STDOUT: +// CHECK:STDOUT: !definition: +// CHECK:STDOUT: %require_complete => constants.%require_complete.94f +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: --- fail_todo_nested_functions_in_outer.carbon +// CHECK:STDOUT: +// CHECK:STDOUT: constants { +// CHECK:STDOUT: %A.type: type = facet_type <@A> [concrete] +// CHECK:STDOUT: %Self.d0c: %A.type = symbolic_binding Self, 0 [symbolic] +// CHECK:STDOUT: %B.type: type = facet_type <@B> [concrete] +// CHECK:STDOUT: %Self.b45: %B.type = symbolic_binding Self, 0 [symbolic] +// CHECK:STDOUT: %type: type = facet_type [concrete] +// CHECK:STDOUT: %.Self.c39: %type = symbolic_binding .Self [symbolic_self] +// CHECK:STDOUT: %pattern_type.029: type = pattern_type %A.type [concrete] +// CHECK:STDOUT: %T.patt: %pattern_type.029 = symbolic_binding_pattern T, 0 [symbolic] +// CHECK:STDOUT: %T: %A.type = symbolic_binding T, 0 [symbolic] +// CHECK:STDOUT: %T.as_type: type = facet_access_type %T [symbolic] +// CHECK:STDOUT: %pattern_type.a0e: type = pattern_type %T.as_type [symbolic] +// CHECK:STDOUT: %x.param_patt.241: %pattern_type.a0e = value_param_pattern [symbolic] +// CHECK:STDOUT: %x.patt.19b: %pattern_type.a0e = at_binding_pattern x, %x.param_patt.241 [symbolic] +// CHECK:STDOUT: %RequiresA.type: type = fn_type @RequiresA [concrete] +// CHECK:STDOUT: %RequiresA: %RequiresA.type = struct_value () [concrete] +// CHECK:STDOUT: %require_complete.94f: = require_complete_type %T.as_type [symbolic] +// CHECK:STDOUT: %.Self.e4d: %B.type = symbolic_binding .Self [symbolic_self] +// CHECK:STDOUT: %B_where.type: type = facet_type <@B where TODO> [concrete] +// CHECK:STDOUT: %pattern_type.831: type = pattern_type %B_where.type [concrete] +// CHECK:STDOUT: %U.patt: %pattern_type.831 = symbolic_binding_pattern U, 1 [symbolic] +// CHECK:STDOUT: %U: %B_where.type = symbolic_binding U, 1 [symbolic] +// CHECK:STDOUT: %F.type: type = fn_type @F [concrete] +// CHECK:STDOUT: %F: %F.type = struct_value () [concrete] +// CHECK:STDOUT: %U.as_type: type = facet_access_type %U [symbolic] +// CHECK:STDOUT: %eq = observe_equivalent %T, %U [symbolic] +// CHECK:STDOUT: %pattern_type.d51: type = pattern_type %U.as_type [symbolic] +// CHECK:STDOUT: %x.param_patt.fbe: %pattern_type.d51 = value_param_pattern [symbolic] +// CHECK:STDOUT: %x.patt.cdb: %pattern_type.d51 = at_binding_pattern x, %x.param_patt.fbe [symbolic] +// CHECK:STDOUT: %InnerF.type: type = fn_type @InnerF, @F(%T, %U) [symbolic] +// CHECK:STDOUT: %InnerF: %InnerF.type = struct_value () [symbolic] +// CHECK:STDOUT: %require_complete.963: = require_complete_type %U.as_type [symbolic] +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: imports { +// CHECK:STDOUT: %Core: = namespace file.%Core.import, [concrete] { +// CHECK:STDOUT: import Core//prelude +// CHECK:STDOUT: import Core//prelude/... +// CHECK:STDOUT: } +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: file { +// CHECK:STDOUT: package: = namespace [concrete] { +// CHECK:STDOUT: .Core = imports.%Core +// CHECK:STDOUT: .A = %A.decl +// CHECK:STDOUT: .B = %B.decl +// CHECK:STDOUT: .RequiresA = %RequiresA.decl +// CHECK:STDOUT: .F = %F.decl +// CHECK:STDOUT: } +// CHECK:STDOUT: %Core.import = import Core +// CHECK:STDOUT: %A.decl: type = interface_decl @A [concrete = constants.%A.type] {} {} +// CHECK:STDOUT: %B.decl: type = interface_decl @B [concrete = constants.%B.type] {} {} +// CHECK:STDOUT: %RequiresA.decl: %RequiresA.type = fn_decl @RequiresA [concrete = constants.%RequiresA] { +// CHECK:STDOUT: %T.patt.loc6_15.1: %pattern_type.029 = symbolic_binding_pattern T, 0 [symbolic = %T.patt.loc6_15.2 (constants.%T.patt)] +// CHECK:STDOUT: %x.param_patt.loc6_29.1: @RequiresA.%pattern_type (%pattern_type.a0e) = value_param_pattern [symbolic = %x.param_patt.loc6_29.2 (constants.%x.param_patt.241)] +// CHECK:STDOUT: %x.patt.loc6_29.1: @RequiresA.%pattern_type (%pattern_type.a0e) = at_binding_pattern x, %x.param_patt.loc6_29.1 [symbolic = %x.patt.loc6_29.2 (constants.%x.patt.19b)] +// CHECK:STDOUT: } { +// CHECK:STDOUT: %.loc6_18: type = splice_block %A.ref [concrete = constants.%A.type] { +// CHECK:STDOUT: %.Self: %type = symbolic_binding .Self [symbolic_self = constants.%.Self.c39] +// CHECK:STDOUT: %A.ref: type = name_ref A, file.%A.decl [concrete = constants.%A.type] +// CHECK:STDOUT: } +// CHECK:STDOUT: %T.loc6_15.2: %A.type = symbolic_binding T, 0 [symbolic = %T.loc6_15.1 (constants.%T)] +// CHECK:STDOUT: %x.param: @RequiresA.%T.as_type.loc6_31.1 (%T.as_type) = value_param call_param0 +// CHECK:STDOUT: %.loc6_31.1: type = splice_block %.loc6_31.2 [symbolic = %T.as_type.loc6_31.1 (constants.%T.as_type)] { +// CHECK:STDOUT: %T.ref: %A.type = name_ref T, %T.loc6_15.2 [symbolic = %T.loc6_15.1 (constants.%T)] +// CHECK:STDOUT: %T.as_type.loc6_31.2: type = facet_access_type %T.ref [symbolic = %T.as_type.loc6_31.1 (constants.%T.as_type)] +// CHECK:STDOUT: %.loc6_31.2: type = converted %T.ref, %T.as_type.loc6_31.2 [symbolic = %T.as_type.loc6_31.1 (constants.%T.as_type)] +// CHECK:STDOUT: } +// CHECK:STDOUT: %x: @RequiresA.%T.as_type.loc6_31.1 (%T.as_type) = wrapper_binding x, %x.param +// CHECK:STDOUT: } +// CHECK:STDOUT: %F.decl: %F.type = fn_decl @F [concrete = constants.%F] { +// CHECK:STDOUT: %T.patt.loc7_7.1: %pattern_type.029 = symbolic_binding_pattern T, 0 [symbolic = %T.patt.loc7_7.2 (constants.%T.patt)] +// CHECK:STDOUT: %U.patt.loc7_14.1: %pattern_type.831 = symbolic_binding_pattern U, 1 [symbolic = %U.patt.loc7_14.2 (constants.%U.patt)] +// CHECK:STDOUT: } { +// CHECK:STDOUT: %.loc7_10: type = splice_block %A.ref [concrete = constants.%A.type] { +// CHECK:STDOUT: %.Self.loc7_7: %type = symbolic_binding .Self [symbolic_self = constants.%.Self.c39] +// CHECK:STDOUT: %A.ref: type = name_ref A, file.%A.decl [concrete = constants.%A.type] +// CHECK:STDOUT: } +// CHECK:STDOUT: %T.loc7_7.2: %A.type = symbolic_binding T, 0 [symbolic = %T.loc7_7.1 (constants.%T)] +// CHECK:STDOUT: %.loc7_19.1: type = splice_block %.loc7_19.2 [concrete = constants.%B_where.type] { +// CHECK:STDOUT: %.Self.loc7_14: %type = symbolic_binding .Self [symbolic_self = constants.%.Self.c39] +// CHECK:STDOUT: %B.ref: type = name_ref B, file.%B.decl [concrete = constants.%B.type] +// CHECK:STDOUT: %.Self.loc7_19: %B.type = symbolic_binding .Self [symbolic_self = constants.%.Self.e4d] +// CHECK:STDOUT: %.Self.ref: %B.type = name_ref .Self, %.Self.loc7_19 [symbolic_self = constants.%.Self.e4d] +// CHECK:STDOUT: %T.ref.loc7: %A.type = name_ref T, %T.loc7_7.2 [symbolic = %T.loc7_7.1 (constants.%T)] +// CHECK:STDOUT: %.loc7_19.2: type = where_expr [concrete = constants.%B_where.type] { +// CHECK:STDOUT: requirement_base_facet_type %B.ref +// CHECK:STDOUT: requirement_equivalent %.Self.ref, %T.ref.loc7 +// CHECK:STDOUT: } +// CHECK:STDOUT: } +// CHECK:STDOUT: %U.loc7_14.2: %B_where.type = symbolic_binding U, 1 [symbolic = %U.loc7_14.1 (constants.%U)] +// CHECK:STDOUT: } +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: interface @A { +// CHECK:STDOUT: %Self: %A.type = symbolic_binding Self, 0 [symbolic = constants.%Self.d0c] +// CHECK:STDOUT: %A.WithSelf.decl = interface_with_self_decl @A [concrete] +// CHECK:STDOUT: +// CHECK:STDOUT: !members: +// CHECK:STDOUT: .Self = %Self +// CHECK:STDOUT: witness = () +// CHECK:STDOUT: +// CHECK:STDOUT: !requires: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: interface @B { +// CHECK:STDOUT: %Self: %B.type = symbolic_binding Self, 0 [symbolic = constants.%Self.b45] +// CHECK:STDOUT: %B.WithSelf.decl = interface_with_self_decl @B [concrete] +// CHECK:STDOUT: +// CHECK:STDOUT: !members: +// CHECK:STDOUT: .Self = %Self +// CHECK:STDOUT: witness = () +// CHECK:STDOUT: +// CHECK:STDOUT: !requires: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: generic fn @RequiresA(%T.loc6_15.2: %A.type) { +// CHECK:STDOUT: %T.patt.loc6_15.2: %pattern_type.029 = symbolic_binding_pattern T, 0 [symbolic = %T.patt.loc6_15.2 (constants.%T.patt)] +// CHECK:STDOUT: %T.loc6_15.1: %A.type = symbolic_binding T, 0 [symbolic = %T.loc6_15.1 (constants.%T)] +// CHECK:STDOUT: %T.as_type.loc6_31.1: type = facet_access_type %T.loc6_15.1 [symbolic = %T.as_type.loc6_31.1 (constants.%T.as_type)] +// CHECK:STDOUT: %pattern_type: type = pattern_type %T.as_type.loc6_31.1 [symbolic = %pattern_type (constants.%pattern_type.a0e)] +// CHECK:STDOUT: %x.param_patt.loc6_29.2: @RequiresA.%pattern_type (%pattern_type.a0e) = value_param_pattern [symbolic = %x.param_patt.loc6_29.2 (constants.%x.param_patt.241)] +// CHECK:STDOUT: %x.patt.loc6_29.2: @RequiresA.%pattern_type (%pattern_type.a0e) = at_binding_pattern x, %x.param_patt.loc6_29.2 [symbolic = %x.patt.loc6_29.2 (constants.%x.patt.19b)] +// CHECK:STDOUT: +// CHECK:STDOUT: !definition: +// CHECK:STDOUT: %require_complete: = require_complete_type %T.as_type.loc6_31.1 [symbolic = %require_complete (constants.%require_complete.94f)] +// CHECK:STDOUT: +// CHECK:STDOUT: fn(%x.param: @RequiresA.%T.as_type.loc6_31.1 (%T.as_type)) { +// CHECK:STDOUT: !entry: +// CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: +// CHECK:STDOUT: } +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: generic fn @F(%T.loc7_7.2: %A.type, %U.loc7_14.2: %B_where.type) { +// CHECK:STDOUT: %T.patt.loc7_7.2: %pattern_type.029 = symbolic_binding_pattern T, 0 [symbolic = %T.patt.loc7_7.2 (constants.%T.patt)] +// CHECK:STDOUT: %T.loc7_7.1: %A.type = symbolic_binding T, 0 [symbolic = %T.loc7_7.1 (constants.%T)] +// CHECK:STDOUT: %U.patt.loc7_14.2: %pattern_type.831 = symbolic_binding_pattern U, 1 [symbolic = %U.patt.loc7_14.2 (constants.%U.patt)] +// CHECK:STDOUT: %U.loc7_14.1: %B_where.type = symbolic_binding U, 1 [symbolic = %U.loc7_14.1 (constants.%U)] +// CHECK:STDOUT: +// CHECK:STDOUT: !definition: +// CHECK:STDOUT: %U.as_type.loc8_16.2: type = facet_access_type %U.loc7_14.1 [symbolic = %U.as_type.loc8_16.2 (constants.%U.as_type)] +// CHECK:STDOUT: %T.as_type.loc8_11.2: type = facet_access_type %T.loc7_7.1 [symbolic = %T.as_type.loc8_11.2 (constants.%T.as_type)] +// CHECK:STDOUT: %eq = observe_equivalent %T.loc7_7.1, %U.loc7_14.1 [symbolic = %eq (constants.%eq)] +// CHECK:STDOUT: %InnerF.type: type = fn_type @InnerF, @F(%T.loc7_7.1, %U.loc7_14.1) [symbolic = %InnerF.type (constants.%InnerF.type)] +// CHECK:STDOUT: %InnerF: @F.%InnerF.type (%InnerF.type) = struct_value () [symbolic = %InnerF (constants.%InnerF)] +// CHECK:STDOUT: +// CHECK:STDOUT: fn() { +// CHECK:STDOUT: !entry: +// CHECK:STDOUT: %T.ref.loc8: %A.type = name_ref T, %T.loc7_7.2 [symbolic = %T.loc7_7.1 (constants.%T)] +// CHECK:STDOUT: %U.ref: %B_where.type = name_ref U, %U.loc7_14.2 [symbolic = %U.loc7_14.1 (constants.%U)] +// CHECK:STDOUT: %U.as_type.loc8_16.1: type = facet_access_type %U.ref [symbolic = %U.as_type.loc8_16.2 (constants.%U.as_type)] +// CHECK:STDOUT: %.loc8_16: type = converted %U.ref, %U.as_type.loc8_16.1 [symbolic = %U.as_type.loc8_16.2 (constants.%U.as_type)] +// CHECK:STDOUT: %T.as_type.loc8_11.1: type = facet_access_type %T.ref.loc8 [symbolic = %T.as_type.loc8_11.2 (constants.%T.as_type)] +// CHECK:STDOUT: %.loc8_11: type = converted %T.ref.loc8, %T.as_type.loc8_11.1 [symbolic = %T.as_type.loc8_11.2 (constants.%T.as_type)] +// CHECK:STDOUT: %F.observe.decl = observe_decl @F.observe [concrete] +// CHECK:STDOUT: %InnerF.decl: @F.%InnerF.type (%InnerF.type) = fn_decl @InnerF [symbolic = @F.%InnerF (constants.%InnerF)] { +// CHECK:STDOUT: %x.param_patt.loc10_14.1: @InnerF.%pattern_type (%pattern_type.d51) = value_param_pattern [symbolic = %x.param_patt.loc10_14.2 (constants.%x.param_patt.fbe)] +// CHECK:STDOUT: %x.patt.loc10_14.1: @InnerF.%pattern_type (%pattern_type.d51) = at_binding_pattern x, %x.param_patt.loc10_14.1 [symbolic = %x.patt.loc10_14.2 (constants.%x.patt.cdb)] +// CHECK:STDOUT: } { +// CHECK:STDOUT: %x.param: @InnerF.%U.as_type.loc10_16.1 (%U.as_type) = value_param call_param0 +// CHECK:STDOUT: %.loc10_16.1: type = splice_block %.loc10_16.2 [symbolic = %U.as_type.loc10_16.1 (constants.%U.as_type)] { +// CHECK:STDOUT: %U.ref: %B_where.type = name_ref U, @F.%U.loc7_14.2 [symbolic = %U (constants.%U)] +// CHECK:STDOUT: %U.as_type.loc10_16.2: type = facet_access_type %U.ref [symbolic = %U.as_type.loc10_16.1 (constants.%U.as_type)] +// CHECK:STDOUT: %.loc10_16.2: type = converted %U.ref, %U.as_type.loc10_16.2 [symbolic = %U.as_type.loc10_16.1 (constants.%U.as_type)] +// CHECK:STDOUT: } +// CHECK:STDOUT: %x: @InnerF.%U.as_type.loc10_16.1 (%U.as_type) = wrapper_binding x, %x.param +// CHECK:STDOUT: } +// CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: +// CHECK:STDOUT: @F.observe { +// CHECK:STDOUT: observe constants.%T == constants.%U +// CHECK:STDOUT: } +// CHECK:STDOUT: } +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: generic fn @InnerF(@F.%T.loc7_7.2: %A.type, @F.%U.loc7_14.2: %B_where.type) { +// CHECK:STDOUT: %U: %B_where.type = symbolic_binding U, 1 [symbolic = %U (constants.%U)] +// CHECK:STDOUT: %U.as_type.loc10_16.1: type = facet_access_type %U [symbolic = %U.as_type.loc10_16.1 (constants.%U.as_type)] +// CHECK:STDOUT: %pattern_type: type = pattern_type %U.as_type.loc10_16.1 [symbolic = %pattern_type (constants.%pattern_type.d51)] +// CHECK:STDOUT: %x.param_patt.loc10_14.2: @InnerF.%pattern_type (%pattern_type.d51) = value_param_pattern [symbolic = %x.param_patt.loc10_14.2 (constants.%x.param_patt.fbe)] +// CHECK:STDOUT: %x.patt.loc10_14.2: @InnerF.%pattern_type (%pattern_type.d51) = at_binding_pattern x, %x.param_patt.loc10_14.2 [symbolic = %x.patt.loc10_14.2 (constants.%x.patt.cdb)] +// CHECK:STDOUT: +// CHECK:STDOUT: !definition: +// CHECK:STDOUT: %require_complete: = require_complete_type %U.as_type.loc10_16.1 [symbolic = %require_complete (constants.%require_complete.963)] +// CHECK:STDOUT: +// CHECK:STDOUT: fn(%x.param: @InnerF.%U.as_type.loc10_16.1 (%U.as_type)) { +// CHECK:STDOUT: !entry: +// CHECK:STDOUT: %RequiresA.ref: %RequiresA.type = name_ref RequiresA, file.%RequiresA.decl [concrete = constants.%RequiresA] +// CHECK:STDOUT: %x.ref: @InnerF.%U.as_type.loc10_16.1 (%U.as_type) = name_ref x, %x +// CHECK:STDOUT: %B.type: type = facet_type <@B> [concrete = constants.%B.type] +// CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: +// CHECK:STDOUT: } +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: specific @A.WithSelf(constants.%Self.d0c) { +// CHECK:STDOUT: !definition: +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: specific @B.WithSelf(constants.%Self.b45) { +// CHECK:STDOUT: !definition: +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: specific @RequiresA(constants.%T) { +// CHECK:STDOUT: %T.patt.loc6_15.2 => constants.%T.patt +// CHECK:STDOUT: %T.loc6_15.1 => constants.%T +// CHECK:STDOUT: %T.as_type.loc6_31.1 => constants.%T.as_type +// CHECK:STDOUT: %pattern_type => constants.%pattern_type.a0e +// CHECK:STDOUT: %x.param_patt.loc6_29.2 => constants.%x.param_patt.241 +// CHECK:STDOUT: %x.patt.loc6_29.2 => constants.%x.patt.19b +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: specific @F(constants.%T, constants.%U) { +// CHECK:STDOUT: %T.patt.loc7_7.2 => constants.%T.patt +// CHECK:STDOUT: %T.loc7_7.1 => constants.%T +// CHECK:STDOUT: %U.patt.loc7_14.2 => constants.%U.patt +// CHECK:STDOUT: %U.loc7_14.1 => constants.%U +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: specific @InnerF(constants.%T, constants.%U) { +// CHECK:STDOUT: %U => constants.%U +// CHECK:STDOUT: %U.as_type.loc10_16.1 => constants.%U.as_type +// CHECK:STDOUT: %pattern_type => constants.%pattern_type.d51 +// CHECK:STDOUT: %x.param_patt.loc10_14.2 => constants.%x.param_patt.fbe +// CHECK:STDOUT: %x.patt.loc10_14.2 => constants.%x.patt.cdb +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: --- fail_todo_nested_functions_in_inner.carbon +// CHECK:STDOUT: +// CHECK:STDOUT: constants { +// CHECK:STDOUT: %A.type: type = facet_type <@A> [concrete] +// CHECK:STDOUT: %Self.d0c: %A.type = symbolic_binding Self, 0 [symbolic] +// CHECK:STDOUT: %B.type: type = facet_type <@B> [concrete] +// CHECK:STDOUT: %Self.b45: %B.type = symbolic_binding Self, 0 [symbolic] +// CHECK:STDOUT: %type: type = facet_type [concrete] +// CHECK:STDOUT: %.Self.c39: %type = symbolic_binding .Self [symbolic_self] +// CHECK:STDOUT: %pattern_type.029: type = pattern_type %A.type [concrete] +// CHECK:STDOUT: %T.patt: %pattern_type.029 = symbolic_binding_pattern T, 0 [symbolic] +// CHECK:STDOUT: %T: %A.type = symbolic_binding T, 0 [symbolic] +// CHECK:STDOUT: %T.as_type: type = facet_access_type %T [symbolic] +// CHECK:STDOUT: %pattern_type.a0e: type = pattern_type %T.as_type [symbolic] +// CHECK:STDOUT: %x.param_patt.241: %pattern_type.a0e = value_param_pattern [symbolic] +// CHECK:STDOUT: %x.patt.19b: %pattern_type.a0e = at_binding_pattern x, %x.param_patt.241 [symbolic] +// CHECK:STDOUT: %RequiresA.type: type = fn_type @RequiresA [concrete] +// CHECK:STDOUT: %RequiresA: %RequiresA.type = struct_value () [concrete] +// CHECK:STDOUT: %require_complete.94f: = require_complete_type %T.as_type [symbolic] +// CHECK:STDOUT: %.Self.e4d: %B.type = symbolic_binding .Self [symbolic_self] +// CHECK:STDOUT: %B_where.type: type = facet_type <@B where TODO> [concrete] +// CHECK:STDOUT: %pattern_type.831: type = pattern_type %B_where.type [concrete] +// CHECK:STDOUT: %U.patt: %pattern_type.831 = symbolic_binding_pattern U, 1 [symbolic] +// CHECK:STDOUT: %U: %B_where.type = symbolic_binding U, 1 [symbolic] +// CHECK:STDOUT: %F.type: type = fn_type @F [concrete] +// CHECK:STDOUT: %F: %F.type = struct_value () [concrete] +// CHECK:STDOUT: %U.as_type: type = facet_access_type %U [symbolic] +// CHECK:STDOUT: %pattern_type.d51: type = pattern_type %U.as_type [symbolic] +// CHECK:STDOUT: %x.param_patt.fbe: %pattern_type.d51 = value_param_pattern [symbolic] +// CHECK:STDOUT: %x.patt.cdb: %pattern_type.d51 = at_binding_pattern x, %x.param_patt.fbe [symbolic] +// CHECK:STDOUT: %InnerF.type: type = fn_type @InnerF, @F(%T, %U) [symbolic] +// CHECK:STDOUT: %InnerF: %InnerF.type = struct_value () [symbolic] +// CHECK:STDOUT: %require_complete.963: = require_complete_type %U.as_type [symbolic] +// CHECK:STDOUT: %eq = observe_equivalent %T, %U [symbolic] +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: imports { +// CHECK:STDOUT: %Core: = namespace file.%Core.import, [concrete] { +// CHECK:STDOUT: import Core//prelude +// CHECK:STDOUT: import Core//prelude/... +// CHECK:STDOUT: } +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: file { +// CHECK:STDOUT: package: = namespace [concrete] { +// CHECK:STDOUT: .Core = imports.%Core +// CHECK:STDOUT: .A = %A.decl +// CHECK:STDOUT: .B = %B.decl +// CHECK:STDOUT: .RequiresA = %RequiresA.decl +// CHECK:STDOUT: .F = %F.decl +// CHECK:STDOUT: } +// CHECK:STDOUT: %Core.import = import Core +// CHECK:STDOUT: %A.decl: type = interface_decl @A [concrete = constants.%A.type] {} {} +// CHECK:STDOUT: %B.decl: type = interface_decl @B [concrete = constants.%B.type] {} {} +// CHECK:STDOUT: %RequiresA.decl: %RequiresA.type = fn_decl @RequiresA [concrete = constants.%RequiresA] { +// CHECK:STDOUT: %T.patt.loc6_15.1: %pattern_type.029 = symbolic_binding_pattern T, 0 [symbolic = %T.patt.loc6_15.2 (constants.%T.patt)] +// CHECK:STDOUT: %x.param_patt.loc6_29.1: @RequiresA.%pattern_type (%pattern_type.a0e) = value_param_pattern [symbolic = %x.param_patt.loc6_29.2 (constants.%x.param_patt.241)] +// CHECK:STDOUT: %x.patt.loc6_29.1: @RequiresA.%pattern_type (%pattern_type.a0e) = at_binding_pattern x, %x.param_patt.loc6_29.1 [symbolic = %x.patt.loc6_29.2 (constants.%x.patt.19b)] +// CHECK:STDOUT: } { +// CHECK:STDOUT: %.loc6_18: type = splice_block %A.ref [concrete = constants.%A.type] { +// CHECK:STDOUT: %.Self: %type = symbolic_binding .Self [symbolic_self = constants.%.Self.c39] +// CHECK:STDOUT: %A.ref: type = name_ref A, file.%A.decl [concrete = constants.%A.type] +// CHECK:STDOUT: } +// CHECK:STDOUT: %T.loc6_15.2: %A.type = symbolic_binding T, 0 [symbolic = %T.loc6_15.1 (constants.%T)] +// CHECK:STDOUT: %x.param: @RequiresA.%T.as_type.loc6_31.1 (%T.as_type) = value_param call_param0 +// CHECK:STDOUT: %.loc6_31.1: type = splice_block %.loc6_31.2 [symbolic = %T.as_type.loc6_31.1 (constants.%T.as_type)] { +// CHECK:STDOUT: %T.ref: %A.type = name_ref T, %T.loc6_15.2 [symbolic = %T.loc6_15.1 (constants.%T)] +// CHECK:STDOUT: %T.as_type.loc6_31.2: type = facet_access_type %T.ref [symbolic = %T.as_type.loc6_31.1 (constants.%T.as_type)] +// CHECK:STDOUT: %.loc6_31.2: type = converted %T.ref, %T.as_type.loc6_31.2 [symbolic = %T.as_type.loc6_31.1 (constants.%T.as_type)] +// CHECK:STDOUT: } +// CHECK:STDOUT: %x: @RequiresA.%T.as_type.loc6_31.1 (%T.as_type) = wrapper_binding x, %x.param +// CHECK:STDOUT: } +// CHECK:STDOUT: %F.decl: %F.type = fn_decl @F [concrete = constants.%F] { +// CHECK:STDOUT: %T.patt.loc7_7.1: %pattern_type.029 = symbolic_binding_pattern T, 0 [symbolic = %T.patt.loc7_7.2 (constants.%T.patt)] +// CHECK:STDOUT: %U.patt.loc7_14.1: %pattern_type.831 = symbolic_binding_pattern U, 1 [symbolic = %U.patt.loc7_14.2 (constants.%U.patt)] +// CHECK:STDOUT: } { +// CHECK:STDOUT: %.loc7_10: type = splice_block %A.ref [concrete = constants.%A.type] { +// CHECK:STDOUT: %.Self.loc7_7: %type = symbolic_binding .Self [symbolic_self = constants.%.Self.c39] +// CHECK:STDOUT: %A.ref: type = name_ref A, file.%A.decl [concrete = constants.%A.type] +// CHECK:STDOUT: } +// CHECK:STDOUT: %T.loc7_7.2: %A.type = symbolic_binding T, 0 [symbolic = %T.loc7_7.1 (constants.%T)] +// CHECK:STDOUT: %.loc7_19.1: type = splice_block %.loc7_19.2 [concrete = constants.%B_where.type] { +// CHECK:STDOUT: %.Self.loc7_14: %type = symbolic_binding .Self [symbolic_self = constants.%.Self.c39] +// CHECK:STDOUT: %B.ref: type = name_ref B, file.%B.decl [concrete = constants.%B.type] +// CHECK:STDOUT: %.Self.loc7_19: %B.type = symbolic_binding .Self [symbolic_self = constants.%.Self.e4d] +// CHECK:STDOUT: %.Self.ref: %B.type = name_ref .Self, %.Self.loc7_19 [symbolic_self = constants.%.Self.e4d] +// CHECK:STDOUT: %T.ref: %A.type = name_ref T, %T.loc7_7.2 [symbolic = %T.loc7_7.1 (constants.%T)] +// CHECK:STDOUT: %.loc7_19.2: type = where_expr [concrete = constants.%B_where.type] { +// CHECK:STDOUT: requirement_base_facet_type %B.ref +// CHECK:STDOUT: requirement_equivalent %.Self.ref, %T.ref +// CHECK:STDOUT: } +// CHECK:STDOUT: } +// CHECK:STDOUT: %U.loc7_14.2: %B_where.type = symbolic_binding U, 1 [symbolic = %U.loc7_14.1 (constants.%U)] +// CHECK:STDOUT: } +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: interface @A { +// CHECK:STDOUT: %Self: %A.type = symbolic_binding Self, 0 [symbolic = constants.%Self.d0c] +// CHECK:STDOUT: %A.WithSelf.decl = interface_with_self_decl @A [concrete] +// CHECK:STDOUT: +// CHECK:STDOUT: !members: +// CHECK:STDOUT: .Self = %Self +// CHECK:STDOUT: witness = () +// CHECK:STDOUT: +// CHECK:STDOUT: !requires: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: interface @B { +// CHECK:STDOUT: %Self: %B.type = symbolic_binding Self, 0 [symbolic = constants.%Self.b45] +// CHECK:STDOUT: %B.WithSelf.decl = interface_with_self_decl @B [concrete] +// CHECK:STDOUT: +// CHECK:STDOUT: !members: +// CHECK:STDOUT: .Self = %Self +// CHECK:STDOUT: witness = () +// CHECK:STDOUT: +// CHECK:STDOUT: !requires: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: generic fn @RequiresA(%T.loc6_15.2: %A.type) { +// CHECK:STDOUT: %T.patt.loc6_15.2: %pattern_type.029 = symbolic_binding_pattern T, 0 [symbolic = %T.patt.loc6_15.2 (constants.%T.patt)] +// CHECK:STDOUT: %T.loc6_15.1: %A.type = symbolic_binding T, 0 [symbolic = %T.loc6_15.1 (constants.%T)] +// CHECK:STDOUT: %T.as_type.loc6_31.1: type = facet_access_type %T.loc6_15.1 [symbolic = %T.as_type.loc6_31.1 (constants.%T.as_type)] +// CHECK:STDOUT: %pattern_type: type = pattern_type %T.as_type.loc6_31.1 [symbolic = %pattern_type (constants.%pattern_type.a0e)] +// CHECK:STDOUT: %x.param_patt.loc6_29.2: @RequiresA.%pattern_type (%pattern_type.a0e) = value_param_pattern [symbolic = %x.param_patt.loc6_29.2 (constants.%x.param_patt.241)] +// CHECK:STDOUT: %x.patt.loc6_29.2: @RequiresA.%pattern_type (%pattern_type.a0e) = at_binding_pattern x, %x.param_patt.loc6_29.2 [symbolic = %x.patt.loc6_29.2 (constants.%x.patt.19b)] +// CHECK:STDOUT: +// CHECK:STDOUT: !definition: +// CHECK:STDOUT: %require_complete: = require_complete_type %T.as_type.loc6_31.1 [symbolic = %require_complete (constants.%require_complete.94f)] +// CHECK:STDOUT: +// CHECK:STDOUT: fn(%x.param: @RequiresA.%T.as_type.loc6_31.1 (%T.as_type)) { +// CHECK:STDOUT: !entry: +// CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: +// CHECK:STDOUT: } +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: generic fn @F(%T.loc7_7.2: %A.type, %U.loc7_14.2: %B_where.type) { +// CHECK:STDOUT: %T.patt.loc7_7.2: %pattern_type.029 = symbolic_binding_pattern T, 0 [symbolic = %T.patt.loc7_7.2 (constants.%T.patt)] +// CHECK:STDOUT: %T.loc7_7.1: %A.type = symbolic_binding T, 0 [symbolic = %T.loc7_7.1 (constants.%T)] +// CHECK:STDOUT: %U.patt.loc7_14.2: %pattern_type.831 = symbolic_binding_pattern U, 1 [symbolic = %U.patt.loc7_14.2 (constants.%U.patt)] +// CHECK:STDOUT: %U.loc7_14.1: %B_where.type = symbolic_binding U, 1 [symbolic = %U.loc7_14.1 (constants.%U)] +// CHECK:STDOUT: +// CHECK:STDOUT: !definition: +// CHECK:STDOUT: %InnerF.type: type = fn_type @InnerF, @F(%T.loc7_7.1, %U.loc7_14.1) [symbolic = %InnerF.type (constants.%InnerF.type)] +// CHECK:STDOUT: %InnerF: @F.%InnerF.type (%InnerF.type) = struct_value () [symbolic = %InnerF (constants.%InnerF)] +// CHECK:STDOUT: +// CHECK:STDOUT: fn() { +// CHECK:STDOUT: !entry: +// CHECK:STDOUT: %InnerF.decl: @F.%InnerF.type (%InnerF.type) = fn_decl @InnerF [symbolic = @F.%InnerF (constants.%InnerF)] { +// CHECK:STDOUT: %x.param_patt.loc9_14.1: @InnerF.%pattern_type (%pattern_type.d51) = value_param_pattern [symbolic = %x.param_patt.loc9_14.2 (constants.%x.param_patt.fbe)] +// CHECK:STDOUT: %x.patt.loc9_14.1: @InnerF.%pattern_type (%pattern_type.d51) = at_binding_pattern x, %x.param_patt.loc9_14.1 [symbolic = %x.patt.loc9_14.2 (constants.%x.patt.cdb)] +// CHECK:STDOUT: } { +// CHECK:STDOUT: %x.param: @InnerF.%U.as_type.loc9_16.1 (%U.as_type) = value_param call_param0 +// CHECK:STDOUT: %.loc9_16.1: type = splice_block %.loc9_16.2 [symbolic = %U.as_type.loc9_16.1 (constants.%U.as_type)] { +// CHECK:STDOUT: %U.ref.loc9: %B_where.type = name_ref U, @F.%U.loc7_14.2 [symbolic = %U (constants.%U)] +// CHECK:STDOUT: %U.as_type.loc9_16.2: type = facet_access_type %U.ref.loc9 [symbolic = %U.as_type.loc9_16.1 (constants.%U.as_type)] +// CHECK:STDOUT: %.loc9_16.2: type = converted %U.ref.loc9, %U.as_type.loc9_16.2 [symbolic = %U.as_type.loc9_16.1 (constants.%U.as_type)] +// CHECK:STDOUT: } +// CHECK:STDOUT: %x: @InnerF.%U.as_type.loc9_16.1 (%U.as_type) = wrapper_binding x, %x.param +// CHECK:STDOUT: } +// CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: +// CHECK:STDOUT: } +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: generic fn @InnerF(@F.%T.loc7_7.2: %A.type, @F.%U.loc7_14.2: %B_where.type) { +// CHECK:STDOUT: %U: %B_where.type = symbolic_binding U, 1 [symbolic = %U (constants.%U)] +// CHECK:STDOUT: %U.as_type.loc9_16.1: type = facet_access_type %U [symbolic = %U.as_type.loc9_16.1 (constants.%U.as_type)] +// CHECK:STDOUT: %pattern_type: type = pattern_type %U.as_type.loc9_16.1 [symbolic = %pattern_type (constants.%pattern_type.d51)] +// CHECK:STDOUT: %x.param_patt.loc9_14.2: @InnerF.%pattern_type (%pattern_type.d51) = value_param_pattern [symbolic = %x.param_patt.loc9_14.2 (constants.%x.param_patt.fbe)] +// CHECK:STDOUT: %x.patt.loc9_14.2: @InnerF.%pattern_type (%pattern_type.d51) = at_binding_pattern x, %x.param_patt.loc9_14.2 [symbolic = %x.patt.loc9_14.2 (constants.%x.patt.cdb)] +// CHECK:STDOUT: +// CHECK:STDOUT: !definition: +// CHECK:STDOUT: %require_complete: = require_complete_type %U.as_type.loc9_16.1 [symbolic = %require_complete (constants.%require_complete.963)] +// CHECK:STDOUT: %T: %A.type = symbolic_binding T, 0 [symbolic = %T (constants.%T)] +// CHECK:STDOUT: %T.as_type.loc10_13.2: type = facet_access_type %T [symbolic = %T.as_type.loc10_13.2 (constants.%T.as_type)] +// CHECK:STDOUT: %eq = observe_equivalent %T, %U [symbolic = %eq (constants.%eq)] +// CHECK:STDOUT: +// CHECK:STDOUT: fn(%x.param: @InnerF.%U.as_type.loc9_16.1 (%U.as_type)) { +// CHECK:STDOUT: !entry: +// CHECK:STDOUT: %T.ref: %A.type = name_ref T, @F.%T.loc7_7.2 [symbolic = %T (constants.%T)] +// CHECK:STDOUT: %U.ref.loc10: %B_where.type = name_ref U, @F.%U.loc7_14.2 [symbolic = %U (constants.%U)] +// CHECK:STDOUT: %U.as_type.loc10: type = facet_access_type %U.ref.loc10 [symbolic = %U.as_type.loc9_16.1 (constants.%U.as_type)] +// CHECK:STDOUT: %.loc10_18: type = converted %U.ref.loc10, %U.as_type.loc10 [symbolic = %U.as_type.loc9_16.1 (constants.%U.as_type)] +// CHECK:STDOUT: %T.as_type.loc10_13.1: type = facet_access_type %T.ref [symbolic = %T.as_type.loc10_13.2 (constants.%T.as_type)] +// CHECK:STDOUT: %.loc10_13: type = converted %T.ref, %T.as_type.loc10_13.1 [symbolic = %T.as_type.loc10_13.2 (constants.%T.as_type)] +// CHECK:STDOUT: %InnerF.observe.decl = observe_decl @InnerF.observe [concrete] +// CHECK:STDOUT: %RequiresA.ref: %RequiresA.type = name_ref RequiresA, file.%RequiresA.decl [concrete = constants.%RequiresA] +// CHECK:STDOUT: %x.ref: @InnerF.%U.as_type.loc9_16.1 (%U.as_type) = name_ref x, %x +// CHECK:STDOUT: %B.type: type = facet_type <@B> [concrete = constants.%B.type] +// CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: +// CHECK:STDOUT: @InnerF.observe { +// CHECK:STDOUT: observe constants.%T == constants.%U +// CHECK:STDOUT: } +// CHECK:STDOUT: } +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: specific @A.WithSelf(constants.%Self.d0c) { +// CHECK:STDOUT: !definition: +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: specific @B.WithSelf(constants.%Self.b45) { +// CHECK:STDOUT: !definition: +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: specific @RequiresA(constants.%T) { +// CHECK:STDOUT: %T.patt.loc6_15.2 => constants.%T.patt +// CHECK:STDOUT: %T.loc6_15.1 => constants.%T +// CHECK:STDOUT: %T.as_type.loc6_31.1 => constants.%T.as_type +// CHECK:STDOUT: %pattern_type => constants.%pattern_type.a0e +// CHECK:STDOUT: %x.param_patt.loc6_29.2 => constants.%x.param_patt.241 +// CHECK:STDOUT: %x.patt.loc6_29.2 => constants.%x.patt.19b +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: specific @F(constants.%T, constants.%U) { +// CHECK:STDOUT: %T.patt.loc7_7.2 => constants.%T.patt +// CHECK:STDOUT: %T.loc7_7.1 => constants.%T +// CHECK:STDOUT: %U.patt.loc7_14.2 => constants.%U.patt +// CHECK:STDOUT: %U.loc7_14.1 => constants.%U +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: specific @InnerF(constants.%T, constants.%U) { +// CHECK:STDOUT: %U => constants.%U +// CHECK:STDOUT: %U.as_type.loc9_16.1 => constants.%U.as_type +// CHECK:STDOUT: %pattern_type => constants.%pattern_type.d51 +// CHECK:STDOUT: %x.param_patt.loc9_14.2 => constants.%x.param_patt.fbe +// CHECK:STDOUT: %x.patt.loc9_14.2 => constants.%x.patt.cdb +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: --- fail_nested_functions_lexical_order.carbon +// CHECK:STDOUT: +// CHECK:STDOUT: constants { +// CHECK:STDOUT: %A.type: type = facet_type <@A> [concrete] +// CHECK:STDOUT: %Self.d0c: %A.type = symbolic_binding Self, 0 [symbolic] +// CHECK:STDOUT: %B.type: type = facet_type <@B> [concrete] +// CHECK:STDOUT: %Self.b45: %B.type = symbolic_binding Self, 0 [symbolic] +// CHECK:STDOUT: %type: type = facet_type [concrete] +// CHECK:STDOUT: %.Self.c39: %type = symbolic_binding .Self [symbolic_self] +// CHECK:STDOUT: %pattern_type.029: type = pattern_type %A.type [concrete] +// CHECK:STDOUT: %T.patt: %pattern_type.029 = symbolic_binding_pattern T, 0 [symbolic] +// CHECK:STDOUT: %T: %A.type = symbolic_binding T, 0 [symbolic] +// CHECK:STDOUT: %T.as_type: type = facet_access_type %T [symbolic] +// CHECK:STDOUT: %pattern_type.a0e: type = pattern_type %T.as_type [symbolic] +// CHECK:STDOUT: %x.param_patt.241: %pattern_type.a0e = value_param_pattern [symbolic] +// CHECK:STDOUT: %x.patt.19b: %pattern_type.a0e = at_binding_pattern x, %x.param_patt.241 [symbolic] +// CHECK:STDOUT: %RequiresA.type: type = fn_type @RequiresA [concrete] +// CHECK:STDOUT: %RequiresA: %RequiresA.type = struct_value () [concrete] +// CHECK:STDOUT: %require_complete.94f: = require_complete_type %T.as_type [symbolic] +// CHECK:STDOUT: %.Self.e4d: %B.type = symbolic_binding .Self [symbolic_self] +// CHECK:STDOUT: %B_where.type: type = facet_type <@B where TODO> [concrete] +// CHECK:STDOUT: %pattern_type.831: type = pattern_type %B_where.type [concrete] +// CHECK:STDOUT: %U.patt: %pattern_type.831 = symbolic_binding_pattern U, 1 [symbolic] +// CHECK:STDOUT: %U: %B_where.type = symbolic_binding U, 1 [symbolic] +// CHECK:STDOUT: %F.type: type = fn_type @F [concrete] +// CHECK:STDOUT: %F: %F.type = struct_value () [concrete] +// CHECK:STDOUT: %U.as_type: type = facet_access_type %U [symbolic] +// CHECK:STDOUT: %pattern_type.d51: type = pattern_type %U.as_type [symbolic] +// CHECK:STDOUT: %x.param_patt.fbe: %pattern_type.d51 = value_param_pattern [symbolic] +// CHECK:STDOUT: %x.patt.cdb: %pattern_type.d51 = at_binding_pattern x, %x.param_patt.fbe [symbolic] +// CHECK:STDOUT: %InnerF.type: type = fn_type @InnerF, @F(%T, %U) [symbolic] +// CHECK:STDOUT: %InnerF: %InnerF.type = struct_value () [symbolic] +// CHECK:STDOUT: %require_complete.963: = require_complete_type %U.as_type [symbolic] +// CHECK:STDOUT: %eq = observe_equivalent %T, %U [symbolic] +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: imports { +// CHECK:STDOUT: %Core: = namespace file.%Core.import, [concrete] { +// CHECK:STDOUT: import Core//prelude +// CHECK:STDOUT: import Core//prelude/... +// CHECK:STDOUT: } +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: file { +// CHECK:STDOUT: package: = namespace [concrete] { +// CHECK:STDOUT: .Core = imports.%Core +// CHECK:STDOUT: .A = %A.decl +// CHECK:STDOUT: .B = %B.decl +// CHECK:STDOUT: .RequiresA = %RequiresA.decl +// CHECK:STDOUT: .F = %F.decl +// CHECK:STDOUT: } +// CHECK:STDOUT: %Core.import = import Core +// CHECK:STDOUT: %A.decl: type = interface_decl @A [concrete = constants.%A.type] {} {} +// CHECK:STDOUT: %B.decl: type = interface_decl @B [concrete = constants.%B.type] {} {} +// CHECK:STDOUT: %RequiresA.decl: %RequiresA.type = fn_decl @RequiresA [concrete = constants.%RequiresA] { +// CHECK:STDOUT: %T.patt.loc6_15.1: %pattern_type.029 = symbolic_binding_pattern T, 0 [symbolic = %T.patt.loc6_15.2 (constants.%T.patt)] +// CHECK:STDOUT: %x.param_patt.loc6_29.1: @RequiresA.%pattern_type (%pattern_type.a0e) = value_param_pattern [symbolic = %x.param_patt.loc6_29.2 (constants.%x.param_patt.241)] +// CHECK:STDOUT: %x.patt.loc6_29.1: @RequiresA.%pattern_type (%pattern_type.a0e) = at_binding_pattern x, %x.param_patt.loc6_29.1 [symbolic = %x.patt.loc6_29.2 (constants.%x.patt.19b)] +// CHECK:STDOUT: } { +// CHECK:STDOUT: %.loc6_18: type = splice_block %A.ref [concrete = constants.%A.type] { +// CHECK:STDOUT: %.Self: %type = symbolic_binding .Self [symbolic_self = constants.%.Self.c39] +// CHECK:STDOUT: %A.ref: type = name_ref A, file.%A.decl [concrete = constants.%A.type] +// CHECK:STDOUT: } +// CHECK:STDOUT: %T.loc6_15.2: %A.type = symbolic_binding T, 0 [symbolic = %T.loc6_15.1 (constants.%T)] +// CHECK:STDOUT: %x.param: @RequiresA.%T.as_type.loc6_31.1 (%T.as_type) = value_param call_param0 +// CHECK:STDOUT: %.loc6_31.1: type = splice_block %.loc6_31.2 [symbolic = %T.as_type.loc6_31.1 (constants.%T.as_type)] { +// CHECK:STDOUT: %T.ref: %A.type = name_ref T, %T.loc6_15.2 [symbolic = %T.loc6_15.1 (constants.%T)] +// CHECK:STDOUT: %T.as_type.loc6_31.2: type = facet_access_type %T.ref [symbolic = %T.as_type.loc6_31.1 (constants.%T.as_type)] +// CHECK:STDOUT: %.loc6_31.2: type = converted %T.ref, %T.as_type.loc6_31.2 [symbolic = %T.as_type.loc6_31.1 (constants.%T.as_type)] +// CHECK:STDOUT: } +// CHECK:STDOUT: %x: @RequiresA.%T.as_type.loc6_31.1 (%T.as_type) = wrapper_binding x, %x.param +// CHECK:STDOUT: } +// CHECK:STDOUT: %F.decl: %F.type = fn_decl @F [concrete = constants.%F] { +// CHECK:STDOUT: %T.patt.loc7_7.1: %pattern_type.029 = symbolic_binding_pattern T, 0 [symbolic = %T.patt.loc7_7.2 (constants.%T.patt)] +// CHECK:STDOUT: %U.patt.loc7_14.1: %pattern_type.831 = symbolic_binding_pattern U, 1 [symbolic = %U.patt.loc7_14.2 (constants.%U.patt)] +// CHECK:STDOUT: } { +// CHECK:STDOUT: %.loc7_10: type = splice_block %A.ref [concrete = constants.%A.type] { +// CHECK:STDOUT: %.Self.loc7_7: %type = symbolic_binding .Self [symbolic_self = constants.%.Self.c39] +// CHECK:STDOUT: %A.ref: type = name_ref A, file.%A.decl [concrete = constants.%A.type] +// CHECK:STDOUT: } +// CHECK:STDOUT: %T.loc7_7.2: %A.type = symbolic_binding T, 0 [symbolic = %T.loc7_7.1 (constants.%T)] +// CHECK:STDOUT: %.loc7_19.1: type = splice_block %.loc7_19.2 [concrete = constants.%B_where.type] { +// CHECK:STDOUT: %.Self.loc7_14: %type = symbolic_binding .Self [symbolic_self = constants.%.Self.c39] +// CHECK:STDOUT: %B.ref: type = name_ref B, file.%B.decl [concrete = constants.%B.type] +// CHECK:STDOUT: %.Self.loc7_19: %B.type = symbolic_binding .Self [symbolic_self = constants.%.Self.e4d] +// CHECK:STDOUT: %.Self.ref: %B.type = name_ref .Self, %.Self.loc7_19 [symbolic_self = constants.%.Self.e4d] +// CHECK:STDOUT: %T.ref.loc7: %A.type = name_ref T, %T.loc7_7.2 [symbolic = %T.loc7_7.1 (constants.%T)] +// CHECK:STDOUT: %.loc7_19.2: type = where_expr [concrete = constants.%B_where.type] { +// CHECK:STDOUT: requirement_base_facet_type %B.ref +// CHECK:STDOUT: requirement_equivalent %.Self.ref, %T.ref.loc7 +// CHECK:STDOUT: } +// CHECK:STDOUT: } +// CHECK:STDOUT: %U.loc7_14.2: %B_where.type = symbolic_binding U, 1 [symbolic = %U.loc7_14.1 (constants.%U)] +// CHECK:STDOUT: } +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: interface @A { +// CHECK:STDOUT: %Self: %A.type = symbolic_binding Self, 0 [symbolic = constants.%Self.d0c] +// CHECK:STDOUT: %A.WithSelf.decl = interface_with_self_decl @A [concrete] +// CHECK:STDOUT: +// CHECK:STDOUT: !members: +// CHECK:STDOUT: .Self = %Self +// CHECK:STDOUT: witness = () +// CHECK:STDOUT: +// CHECK:STDOUT: !requires: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: interface @B { +// CHECK:STDOUT: %Self: %B.type = symbolic_binding Self, 0 [symbolic = constants.%Self.b45] +// CHECK:STDOUT: %B.WithSelf.decl = interface_with_self_decl @B [concrete] +// CHECK:STDOUT: +// CHECK:STDOUT: !members: +// CHECK:STDOUT: .Self = %Self +// CHECK:STDOUT: witness = () +// CHECK:STDOUT: +// CHECK:STDOUT: !requires: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: generic fn @RequiresA(%T.loc6_15.2: %A.type) { +// CHECK:STDOUT: %T.patt.loc6_15.2: %pattern_type.029 = symbolic_binding_pattern T, 0 [symbolic = %T.patt.loc6_15.2 (constants.%T.patt)] +// CHECK:STDOUT: %T.loc6_15.1: %A.type = symbolic_binding T, 0 [symbolic = %T.loc6_15.1 (constants.%T)] +// CHECK:STDOUT: %T.as_type.loc6_31.1: type = facet_access_type %T.loc6_15.1 [symbolic = %T.as_type.loc6_31.1 (constants.%T.as_type)] +// CHECK:STDOUT: %pattern_type: type = pattern_type %T.as_type.loc6_31.1 [symbolic = %pattern_type (constants.%pattern_type.a0e)] +// CHECK:STDOUT: %x.param_patt.loc6_29.2: @RequiresA.%pattern_type (%pattern_type.a0e) = value_param_pattern [symbolic = %x.param_patt.loc6_29.2 (constants.%x.param_patt.241)] +// CHECK:STDOUT: %x.patt.loc6_29.2: @RequiresA.%pattern_type (%pattern_type.a0e) = at_binding_pattern x, %x.param_patt.loc6_29.2 [symbolic = %x.patt.loc6_29.2 (constants.%x.patt.19b)] +// CHECK:STDOUT: +// CHECK:STDOUT: !definition: +// CHECK:STDOUT: %require_complete: = require_complete_type %T.as_type.loc6_31.1 [symbolic = %require_complete (constants.%require_complete.94f)] +// CHECK:STDOUT: +// CHECK:STDOUT: fn(%x.param: @RequiresA.%T.as_type.loc6_31.1 (%T.as_type)) { +// CHECK:STDOUT: !entry: +// CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: +// CHECK:STDOUT: } +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: generic fn @F(%T.loc7_7.2: %A.type, %U.loc7_14.2: %B_where.type) { +// CHECK:STDOUT: %T.patt.loc7_7.2: %pattern_type.029 = symbolic_binding_pattern T, 0 [symbolic = %T.patt.loc7_7.2 (constants.%T.patt)] +// CHECK:STDOUT: %T.loc7_7.1: %A.type = symbolic_binding T, 0 [symbolic = %T.loc7_7.1 (constants.%T)] +// CHECK:STDOUT: %U.patt.loc7_14.2: %pattern_type.831 = symbolic_binding_pattern U, 1 [symbolic = %U.patt.loc7_14.2 (constants.%U.patt)] +// CHECK:STDOUT: %U.loc7_14.1: %B_where.type = symbolic_binding U, 1 [symbolic = %U.loc7_14.1 (constants.%U)] +// CHECK:STDOUT: +// CHECK:STDOUT: !definition: +// CHECK:STDOUT: %InnerF.type: type = fn_type @InnerF, @F(%T.loc7_7.1, %U.loc7_14.1) [symbolic = %InnerF.type (constants.%InnerF.type)] +// CHECK:STDOUT: %InnerF: @F.%InnerF.type (%InnerF.type) = struct_value () [symbolic = %InnerF (constants.%InnerF)] +// CHECK:STDOUT: %U.as_type.loc20_16.2: type = facet_access_type %U.loc7_14.1 [symbolic = %U.as_type.loc20_16.2 (constants.%U.as_type)] +// CHECK:STDOUT: %T.as_type.loc20_11.2: type = facet_access_type %T.loc7_7.1 [symbolic = %T.as_type.loc20_11.2 (constants.%T.as_type)] +// CHECK:STDOUT: %eq = observe_equivalent %T.loc7_7.1, %U.loc7_14.1 [symbolic = %eq (constants.%eq)] +// CHECK:STDOUT: +// CHECK:STDOUT: fn() { +// CHECK:STDOUT: !entry: +// CHECK:STDOUT: %InnerF.decl: @F.%InnerF.type (%InnerF.type) = fn_decl @InnerF [symbolic = @F.%InnerF (constants.%InnerF)] { +// CHECK:STDOUT: %x.param_patt.loc9_14.1: @InnerF.%pattern_type (%pattern_type.d51) = value_param_pattern [symbolic = %x.param_patt.loc9_14.2 (constants.%x.param_patt.fbe)] +// CHECK:STDOUT: %x.patt.loc9_14.1: @InnerF.%pattern_type (%pattern_type.d51) = at_binding_pattern x, %x.param_patt.loc9_14.1 [symbolic = %x.patt.loc9_14.2 (constants.%x.patt.cdb)] +// CHECK:STDOUT: } { +// CHECK:STDOUT: %x.param: @InnerF.%U.as_type.loc9_16.1 (%U.as_type) = value_param call_param0 +// CHECK:STDOUT: %.loc9_16.1: type = splice_block %.loc9_16.2 [symbolic = %U.as_type.loc9_16.1 (constants.%U.as_type)] { +// CHECK:STDOUT: %U.ref: %B_where.type = name_ref U, @F.%U.loc7_14.2 [symbolic = %U (constants.%U)] +// CHECK:STDOUT: %U.as_type.loc9_16.2: type = facet_access_type %U.ref [symbolic = %U.as_type.loc9_16.1 (constants.%U.as_type)] +// CHECK:STDOUT: %.loc9_16.2: type = converted %U.ref, %U.as_type.loc9_16.2 [symbolic = %U.as_type.loc9_16.1 (constants.%U.as_type)] +// CHECK:STDOUT: } +// CHECK:STDOUT: %x: @InnerF.%U.as_type.loc9_16.1 (%U.as_type) = wrapper_binding x, %x.param +// CHECK:STDOUT: } +// CHECK:STDOUT: %T.ref.loc20: %A.type = name_ref T, %T.loc7_7.2 [symbolic = %T.loc7_7.1 (constants.%T)] +// CHECK:STDOUT: %U.ref: %B_where.type = name_ref U, %U.loc7_14.2 [symbolic = %U.loc7_14.1 (constants.%U)] +// CHECK:STDOUT: %U.as_type.loc20_16.1: type = facet_access_type %U.ref [symbolic = %U.as_type.loc20_16.2 (constants.%U.as_type)] +// CHECK:STDOUT: %.loc20_16: type = converted %U.ref, %U.as_type.loc20_16.1 [symbolic = %U.as_type.loc20_16.2 (constants.%U.as_type)] +// CHECK:STDOUT: %T.as_type.loc20_11.1: type = facet_access_type %T.ref.loc20 [symbolic = %T.as_type.loc20_11.2 (constants.%T.as_type)] +// CHECK:STDOUT: %.loc20_11: type = converted %T.ref.loc20, %T.as_type.loc20_11.1 [symbolic = %T.as_type.loc20_11.2 (constants.%T.as_type)] +// CHECK:STDOUT: %F.observe.decl = observe_decl @F.observe [concrete] +// CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: +// CHECK:STDOUT: @F.observe { +// CHECK:STDOUT: observe constants.%T == constants.%U +// CHECK:STDOUT: } +// CHECK:STDOUT: } +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: generic fn @InnerF(@F.%T.loc7_7.2: %A.type, @F.%U.loc7_14.2: %B_where.type) { +// CHECK:STDOUT: %U: %B_where.type = symbolic_binding U, 1 [symbolic = %U (constants.%U)] +// CHECK:STDOUT: %U.as_type.loc9_16.1: type = facet_access_type %U [symbolic = %U.as_type.loc9_16.1 (constants.%U.as_type)] +// CHECK:STDOUT: %pattern_type: type = pattern_type %U.as_type.loc9_16.1 [symbolic = %pattern_type (constants.%pattern_type.d51)] +// CHECK:STDOUT: %x.param_patt.loc9_14.2: @InnerF.%pattern_type (%pattern_type.d51) = value_param_pattern [symbolic = %x.param_patt.loc9_14.2 (constants.%x.param_patt.fbe)] +// CHECK:STDOUT: %x.patt.loc9_14.2: @InnerF.%pattern_type (%pattern_type.d51) = at_binding_pattern x, %x.param_patt.loc9_14.2 [symbolic = %x.patt.loc9_14.2 (constants.%x.patt.cdb)] +// CHECK:STDOUT: +// CHECK:STDOUT: !definition: +// CHECK:STDOUT: %require_complete: = require_complete_type %U.as_type.loc9_16.1 [symbolic = %require_complete (constants.%require_complete.963)] +// CHECK:STDOUT: +// CHECK:STDOUT: fn(%x.param: @InnerF.%U.as_type.loc9_16.1 (%U.as_type)) { +// CHECK:STDOUT: !entry: +// CHECK:STDOUT: %RequiresA.ref: %RequiresA.type = name_ref RequiresA, file.%RequiresA.decl [concrete = constants.%RequiresA] +// CHECK:STDOUT: %x.ref: @InnerF.%U.as_type.loc9_16.1 (%U.as_type) = name_ref x, %x +// CHECK:STDOUT: %B.type: type = facet_type <@B> [concrete = constants.%B.type] +// CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: +// CHECK:STDOUT: } +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: specific @A.WithSelf(constants.%Self.d0c) { +// CHECK:STDOUT: !definition: +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: specific @B.WithSelf(constants.%Self.b45) { +// CHECK:STDOUT: !definition: +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: specific @RequiresA(constants.%T) { +// CHECK:STDOUT: %T.patt.loc6_15.2 => constants.%T.patt +// CHECK:STDOUT: %T.loc6_15.1 => constants.%T +// CHECK:STDOUT: %T.as_type.loc6_31.1 => constants.%T.as_type +// CHECK:STDOUT: %pattern_type => constants.%pattern_type.a0e +// CHECK:STDOUT: %x.param_patt.loc6_29.2 => constants.%x.param_patt.241 +// CHECK:STDOUT: %x.patt.loc6_29.2 => constants.%x.patt.19b +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: specific @F(constants.%T, constants.%U) { +// CHECK:STDOUT: %T.patt.loc7_7.2 => constants.%T.patt +// CHECK:STDOUT: %T.loc7_7.1 => constants.%T +// CHECK:STDOUT: %U.patt.loc7_14.2 => constants.%U.patt +// CHECK:STDOUT: %U.loc7_14.1 => constants.%U +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: specific @InnerF(constants.%T, constants.%U) { +// CHECK:STDOUT: %U => constants.%U +// CHECK:STDOUT: %U.as_type.loc9_16.1 => constants.%U.as_type +// CHECK:STDOUT: %pattern_type => constants.%pattern_type.d51 +// CHECK:STDOUT: %x.param_patt.loc9_14.2 => constants.%x.param_patt.fbe +// CHECK:STDOUT: %x.patt.loc9_14.2 => constants.%x.patt.cdb +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: --- fail_nested_functions_leak_upward.carbon +// CHECK:STDOUT: +// CHECK:STDOUT: constants { +// CHECK:STDOUT: %A.type: type = facet_type <@A> [concrete] +// CHECK:STDOUT: %Self.d0c: %A.type = symbolic_binding Self, 0 [symbolic] +// CHECK:STDOUT: %B.type: type = facet_type <@B> [concrete] +// CHECK:STDOUT: %Self.b45: %B.type = symbolic_binding Self, 0 [symbolic] +// CHECK:STDOUT: %type: type = facet_type [concrete] +// CHECK:STDOUT: %.Self.c39: %type = symbolic_binding .Self [symbolic_self] +// CHECK:STDOUT: %pattern_type.029: type = pattern_type %A.type [concrete] +// CHECK:STDOUT: %T.patt: %pattern_type.029 = symbolic_binding_pattern T, 0 [symbolic] +// CHECK:STDOUT: %T: %A.type = symbolic_binding T, 0 [symbolic] +// CHECK:STDOUT: %T.as_type: type = facet_access_type %T [symbolic] +// CHECK:STDOUT: %pattern_type.a0e: type = pattern_type %T.as_type [symbolic] +// CHECK:STDOUT: %x.param_patt.241: %pattern_type.a0e = value_param_pattern [symbolic] +// CHECK:STDOUT: %x.patt.19b: %pattern_type.a0e = at_binding_pattern x, %x.param_patt.241 [symbolic] +// CHECK:STDOUT: %RequiresA.type: type = fn_type @RequiresA [concrete] +// CHECK:STDOUT: %RequiresA: %RequiresA.type = struct_value () [concrete] +// CHECK:STDOUT: %require_complete.94f: = require_complete_type %T.as_type [symbolic] +// CHECK:STDOUT: %.Self.e4d: %B.type = symbolic_binding .Self [symbolic_self] +// CHECK:STDOUT: %B_where.type: type = facet_type <@B where TODO> [concrete] +// CHECK:STDOUT: %pattern_type.831: type = pattern_type %B_where.type [concrete] +// CHECK:STDOUT: %U.patt: %pattern_type.831 = symbolic_binding_pattern U, 1 [symbolic] +// CHECK:STDOUT: %U: %B_where.type = symbolic_binding U, 1 [symbolic] +// CHECK:STDOUT: %U.as_type: type = facet_access_type %U [symbolic] +// CHECK:STDOUT: %pattern_type.d51: type = pattern_type %U.as_type [symbolic] +// CHECK:STDOUT: %x.param_patt.fbe: %pattern_type.d51 = value_param_pattern [symbolic] +// CHECK:STDOUT: %x.patt.cdb: %pattern_type.d51 = at_binding_pattern x, %x.param_patt.fbe [symbolic] +// CHECK:STDOUT: %F.type: type = fn_type @F [concrete] +// CHECK:STDOUT: %F: %F.type = struct_value () [concrete] +// CHECK:STDOUT: %require_complete.963: = require_complete_type %U.as_type [symbolic] +// CHECK:STDOUT: %InnerF.type: type = fn_type @InnerF, @F(%T, %U) [symbolic] +// CHECK:STDOUT: %InnerF: %InnerF.type = struct_value () [symbolic] +// CHECK:STDOUT: %eq = observe_equivalent %T, %U [symbolic] +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: imports { +// CHECK:STDOUT: %Core: = namespace file.%Core.import, [concrete] { +// CHECK:STDOUT: import Core//prelude +// CHECK:STDOUT: import Core//prelude/... +// CHECK:STDOUT: } +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: file { +// CHECK:STDOUT: package: = namespace [concrete] { +// CHECK:STDOUT: .Core = imports.%Core +// CHECK:STDOUT: .A = %A.decl +// CHECK:STDOUT: .B = %B.decl +// CHECK:STDOUT: .RequiresA = %RequiresA.decl +// CHECK:STDOUT: .F = %F.decl +// CHECK:STDOUT: } +// CHECK:STDOUT: %Core.import = import Core +// CHECK:STDOUT: %A.decl: type = interface_decl @A [concrete = constants.%A.type] {} {} +// CHECK:STDOUT: %B.decl: type = interface_decl @B [concrete = constants.%B.type] {} {} +// CHECK:STDOUT: %RequiresA.decl: %RequiresA.type = fn_decl @RequiresA [concrete = constants.%RequiresA] { +// CHECK:STDOUT: %T.patt.loc6_15.1: %pattern_type.029 = symbolic_binding_pattern T, 0 [symbolic = %T.patt.loc6_15.2 (constants.%T.patt)] +// CHECK:STDOUT: %x.param_patt.loc6_29.1: @RequiresA.%pattern_type (%pattern_type.a0e) = value_param_pattern [symbolic = %x.param_patt.loc6_29.2 (constants.%x.param_patt.241)] +// CHECK:STDOUT: %x.patt.loc6_29.1: @RequiresA.%pattern_type (%pattern_type.a0e) = at_binding_pattern x, %x.param_patt.loc6_29.1 [symbolic = %x.patt.loc6_29.2 (constants.%x.patt.19b)] +// CHECK:STDOUT: } { +// CHECK:STDOUT: %.loc6_18: type = splice_block %A.ref [concrete = constants.%A.type] { +// CHECK:STDOUT: %.Self: %type = symbolic_binding .Self [symbolic_self = constants.%.Self.c39] +// CHECK:STDOUT: %A.ref: type = name_ref A, file.%A.decl [concrete = constants.%A.type] +// CHECK:STDOUT: } +// CHECK:STDOUT: %T.loc6_15.2: %A.type = symbolic_binding T, 0 [symbolic = %T.loc6_15.1 (constants.%T)] +// CHECK:STDOUT: %x.param: @RequiresA.%T.as_type.loc6_31.1 (%T.as_type) = value_param call_param0 +// CHECK:STDOUT: %.loc6_31.1: type = splice_block %.loc6_31.2 [symbolic = %T.as_type.loc6_31.1 (constants.%T.as_type)] { +// CHECK:STDOUT: %T.ref: %A.type = name_ref T, %T.loc6_15.2 [symbolic = %T.loc6_15.1 (constants.%T)] +// CHECK:STDOUT: %T.as_type.loc6_31.2: type = facet_access_type %T.ref [symbolic = %T.as_type.loc6_31.1 (constants.%T.as_type)] +// CHECK:STDOUT: %.loc6_31.2: type = converted %T.ref, %T.as_type.loc6_31.2 [symbolic = %T.as_type.loc6_31.1 (constants.%T.as_type)] +// CHECK:STDOUT: } +// CHECK:STDOUT: %x: @RequiresA.%T.as_type.loc6_31.1 (%T.as_type) = wrapper_binding x, %x.param +// CHECK:STDOUT: } +// CHECK:STDOUT: %F.decl: %F.type = fn_decl @F [concrete = constants.%F] { +// CHECK:STDOUT: %T.patt.loc7_7.1: %pattern_type.029 = symbolic_binding_pattern T, 0 [symbolic = %T.patt.loc7_7.2 (constants.%T.patt)] +// CHECK:STDOUT: %U.patt.loc7_14.1: %pattern_type.831 = symbolic_binding_pattern U, 1 [symbolic = %U.patt.loc7_14.2 (constants.%U.patt)] +// CHECK:STDOUT: %x.param_patt.loc7_38.1: @F.%pattern_type (%pattern_type.d51) = value_param_pattern [symbolic = %x.param_patt.loc7_38.2 (constants.%x.param_patt.fbe)] +// CHECK:STDOUT: %x.patt.loc7_38.1: @F.%pattern_type (%pattern_type.d51) = at_binding_pattern x, %x.param_patt.loc7_38.1 [symbolic = %x.patt.loc7_38.2 (constants.%x.patt.cdb)] +// CHECK:STDOUT: } { +// CHECK:STDOUT: %.loc7_10: type = splice_block %A.ref [concrete = constants.%A.type] { +// CHECK:STDOUT: %.Self.loc7_7: %type = symbolic_binding .Self [symbolic_self = constants.%.Self.c39] +// CHECK:STDOUT: %A.ref: type = name_ref A, file.%A.decl [concrete = constants.%A.type] +// CHECK:STDOUT: } +// CHECK:STDOUT: %T.loc7_7.2: %A.type = symbolic_binding T, 0 [symbolic = %T.loc7_7.1 (constants.%T)] +// CHECK:STDOUT: %.loc7_19.1: type = splice_block %.loc7_19.2 [concrete = constants.%B_where.type] { +// CHECK:STDOUT: %.Self.loc7_14: %type = symbolic_binding .Self [symbolic_self = constants.%.Self.c39] +// CHECK:STDOUT: %B.ref: type = name_ref B, file.%B.decl [concrete = constants.%B.type] +// CHECK:STDOUT: %.Self.loc7_19: %B.type = symbolic_binding .Self [symbolic_self = constants.%.Self.e4d] +// CHECK:STDOUT: %.Self.ref: %B.type = name_ref .Self, %.Self.loc7_19 [symbolic_self = constants.%.Self.e4d] +// CHECK:STDOUT: %T.ref: %A.type = name_ref T, %T.loc7_7.2 [symbolic = %T.loc7_7.1 (constants.%T)] +// CHECK:STDOUT: %.loc7_19.2: type = where_expr [concrete = constants.%B_where.type] { +// CHECK:STDOUT: requirement_base_facet_type %B.ref +// CHECK:STDOUT: requirement_equivalent %.Self.ref, %T.ref +// CHECK:STDOUT: } +// CHECK:STDOUT: } +// CHECK:STDOUT: %U.loc7_14.2: %B_where.type = symbolic_binding U, 1 [symbolic = %U.loc7_14.1 (constants.%U)] +// CHECK:STDOUT: %x.param: @F.%U.as_type.loc7_40.1 (%U.as_type) = value_param call_param0 +// CHECK:STDOUT: %.loc7_40.1: type = splice_block %.loc7_40.2 [symbolic = %U.as_type.loc7_40.1 (constants.%U.as_type)] { +// CHECK:STDOUT: %U.ref: %B_where.type = name_ref U, %U.loc7_14.2 [symbolic = %U.loc7_14.1 (constants.%U)] +// CHECK:STDOUT: %U.as_type.loc7_40.2: type = facet_access_type %U.ref [symbolic = %U.as_type.loc7_40.1 (constants.%U.as_type)] +// CHECK:STDOUT: %.loc7_40.2: type = converted %U.ref, %U.as_type.loc7_40.2 [symbolic = %U.as_type.loc7_40.1 (constants.%U.as_type)] +// CHECK:STDOUT: } +// CHECK:STDOUT: %x: @F.%U.as_type.loc7_40.1 (%U.as_type) = wrapper_binding x, %x.param +// CHECK:STDOUT: } +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: interface @A { +// CHECK:STDOUT: %Self: %A.type = symbolic_binding Self, 0 [symbolic = constants.%Self.d0c] +// CHECK:STDOUT: %A.WithSelf.decl = interface_with_self_decl @A [concrete] +// CHECK:STDOUT: +// CHECK:STDOUT: !members: +// CHECK:STDOUT: .Self = %Self +// CHECK:STDOUT: witness = () +// CHECK:STDOUT: +// CHECK:STDOUT: !requires: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: interface @B { +// CHECK:STDOUT: %Self: %B.type = symbolic_binding Self, 0 [symbolic = constants.%Self.b45] +// CHECK:STDOUT: %B.WithSelf.decl = interface_with_self_decl @B [concrete] +// CHECK:STDOUT: +// CHECK:STDOUT: !members: +// CHECK:STDOUT: .Self = %Self +// CHECK:STDOUT: witness = () +// CHECK:STDOUT: +// CHECK:STDOUT: !requires: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: generic fn @RequiresA(%T.loc6_15.2: %A.type) { +// CHECK:STDOUT: %T.patt.loc6_15.2: %pattern_type.029 = symbolic_binding_pattern T, 0 [symbolic = %T.patt.loc6_15.2 (constants.%T.patt)] +// CHECK:STDOUT: %T.loc6_15.1: %A.type = symbolic_binding T, 0 [symbolic = %T.loc6_15.1 (constants.%T)] +// CHECK:STDOUT: %T.as_type.loc6_31.1: type = facet_access_type %T.loc6_15.1 [symbolic = %T.as_type.loc6_31.1 (constants.%T.as_type)] +// CHECK:STDOUT: %pattern_type: type = pattern_type %T.as_type.loc6_31.1 [symbolic = %pattern_type (constants.%pattern_type.a0e)] +// CHECK:STDOUT: %x.param_patt.loc6_29.2: @RequiresA.%pattern_type (%pattern_type.a0e) = value_param_pattern [symbolic = %x.param_patt.loc6_29.2 (constants.%x.param_patt.241)] +// CHECK:STDOUT: %x.patt.loc6_29.2: @RequiresA.%pattern_type (%pattern_type.a0e) = at_binding_pattern x, %x.param_patt.loc6_29.2 [symbolic = %x.patt.loc6_29.2 (constants.%x.patt.19b)] +// CHECK:STDOUT: +// CHECK:STDOUT: !definition: +// CHECK:STDOUT: %require_complete: = require_complete_type %T.as_type.loc6_31.1 [symbolic = %require_complete (constants.%require_complete.94f)] +// CHECK:STDOUT: +// CHECK:STDOUT: fn(%x.param: @RequiresA.%T.as_type.loc6_31.1 (%T.as_type)) { +// CHECK:STDOUT: !entry: +// CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: +// CHECK:STDOUT: } +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: generic fn @F(%T.loc7_7.2: %A.type, %U.loc7_14.2: %B_where.type) { +// CHECK:STDOUT: %T.patt.loc7_7.2: %pattern_type.029 = symbolic_binding_pattern T, 0 [symbolic = %T.patt.loc7_7.2 (constants.%T.patt)] +// CHECK:STDOUT: %T.loc7_7.1: %A.type = symbolic_binding T, 0 [symbolic = %T.loc7_7.1 (constants.%T)] +// CHECK:STDOUT: %U.patt.loc7_14.2: %pattern_type.831 = symbolic_binding_pattern U, 1 [symbolic = %U.patt.loc7_14.2 (constants.%U.patt)] +// CHECK:STDOUT: %U.loc7_14.1: %B_where.type = symbolic_binding U, 1 [symbolic = %U.loc7_14.1 (constants.%U)] +// CHECK:STDOUT: %U.as_type.loc7_40.1: type = facet_access_type %U.loc7_14.1 [symbolic = %U.as_type.loc7_40.1 (constants.%U.as_type)] +// CHECK:STDOUT: %pattern_type: type = pattern_type %U.as_type.loc7_40.1 [symbolic = %pattern_type (constants.%pattern_type.d51)] +// CHECK:STDOUT: %x.param_patt.loc7_38.2: @F.%pattern_type (%pattern_type.d51) = value_param_pattern [symbolic = %x.param_patt.loc7_38.2 (constants.%x.param_patt.fbe)] +// CHECK:STDOUT: %x.patt.loc7_38.2: @F.%pattern_type (%pattern_type.d51) = at_binding_pattern x, %x.param_patt.loc7_38.2 [symbolic = %x.patt.loc7_38.2 (constants.%x.patt.cdb)] +// CHECK:STDOUT: +// CHECK:STDOUT: !definition: +// CHECK:STDOUT: %require_complete: = require_complete_type %U.as_type.loc7_40.1 [symbolic = %require_complete (constants.%require_complete.963)] +// CHECK:STDOUT: %InnerF.type: type = fn_type @InnerF, @F(%T.loc7_7.1, %U.loc7_14.1) [symbolic = %InnerF.type (constants.%InnerF.type)] +// CHECK:STDOUT: %InnerF: @F.%InnerF.type (%InnerF.type) = struct_value () [symbolic = %InnerF (constants.%InnerF)] +// CHECK:STDOUT: +// CHECK:STDOUT: fn(%x.param: @F.%U.as_type.loc7_40.1 (%U.as_type)) { +// CHECK:STDOUT: !entry: +// CHECK:STDOUT: %InnerF.decl: @F.%InnerF.type (%InnerF.type) = fn_decl @InnerF [symbolic = @F.%InnerF (constants.%InnerF)] { +// CHECK:STDOUT: %x.param_patt.loc9_21.1: @InnerF.%pattern_type (%pattern_type.d51) = value_param_pattern [symbolic = %x.param_patt.loc9_21.2 (constants.%x.param_patt.fbe)] +// CHECK:STDOUT: %x.patt.loc9_21.1: @InnerF.%pattern_type (%pattern_type.d51) = at_binding_pattern x, %x.param_patt.loc9_21.1 [symbolic = %x.patt.loc9_21.2 (constants.%x.patt.cdb)] +// CHECK:STDOUT: } { +// CHECK:STDOUT: %x.param: @InnerF.%U.as_type.loc9_23.1 (%U.as_type) = value_param call_param0 +// CHECK:STDOUT: %.loc9_23.1: type = splice_block %.loc9_23.2 [symbolic = %U.as_type.loc9_23.1 (constants.%U.as_type)] { +// CHECK:STDOUT: %U.ref.loc9: %B_where.type = name_ref U, @F.%U.loc7_14.2 [symbolic = %U (constants.%U)] +// CHECK:STDOUT: %U.as_type.loc9_23.2: type = facet_access_type %U.ref.loc9 [symbolic = %U.as_type.loc9_23.1 (constants.%U.as_type)] +// CHECK:STDOUT: %.loc9_23.2: type = converted %U.ref.loc9, %U.as_type.loc9_23.2 [symbolic = %U.as_type.loc9_23.1 (constants.%U.as_type)] +// CHECK:STDOUT: } +// CHECK:STDOUT: %x: @InnerF.%U.as_type.loc9_23.1 (%U.as_type) = wrapper_binding x, %x.param +// CHECK:STDOUT: } +// CHECK:STDOUT: %RequiresA.ref: %RequiresA.type = name_ref RequiresA, file.%RequiresA.decl [concrete = constants.%RequiresA] +// CHECK:STDOUT: %x.ref: @F.%U.as_type.loc7_40.1 (%U.as_type) = name_ref x, %x +// CHECK:STDOUT: %B.type: type = facet_type <@B> [concrete = constants.%B.type] +// CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: +// CHECK:STDOUT: } +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: generic fn @InnerF(@F.%T.loc7_7.2: %A.type, @F.%U.loc7_14.2: %B_where.type) { +// CHECK:STDOUT: %U: %B_where.type = symbolic_binding U, 1 [symbolic = %U (constants.%U)] +// CHECK:STDOUT: %U.as_type.loc9_23.1: type = facet_access_type %U [symbolic = %U.as_type.loc9_23.1 (constants.%U.as_type)] +// CHECK:STDOUT: %pattern_type: type = pattern_type %U.as_type.loc9_23.1 [symbolic = %pattern_type (constants.%pattern_type.d51)] +// CHECK:STDOUT: %x.param_patt.loc9_21.2: @InnerF.%pattern_type (%pattern_type.d51) = value_param_pattern [symbolic = %x.param_patt.loc9_21.2 (constants.%x.param_patt.fbe)] +// CHECK:STDOUT: %x.patt.loc9_21.2: @InnerF.%pattern_type (%pattern_type.d51) = at_binding_pattern x, %x.param_patt.loc9_21.2 [symbolic = %x.patt.loc9_21.2 (constants.%x.patt.cdb)] +// CHECK:STDOUT: +// CHECK:STDOUT: !definition: +// CHECK:STDOUT: %require_complete: = require_complete_type %U.as_type.loc9_23.1 [symbolic = %require_complete (constants.%require_complete.963)] +// CHECK:STDOUT: %T: %A.type = symbolic_binding T, 0 [symbolic = %T (constants.%T)] +// CHECK:STDOUT: %T.as_type.loc10_13.2: type = facet_access_type %T [symbolic = %T.as_type.loc10_13.2 (constants.%T.as_type)] +// CHECK:STDOUT: %eq = observe_equivalent %T, %U [symbolic = %eq (constants.%eq)] +// CHECK:STDOUT: +// CHECK:STDOUT: fn(%x.param: @InnerF.%U.as_type.loc9_23.1 (%U.as_type)) { +// CHECK:STDOUT: !entry: +// CHECK:STDOUT: %T.ref: %A.type = name_ref T, @F.%T.loc7_7.2 [symbolic = %T (constants.%T)] +// CHECK:STDOUT: %U.ref.loc10: %B_where.type = name_ref U, @F.%U.loc7_14.2 [symbolic = %U (constants.%U)] +// CHECK:STDOUT: %U.as_type.loc10: type = facet_access_type %U.ref.loc10 [symbolic = %U.as_type.loc9_23.1 (constants.%U.as_type)] +// CHECK:STDOUT: %.loc10_18: type = converted %U.ref.loc10, %U.as_type.loc10 [symbolic = %U.as_type.loc9_23.1 (constants.%U.as_type)] +// CHECK:STDOUT: %T.as_type.loc10_13.1: type = facet_access_type %T.ref [symbolic = %T.as_type.loc10_13.2 (constants.%T.as_type)] +// CHECK:STDOUT: %.loc10_13: type = converted %T.ref, %T.as_type.loc10_13.1 [symbolic = %T.as_type.loc10_13.2 (constants.%T.as_type)] +// CHECK:STDOUT: %InnerF.observe.decl = observe_decl @InnerF.observe [concrete] +// CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: +// CHECK:STDOUT: @InnerF.observe { +// CHECK:STDOUT: observe constants.%T == constants.%U +// CHECK:STDOUT: } +// CHECK:STDOUT: } +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: specific @A.WithSelf(constants.%Self.d0c) { +// CHECK:STDOUT: !definition: +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: specific @B.WithSelf(constants.%Self.b45) { +// CHECK:STDOUT: !definition: +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: specific @RequiresA(constants.%T) { +// CHECK:STDOUT: %T.patt.loc6_15.2 => constants.%T.patt +// CHECK:STDOUT: %T.loc6_15.1 => constants.%T +// CHECK:STDOUT: %T.as_type.loc6_31.1 => constants.%T.as_type +// CHECK:STDOUT: %pattern_type => constants.%pattern_type.a0e +// CHECK:STDOUT: %x.param_patt.loc6_29.2 => constants.%x.param_patt.241 +// CHECK:STDOUT: %x.patt.loc6_29.2 => constants.%x.patt.19b +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: specific @F(constants.%T, constants.%U) { +// CHECK:STDOUT: %T.patt.loc7_7.2 => constants.%T.patt +// CHECK:STDOUT: %T.loc7_7.1 => constants.%T +// CHECK:STDOUT: %U.patt.loc7_14.2 => constants.%U.patt +// CHECK:STDOUT: %U.loc7_14.1 => constants.%U +// CHECK:STDOUT: %U.as_type.loc7_40.1 => constants.%U.as_type +// CHECK:STDOUT: %pattern_type => constants.%pattern_type.d51 +// CHECK:STDOUT: %x.param_patt.loc7_38.2 => constants.%x.param_patt.fbe +// CHECK:STDOUT: %x.patt.loc7_38.2 => constants.%x.patt.cdb +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: specific @InnerF(constants.%T, constants.%U) { +// CHECK:STDOUT: %U => constants.%U +// CHECK:STDOUT: %U.as_type.loc9_23.1 => constants.%U.as_type +// CHECK:STDOUT: %pattern_type => constants.%pattern_type.d51 +// CHECK:STDOUT: %x.param_patt.loc9_21.2 => constants.%x.param_patt.fbe +// CHECK:STDOUT: %x.patt.loc9_21.2 => constants.%x.patt.cdb +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: --- fail_not_observed.carbon +// CHECK:STDOUT: +// CHECK:STDOUT: constants { +// CHECK:STDOUT: %A.type: type = facet_type <@A> [concrete] +// CHECK:STDOUT: %Self.d0c: %A.type = symbolic_binding Self, 0 [symbolic] +// CHECK:STDOUT: %B.type: type = facet_type <@B> [concrete] +// CHECK:STDOUT: %Self.b45: %B.type = symbolic_binding Self, 0 [symbolic] +// CHECK:STDOUT: %type: type = facet_type [concrete] +// CHECK:STDOUT: %.Self.c39: %type = symbolic_binding .Self [symbolic_self] +// CHECK:STDOUT: %pattern_type.029: type = pattern_type %A.type [concrete] +// CHECK:STDOUT: %T.patt: %pattern_type.029 = symbolic_binding_pattern T, 0 [symbolic] +// CHECK:STDOUT: %T: %A.type = symbolic_binding T, 0 [symbolic] +// CHECK:STDOUT: %T.as_type: type = facet_access_type %T [symbolic] +// CHECK:STDOUT: %pattern_type.a0e: type = pattern_type %T.as_type [symbolic] +// CHECK:STDOUT: %x.param_patt.241: %pattern_type.a0e = value_param_pattern [symbolic] +// CHECK:STDOUT: %x.patt.19b: %pattern_type.a0e = at_binding_pattern x, %x.param_patt.241 [symbolic] +// CHECK:STDOUT: %RequiresA.type: type = fn_type @RequiresA [concrete] +// CHECK:STDOUT: %RequiresA: %RequiresA.type = struct_value () [concrete] +// CHECK:STDOUT: %require_complete.94f: = require_complete_type %T.as_type [symbolic] +// CHECK:STDOUT: %.Self.e4d: %B.type = symbolic_binding .Self [symbolic_self] +// CHECK:STDOUT: %B_where.type: type = facet_type <@B where TODO> [concrete] +// CHECK:STDOUT: %pattern_type.831: type = pattern_type %B_where.type [concrete] +// CHECK:STDOUT: %U.patt: %pattern_type.831 = symbolic_binding_pattern U, 1 [symbolic] +// CHECK:STDOUT: %U: %B_where.type = symbolic_binding U, 1 [symbolic] +// CHECK:STDOUT: %pattern_type.7b5: type = pattern_type %B.type [concrete] +// CHECK:STDOUT: %V.patt: %pattern_type.7b5 = symbolic_binding_pattern V, 2 [symbolic] +// CHECK:STDOUT: %V: %B.type = symbolic_binding V, 2 [symbolic] +// CHECK:STDOUT: %U.as_type: type = facet_access_type %U [symbolic] +// CHECK:STDOUT: %pattern_type.d51: type = pattern_type %U.as_type [symbolic] +// CHECK:STDOUT: %x.param_patt.fbe: %pattern_type.d51 = value_param_pattern [symbolic] +// CHECK:STDOUT: %x.patt.cdb: %pattern_type.d51 = at_binding_pattern x, %x.param_patt.fbe [symbolic] +// CHECK:STDOUT: %F.type: type = fn_type @F [concrete] +// CHECK:STDOUT: %F: %F.type = struct_value () [concrete] +// CHECK:STDOUT: %require_complete.963: = require_complete_type %U.as_type [symbolic] +// CHECK:STDOUT: %V.as_type: type = facet_access_type %V [symbolic] +// CHECK:STDOUT: %eq = observe_equivalent %T, %V [symbolic] +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: imports { +// CHECK:STDOUT: %Core: = namespace file.%Core.import, [concrete] { +// CHECK:STDOUT: import Core//prelude +// CHECK:STDOUT: import Core//prelude/... +// CHECK:STDOUT: } +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: file { +// CHECK:STDOUT: package: = namespace [concrete] { +// CHECK:STDOUT: .Core = imports.%Core +// CHECK:STDOUT: .A = %A.decl +// CHECK:STDOUT: .B = %B.decl +// CHECK:STDOUT: .RequiresA = %RequiresA.decl +// CHECK:STDOUT: .F = %F.decl +// CHECK:STDOUT: } +// CHECK:STDOUT: %Core.import = import Core +// CHECK:STDOUT: %A.decl: type = interface_decl @A [concrete = constants.%A.type] {} {} +// CHECK:STDOUT: %B.decl: type = interface_decl @B [concrete = constants.%B.type] {} {} +// CHECK:STDOUT: %RequiresA.decl: %RequiresA.type = fn_decl @RequiresA [concrete = constants.%RequiresA] { +// CHECK:STDOUT: %T.patt.loc6_15.1: %pattern_type.029 = symbolic_binding_pattern T, 0 [symbolic = %T.patt.loc6_15.2 (constants.%T.patt)] +// CHECK:STDOUT: %x.param_patt.loc6_29.1: @RequiresA.%pattern_type (%pattern_type.a0e) = value_param_pattern [symbolic = %x.param_patt.loc6_29.2 (constants.%x.param_patt.241)] +// CHECK:STDOUT: %x.patt.loc6_29.1: @RequiresA.%pattern_type (%pattern_type.a0e) = at_binding_pattern x, %x.param_patt.loc6_29.1 [symbolic = %x.patt.loc6_29.2 (constants.%x.patt.19b)] +// CHECK:STDOUT: } { +// CHECK:STDOUT: %.loc6_18: type = splice_block %A.ref [concrete = constants.%A.type] { +// CHECK:STDOUT: %.Self: %type = symbolic_binding .Self [symbolic_self = constants.%.Self.c39] +// CHECK:STDOUT: %A.ref: type = name_ref A, file.%A.decl [concrete = constants.%A.type] +// CHECK:STDOUT: } +// CHECK:STDOUT: %T.loc6_15.2: %A.type = symbolic_binding T, 0 [symbolic = %T.loc6_15.1 (constants.%T)] +// CHECK:STDOUT: %x.param: @RequiresA.%T.as_type.loc6_31.1 (%T.as_type) = value_param call_param0 +// CHECK:STDOUT: %.loc6_31.1: type = splice_block %.loc6_31.2 [symbolic = %T.as_type.loc6_31.1 (constants.%T.as_type)] { +// CHECK:STDOUT: %T.ref: %A.type = name_ref T, %T.loc6_15.2 [symbolic = %T.loc6_15.1 (constants.%T)] +// CHECK:STDOUT: %T.as_type.loc6_31.2: type = facet_access_type %T.ref [symbolic = %T.as_type.loc6_31.1 (constants.%T.as_type)] +// CHECK:STDOUT: %.loc6_31.2: type = converted %T.ref, %T.as_type.loc6_31.2 [symbolic = %T.as_type.loc6_31.1 (constants.%T.as_type)] +// CHECK:STDOUT: } +// CHECK:STDOUT: %x: @RequiresA.%T.as_type.loc6_31.1 (%T.as_type) = wrapper_binding x, %x.param +// CHECK:STDOUT: } +// CHECK:STDOUT: %F.decl: %F.type = fn_decl @F [concrete = constants.%F] { +// CHECK:STDOUT: %T.patt.loc7_7.1: %pattern_type.029 = symbolic_binding_pattern T, 0 [symbolic = %T.patt.loc7_7.2 (constants.%T.patt)] +// CHECK:STDOUT: %U.patt.loc7_14.1: %pattern_type.831 = symbolic_binding_pattern U, 1 [symbolic = %U.patt.loc7_14.2 (constants.%U.patt)] +// CHECK:STDOUT: %V.patt.loc7_38.1: %pattern_type.7b5 = symbolic_binding_pattern V, 2 [symbolic = %V.patt.loc7_38.2 (constants.%V.patt)] +// CHECK:STDOUT: %x.param_patt.loc7_45.1: @F.%pattern_type (%pattern_type.d51) = value_param_pattern [symbolic = %x.param_patt.loc7_45.2 (constants.%x.param_patt.fbe)] +// CHECK:STDOUT: %x.patt.loc7_45.1: @F.%pattern_type (%pattern_type.d51) = at_binding_pattern x, %x.param_patt.loc7_45.1 [symbolic = %x.patt.loc7_45.2 (constants.%x.patt.cdb)] +// CHECK:STDOUT: } { +// CHECK:STDOUT: %.loc7_10: type = splice_block %A.ref [concrete = constants.%A.type] { +// CHECK:STDOUT: %.Self.loc7_7: %type = symbolic_binding .Self [symbolic_self = constants.%.Self.c39] +// CHECK:STDOUT: %A.ref: type = name_ref A, file.%A.decl [concrete = constants.%A.type] +// CHECK:STDOUT: } +// CHECK:STDOUT: %T.loc7_7.2: %A.type = symbolic_binding T, 0 [symbolic = %T.loc7_7.1 (constants.%T)] +// CHECK:STDOUT: %.loc7_19.1: type = splice_block %.loc7_19.2 [concrete = constants.%B_where.type] { +// CHECK:STDOUT: %.Self.loc7_14: %type = symbolic_binding .Self [symbolic_self = constants.%.Self.c39] +// CHECK:STDOUT: %B.ref.loc7_17: type = name_ref B, file.%B.decl [concrete = constants.%B.type] +// CHECK:STDOUT: %.Self.loc7_19: %B.type = symbolic_binding .Self [symbolic_self = constants.%.Self.e4d] +// CHECK:STDOUT: %.Self.ref: %B.type = name_ref .Self, %.Self.loc7_19 [symbolic_self = constants.%.Self.e4d] +// CHECK:STDOUT: %T.ref.loc7: %A.type = name_ref T, %T.loc7_7.2 [symbolic = %T.loc7_7.1 (constants.%T)] +// CHECK:STDOUT: %.loc7_19.2: type = where_expr [concrete = constants.%B_where.type] { +// CHECK:STDOUT: requirement_base_facet_type %B.ref.loc7_17 +// CHECK:STDOUT: requirement_equivalent %.Self.ref, %T.ref.loc7 +// CHECK:STDOUT: } +// CHECK:STDOUT: } +// CHECK:STDOUT: %U.loc7_14.2: %B_where.type = symbolic_binding U, 1 [symbolic = %U.loc7_14.1 (constants.%U)] +// CHECK:STDOUT: %.loc7_41: type = splice_block %B.ref.loc7_41 [concrete = constants.%B.type] { +// CHECK:STDOUT: %.Self.loc7_38: %type = symbolic_binding .Self [symbolic_self = constants.%.Self.c39] +// CHECK:STDOUT: %B.ref.loc7_41: type = name_ref B, file.%B.decl [concrete = constants.%B.type] +// CHECK:STDOUT: } +// CHECK:STDOUT: %V.loc7_38.2: %B.type = symbolic_binding V, 2 [symbolic = %V.loc7_38.1 (constants.%V)] +// CHECK:STDOUT: %x.param: @F.%U.as_type.loc7_47.1 (%U.as_type) = value_param call_param0 +// CHECK:STDOUT: %.loc7_47.1: type = splice_block %.loc7_47.2 [symbolic = %U.as_type.loc7_47.1 (constants.%U.as_type)] { +// CHECK:STDOUT: %U.ref: %B_where.type = name_ref U, %U.loc7_14.2 [symbolic = %U.loc7_14.1 (constants.%U)] +// CHECK:STDOUT: %U.as_type.loc7_47.2: type = facet_access_type %U.ref [symbolic = %U.as_type.loc7_47.1 (constants.%U.as_type)] +// CHECK:STDOUT: %.loc7_47.2: type = converted %U.ref, %U.as_type.loc7_47.2 [symbolic = %U.as_type.loc7_47.1 (constants.%U.as_type)] +// CHECK:STDOUT: } +// CHECK:STDOUT: %x: @F.%U.as_type.loc7_47.1 (%U.as_type) = wrapper_binding x, %x.param +// CHECK:STDOUT: } +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: interface @A { +// CHECK:STDOUT: %Self: %A.type = symbolic_binding Self, 0 [symbolic = constants.%Self.d0c] +// CHECK:STDOUT: %A.WithSelf.decl = interface_with_self_decl @A [concrete] +// CHECK:STDOUT: +// CHECK:STDOUT: !members: +// CHECK:STDOUT: .Self = %Self +// CHECK:STDOUT: witness = () +// CHECK:STDOUT: +// CHECK:STDOUT: !requires: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: interface @B { +// CHECK:STDOUT: %Self: %B.type = symbolic_binding Self, 0 [symbolic = constants.%Self.b45] +// CHECK:STDOUT: %B.WithSelf.decl = interface_with_self_decl @B [concrete] +// CHECK:STDOUT: +// CHECK:STDOUT: !members: +// CHECK:STDOUT: .Self = %Self +// CHECK:STDOUT: witness = () +// CHECK:STDOUT: +// CHECK:STDOUT: !requires: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: generic fn @RequiresA(%T.loc6_15.2: %A.type) { +// CHECK:STDOUT: %T.patt.loc6_15.2: %pattern_type.029 = symbolic_binding_pattern T, 0 [symbolic = %T.patt.loc6_15.2 (constants.%T.patt)] +// CHECK:STDOUT: %T.loc6_15.1: %A.type = symbolic_binding T, 0 [symbolic = %T.loc6_15.1 (constants.%T)] +// CHECK:STDOUT: %T.as_type.loc6_31.1: type = facet_access_type %T.loc6_15.1 [symbolic = %T.as_type.loc6_31.1 (constants.%T.as_type)] +// CHECK:STDOUT: %pattern_type: type = pattern_type %T.as_type.loc6_31.1 [symbolic = %pattern_type (constants.%pattern_type.a0e)] +// CHECK:STDOUT: %x.param_patt.loc6_29.2: @RequiresA.%pattern_type (%pattern_type.a0e) = value_param_pattern [symbolic = %x.param_patt.loc6_29.2 (constants.%x.param_patt.241)] +// CHECK:STDOUT: %x.patt.loc6_29.2: @RequiresA.%pattern_type (%pattern_type.a0e) = at_binding_pattern x, %x.param_patt.loc6_29.2 [symbolic = %x.patt.loc6_29.2 (constants.%x.patt.19b)] +// CHECK:STDOUT: +// CHECK:STDOUT: !definition: +// CHECK:STDOUT: %require_complete: = require_complete_type %T.as_type.loc6_31.1 [symbolic = %require_complete (constants.%require_complete.94f)] +// CHECK:STDOUT: +// CHECK:STDOUT: fn(%x.param: @RequiresA.%T.as_type.loc6_31.1 (%T.as_type)) { +// CHECK:STDOUT: !entry: +// CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: +// CHECK:STDOUT: } +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: generic fn @F(%T.loc7_7.2: %A.type, %U.loc7_14.2: %B_where.type, %V.loc7_38.2: %B.type) { +// CHECK:STDOUT: %T.patt.loc7_7.2: %pattern_type.029 = symbolic_binding_pattern T, 0 [symbolic = %T.patt.loc7_7.2 (constants.%T.patt)] +// CHECK:STDOUT: %T.loc7_7.1: %A.type = symbolic_binding T, 0 [symbolic = %T.loc7_7.1 (constants.%T)] +// CHECK:STDOUT: %U.patt.loc7_14.2: %pattern_type.831 = symbolic_binding_pattern U, 1 [symbolic = %U.patt.loc7_14.2 (constants.%U.patt)] +// CHECK:STDOUT: %U.loc7_14.1: %B_where.type = symbolic_binding U, 1 [symbolic = %U.loc7_14.1 (constants.%U)] +// CHECK:STDOUT: %V.patt.loc7_38.2: %pattern_type.7b5 = symbolic_binding_pattern V, 2 [symbolic = %V.patt.loc7_38.2 (constants.%V.patt)] +// CHECK:STDOUT: %V.loc7_38.1: %B.type = symbolic_binding V, 2 [symbolic = %V.loc7_38.1 (constants.%V)] +// CHECK:STDOUT: %U.as_type.loc7_47.1: type = facet_access_type %U.loc7_14.1 [symbolic = %U.as_type.loc7_47.1 (constants.%U.as_type)] +// CHECK:STDOUT: %pattern_type: type = pattern_type %U.as_type.loc7_47.1 [symbolic = %pattern_type (constants.%pattern_type.d51)] +// CHECK:STDOUT: %x.param_patt.loc7_45.2: @F.%pattern_type (%pattern_type.d51) = value_param_pattern [symbolic = %x.param_patt.loc7_45.2 (constants.%x.param_patt.fbe)] +// CHECK:STDOUT: %x.patt.loc7_45.2: @F.%pattern_type (%pattern_type.d51) = at_binding_pattern x, %x.param_patt.loc7_45.2 [symbolic = %x.patt.loc7_45.2 (constants.%x.patt.cdb)] +// CHECK:STDOUT: +// CHECK:STDOUT: !definition: +// CHECK:STDOUT: %require_complete: = require_complete_type %U.as_type.loc7_47.1 [symbolic = %require_complete (constants.%require_complete.963)] +// CHECK:STDOUT: %V.as_type.loc8_16.2: type = facet_access_type %V.loc7_38.1 [symbolic = %V.as_type.loc8_16.2 (constants.%V.as_type)] +// CHECK:STDOUT: %T.as_type.loc8_11.2: type = facet_access_type %T.loc7_7.1 [symbolic = %T.as_type.loc8_11.2 (constants.%T.as_type)] +// CHECK:STDOUT: %eq = observe_equivalent %T.loc7_7.1, %V.loc7_38.1 [symbolic = %eq (constants.%eq)] +// CHECK:STDOUT: +// CHECK:STDOUT: fn(%x.param: @F.%U.as_type.loc7_47.1 (%U.as_type)) { +// CHECK:STDOUT: !entry: +// CHECK:STDOUT: %T.ref.loc8: %A.type = name_ref T, %T.loc7_7.2 [symbolic = %T.loc7_7.1 (constants.%T)] +// CHECK:STDOUT: %V.ref: %B.type = name_ref V, %V.loc7_38.2 [symbolic = %V.loc7_38.1 (constants.%V)] +// CHECK:STDOUT: %V.as_type.loc8_16.1: type = facet_access_type %V.ref [symbolic = %V.as_type.loc8_16.2 (constants.%V.as_type)] +// CHECK:STDOUT: %.loc8_16: type = converted %V.ref, %V.as_type.loc8_16.1 [symbolic = %V.as_type.loc8_16.2 (constants.%V.as_type)] +// CHECK:STDOUT: %T.as_type.loc8_11.1: type = facet_access_type %T.ref.loc8 [symbolic = %T.as_type.loc8_11.2 (constants.%T.as_type)] +// CHECK:STDOUT: %.loc8_11: type = converted %T.ref.loc8, %T.as_type.loc8_11.1 [symbolic = %T.as_type.loc8_11.2 (constants.%T.as_type)] +// CHECK:STDOUT: %F.observe.decl = observe_decl @F.observe [concrete] +// CHECK:STDOUT: %RequiresA.ref: %RequiresA.type = name_ref RequiresA, file.%RequiresA.decl [concrete = constants.%RequiresA] +// CHECK:STDOUT: %x.ref: @F.%U.as_type.loc7_47.1 (%U.as_type) = name_ref x, %x +// CHECK:STDOUT: %B.type: type = facet_type <@B> [concrete = constants.%B.type] +// CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: +// CHECK:STDOUT: @F.observe { +// CHECK:STDOUT: observe constants.%T == constants.%V +// CHECK:STDOUT: } +// CHECK:STDOUT: } +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: specific @A.WithSelf(constants.%Self.d0c) { +// CHECK:STDOUT: !definition: +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: specific @B.WithSelf(constants.%Self.b45) { +// CHECK:STDOUT: !definition: +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: specific @RequiresA(constants.%T) { +// CHECK:STDOUT: %T.patt.loc6_15.2 => constants.%T.patt +// CHECK:STDOUT: %T.loc6_15.1 => constants.%T +// CHECK:STDOUT: %T.as_type.loc6_31.1 => constants.%T.as_type +// CHECK:STDOUT: %pattern_type => constants.%pattern_type.a0e +// CHECK:STDOUT: %x.param_patt.loc6_29.2 => constants.%x.param_patt.241 +// CHECK:STDOUT: %x.patt.loc6_29.2 => constants.%x.patt.19b +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: specific @F(constants.%T, constants.%U, constants.%V) { +// CHECK:STDOUT: %T.patt.loc7_7.2 => constants.%T.patt +// CHECK:STDOUT: %T.loc7_7.1 => constants.%T +// CHECK:STDOUT: %U.patt.loc7_14.2 => constants.%U.patt +// CHECK:STDOUT: %U.loc7_14.1 => constants.%U +// CHECK:STDOUT: %V.patt.loc7_38.2 => constants.%V.patt +// CHECK:STDOUT: %V.loc7_38.1 => constants.%V +// CHECK:STDOUT: %U.as_type.loc7_47.1 => constants.%U.as_type +// CHECK:STDOUT: %pattern_type => constants.%pattern_type.d51 +// CHECK:STDOUT: %x.param_patt.loc7_45.2 => constants.%x.param_patt.fbe +// CHECK:STDOUT: %x.patt.loc7_45.2 => constants.%x.patt.cdb +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: --- fail_invalid_equivalent.carbon +// CHECK:STDOUT: +// CHECK:STDOUT: constants { +// CHECK:STDOUT: %A.type: type = facet_type <@A> [concrete] +// CHECK:STDOUT: %Self.d0c: %A.type = symbolic_binding Self, 0 [symbolic] +// CHECK:STDOUT: %B.type: type = facet_type <@B> [concrete] +// CHECK:STDOUT: %Self.b45: %B.type = symbolic_binding Self, 0 [symbolic] +// CHECK:STDOUT: %type: type = facet_type [concrete] +// CHECK:STDOUT: %.Self: %type = symbolic_binding .Self [symbolic_self] +// CHECK:STDOUT: %pattern_type.029: type = pattern_type %A.type [concrete] +// CHECK:STDOUT: %T.patt: %pattern_type.029 = symbolic_binding_pattern T, 0 [symbolic] +// CHECK:STDOUT: %T: %A.type = symbolic_binding T, 0 [symbolic] +// CHECK:STDOUT: %T.as_type: type = facet_access_type %T [symbolic] +// CHECK:STDOUT: %pattern_type.a0e: type = pattern_type %T.as_type [symbolic] +// CHECK:STDOUT: %x.param_patt.241: %pattern_type.a0e = value_param_pattern [symbolic] +// CHECK:STDOUT: %x.patt.19b: %pattern_type.a0e = at_binding_pattern x, %x.param_patt.241 [symbolic] +// CHECK:STDOUT: %TakesA.type: type = fn_type @TakesA [concrete] +// CHECK:STDOUT: %TakesA: %TakesA.type = struct_value () [concrete] +// CHECK:STDOUT: %require_complete.94f: = require_complete_type %T.as_type [symbolic] +// CHECK:STDOUT: %pattern_type.7b5: type = pattern_type %B.type [concrete] +// CHECK:STDOUT: %U.patt: %pattern_type.7b5 = symbolic_binding_pattern U, 1 [symbolic] +// CHECK:STDOUT: %U: %B.type = symbolic_binding U, 1 [symbolic] +// CHECK:STDOUT: %U.as_type: type = facet_access_type %U [symbolic] +// CHECK:STDOUT: %pattern_type.d7b: type = pattern_type %U.as_type [symbolic] +// CHECK:STDOUT: %x.param_patt.19f: %pattern_type.d7b = value_param_pattern [symbolic] +// CHECK:STDOUT: %x.patt.033: %pattern_type.d7b = at_binding_pattern x, %x.param_patt.19f [symbolic] +// CHECK:STDOUT: %F.type: type = fn_type @F [concrete] +// CHECK:STDOUT: %F: %F.type = struct_value () [concrete] +// CHECK:STDOUT: %require_complete.806: = require_complete_type %U.as_type [symbolic] +// CHECK:STDOUT: %eq = observe_equivalent %T, %U [symbolic] +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: imports { +// CHECK:STDOUT: %Core: = namespace file.%Core.import, [concrete] { +// CHECK:STDOUT: import Core//prelude +// CHECK:STDOUT: import Core//prelude/... +// CHECK:STDOUT: } +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: file { +// CHECK:STDOUT: package: = namespace [concrete] { +// CHECK:STDOUT: .Core = imports.%Core +// CHECK:STDOUT: .A = %A.decl +// CHECK:STDOUT: .B = %B.decl +// CHECK:STDOUT: .TakesA = %TakesA.decl +// CHECK:STDOUT: .F = %F.decl +// CHECK:STDOUT: } +// CHECK:STDOUT: %Core.import = import Core +// CHECK:STDOUT: %A.decl: type = interface_decl @A [concrete = constants.%A.type] {} {} +// CHECK:STDOUT: %B.decl: type = interface_decl @B [concrete = constants.%B.type] {} {} +// CHECK:STDOUT: %TakesA.decl: %TakesA.type = fn_decl @TakesA [concrete = constants.%TakesA] { +// CHECK:STDOUT: %T.patt.loc6_12.1: %pattern_type.029 = symbolic_binding_pattern T, 0 [symbolic = %T.patt.loc6_12.2 (constants.%T.patt)] +// CHECK:STDOUT: %x.param_patt.loc6_26.1: @TakesA.%pattern_type (%pattern_type.a0e) = value_param_pattern [symbolic = %x.param_patt.loc6_26.2 (constants.%x.param_patt.241)] +// CHECK:STDOUT: %x.patt.loc6_26.1: @TakesA.%pattern_type (%pattern_type.a0e) = at_binding_pattern x, %x.param_patt.loc6_26.1 [symbolic = %x.patt.loc6_26.2 (constants.%x.patt.19b)] +// CHECK:STDOUT: } { +// CHECK:STDOUT: %.loc6_15: type = splice_block %A.ref [concrete = constants.%A.type] { +// CHECK:STDOUT: %.Self: %type = symbolic_binding .Self [symbolic_self = constants.%.Self] +// CHECK:STDOUT: %A.ref: type = name_ref A, file.%A.decl [concrete = constants.%A.type] +// CHECK:STDOUT: } +// CHECK:STDOUT: %T.loc6_12.2: %A.type = symbolic_binding T, 0 [symbolic = %T.loc6_12.1 (constants.%T)] +// CHECK:STDOUT: %x.param: @TakesA.%T.as_type.loc6_28.1 (%T.as_type) = value_param call_param0 +// CHECK:STDOUT: %.loc6_28.1: type = splice_block %.loc6_28.2 [symbolic = %T.as_type.loc6_28.1 (constants.%T.as_type)] { +// CHECK:STDOUT: %T.ref: %A.type = name_ref T, %T.loc6_12.2 [symbolic = %T.loc6_12.1 (constants.%T)] +// CHECK:STDOUT: %T.as_type.loc6_28.2: type = facet_access_type %T.ref [symbolic = %T.as_type.loc6_28.1 (constants.%T.as_type)] +// CHECK:STDOUT: %.loc6_28.2: type = converted %T.ref, %T.as_type.loc6_28.2 [symbolic = %T.as_type.loc6_28.1 (constants.%T.as_type)] +// CHECK:STDOUT: } +// CHECK:STDOUT: %x: @TakesA.%T.as_type.loc6_28.1 (%T.as_type) = wrapper_binding x, %x.param +// CHECK:STDOUT: } +// CHECK:STDOUT: %F.decl: %F.type = fn_decl @F [concrete = constants.%F] { +// CHECK:STDOUT: %T.patt.loc7_7.1: %pattern_type.029 = symbolic_binding_pattern T, 0 [symbolic = %T.patt.loc7_7.2 (constants.%T.patt)] +// CHECK:STDOUT: %U.patt.loc7_14.1: %pattern_type.7b5 = symbolic_binding_pattern U, 1 [symbolic = %U.patt.loc7_14.2 (constants.%U.patt)] +// CHECK:STDOUT: %x.param_patt.loc7_21.1: @F.%pattern_type (%pattern_type.d7b) = value_param_pattern [symbolic = %x.param_patt.loc7_21.2 (constants.%x.param_patt.19f)] +// CHECK:STDOUT: %x.patt.loc7_21.1: @F.%pattern_type (%pattern_type.d7b) = at_binding_pattern x, %x.param_patt.loc7_21.1 [symbolic = %x.patt.loc7_21.2 (constants.%x.patt.033)] +// CHECK:STDOUT: } { +// CHECK:STDOUT: %.loc7_10: type = splice_block %A.ref [concrete = constants.%A.type] { +// CHECK:STDOUT: %.Self.loc7_7: %type = symbolic_binding .Self [symbolic_self = constants.%.Self] +// CHECK:STDOUT: %A.ref: type = name_ref A, file.%A.decl [concrete = constants.%A.type] +// CHECK:STDOUT: } +// CHECK:STDOUT: %T.loc7_7.2: %A.type = symbolic_binding T, 0 [symbolic = %T.loc7_7.1 (constants.%T)] +// CHECK:STDOUT: %.loc7_17: type = splice_block %B.ref [concrete = constants.%B.type] { +// CHECK:STDOUT: %.Self.loc7_14: %type = symbolic_binding .Self [symbolic_self = constants.%.Self] +// CHECK:STDOUT: %B.ref: type = name_ref B, file.%B.decl [concrete = constants.%B.type] +// CHECK:STDOUT: } +// CHECK:STDOUT: %U.loc7_14.2: %B.type = symbolic_binding U, 1 [symbolic = %U.loc7_14.1 (constants.%U)] +// CHECK:STDOUT: %x.param: @F.%U.as_type.loc7_23.1 (%U.as_type) = value_param call_param0 +// CHECK:STDOUT: %.loc7_23.1: type = splice_block %.loc7_23.2 [symbolic = %U.as_type.loc7_23.1 (constants.%U.as_type)] { +// CHECK:STDOUT: %U.ref.loc7: %B.type = name_ref U, %U.loc7_14.2 [symbolic = %U.loc7_14.1 (constants.%U)] +// CHECK:STDOUT: %U.as_type.loc7_23.2: type = facet_access_type %U.ref.loc7 [symbolic = %U.as_type.loc7_23.1 (constants.%U.as_type)] +// CHECK:STDOUT: %.loc7_23.2: type = converted %U.ref.loc7, %U.as_type.loc7_23.2 [symbolic = %U.as_type.loc7_23.1 (constants.%U.as_type)] +// CHECK:STDOUT: } +// CHECK:STDOUT: %x: @F.%U.as_type.loc7_23.1 (%U.as_type) = wrapper_binding x, %x.param +// CHECK:STDOUT: } +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: interface @A { +// CHECK:STDOUT: %Self: %A.type = symbolic_binding Self, 0 [symbolic = constants.%Self.d0c] +// CHECK:STDOUT: %A.WithSelf.decl = interface_with_self_decl @A [concrete] +// CHECK:STDOUT: +// CHECK:STDOUT: !members: +// CHECK:STDOUT: .Self = %Self +// CHECK:STDOUT: witness = () +// CHECK:STDOUT: +// CHECK:STDOUT: !requires: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: interface @B { +// CHECK:STDOUT: %Self: %B.type = symbolic_binding Self, 0 [symbolic = constants.%Self.b45] +// CHECK:STDOUT: %B.WithSelf.decl = interface_with_self_decl @B [concrete] +// CHECK:STDOUT: +// CHECK:STDOUT: !members: +// CHECK:STDOUT: .Self = %Self +// CHECK:STDOUT: witness = () +// CHECK:STDOUT: +// CHECK:STDOUT: !requires: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: generic fn @TakesA(%T.loc6_12.2: %A.type) { +// CHECK:STDOUT: %T.patt.loc6_12.2: %pattern_type.029 = symbolic_binding_pattern T, 0 [symbolic = %T.patt.loc6_12.2 (constants.%T.patt)] +// CHECK:STDOUT: %T.loc6_12.1: %A.type = symbolic_binding T, 0 [symbolic = %T.loc6_12.1 (constants.%T)] +// CHECK:STDOUT: %T.as_type.loc6_28.1: type = facet_access_type %T.loc6_12.1 [symbolic = %T.as_type.loc6_28.1 (constants.%T.as_type)] +// CHECK:STDOUT: %pattern_type: type = pattern_type %T.as_type.loc6_28.1 [symbolic = %pattern_type (constants.%pattern_type.a0e)] +// CHECK:STDOUT: %x.param_patt.loc6_26.2: @TakesA.%pattern_type (%pattern_type.a0e) = value_param_pattern [symbolic = %x.param_patt.loc6_26.2 (constants.%x.param_patt.241)] +// CHECK:STDOUT: %x.patt.loc6_26.2: @TakesA.%pattern_type (%pattern_type.a0e) = at_binding_pattern x, %x.param_patt.loc6_26.2 [symbolic = %x.patt.loc6_26.2 (constants.%x.patt.19b)] +// CHECK:STDOUT: +// CHECK:STDOUT: !definition: +// CHECK:STDOUT: %require_complete: = require_complete_type %T.as_type.loc6_28.1 [symbolic = %require_complete (constants.%require_complete.94f)] +// CHECK:STDOUT: +// CHECK:STDOUT: fn(%x.param: @TakesA.%T.as_type.loc6_28.1 (%T.as_type)) { +// CHECK:STDOUT: !entry: +// CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: +// CHECK:STDOUT: } +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: generic fn @F(%T.loc7_7.2: %A.type, %U.loc7_14.2: %B.type) { +// CHECK:STDOUT: %T.patt.loc7_7.2: %pattern_type.029 = symbolic_binding_pattern T, 0 [symbolic = %T.patt.loc7_7.2 (constants.%T.patt)] +// CHECK:STDOUT: %T.loc7_7.1: %A.type = symbolic_binding T, 0 [symbolic = %T.loc7_7.1 (constants.%T)] +// CHECK:STDOUT: %U.patt.loc7_14.2: %pattern_type.7b5 = symbolic_binding_pattern U, 1 [symbolic = %U.patt.loc7_14.2 (constants.%U.patt)] +// CHECK:STDOUT: %U.loc7_14.1: %B.type = symbolic_binding U, 1 [symbolic = %U.loc7_14.1 (constants.%U)] +// CHECK:STDOUT: %U.as_type.loc7_23.1: type = facet_access_type %U.loc7_14.1 [symbolic = %U.as_type.loc7_23.1 (constants.%U.as_type)] +// CHECK:STDOUT: %pattern_type: type = pattern_type %U.as_type.loc7_23.1 [symbolic = %pattern_type (constants.%pattern_type.d7b)] +// CHECK:STDOUT: %x.param_patt.loc7_21.2: @F.%pattern_type (%pattern_type.d7b) = value_param_pattern [symbolic = %x.param_patt.loc7_21.2 (constants.%x.param_patt.19f)] +// CHECK:STDOUT: %x.patt.loc7_21.2: @F.%pattern_type (%pattern_type.d7b) = at_binding_pattern x, %x.param_patt.loc7_21.2 [symbolic = %x.patt.loc7_21.2 (constants.%x.patt.033)] +// CHECK:STDOUT: +// CHECK:STDOUT: !definition: +// CHECK:STDOUT: %require_complete: = require_complete_type %U.as_type.loc7_23.1 [symbolic = %require_complete (constants.%require_complete.806)] +// CHECK:STDOUT: %T.as_type.loc8_11.2: type = facet_access_type %T.loc7_7.1 [symbolic = %T.as_type.loc8_11.2 (constants.%T.as_type)] +// CHECK:STDOUT: %eq = observe_equivalent %T.loc7_7.1, %U.loc7_14.1 [symbolic = %eq (constants.%eq)] +// CHECK:STDOUT: +// CHECK:STDOUT: fn(%x.param: @F.%U.as_type.loc7_23.1 (%U.as_type)) { +// CHECK:STDOUT: !entry: +// CHECK:STDOUT: %T.ref: %A.type = name_ref T, %T.loc7_7.2 [symbolic = %T.loc7_7.1 (constants.%T)] +// CHECK:STDOUT: %U.ref.loc8: %B.type = name_ref U, %U.loc7_14.2 [symbolic = %U.loc7_14.1 (constants.%U)] +// CHECK:STDOUT: %U.as_type.loc8: type = facet_access_type %U.ref.loc8 [symbolic = %U.as_type.loc7_23.1 (constants.%U.as_type)] +// CHECK:STDOUT: %.loc8_16: type = converted %U.ref.loc8, %U.as_type.loc8 [symbolic = %U.as_type.loc7_23.1 (constants.%U.as_type)] +// CHECK:STDOUT: %T.as_type.loc8_11.1: type = facet_access_type %T.ref [symbolic = %T.as_type.loc8_11.2 (constants.%T.as_type)] +// CHECK:STDOUT: %.loc8_11: type = converted %T.ref, %T.as_type.loc8_11.1 [symbolic = %T.as_type.loc8_11.2 (constants.%T.as_type)] +// CHECK:STDOUT: %F.observe.decl = observe_decl @F.observe [concrete] +// CHECK:STDOUT: %TakesA.ref: %TakesA.type = name_ref TakesA, file.%TakesA.decl [concrete = constants.%TakesA] +// CHECK:STDOUT: %x.ref: @F.%U.as_type.loc7_23.1 (%U.as_type) = name_ref x, %x +// CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: +// CHECK:STDOUT: @F.observe { +// CHECK:STDOUT: observe constants.%T == constants.%U +// CHECK:STDOUT: } +// CHECK:STDOUT: } +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: specific @A.WithSelf(constants.%Self.d0c) { +// CHECK:STDOUT: !definition: +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: specific @B.WithSelf(constants.%Self.b45) { +// CHECK:STDOUT: !definition: +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: specific @TakesA(constants.%T) { +// CHECK:STDOUT: %T.patt.loc6_12.2 => constants.%T.patt +// CHECK:STDOUT: %T.loc6_12.1 => constants.%T +// CHECK:STDOUT: %T.as_type.loc6_28.1 => constants.%T.as_type +// CHECK:STDOUT: %pattern_type => constants.%pattern_type.a0e +// CHECK:STDOUT: %x.param_patt.loc6_26.2 => constants.%x.param_patt.241 +// CHECK:STDOUT: %x.patt.loc6_26.2 => constants.%x.patt.19b +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: specific @F(constants.%T, constants.%U) { +// CHECK:STDOUT: %T.patt.loc7_7.2 => constants.%T.patt +// CHECK:STDOUT: %T.loc7_7.1 => constants.%T +// CHECK:STDOUT: %U.patt.loc7_14.2 => constants.%U.patt +// CHECK:STDOUT: %U.loc7_14.1 => constants.%U +// CHECK:STDOUT: %U.as_type.loc7_23.1 => constants.%U.as_type +// CHECK:STDOUT: %pattern_type => constants.%pattern_type.d7b +// CHECK:STDOUT: %x.param_patt.loc7_21.2 => constants.%x.param_patt.19f +// CHECK:STDOUT: %x.patt.loc7_21.2 => constants.%x.patt.033 +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: --- fail_wrong_scope_class.carbon +// CHECK:STDOUT: +// CHECK:STDOUT: constants { +// CHECK:STDOUT: %type: type = facet_type [concrete] +// CHECK:STDOUT: %.Self: %type = symbolic_binding .Self [symbolic_self] +// CHECK:STDOUT: %pattern_type: type = pattern_type type [concrete] +// CHECK:STDOUT: %T.patt: %pattern_type = symbolic_binding_pattern T, 0 [symbolic] +// CHECK:STDOUT: %T: type = symbolic_binding T, 0 [symbolic] +// CHECK:STDOUT: %U.patt: %pattern_type = symbolic_binding_pattern U, 1 [symbolic] +// CHECK:STDOUT: %U: type = symbolic_binding U, 1 [symbolic] +// CHECK:STDOUT: %C.type: type = generic_class_type @C [concrete] +// CHECK:STDOUT: %C.generic: %C.type = struct_value () [concrete] +// CHECK:STDOUT: %C: type = class_type @C, @C(%T, %U) [symbolic] +// CHECK:STDOUT: %empty_struct_type: type = struct_type {} [concrete] +// CHECK:STDOUT: %complete_type: = complete_type_witness %empty_struct_type [concrete] +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: imports { +// CHECK:STDOUT: %Core: = namespace file.%Core.import, [concrete] { +// CHECK:STDOUT: import Core//prelude +// CHECK:STDOUT: import Core//prelude/... +// CHECK:STDOUT: } +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: file { +// CHECK:STDOUT: package: = namespace [concrete] { +// CHECK:STDOUT: .Core = imports.%Core +// CHECK:STDOUT: .C = %C.decl +// CHECK:STDOUT: } +// CHECK:STDOUT: %Core.import = import Core +// CHECK:STDOUT: %C.decl: %C.type = class_decl @C [concrete = constants.%C.generic] { +// CHECK:STDOUT: %T.patt.loc3_10.1: %pattern_type = symbolic_binding_pattern T, 0 [symbolic = %T.patt.loc3_10.2 (constants.%T.patt)] +// CHECK:STDOUT: %U.patt.loc3_20.1: %pattern_type = symbolic_binding_pattern U, 1 [symbolic = %U.patt.loc3_20.2 (constants.%U.patt)] +// CHECK:STDOUT: } { +// CHECK:STDOUT: %.loc3_13.1: type = splice_block %.loc3_13.2 [concrete = type] { +// CHECK:STDOUT: %.Self.loc3_10: %type = symbolic_binding .Self [symbolic_self = constants.%.Self] +// CHECK:STDOUT: %.loc3_13.2: type = type_literal type [concrete = type] +// CHECK:STDOUT: } +// CHECK:STDOUT: %T.loc3_10.2: type = symbolic_binding T, 0 [symbolic = %T.loc3_10.1 (constants.%T)] +// CHECK:STDOUT: %.loc3_23.1: type = splice_block %.loc3_23.2 [concrete = type] { +// CHECK:STDOUT: %.Self.loc3_20: %type = symbolic_binding .Self [symbolic_self = constants.%.Self] +// CHECK:STDOUT: %.loc3_23.2: type = type_literal type [concrete = type] +// CHECK:STDOUT: } +// CHECK:STDOUT: %U.loc3_20.2: type = symbolic_binding U, 1 [symbolic = %U.loc3_20.1 (constants.%U)] +// CHECK:STDOUT: } +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: generic class @C(%T.loc3_10.2: type, %U.loc3_20.2: type) { +// CHECK:STDOUT: %T.patt.loc3_10.2: %pattern_type = symbolic_binding_pattern T, 0 [symbolic = %T.patt.loc3_10.2 (constants.%T.patt)] +// CHECK:STDOUT: %T.loc3_10.1: type = symbolic_binding T, 0 [symbolic = %T.loc3_10.1 (constants.%T)] +// CHECK:STDOUT: %U.patt.loc3_20.2: %pattern_type = symbolic_binding_pattern U, 1 [symbolic = %U.patt.loc3_20.2 (constants.%U.patt)] +// CHECK:STDOUT: %U.loc3_20.1: type = symbolic_binding U, 1 [symbolic = %U.loc3_20.1 (constants.%U)] +// CHECK:STDOUT: +// CHECK:STDOUT: !definition: +// CHECK:STDOUT: +// CHECK:STDOUT: class { +// CHECK:STDOUT: %T.ref: type = name_ref T, %T.loc3_10.2 [symbolic = %T.loc3_10.1 (constants.%T)] +// CHECK:STDOUT: %U.ref: type = name_ref U, %U.loc3_20.2 [symbolic = %U.loc3_20.1 (constants.%U)] +// CHECK:STDOUT: %complete_type: = complete_type_witness constants.%empty_struct_type [concrete = constants.%complete_type] +// CHECK:STDOUT: complete_type_witness = %complete_type +// CHECK:STDOUT: +// CHECK:STDOUT: !members: +// CHECK:STDOUT: .Self = constants.%C +// CHECK:STDOUT: .T = +// CHECK:STDOUT: .U = +// CHECK:STDOUT: } +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: specific @C(constants.%T, constants.%U) { +// CHECK:STDOUT: %T.patt.loc3_10.2 => constants.%T.patt +// CHECK:STDOUT: %T.loc3_10.1 => constants.%T +// CHECK:STDOUT: %U.patt.loc3_20.2 => constants.%U.patt +// CHECK:STDOUT: %U.loc3_20.1 => constants.%U +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: --- fail_wrong_scope_named_constraint.carbon +// CHECK:STDOUT: +// CHECK:STDOUT: constants { +// CHECK:STDOUT: %type: type = facet_type [concrete] +// CHECK:STDOUT: %.Self: %type = symbolic_binding .Self [symbolic_self] +// CHECK:STDOUT: %pattern_type: type = pattern_type type [concrete] +// CHECK:STDOUT: %T.patt: %pattern_type = symbolic_binding_pattern T, 0 [symbolic] +// CHECK:STDOUT: %T: type = symbolic_binding T, 0 [symbolic] +// CHECK:STDOUT: %U.patt: %pattern_type = symbolic_binding_pattern U, 1 [symbolic] +// CHECK:STDOUT: %U: type = symbolic_binding U, 1 [symbolic] +// CHECK:STDOUT: %C.type.eac: type = generic_named_constaint_type @C [concrete] +// CHECK:STDOUT: %empty_struct: %C.type.eac = struct_value () [concrete] +// CHECK:STDOUT: %C.type.d68: type = facet_type <@C, @C(%T, %U)> [symbolic] +// CHECK:STDOUT: %Self: %C.type.d68 = symbolic_binding Self, 2 [symbolic] +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: imports { +// CHECK:STDOUT: %Core: = namespace file.%Core.import, [concrete] { +// CHECK:STDOUT: import Core//prelude +// CHECK:STDOUT: import Core//prelude/... +// CHECK:STDOUT: } +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: file { +// CHECK:STDOUT: package: = namespace [concrete] { +// CHECK:STDOUT: .Core = imports.%Core +// CHECK:STDOUT: .C = %C.decl +// CHECK:STDOUT: } +// CHECK:STDOUT: %Core.import = import Core +// CHECK:STDOUT: %C.decl: %C.type.eac = constraint_decl @C [concrete = constants.%empty_struct] { +// CHECK:STDOUT: %T.patt.loc3_15.1: %pattern_type = symbolic_binding_pattern T, 0 [symbolic = %T.patt.loc3_15.2 (constants.%T.patt)] +// CHECK:STDOUT: %U.patt.loc3_25.1: %pattern_type = symbolic_binding_pattern U, 1 [symbolic = %U.patt.loc3_25.2 (constants.%U.patt)] +// CHECK:STDOUT: } { +// CHECK:STDOUT: %.loc3_18.1: type = splice_block %.loc3_18.2 [concrete = type] { +// CHECK:STDOUT: %.Self.loc3_15: %type = symbolic_binding .Self [symbolic_self = constants.%.Self] +// CHECK:STDOUT: %.loc3_18.2: type = type_literal type [concrete = type] +// CHECK:STDOUT: } +// CHECK:STDOUT: %T.loc3_15.2: type = symbolic_binding T, 0 [symbolic = %T.loc3_15.1 (constants.%T)] +// CHECK:STDOUT: %.loc3_28.1: type = splice_block %.loc3_28.2 [concrete = type] { +// CHECK:STDOUT: %.Self.loc3_25: %type = symbolic_binding .Self [symbolic_self = constants.%.Self] +// CHECK:STDOUT: %.loc3_28.2: type = type_literal type [concrete = type] +// CHECK:STDOUT: } +// CHECK:STDOUT: %U.loc3_25.2: type = symbolic_binding U, 1 [symbolic = %U.loc3_25.1 (constants.%U)] +// CHECK:STDOUT: } +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: generic constraint @C(%T.loc3_15.2: type, %U.loc3_25.2: type) { +// CHECK:STDOUT: %T.patt.loc3_15.2: %pattern_type = symbolic_binding_pattern T, 0 [symbolic = %T.patt.loc3_15.2 (constants.%T.patt)] +// CHECK:STDOUT: %T.loc3_15.1: type = symbolic_binding T, 0 [symbolic = %T.loc3_15.1 (constants.%T)] +// CHECK:STDOUT: %U.patt.loc3_25.2: %pattern_type = symbolic_binding_pattern U, 1 [symbolic = %U.patt.loc3_25.2 (constants.%U.patt)] +// CHECK:STDOUT: %U.loc3_25.1: type = symbolic_binding U, 1 [symbolic = %U.loc3_25.1 (constants.%U)] +// CHECK:STDOUT: +// CHECK:STDOUT: !definition: +// CHECK:STDOUT: %C.type: type = facet_type <@C, @C(%T.loc3_15.1, %U.loc3_25.1)> [symbolic = %C.type (constants.%C.type.d68)] +// CHECK:STDOUT: %Self.loc3_34.2: @C.%C.type (%C.type.d68) = symbolic_binding Self, 2 [symbolic = %Self.loc3_34.2 (constants.%Self)] +// CHECK:STDOUT: +// CHECK:STDOUT: constraint { +// CHECK:STDOUT: %Self.loc3_34.1: @C.%C.type (%C.type.d68) = symbolic_binding Self, 2 [symbolic = %Self.loc3_34.2 (constants.%Self)] +// CHECK:STDOUT: %C.WithSelf.decl = constraint_with_self_decl @C [concrete] +// CHECK:STDOUT: +// CHECK:STDOUT: !with Self: +// CHECK:STDOUT: %T.ref: type = name_ref T, @C.%T.loc3_15.2 [symbolic = %T (constants.%T)] +// CHECK:STDOUT: %U.ref: type = name_ref U, @C.%U.loc3_25.2 [symbolic = %U (constants.%U)] +// CHECK:STDOUT: +// CHECK:STDOUT: !members: +// CHECK:STDOUT: .Self = %Self.loc3_34.1 +// CHECK:STDOUT: .T = +// CHECK:STDOUT: .U = +// CHECK:STDOUT: .T = +// CHECK:STDOUT: .U = +// CHECK:STDOUT: +// CHECK:STDOUT: !requires: +// CHECK:STDOUT: } +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: specific @C(constants.%T, constants.%U) { +// CHECK:STDOUT: %T.patt.loc3_15.2 => constants.%T.patt +// CHECK:STDOUT: %T.loc3_15.1 => constants.%T +// CHECK:STDOUT: %U.patt.loc3_25.2 => constants.%U.patt +// CHECK:STDOUT: %U.loc3_25.1 => constants.%U +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: specific @C.WithSelf(constants.%T, constants.%U, constants.%Self) {} +// CHECK:STDOUT: +// CHECK:STDOUT: --- fail_non_facet_type_in_impls.carbon +// CHECK:STDOUT: +// CHECK:STDOUT: constants { +// CHECK:STDOUT: %C: type = class_type @C [concrete] +// CHECK:STDOUT: %empty_struct_type: type = struct_type {} [concrete] +// CHECK:STDOUT: %complete_type: = complete_type_witness %empty_struct_type [concrete] +// CHECK:STDOUT: %A.type: type = facet_type <@A> [concrete] +// CHECK:STDOUT: %Self: %A.type = symbolic_binding Self, 0 [symbolic] +// CHECK:STDOUT: %type: type = facet_type [concrete] +// CHECK:STDOUT: %.Self: %type = symbolic_binding .Self [symbolic_self] +// CHECK:STDOUT: %pattern_type: type = pattern_type %A.type [concrete] +// CHECK:STDOUT: %T.patt: %pattern_type = symbolic_binding_pattern T, 0 [symbolic] +// CHECK:STDOUT: %T: %A.type = symbolic_binding T, 0 [symbolic] +// CHECK:STDOUT: %F.type: type = fn_type @F [concrete] +// CHECK:STDOUT: %F: %F.type = struct_value () [concrete] +// CHECK:STDOUT: %T.as_type: type = facet_access_type %T [symbolic] +// CHECK:STDOUT: %impls = observe_impls %T, %C [symbolic] +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: imports { +// CHECK:STDOUT: %Core: = namespace file.%Core.import, [concrete] { +// CHECK:STDOUT: import Core//prelude +// CHECK:STDOUT: import Core//prelude/... +// CHECK:STDOUT: } +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: file { +// CHECK:STDOUT: package: = namespace [concrete] { +// CHECK:STDOUT: .Core = imports.%Core +// CHECK:STDOUT: .C = %C.decl +// CHECK:STDOUT: .A = %A.decl +// CHECK:STDOUT: .F = %F.decl +// CHECK:STDOUT: } +// CHECK:STDOUT: %Core.import = import Core +// CHECK:STDOUT: %C.decl: type = class_decl @C [concrete = constants.%C] {} {} +// CHECK:STDOUT: %A.decl: type = interface_decl @A [concrete = constants.%A.type] {} {} +// CHECK:STDOUT: %F.decl: %F.type = fn_decl @F [concrete = constants.%F] { +// CHECK:STDOUT: %T.patt.loc6_7.1: %pattern_type = symbolic_binding_pattern T, 0 [symbolic = %T.patt.loc6_7.2 (constants.%T.patt)] +// CHECK:STDOUT: } { +// CHECK:STDOUT: %.loc6: type = splice_block %A.ref [concrete = constants.%A.type] { +// CHECK:STDOUT: %.Self: %type = symbolic_binding .Self [symbolic_self = constants.%.Self] +// CHECK:STDOUT: %A.ref: type = name_ref A, file.%A.decl [concrete = constants.%A.type] +// CHECK:STDOUT: } +// CHECK:STDOUT: %T.loc6_7.2: %A.type = symbolic_binding T, 0 [symbolic = %T.loc6_7.1 (constants.%T)] +// CHECK:STDOUT: } +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: interface @A { +// CHECK:STDOUT: %Self: %A.type = symbolic_binding Self, 0 [symbolic = constants.%Self] +// CHECK:STDOUT: %A.WithSelf.decl = interface_with_self_decl @A [concrete] +// CHECK:STDOUT: +// CHECK:STDOUT: !members: +// CHECK:STDOUT: .Self = %Self +// CHECK:STDOUT: witness = () +// CHECK:STDOUT: +// CHECK:STDOUT: !requires: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: class @C { +// CHECK:STDOUT: %complete_type: = complete_type_witness constants.%empty_struct_type [concrete = constants.%complete_type] +// CHECK:STDOUT: complete_type_witness = %complete_type +// CHECK:STDOUT: +// CHECK:STDOUT: !members: +// CHECK:STDOUT: .Self = constants.%C +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: generic fn @F(%T.loc6_7.2: %A.type) { +// CHECK:STDOUT: %T.patt.loc6_7.2: %pattern_type = symbolic_binding_pattern T, 0 [symbolic = %T.patt.loc6_7.2 (constants.%T.patt)] +// CHECK:STDOUT: %T.loc6_7.1: %A.type = symbolic_binding T, 0 [symbolic = %T.loc6_7.1 (constants.%T)] +// CHECK:STDOUT: +// CHECK:STDOUT: !definition: +// CHECK:STDOUT: %T.as_type.loc11_11.2: type = facet_access_type %T.loc6_7.1 [symbolic = %T.as_type.loc11_11.2 (constants.%T.as_type)] +// CHECK:STDOUT: %impls = observe_impls %T.loc6_7.1, constants.%C [symbolic = %impls (constants.%impls)] +// CHECK:STDOUT: +// CHECK:STDOUT: fn() { +// CHECK:STDOUT: !entry: +// CHECK:STDOUT: %T.ref: %A.type = name_ref T, %T.loc6_7.2 [symbolic = %T.loc6_7.1 (constants.%T)] +// CHECK:STDOUT: %C.ref: type = name_ref C, file.%C.decl [concrete = constants.%C] +// CHECK:STDOUT: %T.as_type.loc11_11.1: type = facet_access_type %T.ref [symbolic = %T.as_type.loc11_11.2 (constants.%T.as_type)] +// CHECK:STDOUT: %.loc11: type = converted %T.ref, %T.as_type.loc11_11.1 [symbolic = %T.as_type.loc11_11.2 (constants.%T.as_type)] +// CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: +// CHECK:STDOUT: } +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: specific @A.WithSelf(constants.%Self) { +// CHECK:STDOUT: !definition: +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: specific @F(constants.%T) { +// CHECK:STDOUT: %T.patt.loc6_7.2 => constants.%T.patt +// CHECK:STDOUT: %T.loc6_7.1 => constants.%T +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: --- generic_observe.carbon +// CHECK:STDOUT: +// CHECK:STDOUT: constants { +// CHECK:STDOUT: %A.type: type = facet_type <@A> [concrete] +// CHECK:STDOUT: %Self.d0c: %A.type = symbolic_binding Self, 0 [symbolic] +// CHECK:STDOUT: %B.type: type = facet_type <@B> [concrete] +// CHECK:STDOUT: %Self.b45: %B.type = symbolic_binding Self, 0 [symbolic] +// CHECK:STDOUT: %type: type = facet_type [concrete] +// CHECK:STDOUT: %.Self.c39: %type = symbolic_binding .Self [symbolic_self] +// CHECK:STDOUT: %Destroy.type: type = facet_type <@Destroy> [concrete] +// CHECK:STDOUT: %BitAndWith.type.a06: type = generic_interface_type @BitAndWith [concrete] +// CHECK:STDOUT: %BitAndWith.generic: %BitAndWith.type.a06 = struct_value () [concrete] +// CHECK:STDOUT: %BitAndWith.type.802: type = facet_type <@BitAndWith, @BitAndWith(type)> [concrete] +// CHECK:STDOUT: %BitAndWith.impl_witness: = impl_witness imports.%BitAndWith.impl_witness_table [concrete] +// CHECK:STDOUT: %BitAndWith.facet: %BitAndWith.type.802 = facet_value type, (%BitAndWith.impl_witness) [concrete] +// CHECK:STDOUT: %BitAndWith.WithSelf.Op.type.38f: type = fn_type @BitAndWith.WithSelf.Op, @BitAndWith.WithSelf(type, %BitAndWith.facet) [concrete] +// CHECK:STDOUT: %.d56: type = fn_type_with_self_type %BitAndWith.WithSelf.Op.type.38f, %BitAndWith.facet [concrete] +// CHECK:STDOUT: %type.as.BitAndWith.impl.Op.type: type = fn_type @type.as.BitAndWith.impl.Op [concrete] +// CHECK:STDOUT: %type.as.BitAndWith.impl.Op: %type.as.BitAndWith.impl.Op.type = struct_value () [concrete] +// CHECK:STDOUT: %type.as.BitAndWith.impl.Op.bound.36e: = bound_method %A.type, %type.as.BitAndWith.impl.Op [concrete] +// CHECK:STDOUT: %facet_type.8cb: type = facet_type <@A & @Destroy> [concrete] +// CHECK:STDOUT: %pattern_type.827: type = pattern_type %facet_type.8cb [concrete] +// CHECK:STDOUT: %T.patt: %pattern_type.827 = symbolic_binding_pattern T, 0 [symbolic] +// CHECK:STDOUT: %T: %facet_type.8cb = symbolic_binding T, 0 [symbolic] +// CHECK:STDOUT: %I.type.335: type = generic_interface_type @I [concrete] +// CHECK:STDOUT: %I.generic: %I.type.335 = struct_value () [concrete] +// CHECK:STDOUT: %I.type.715: type = facet_type <@I, @I(%T)> [symbolic] +// CHECK:STDOUT: %Self.dca: %I.type.715 = symbolic_binding Self, 1 [symbolic] +// CHECK:STDOUT: %facet_type.208: type = facet_type <@B & @Destroy where TODO> [concrete] +// CHECK:STDOUT: %I.assoc_type: type = assoc_entity_type @I, @I(%T) [symbolic] +// CHECK:STDOUT: %assoc0.93a: %I.assoc_type = assoc_entity element0, @I.WithSelf.%U [symbolic] +// CHECK:STDOUT: %Self.as_type.37b: type = facet_access_type %Self.dca [symbolic] +// CHECK:STDOUT: %pattern_type.f76: type = pattern_type %Self.as_type.37b [symbolic] +// CHECK:STDOUT: %self.param_patt.ee4: %pattern_type.f76 = value_param_pattern [symbolic] +// CHECK:STDOUT: %self.patt.2e1: %pattern_type.f76 = at_binding_pattern self, %self.param_patt.ee4 [symbolic] +// CHECK:STDOUT: %I.lookup_impl_witness: = lookup_impl_witness %Self.dca, @I, @I(%T) [symbolic] +// CHECK:STDOUT: %impl.elem0: %facet_type.208 = impl_witness_access %I.lookup_impl_witness, element0 [symbolic] +// CHECK:STDOUT: %as_type: type = facet_access_type %impl.elem0 [symbolic] +// CHECK:STDOUT: %.344: Core.Form = init_form %as_type [symbolic] +// CHECK:STDOUT: %pattern_type.079: type = pattern_type %as_type [symbolic] +// CHECK:STDOUT: %return.param_patt.82c: %pattern_type.079 = out_param_pattern [symbolic] +// CHECK:STDOUT: %return.patt.4f7: %pattern_type.079 = return_slot_pattern %return.param_patt.82c, %as_type [symbolic] +// CHECK:STDOUT: %I.WithSelf.GetU.type: type = fn_type @I.WithSelf.GetU, @I.WithSelf(%T, %Self.dca) [symbolic] +// CHECK:STDOUT: %I.WithSelf.GetU: %I.WithSelf.GetU.type = struct_value () [symbolic] +// CHECK:STDOUT: %assoc1: %I.assoc_type = assoc_entity element1, @I.WithSelf.%I.WithSelf.GetU.decl [symbolic] +// CHECK:STDOUT: %T.as_type: type = facet_access_type %T [symbolic] +// CHECK:STDOUT: %pattern_type.bc3: type = pattern_type %T.as_type [symbolic] +// CHECK:STDOUT: %t.param_patt: %pattern_type.bc3 = value_param_pattern [symbolic] +// CHECK:STDOUT: %t.patt: %pattern_type.bc3 = at_binding_pattern t, %t.param_patt [symbolic] +// CHECK:STDOUT: %I.WithSelf.TakesT.type: type = fn_type @I.WithSelf.TakesT, @I.WithSelf(%T, %Self.dca) [symbolic] +// CHECK:STDOUT: %I.WithSelf.TakesT: %I.WithSelf.TakesT.type = struct_value () [symbolic] +// CHECK:STDOUT: %assoc2: %I.assoc_type = assoc_entity element2, @I.WithSelf.%I.WithSelf.TakesT.decl [symbolic] +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: imports { +// CHECK:STDOUT: %Core: = namespace file.%Core.import, [concrete] { +// CHECK:STDOUT: .Destroy = %Core.Destroy +// CHECK:STDOUT: .BitAndWith = %Core.BitAndWith +// CHECK:STDOUT: import Core//prelude +// CHECK:STDOUT: import Core//prelude/... +// CHECK:STDOUT: } +// CHECK:STDOUT: %Core.Destroy: type = import_ref Core//prelude/parts/destroy, Destroy, loaded [concrete = constants.%Destroy.type] +// CHECK:STDOUT: %Core.BitAndWith: %BitAndWith.type.a06 = import_ref Core//prelude/parts/as, BitAndWith, loaded [concrete = constants.%BitAndWith.generic] +// CHECK:STDOUT: %Core.import_ref.9c3: %type.as.BitAndWith.impl.Op.type = import_ref Core//prelude/parts/as, loc{{\d+_\d+}}, loaded [concrete = constants.%type.as.BitAndWith.impl.Op] +// CHECK:STDOUT: %BitAndWith.impl_witness_table = impl_witness_table (%Core.import_ref.9c3), @type.as.BitAndWith.impl [concrete] +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: file { +// CHECK:STDOUT: package: = namespace [concrete] { +// CHECK:STDOUT: .Core = imports.%Core +// CHECK:STDOUT: .A = %A.decl +// CHECK:STDOUT: .B = %B.decl +// CHECK:STDOUT: .I = %I.decl +// CHECK:STDOUT: } +// CHECK:STDOUT: %Core.import = import Core +// CHECK:STDOUT: %A.decl: type = interface_decl @A [concrete = constants.%A.type] {} {} +// CHECK:STDOUT: %B.decl: type = interface_decl @B [concrete = constants.%B.type] {} {} +// CHECK:STDOUT: %I.decl: %I.type.335 = interface_decl @I [concrete = constants.%I.generic] { +// CHECK:STDOUT: %T.patt.loc5_14.1: %pattern_type.827 = symbolic_binding_pattern T, 0 [symbolic = %T.patt.loc5_14.2 (constants.%T.patt)] +// CHECK:STDOUT: } { +// CHECK:STDOUT: %.loc5_19.1: type = splice_block %.loc5_19.3 [concrete = constants.%facet_type.8cb] { +// CHECK:STDOUT: %.Self: %type = symbolic_binding .Self [symbolic_self = constants.%.Self.c39] +// CHECK:STDOUT: %A.ref: type = name_ref A, file.%A.decl [concrete = constants.%A.type] +// CHECK:STDOUT: %Core.ref: = name_ref Core, imports.%Core [concrete = imports.%Core] +// CHECK:STDOUT: %Destroy.ref: type = name_ref Destroy, imports.%Core.Destroy [concrete = constants.%Destroy.type] +// CHECK:STDOUT: %impl.elem0: %.d56 = impl_witness_access constants.%BitAndWith.impl_witness, element0 [concrete = constants.%type.as.BitAndWith.impl.Op] +// CHECK:STDOUT: %bound_method: = bound_method %A.ref, %impl.elem0 [concrete = constants.%type.as.BitAndWith.impl.Op.bound.36e] +// CHECK:STDOUT: %type.as.BitAndWith.impl.Op.call: init type = call %bound_method(%A.ref, %Destroy.ref) [concrete = constants.%facet_type.8cb] +// CHECK:STDOUT: %.loc5_19.2: type = value_of_initializer %type.as.BitAndWith.impl.Op.call [concrete = constants.%facet_type.8cb] +// CHECK:STDOUT: %.loc5_19.3: type = converted %type.as.BitAndWith.impl.Op.call, %.loc5_19.2 [concrete = constants.%facet_type.8cb] +// CHECK:STDOUT: } +// CHECK:STDOUT: %T.loc5_14.2: %facet_type.8cb = symbolic_binding T, 0 [symbolic = %T.loc5_14.1 (constants.%T)] +// CHECK:STDOUT: } +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: interface @A { +// CHECK:STDOUT: %Self: %A.type = symbolic_binding Self, 0 [symbolic = constants.%Self.d0c] +// CHECK:STDOUT: %A.WithSelf.decl = interface_with_self_decl @A [concrete] +// CHECK:STDOUT: +// CHECK:STDOUT: !members: +// CHECK:STDOUT: .Self = %Self +// CHECK:STDOUT: witness = () +// CHECK:STDOUT: +// CHECK:STDOUT: !requires: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: interface @B { +// CHECK:STDOUT: %Self: %B.type = symbolic_binding Self, 0 [symbolic = constants.%Self.b45] +// CHECK:STDOUT: %B.WithSelf.decl = interface_with_self_decl @B [concrete] +// CHECK:STDOUT: +// CHECK:STDOUT: !members: +// CHECK:STDOUT: .Self = %Self +// CHECK:STDOUT: witness = () +// CHECK:STDOUT: +// CHECK:STDOUT: !requires: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: generic interface @I(%T.loc5_14.2: %facet_type.8cb) { +// CHECK:STDOUT: %T.patt.loc5_14.2: %pattern_type.827 = symbolic_binding_pattern T, 0 [symbolic = %T.patt.loc5_14.2 (constants.%T.patt)] +// CHECK:STDOUT: %T.loc5_14.1: %facet_type.8cb = symbolic_binding T, 0 [symbolic = %T.loc5_14.1 (constants.%T)] +// CHECK:STDOUT: +// CHECK:STDOUT: !definition: +// CHECK:STDOUT: %I.type: type = facet_type <@I, @I(%T.loc5_14.1)> [symbolic = %I.type (constants.%I.type.715)] +// CHECK:STDOUT: %Self.loc5_35.2: @I.%I.type (%I.type.715) = symbolic_binding Self, 1 [symbolic = %Self.loc5_35.2 (constants.%Self.dca)] +// CHECK:STDOUT: +// CHECK:STDOUT: interface { +// CHECK:STDOUT: %Self.loc5_35.1: @I.%I.type (%I.type.715) = symbolic_binding Self, 1 [symbolic = %Self.loc5_35.2 (constants.%Self.dca)] +// CHECK:STDOUT: %I.WithSelf.decl = interface_with_self_decl @I [concrete] +// CHECK:STDOUT: +// CHECK:STDOUT: !with Self: +// CHECK:STDOUT: %U: %facet_type.208 = assoc_const_decl @U [concrete] { +// CHECK:STDOUT: %assoc0: @I.WithSelf.%I.assoc_type (%I.assoc_type) = assoc_entity element0, @I.WithSelf.%U [symbolic = @I.WithSelf.%assoc0 (constants.%assoc0.93a)] +// CHECK:STDOUT: } +// CHECK:STDOUT: %I.WithSelf.GetU.decl: @I.WithSelf.%I.WithSelf.GetU.type (%I.WithSelf.GetU.type) = fn_decl @I.WithSelf.GetU [symbolic = @I.WithSelf.%I.WithSelf.GetU (constants.%I.WithSelf.GetU)] { +// CHECK:STDOUT: %self.param_patt.loc8_11.1: @I.WithSelf.GetU.%pattern_type.loc8_11 (%pattern_type.f76) = value_param_pattern [symbolic = %self.param_patt.loc8_11.2 (constants.%self.param_patt.ee4)] +// CHECK:STDOUT: %self.patt.loc8_11.1: @I.WithSelf.GetU.%pattern_type.loc8_11 (%pattern_type.f76) = at_binding_pattern self, %self.param_patt.loc8_11.1 [symbolic = %self.patt.loc8_11.2 (constants.%self.patt.2e1)] +// CHECK:STDOUT: %return.param_patt.loc8_20.1: @I.WithSelf.GetU.%pattern_type.loc8_20 (%pattern_type.079) = out_param_pattern [symbolic = %return.param_patt.loc8_20.2 (constants.%return.param_patt.82c)] +// CHECK:STDOUT: %return.patt.loc8_17.1: @I.WithSelf.GetU.%pattern_type.loc8_20 (%pattern_type.079) = return_slot_pattern %return.param_patt.loc8_20.1, %.loc8_20.2 [symbolic = %return.patt.loc8_17.2 (constants.%return.patt.4f7)] +// CHECK:STDOUT: } { +// CHECK:STDOUT: %impl.elem0.loc8_20.2: %facet_type.208 = impl_witness_access constants.%I.lookup_impl_witness, element0 [symbolic = %impl.elem0.loc8_20.1 (constants.%impl.elem0)] +// CHECK:STDOUT: %U.ref: %facet_type.208 = name_ref U, %impl.elem0.loc8_20.2 [symbolic = %impl.elem0.loc8_20.1 (constants.%impl.elem0)] +// CHECK:STDOUT: %U.as_type: type = facet_access_type %U.ref [symbolic = %as_type (constants.%as_type)] +// CHECK:STDOUT: %.loc8_20.2: type = converted %U.ref, %U.as_type [symbolic = %as_type (constants.%as_type)] +// CHECK:STDOUT: %.loc8_20.3: Core.Form = init_form %.loc8_20.2 [symbolic = %.loc8_20.1 (constants.%.344)] +// CHECK:STDOUT: %self.param: @I.WithSelf.GetU.%Self.as_type.loc8_11.1 (%Self.as_type.37b) = value_param call_param0 +// CHECK:STDOUT: %.loc8_11.1: type = splice_block %.loc8_11.3 [symbolic = %Self.as_type.loc8_11.1 (constants.%Self.as_type.37b)] { +// CHECK:STDOUT: %.loc8_11.2: @I.WithSelf.GetU.%I.type (%I.type.715) = specific_constant @I.%Self.loc5_35.1, @I(constants.%T) [symbolic = %Self (constants.%Self.dca)] +// CHECK:STDOUT: %Self.ref: @I.WithSelf.GetU.%I.type (%I.type.715) = name_ref Self, %.loc8_11.2 [symbolic = %Self (constants.%Self.dca)] +// CHECK:STDOUT: %Self.as_type.loc8_11.2: type = facet_access_type %Self.ref [symbolic = %Self.as_type.loc8_11.1 (constants.%Self.as_type.37b)] +// CHECK:STDOUT: %.loc8_11.3: type = converted %Self.ref, %Self.as_type.loc8_11.2 [symbolic = %Self.as_type.loc8_11.1 (constants.%Self.as_type.37b)] +// CHECK:STDOUT: } +// CHECK:STDOUT: %self: @I.WithSelf.GetU.%Self.as_type.loc8_11.1 (%Self.as_type.37b) = wrapper_binding self, %self.param +// CHECK:STDOUT: %return.param: ref @I.WithSelf.GetU.%as_type (%as_type) = out_param call_param1 +// CHECK:STDOUT: %return: ref @I.WithSelf.GetU.%as_type (%as_type) = return_slot %return.param +// CHECK:STDOUT: } +// CHECK:STDOUT: %assoc1.loc8_21.1: @I.WithSelf.%I.assoc_type (%I.assoc_type) = assoc_entity element1, %I.WithSelf.GetU.decl [symbolic = %assoc1.loc8_21.2 (constants.%assoc1)] +// CHECK:STDOUT: %I.WithSelf.TakesT.decl: @I.WithSelf.%I.WithSelf.TakesT.type (%I.WithSelf.TakesT.type) = fn_decl @I.WithSelf.TakesT [symbolic = @I.WithSelf.%I.WithSelf.TakesT (constants.%I.WithSelf.TakesT)] { +// CHECK:STDOUT: %self.param_patt.loc9_13.1: @I.WithSelf.TakesT.%pattern_type.loc9_13 (%pattern_type.f76) = value_param_pattern [symbolic = %self.param_patt.loc9_13.2 (constants.%self.param_patt.ee4)] +// CHECK:STDOUT: %self.patt.loc9_13.1: @I.WithSelf.TakesT.%pattern_type.loc9_13 (%pattern_type.f76) = at_binding_pattern self, %self.param_patt.loc9_13.1 [symbolic = %self.patt.loc9_13.2 (constants.%self.patt.2e1)] +// CHECK:STDOUT: %t.param_patt.loc9_20.1: @I.WithSelf.TakesT.%pattern_type.loc9_20 (%pattern_type.bc3) = value_param_pattern [symbolic = %t.param_patt.loc9_20.2 (constants.%t.param_patt)] +// CHECK:STDOUT: %t.patt.loc9_20.1: @I.WithSelf.TakesT.%pattern_type.loc9_20 (%pattern_type.bc3) = at_binding_pattern t, %t.param_patt.loc9_20.1 [symbolic = %t.patt.loc9_20.2 (constants.%t.patt)] +// CHECK:STDOUT: } { +// CHECK:STDOUT: %self.param: @I.WithSelf.TakesT.%Self.as_type.loc9_13.1 (%Self.as_type.37b) = value_param call_param0 +// CHECK:STDOUT: %.loc9_13.1: type = splice_block %.loc9_13.3 [symbolic = %Self.as_type.loc9_13.1 (constants.%Self.as_type.37b)] { +// CHECK:STDOUT: %.loc9_13.2: @I.WithSelf.TakesT.%I.type (%I.type.715) = specific_constant @I.%Self.loc5_35.1, @I(constants.%T) [symbolic = %Self (constants.%Self.dca)] +// CHECK:STDOUT: %Self.ref: @I.WithSelf.TakesT.%I.type (%I.type.715) = name_ref Self, %.loc9_13.2 [symbolic = %Self (constants.%Self.dca)] +// CHECK:STDOUT: %Self.as_type.loc9_13.2: type = facet_access_type %Self.ref [symbolic = %Self.as_type.loc9_13.1 (constants.%Self.as_type.37b)] +// CHECK:STDOUT: %.loc9_13.3: type = converted %Self.ref, %Self.as_type.loc9_13.2 [symbolic = %Self.as_type.loc9_13.1 (constants.%Self.as_type.37b)] +// CHECK:STDOUT: } +// CHECK:STDOUT: %self: @I.WithSelf.TakesT.%Self.as_type.loc9_13.1 (%Self.as_type.37b) = wrapper_binding self, %self.param +// CHECK:STDOUT: %t.param: @I.WithSelf.TakesT.%T.as_type.loc9_22.1 (%T.as_type) = value_param call_param1 +// CHECK:STDOUT: %.loc9_22.1: type = splice_block %.loc9_22.2 [symbolic = %T.as_type.loc9_22.1 (constants.%T.as_type)] { +// CHECK:STDOUT: %T.ref: %facet_type.8cb = name_ref T, @I.%T.loc5_14.2 [symbolic = %T (constants.%T)] +// CHECK:STDOUT: %T.as_type.loc9_22.2: type = facet_access_type %T.ref [symbolic = %T.as_type.loc9_22.1 (constants.%T.as_type)] +// CHECK:STDOUT: %.loc9_22.2: type = converted %T.ref, %T.as_type.loc9_22.2 [symbolic = %T.as_type.loc9_22.1 (constants.%T.as_type)] +// CHECK:STDOUT: } +// CHECK:STDOUT: %t: @I.WithSelf.TakesT.%T.as_type.loc9_22.1 (%T.as_type) = wrapper_binding t, %t.param +// CHECK:STDOUT: } +// CHECK:STDOUT: %assoc2.loc9_24.1: @I.WithSelf.%I.assoc_type (%I.assoc_type) = assoc_entity element2, %I.WithSelf.TakesT.decl [symbolic = %assoc2.loc9_24.2 (constants.%assoc2)] +// CHECK:STDOUT: %T.ref: %facet_type.8cb = name_ref T, @I.%T.loc5_14.2 [symbolic = %T (constants.%T)] +// CHECK:STDOUT: %impl.elem0.loc11_16.1: %facet_type.208 = impl_witness_access constants.%I.lookup_impl_witness, element0 [symbolic = %impl.elem0.loc11_16.2 (constants.%impl.elem0)] +// CHECK:STDOUT: %U.ref: %facet_type.208 = name_ref U, %impl.elem0.loc11_16.1 [symbolic = %impl.elem0.loc11_16.2 (constants.%impl.elem0)] +// CHECK:STDOUT: %U.as_type: type = facet_access_type %U.ref [symbolic = %as_type (constants.%as_type)] +// CHECK:STDOUT: %.loc11_16: type = converted %U.ref, %U.as_type [symbolic = %as_type (constants.%as_type)] +// CHECK:STDOUT: %T.as_type.loc11_11.1: type = facet_access_type %T.ref [symbolic = %T.as_type.loc11_11.2 (constants.%T.as_type)] +// CHECK:STDOUT: %.loc11_11: type = converted %T.ref, %T.as_type.loc11_11.1 [symbolic = %T.as_type.loc11_11.2 (constants.%T.as_type)] +// CHECK:STDOUT: %I.observe.decl = observe_decl @I.observe [concrete] +// CHECK:STDOUT: +// CHECK:STDOUT: !members: +// CHECK:STDOUT: .Self = %Self.loc5_35.1 +// CHECK:STDOUT: .B = +// CHECK:STDOUT: .T = +// CHECK:STDOUT: .B = +// CHECK:STDOUT: .T = +// CHECK:STDOUT: .U = @U.%assoc0 +// CHECK:STDOUT: .GetU = @I.WithSelf.%assoc1.loc8_21.1 +// CHECK:STDOUT: .TakesT = @I.WithSelf.%assoc2.loc9_24.1 +// CHECK:STDOUT: witness = (@I.WithSelf.%U, @I.WithSelf.%I.WithSelf.GetU.decl, @I.WithSelf.%I.WithSelf.TakesT.decl) +// CHECK:STDOUT: +// CHECK:STDOUT: !requires: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: +// CHECK:STDOUT: @I.observe { +// CHECK:STDOUT: observe constants.%T == constants.%impl.elem0 +// CHECK:STDOUT: } +// CHECK:STDOUT: } +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: generic fn @I.WithSelf.GetU(@I.%T.loc5_14.2: %facet_type.8cb, @I.%Self.loc5_35.1: @I.%I.type (%I.type.715)) { +// CHECK:STDOUT: %T: %facet_type.8cb = symbolic_binding T, 0 [symbolic = %T (constants.%T)] +// CHECK:STDOUT: %I.type: type = facet_type <@I, @I(%T)> [symbolic = %I.type (constants.%I.type.715)] +// CHECK:STDOUT: %Self: @I.WithSelf.GetU.%I.type (%I.type.715) = symbolic_binding Self, 1 [symbolic = %Self (constants.%Self.dca)] +// CHECK:STDOUT: %Self.as_type.loc8_11.1: type = facet_access_type %Self [symbolic = %Self.as_type.loc8_11.1 (constants.%Self.as_type.37b)] +// CHECK:STDOUT: %pattern_type.loc8_11: type = pattern_type %Self.as_type.loc8_11.1 [symbolic = %pattern_type.loc8_11 (constants.%pattern_type.f76)] +// CHECK:STDOUT: %self.param_patt.loc8_11.2: @I.WithSelf.GetU.%pattern_type.loc8_11 (%pattern_type.f76) = value_param_pattern [symbolic = %self.param_patt.loc8_11.2 (constants.%self.param_patt.ee4)] +// CHECK:STDOUT: %self.patt.loc8_11.2: @I.WithSelf.GetU.%pattern_type.loc8_11 (%pattern_type.f76) = at_binding_pattern self, %self.param_patt.loc8_11.2 [symbolic = %self.patt.loc8_11.2 (constants.%self.patt.2e1)] +// CHECK:STDOUT: %I.lookup_impl_witness: = lookup_impl_witness %Self, @I, @I(%T) [symbolic = %I.lookup_impl_witness (constants.%I.lookup_impl_witness)] +// CHECK:STDOUT: %impl.elem0.loc8_20.1: %facet_type.208 = impl_witness_access %I.lookup_impl_witness, element0 [symbolic = %impl.elem0.loc8_20.1 (constants.%impl.elem0)] +// CHECK:STDOUT: %as_type: type = facet_access_type %impl.elem0.loc8_20.1 [symbolic = %as_type (constants.%as_type)] +// CHECK:STDOUT: %.loc8_20.1: Core.Form = init_form %as_type [symbolic = %.loc8_20.1 (constants.%.344)] +// CHECK:STDOUT: %pattern_type.loc8_20: type = pattern_type %as_type [symbolic = %pattern_type.loc8_20 (constants.%pattern_type.079)] +// CHECK:STDOUT: %return.param_patt.loc8_20.2: @I.WithSelf.GetU.%pattern_type.loc8_20 (%pattern_type.079) = out_param_pattern [symbolic = %return.param_patt.loc8_20.2 (constants.%return.param_patt.82c)] +// CHECK:STDOUT: %return.patt.loc8_17.2: @I.WithSelf.GetU.%pattern_type.loc8_20 (%pattern_type.079) = return_slot_pattern %return.param_patt.loc8_20.2, %as_type [symbolic = %return.patt.loc8_17.2 (constants.%return.patt.4f7)] +// CHECK:STDOUT: +// CHECK:STDOUT: fn(%self.param: @I.WithSelf.GetU.%Self.as_type.loc8_11.1 (%Self.as_type.37b)) -> out %return.param: @I.WithSelf.GetU.%as_type (%as_type); +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: generic fn @I.WithSelf.TakesT(@I.%T.loc5_14.2: %facet_type.8cb, @I.%Self.loc5_35.1: @I.%I.type (%I.type.715)) { +// CHECK:STDOUT: %T: %facet_type.8cb = symbolic_binding T, 0 [symbolic = %T (constants.%T)] +// CHECK:STDOUT: %I.type: type = facet_type <@I, @I(%T)> [symbolic = %I.type (constants.%I.type.715)] +// CHECK:STDOUT: %Self: @I.WithSelf.TakesT.%I.type (%I.type.715) = symbolic_binding Self, 1 [symbolic = %Self (constants.%Self.dca)] +// CHECK:STDOUT: %Self.as_type.loc9_13.1: type = facet_access_type %Self [symbolic = %Self.as_type.loc9_13.1 (constants.%Self.as_type.37b)] +// CHECK:STDOUT: %pattern_type.loc9_13: type = pattern_type %Self.as_type.loc9_13.1 [symbolic = %pattern_type.loc9_13 (constants.%pattern_type.f76)] +// CHECK:STDOUT: %self.param_patt.loc9_13.2: @I.WithSelf.TakesT.%pattern_type.loc9_13 (%pattern_type.f76) = value_param_pattern [symbolic = %self.param_patt.loc9_13.2 (constants.%self.param_patt.ee4)] +// CHECK:STDOUT: %self.patt.loc9_13.2: @I.WithSelf.TakesT.%pattern_type.loc9_13 (%pattern_type.f76) = at_binding_pattern self, %self.param_patt.loc9_13.2 [symbolic = %self.patt.loc9_13.2 (constants.%self.patt.2e1)] +// CHECK:STDOUT: %T.as_type.loc9_22.1: type = facet_access_type %T [symbolic = %T.as_type.loc9_22.1 (constants.%T.as_type)] +// CHECK:STDOUT: %pattern_type.loc9_20: type = pattern_type %T.as_type.loc9_22.1 [symbolic = %pattern_type.loc9_20 (constants.%pattern_type.bc3)] +// CHECK:STDOUT: %t.param_patt.loc9_20.2: @I.WithSelf.TakesT.%pattern_type.loc9_20 (%pattern_type.bc3) = value_param_pattern [symbolic = %t.param_patt.loc9_20.2 (constants.%t.param_patt)] +// CHECK:STDOUT: %t.patt.loc9_20.2: @I.WithSelf.TakesT.%pattern_type.loc9_20 (%pattern_type.bc3) = at_binding_pattern t, %t.param_patt.loc9_20.2 [symbolic = %t.patt.loc9_20.2 (constants.%t.patt)] +// CHECK:STDOUT: +// CHECK:STDOUT: fn(%self.param: @I.WithSelf.TakesT.%Self.as_type.loc9_13.1 (%Self.as_type.37b), %t.param: @I.WithSelf.TakesT.%T.as_type.loc9_22.1 (%T.as_type)); +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: specific @A.WithSelf(constants.%Self.d0c) { +// CHECK:STDOUT: !definition: +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: specific @B.WithSelf(constants.%Self.b45) { +// CHECK:STDOUT: !definition: +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: specific @I(constants.%T) { +// CHECK:STDOUT: %T.patt.loc5_14.2 => constants.%T.patt +// CHECK:STDOUT: %T.loc5_14.1 => constants.%T +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: specific @I.WithSelf(constants.%T, constants.%Self.dca) {} +// CHECK:STDOUT: +// CHECK:STDOUT: specific @I.WithSelf.GetU(constants.%T, constants.%Self.dca) { +// CHECK:STDOUT: %T => constants.%T +// CHECK:STDOUT: %I.type => constants.%I.type.715 +// CHECK:STDOUT: %Self => constants.%Self.dca +// CHECK:STDOUT: %Self.as_type.loc8_11.1 => constants.%Self.as_type.37b +// CHECK:STDOUT: %pattern_type.loc8_11 => constants.%pattern_type.f76 +// CHECK:STDOUT: %self.param_patt.loc8_11.2 => constants.%self.param_patt.ee4 +// CHECK:STDOUT: %self.patt.loc8_11.2 => constants.%self.patt.2e1 +// CHECK:STDOUT: %I.lookup_impl_witness => constants.%I.lookup_impl_witness +// CHECK:STDOUT: %impl.elem0.loc8_20.1 => constants.%impl.elem0 +// CHECK:STDOUT: %as_type => constants.%as_type +// CHECK:STDOUT: %.loc8_20.1 => constants.%.344 +// CHECK:STDOUT: %pattern_type.loc8_20 => constants.%pattern_type.079 +// CHECK:STDOUT: %return.param_patt.loc8_20.2 => constants.%return.param_patt.82c +// CHECK:STDOUT: %return.patt.loc8_17.2 => constants.%return.patt.4f7 +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: specific @I.WithSelf.TakesT(constants.%T, constants.%Self.dca) { +// CHECK:STDOUT: %T => constants.%T +// CHECK:STDOUT: %I.type => constants.%I.type.715 +// CHECK:STDOUT: %Self => constants.%Self.dca +// CHECK:STDOUT: %Self.as_type.loc9_13.1 => constants.%Self.as_type.37b +// CHECK:STDOUT: %pattern_type.loc9_13 => constants.%pattern_type.f76 +// CHECK:STDOUT: %self.param_patt.loc9_13.2 => constants.%self.param_patt.ee4 +// CHECK:STDOUT: %self.patt.loc9_13.2 => constants.%self.patt.2e1 +// CHECK:STDOUT: %T.as_type.loc9_22.1 => constants.%T.as_type +// CHECK:STDOUT: %pattern_type.loc9_20 => constants.%pattern_type.bc3 +// CHECK:STDOUT: %t.param_patt.loc9_20.2 => constants.%t.param_patt +// CHECK:STDOUT: %t.patt.loc9_20.2 => constants.%t.patt +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: --- fail_todo_generic_import.carbon +// CHECK:STDOUT: +// CHECK:STDOUT: constants { +// CHECK:STDOUT: %C: type = class_type @C [concrete] +// CHECK:STDOUT: %empty_struct_type: type = struct_type {} [concrete] +// CHECK:STDOUT: %complete_type: = complete_type_witness %empty_struct_type [concrete] +// CHECK:STDOUT: %A.type: type = facet_type <@A> [concrete] +// CHECK:STDOUT: %Self.626: %A.type = symbolic_binding Self, 0 [symbolic] +// CHECK:STDOUT: %A.impl_witness: = impl_witness @C.as.A.impl.%A.impl_witness_table [concrete] +// CHECK:STDOUT: %A.facet: %A.type = facet_value %C, (%A.impl_witness) [concrete] +// CHECK:STDOUT: %type: type = facet_type [concrete] +// CHECK:STDOUT: %.Self: %type = symbolic_binding .Self [symbolic_self] +// CHECK:STDOUT: %I.type.335: type = generic_interface_type @I [concrete] +// CHECK:STDOUT: %empty_tuple.type: type = tuple_type () [concrete] +// CHECK:STDOUT: %I.generic: %I.type.335 = struct_value () [concrete] +// CHECK:STDOUT: %Destroy.type: type = facet_type <@Destroy> [concrete] +// CHECK:STDOUT: %facet_type.8cb: type = facet_type <@A & @Destroy> [concrete] +// CHECK:STDOUT: %T.2b7: %facet_type.8cb = symbolic_binding T, 0 [symbolic] +// CHECK:STDOUT: %I.type.715: type = facet_type <@I, @I(%T.2b7)> [symbolic] +// CHECK:STDOUT: %pattern_type.827: type = pattern_type %facet_type.8cb [concrete] +// CHECK:STDOUT: %T.patt.196: %pattern_type.827 = symbolic_binding_pattern T, 0 [symbolic] +// CHECK:STDOUT: %Self.a17: %I.type.715 = symbolic_binding Self, 1 [symbolic] +// CHECK:STDOUT: %I.lookup_impl_witness.530: = lookup_impl_witness %Self.a17, @I, @I(%T.2b7) [symbolic] +// CHECK:STDOUT: %B.type: type = facet_type <@B> [concrete] +// CHECK:STDOUT: %Self.ed4: %B.type = symbolic_binding Self, 0 [symbolic] +// CHECK:STDOUT: %facet_type.0e2: type = facet_type <@Destroy & @B where TODO> [concrete] +// CHECK:STDOUT: %impl.elem0.0fe: %facet_type.0e2 = impl_witness_access %I.lookup_impl_witness.530, element0 [symbolic] +// CHECK:STDOUT: %T.as_type.64c: type = facet_access_type %T.2b7 [symbolic] +// CHECK:STDOUT: %as_type.b29: type = facet_access_type %impl.elem0.0fe [symbolic] +// CHECK:STDOUT: %I.assoc_type.233: type = assoc_entity_type @I, @I(%T.2b7) [symbolic] +// CHECK:STDOUT: %I.WithSelf.TakesT.type.74f: type = fn_type @I.WithSelf.TakesT, @I.WithSelf(%T.2b7, %Self.a17) [symbolic] +// CHECK:STDOUT: %I.WithSelf.TakesT.406: %I.WithSelf.TakesT.type.74f = struct_value () [symbolic] +// CHECK:STDOUT: %Self.as_type.1df: type = facet_access_type %Self.a17 [symbolic] +// CHECK:STDOUT: %pattern_type.e16: type = pattern_type %Self.as_type.1df [symbolic] +// CHECK:STDOUT: %self.param_patt.306: %pattern_type.e16 = value_param_pattern [symbolic] +// CHECK:STDOUT: %self.patt.cad: %pattern_type.e16 = at_binding_pattern self, %self.param_patt.306 [symbolic] +// CHECK:STDOUT: %pattern_type.bc3: type = pattern_type %T.as_type.64c [symbolic] +// CHECK:STDOUT: %t.param_patt.2bb: %pattern_type.bc3 = value_param_pattern [symbolic] +// CHECK:STDOUT: %t.patt.974: %pattern_type.bc3 = at_binding_pattern t, %t.param_patt.2bb [symbolic] +// CHECK:STDOUT: %I.WithSelf.GetU.type.841: type = fn_type @I.WithSelf.GetU, @I.WithSelf(%T.2b7, %Self.a17) [symbolic] +// CHECK:STDOUT: %I.WithSelf.GetU.7cf: %I.WithSelf.GetU.type.841 = struct_value () [symbolic] +// CHECK:STDOUT: %pattern_type.304: type = pattern_type %as_type.b29 [symbolic] +// CHECK:STDOUT: %return.param_patt.8e4: %pattern_type.304 = out_param_pattern [symbolic] +// CHECK:STDOUT: %return.patt.9ec: %pattern_type.304 = return_slot_pattern %return.param_patt.8e4, invalid [symbolic] +// CHECK:STDOUT: %.c94: Core.Form = init_form %as_type.b29 [symbolic] +// CHECK:STDOUT: %Destroy.Op.type.1d8f74.2: type = fn_type @Destroy.Op.loc8_13.2 [concrete] +// CHECK:STDOUT: %Destroy.Op.1a2547.2: %Destroy.Op.type.1d8f74.2 = struct_value () [concrete] +// CHECK:STDOUT: %custom_witness.df9cc1.2: = custom_witness (%Destroy.Op.1a2547.2), @Destroy [concrete] +// CHECK:STDOUT: %facet_value: %facet_type.8cb = facet_value %C, (%A.impl_witness, %custom_witness.df9cc1.2) [concrete] +// CHECK:STDOUT: %I.type.8a7: type = facet_type <@I, @I(%facet_value)> [concrete] +// CHECK:STDOUT: %pattern_type.7b0: type = pattern_type %I.type.8a7 [concrete] +// CHECK:STDOUT: %T.patt.fb5: %pattern_type.7b0 = symbolic_binding_pattern T, 0 [symbolic] +// CHECK:STDOUT: %T.e69: %I.type.8a7 = symbolic_binding T, 0 [symbolic] +// CHECK:STDOUT: %Self.3ca: %I.type.8a7 = symbolic_binding Self, 1 [symbolic] +// CHECK:STDOUT: %I.assoc_type.cf6: type = assoc_entity_type @I, @I(%facet_value) [concrete] +// CHECK:STDOUT: %assoc0.64a: %I.assoc_type.cf6 = assoc_entity element0, imports.%Main.import_ref.bda [concrete] +// CHECK:STDOUT: %I.WithSelf.GetU.type.0c5: type = fn_type @I.WithSelf.GetU, @I.WithSelf(%facet_value, %Self.a17) [symbolic] +// CHECK:STDOUT: %I.WithSelf.GetU.878: %I.WithSelf.GetU.type.0c5 = struct_value () [symbolic] +// CHECK:STDOUT: %assoc1.9b4: %I.assoc_type.cf6 = assoc_entity element1, imports.%Main.import_ref.1a4 [concrete] +// CHECK:STDOUT: %I.WithSelf.TakesT.type.bd4: type = fn_type @I.WithSelf.TakesT, @I.WithSelf(%facet_value, %Self.a17) [symbolic] +// CHECK:STDOUT: %I.WithSelf.TakesT.148: %I.WithSelf.TakesT.type.bd4 = struct_value () [symbolic] +// CHECK:STDOUT: %assoc2.e5d: %I.assoc_type.cf6 = assoc_entity element2, imports.%Main.import_ref.93b [concrete] +// CHECK:STDOUT: %I.lookup_impl_witness.c15: = lookup_impl_witness %Self.a17, @I, @I(%facet_value) [symbolic] +// CHECK:STDOUT: %impl.elem0.a31: %facet_type.0e2 = impl_witness_access %I.lookup_impl_witness.c15, element0 [symbolic] +// CHECK:STDOUT: %as_type.7cc: type = facet_access_type %impl.elem0.a31 [symbolic] +// CHECK:STDOUT: %eq.f2b = observe_equivalent %facet_value, %impl.elem0.a31 [symbolic] +// CHECK:STDOUT: %T.as_type.a68: type = facet_access_type %T.e69 [symbolic] +// CHECK:STDOUT: %pattern_type.cf2: type = pattern_type %T.as_type.a68 [symbolic] +// CHECK:STDOUT: %t.param_patt.135: %pattern_type.cf2 = value_param_pattern [symbolic] +// CHECK:STDOUT: %t.patt.1b6: %pattern_type.cf2 = at_binding_pattern t, %t.param_patt.135 [symbolic] +// CHECK:STDOUT: %F.type: type = fn_type @F [concrete] +// CHECK:STDOUT: %F: %F.type = struct_value () [concrete] +// CHECK:STDOUT: %require_complete.3ae: = require_complete_type %T.as_type.a68 [symbolic] +// CHECK:STDOUT: %I.WithSelf.GetU.type.fd3: type = fn_type @I.WithSelf.GetU, @I.WithSelf(%facet_value, %T.e69) [symbolic] +// CHECK:STDOUT: %I.WithSelf.GetU.01c: %I.WithSelf.GetU.type.fd3 = struct_value () [symbolic] +// CHECK:STDOUT: %I.WithSelf.TakesT.type.f2f: type = fn_type @I.WithSelf.TakesT, @I.WithSelf(%facet_value, %T.e69) [symbolic] +// CHECK:STDOUT: %I.WithSelf.TakesT.9b6: %I.WithSelf.TakesT.type.f2f = struct_value () [symbolic] +// CHECK:STDOUT: %I.lookup_impl_witness.919: = lookup_impl_witness %T.e69, @I, @I(%facet_value) [symbolic] +// CHECK:STDOUT: %impl.elem0.ae2: %facet_type.0e2 = impl_witness_access %I.lookup_impl_witness.919, element0 [symbolic] +// CHECK:STDOUT: %as_type.93c: type = facet_access_type %impl.elem0.ae2 [symbolic] +// CHECK:STDOUT: %eq.e81 = observe_equivalent %facet_value, %impl.elem0.ae2 [symbolic] +// CHECK:STDOUT: %assoc0.aac: %I.assoc_type.233 = assoc_entity element0, imports.%Main.import_ref.4e9 [symbolic] +// CHECK:STDOUT: %require_complete.47f: = require_complete_type %as_type.93c [symbolic] +// CHECK:STDOUT: %pattern_type.439: type = pattern_type %as_type.93c [symbolic] +// CHECK:STDOUT: %u.patt: %pattern_type.439 = ref_binding_pattern u [symbolic] +// CHECK:STDOUT: %u.var_patt: %pattern_type.439 = var_pattern %u.patt [symbolic] +// CHECK:STDOUT: %assoc1.8f3: %I.assoc_type.233 = assoc_entity element1, imports.%Main.import_ref.1c1 [symbolic] +// CHECK:STDOUT: %.086: type = fn_type_with_self_type %I.WithSelf.GetU.type.fd3, %T.e69 [symbolic] +// CHECK:STDOUT: %impl.elem1: %.086 = impl_witness_access %I.lookup_impl_witness.919, element1 [symbolic] +// CHECK:STDOUT: %self.param_patt.8a4: %pattern_type.cf2 = value_param_pattern [symbolic] +// CHECK:STDOUT: %self.patt.1fe: %pattern_type.cf2 = at_binding_pattern self, %self.param_patt.8a4 [symbolic] +// CHECK:STDOUT: %.295: Core.Form = init_form %as_type.93c [symbolic] +// CHECK:STDOUT: %return.param_patt.099: %pattern_type.439 = out_param_pattern [symbolic] +// CHECK:STDOUT: %return.patt.b38: %pattern_type.439 = return_slot_pattern %return.param_patt.099, invalid [symbolic] +// CHECK:STDOUT: %specific_impl_fn.87f: = specific_impl_function %impl.elem1, @I.WithSelf.GetU(%facet_value, %T.e69) [symbolic] +// CHECK:STDOUT: %assoc2.f3c: %I.assoc_type.233 = assoc_entity element2, imports.%Main.import_ref.133 [symbolic] +// CHECK:STDOUT: %.dea: type = fn_type_with_self_type %I.WithSelf.TakesT.type.f2f, %T.e69 [symbolic] +// CHECK:STDOUT: %impl.elem2: %.dea = impl_witness_access %I.lookup_impl_witness.919, element2 [symbolic] +// CHECK:STDOUT: %facet_type.22d: type = facet_type <@Destroy & @B> [concrete] +// CHECK:STDOUT: %Destroy.lookup_impl_witness: = lookup_impl_witness %impl.elem0.ae2, @Destroy [symbolic] +// CHECK:STDOUT: %Destroy.facet.707: %Destroy.type = facet_value %as_type.93c, (%Destroy.lookup_impl_witness) [symbolic] +// CHECK:STDOUT: %Destroy.WithSelf.Op.type.83d: type = fn_type @Destroy.WithSelf.Op, @Destroy.WithSelf(%Destroy.facet.707) [symbolic] +// CHECK:STDOUT: %.8d3: type = fn_type_with_self_type %Destroy.WithSelf.Op.type.83d, %Destroy.facet.707 [symbolic] +// CHECK:STDOUT: %impl.elem0.706: %.8d3 = impl_witness_access %Destroy.lookup_impl_witness, element0 [symbolic] +// CHECK:STDOUT: %specific_impl_fn.977: = specific_impl_function %impl.elem0.706, @Destroy.WithSelf.Op(%Destroy.facet.707) [symbolic] +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: imports { +// CHECK:STDOUT: %Main.A: type = import_ref Main//generic_observe, A, loaded [concrete = constants.%A.type] +// CHECK:STDOUT: %Main.B = import_ref Main//generic_observe, B, unloaded +// CHECK:STDOUT: %Main.I: %I.type.335 = import_ref Main//generic_observe, I, loaded [concrete = constants.%I.generic] +// CHECK:STDOUT: %Core.048aa3.1: = namespace file.%Core.import, [concrete] { +// CHECK:STDOUT: .Destroy = %Core.Destroy +// CHECK:STDOUT: import Core//prelude +// CHECK:STDOUT: import Core//prelude/... +// CHECK:STDOUT: } +// CHECK:STDOUT: %Main.import_ref.0a1 = import_ref Main//generic_observe, loc3_13, unloaded +// CHECK:STDOUT: %Main.import_ref.327: @I.WithSelf.%I.assoc_type (%I.assoc_type.233) = import_ref Main//generic_observe, loc6_8, loaded [symbolic = @I.WithSelf.%assoc0 (constants.%assoc0.aac)] +// CHECK:STDOUT: %Main.import_ref.c5a: @I.WithSelf.%I.assoc_type (%I.assoc_type.233) = import_ref Main//generic_observe, loc8_21, loaded [symbolic = @I.WithSelf.%assoc1 (constants.%assoc1.8f3)] +// CHECK:STDOUT: %Main.import_ref.f14: @I.WithSelf.%I.assoc_type (%I.assoc_type.233) = import_ref Main//generic_observe, loc9_24, loaded [symbolic = @I.WithSelf.%assoc2 (constants.%assoc2.f3c)] +// CHECK:STDOUT: %Main.U = import_ref Main//generic_observe, U, unloaded +// CHECK:STDOUT: %Main.GetU = import_ref Main//generic_observe, GetU, unloaded +// CHECK:STDOUT: %Main.TakesT = import_ref Main//generic_observe, TakesT, unloaded +// CHECK:STDOUT: %Main.import_ref.c07 = import_ref Main//generic_observe, loc4_13, unloaded +// CHECK:STDOUT: %Main.import_ref.93b: @I.WithSelf.%I.WithSelf.TakesT.type (%I.WithSelf.TakesT.type.74f) = import_ref Main//generic_observe, loc9_24, loaded [symbolic = @I.WithSelf.%I.WithSelf.TakesT (constants.%I.WithSelf.TakesT.406)] +// CHECK:STDOUT: %Main.import_ref.10abc5.2: %facet_type.8cb = import_ref Main//generic_observe, loc5_14, loaded [symbolic = @I.%T (constants.%T.2b7)] +// CHECK:STDOUT: %Main.import_ref.563720.2: @I.%I.type (%I.type.715) = import_ref Main//generic_observe, loc5_35, loaded [symbolic = @I.%Self (constants.%Self.a17)] +// CHECK:STDOUT: %Main.import_ref.1a4: @I.WithSelf.%I.WithSelf.GetU.type (%I.WithSelf.GetU.type.841) = import_ref Main//generic_observe, loc8_21, loaded [symbolic = @I.WithSelf.%I.WithSelf.GetU (constants.%I.WithSelf.GetU.7cf)] +// CHECK:STDOUT: %Main.import_ref.10abc5.3: %facet_type.8cb = import_ref Main//generic_observe, loc5_14, loaded [symbolic = @I.%T (constants.%T.2b7)] +// CHECK:STDOUT: %Main.import_ref.563720.3: @I.%I.type (%I.type.715) = import_ref Main//generic_observe, loc5_35, loaded [symbolic = @I.%Self (constants.%Self.a17)] +// CHECK:STDOUT: %Main.import_ref.bda: %facet_type.0e2 = import_ref Main//generic_observe, loc6_8, loaded [concrete = %U] +// CHECK:STDOUT: %Main.import_ref.603 = import_ref Main//generic_observe, loc5_35, unloaded +// CHECK:STDOUT: %Main.import_ref.10abc5.4: %facet_type.8cb = import_ref Main//generic_observe, loc5_14, loaded [symbolic = @I.%T (constants.%T.2b7)] +// CHECK:STDOUT: %Main.import_ref.4e9 = import_ref Main//generic_observe, loc6_8, unloaded +// CHECK:STDOUT: %U: %facet_type.0e2 = assoc_const_decl @U [concrete] {} +// CHECK:STDOUT: %Main.import_ref.1c1 = import_ref Main//generic_observe, loc8_21, unloaded +// CHECK:STDOUT: %Main.import_ref.133 = import_ref Main//generic_observe, loc9_24, unloaded +// CHECK:STDOUT: %Core.Destroy: type = import_ref Core//prelude/parts/destroy, Destroy, loaded [concrete = constants.%Destroy.type] +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: file { +// CHECK:STDOUT: package: = namespace [concrete] { +// CHECK:STDOUT: .A = imports.%Main.A +// CHECK:STDOUT: .B = imports.%Main.B +// CHECK:STDOUT: .I = imports.%Main.I +// CHECK:STDOUT: .Core = imports.%Core.048aa3.1 +// CHECK:STDOUT: .C = %C.decl +// CHECK:STDOUT: .F = %F.decl +// CHECK:STDOUT: } +// CHECK:STDOUT: %Core.import = import Core +// CHECK:STDOUT: %default.import = import +// CHECK:STDOUT: %C.decl: type = class_decl @C [concrete = constants.%C] {} {} +// CHECK:STDOUT: impl_decl @C.as.A.impl [concrete] {} { +// CHECK:STDOUT: %C.ref: type = name_ref C, file.%C.decl [concrete = constants.%C] +// CHECK:STDOUT: %A.ref: type = name_ref A, imports.%Main.A [concrete = constants.%A.type] +// CHECK:STDOUT: } +// CHECK:STDOUT: %F.decl: %F.type = fn_decl @F [concrete = constants.%F] { +// CHECK:STDOUT: %T.patt.loc8_7.1: %pattern_type.7b0 = symbolic_binding_pattern T, 0 [symbolic = %T.patt.loc8_7.2 (constants.%T.patt.fb5)] +// CHECK:STDOUT: %t.param_patt.loc8_17.1: @F.%pattern_type.loc8 (%pattern_type.cf2) = value_param_pattern [symbolic = %t.param_patt.loc8_17.2 (constants.%t.param_patt.135)] +// CHECK:STDOUT: %t.patt.loc8_17.1: @F.%pattern_type.loc8 (%pattern_type.cf2) = at_binding_pattern t, %t.param_patt.loc8_17.1 [symbolic = %t.patt.loc8_17.2 (constants.%t.patt.1b6)] +// CHECK:STDOUT: } { +// CHECK:STDOUT: %.loc8_13.1: type = splice_block %I.type [concrete = constants.%I.type.8a7] { +// CHECK:STDOUT: %.Self: %type = symbolic_binding .Self [symbolic_self = constants.%.Self] +// CHECK:STDOUT: %I.ref: %I.type.335 = name_ref I, imports.%Main.I [concrete = constants.%I.generic] +// CHECK:STDOUT: %C.ref: type = name_ref C, file.%C.decl [concrete = constants.%C] +// CHECK:STDOUT: %facet_value: %facet_type.8cb = facet_value %C.ref, (constants.%A.impl_witness, constants.%custom_witness.df9cc1.2) [concrete = constants.%facet_value] +// CHECK:STDOUT: %.loc8_13.2: %facet_type.8cb = converted %C.ref, %facet_value [concrete = constants.%facet_value] +// CHECK:STDOUT: %I.type: type = facet_type <@I, @I(constants.%facet_value)> [concrete = constants.%I.type.8a7] +// CHECK:STDOUT: } +// CHECK:STDOUT: %T.loc8_7.2: %I.type.8a7 = symbolic_binding T, 0 [symbolic = %T.loc8_7.1 (constants.%T.e69)] +// CHECK:STDOUT: %t.param: @F.%T.as_type.loc8_19.1 (%T.as_type.a68) = value_param call_param0 +// CHECK:STDOUT: %.loc8_19.1: type = splice_block %.loc8_19.2 [symbolic = %T.as_type.loc8_19.1 (constants.%T.as_type.a68)] { +// CHECK:STDOUT: %T.ref.loc8: %I.type.8a7 = name_ref T, %T.loc8_7.2 [symbolic = %T.loc8_7.1 (constants.%T.e69)] +// CHECK:STDOUT: %T.as_type.loc8_19.2: type = facet_access_type %T.ref.loc8 [symbolic = %T.as_type.loc8_19.1 (constants.%T.as_type.a68)] +// CHECK:STDOUT: %.loc8_19.2: type = converted %T.ref.loc8, %T.as_type.loc8_19.2 [symbolic = %T.as_type.loc8_19.1 (constants.%T.as_type.a68)] +// CHECK:STDOUT: } +// CHECK:STDOUT: %t: @F.%T.as_type.loc8_19.1 (%T.as_type.a68) = wrapper_binding t, %t.param +// CHECK:STDOUT: } +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: interface @A [from "generic_observe.carbon"] { +// CHECK:STDOUT: !members: +// CHECK:STDOUT: .Self = imports.%Main.import_ref.0a1 +// CHECK:STDOUT: witness = () +// CHECK:STDOUT: +// CHECK:STDOUT: !requires: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: generic interface @I(imports.%Main.import_ref.10abc5.4: %facet_type.8cb) [from "generic_observe.carbon"] { +// CHECK:STDOUT: %T.patt: %pattern_type.827 = symbolic_binding_pattern T, 0 [symbolic = %T.patt (constants.%T.patt.196)] +// CHECK:STDOUT: %T: %facet_type.8cb = symbolic_binding T, 0 [symbolic = %T (constants.%T.2b7)] +// CHECK:STDOUT: +// CHECK:STDOUT: !definition: +// CHECK:STDOUT: %I.type: type = facet_type <@I, @I(%T)> [symbolic = %I.type (constants.%I.type.715)] +// CHECK:STDOUT: %Self: @I.%I.type (%I.type.715) = symbolic_binding Self, 1 [symbolic = %Self (constants.%Self.a17)] +// CHECK:STDOUT: +// CHECK:STDOUT: interface { +// CHECK:STDOUT: !members: +// CHECK:STDOUT: .Self = imports.%Main.import_ref.603 +// CHECK:STDOUT: .U = imports.%Main.import_ref.327 +// CHECK:STDOUT: .GetU = imports.%Main.import_ref.c5a +// CHECK:STDOUT: .TakesT = imports.%Main.import_ref.f14 +// CHECK:STDOUT: witness = (imports.%Main.U, imports.%Main.GetU, imports.%Main.TakesT) +// CHECK:STDOUT: +// CHECK:STDOUT: !requires: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: +// CHECK:STDOUT: @I.observe { +// CHECK:STDOUT: observe constants.%T.2b7 == constants.%impl.elem0.0fe +// CHECK:STDOUT: } +// CHECK:STDOUT: } +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: interface @B [from "generic_observe.carbon"] { +// CHECK:STDOUT: !members: +// CHECK:STDOUT: .Self = imports.%Main.import_ref.c07 +// CHECK:STDOUT: witness = () +// CHECK:STDOUT: +// CHECK:STDOUT: !requires: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: impl @C.as.A.impl: %C.ref as %A.ref { +// CHECK:STDOUT: %A.impl_witness_table = impl_witness_table (), @C.as.A.impl [concrete] +// CHECK:STDOUT: %A.impl_witness: = impl_witness %A.impl_witness_table [concrete = constants.%A.impl_witness] +// CHECK:STDOUT: +// CHECK:STDOUT: !members: +// CHECK:STDOUT: extend %A.ref +// CHECK:STDOUT: witness = %A.impl_witness +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: class @C { +// CHECK:STDOUT: %complete_type: = complete_type_witness constants.%empty_struct_type [concrete = constants.%complete_type] +// CHECK:STDOUT: complete_type_witness = %complete_type +// CHECK:STDOUT: +// CHECK:STDOUT: !members: +// CHECK:STDOUT: .Self = constants.%C +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: generic fn @I.WithSelf.TakesT(imports.%Main.import_ref.10abc5.2: %facet_type.8cb, imports.%Main.import_ref.563720.2: @I.%I.type (%I.type.715)) [from "generic_observe.carbon"] { +// CHECK:STDOUT: %T: %facet_type.8cb = symbolic_binding T, 0 [symbolic = %T (constants.%T.2b7)] +// CHECK:STDOUT: %I.type: type = facet_type <@I, @I(%T)> [symbolic = %I.type (constants.%I.type.715)] +// CHECK:STDOUT: %Self: @I.WithSelf.TakesT.%I.type (%I.type.715) = symbolic_binding Self, 1 [symbolic = %Self (constants.%Self.a17)] +// CHECK:STDOUT: %Self.as_type: type = facet_access_type %Self [symbolic = %Self.as_type (constants.%Self.as_type.1df)] +// CHECK:STDOUT: %pattern_type.1: type = pattern_type %Self.as_type [symbolic = %pattern_type.1 (constants.%pattern_type.e16)] +// CHECK:STDOUT: %self.param_patt: @I.WithSelf.TakesT.%pattern_type.1 (%pattern_type.e16) = value_param_pattern [symbolic = %self.param_patt (constants.%self.param_patt.306)] +// CHECK:STDOUT: %self.patt: @I.WithSelf.TakesT.%pattern_type.1 (%pattern_type.e16) = at_binding_pattern self, %self.param_patt [symbolic = %self.patt (constants.%self.patt.cad)] +// CHECK:STDOUT: %T.as_type: type = facet_access_type %T [symbolic = %T.as_type (constants.%T.as_type.64c)] +// CHECK:STDOUT: %pattern_type.2: type = pattern_type %T.as_type [symbolic = %pattern_type.2 (constants.%pattern_type.bc3)] +// CHECK:STDOUT: %t.param_patt: @I.WithSelf.TakesT.%pattern_type.2 (%pattern_type.bc3) = value_param_pattern [symbolic = %t.param_patt (constants.%t.param_patt.2bb)] +// CHECK:STDOUT: %t.patt: @I.WithSelf.TakesT.%pattern_type.2 (%pattern_type.bc3) = at_binding_pattern t, %t.param_patt [symbolic = %t.patt (constants.%t.patt.974)] +// CHECK:STDOUT: +// CHECK:STDOUT: fn; +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: generic fn @I.WithSelf.GetU(imports.%Main.import_ref.10abc5.3: %facet_type.8cb, imports.%Main.import_ref.563720.3: @I.%I.type (%I.type.715)) [from "generic_observe.carbon"] { +// CHECK:STDOUT: %T: %facet_type.8cb = symbolic_binding T, 0 [symbolic = %T (constants.%T.2b7)] +// CHECK:STDOUT: %I.type: type = facet_type <@I, @I(%T)> [symbolic = %I.type (constants.%I.type.715)] +// CHECK:STDOUT: %Self: @I.WithSelf.GetU.%I.type (%I.type.715) = symbolic_binding Self, 1 [symbolic = %Self (constants.%Self.a17)] +// CHECK:STDOUT: %Self.as_type: type = facet_access_type %Self [symbolic = %Self.as_type (constants.%Self.as_type.1df)] +// CHECK:STDOUT: %pattern_type.1: type = pattern_type %Self.as_type [symbolic = %pattern_type.1 (constants.%pattern_type.e16)] +// CHECK:STDOUT: %self.param_patt: @I.WithSelf.GetU.%pattern_type.1 (%pattern_type.e16) = value_param_pattern [symbolic = %self.param_patt (constants.%self.param_patt.306)] +// CHECK:STDOUT: %self.patt: @I.WithSelf.GetU.%pattern_type.1 (%pattern_type.e16) = at_binding_pattern self, %self.param_patt [symbolic = %self.patt (constants.%self.patt.cad)] +// CHECK:STDOUT: %I.lookup_impl_witness: = lookup_impl_witness %Self, @I, @I(%T) [symbolic = %I.lookup_impl_witness (constants.%I.lookup_impl_witness.530)] +// CHECK:STDOUT: %impl.elem0: %facet_type.0e2 = impl_witness_access %I.lookup_impl_witness, element0 [symbolic = %impl.elem0 (constants.%impl.elem0.0fe)] +// CHECK:STDOUT: %as_type: type = facet_access_type %impl.elem0 [symbolic = %as_type (constants.%as_type.b29)] +// CHECK:STDOUT: %.1: Core.Form = init_form %as_type [symbolic = %.1 (constants.%.c94)] +// CHECK:STDOUT: %pattern_type.2: type = pattern_type %as_type [symbolic = %pattern_type.2 (constants.%pattern_type.304)] +// CHECK:STDOUT: %return.param_patt: @I.WithSelf.GetU.%pattern_type.2 (%pattern_type.304) = out_param_pattern [symbolic = %return.param_patt (constants.%return.param_patt.8e4)] +// CHECK:STDOUT: %return.patt: @I.WithSelf.GetU.%pattern_type.2 (%pattern_type.304) = return_slot_pattern %return.param_patt, invalid [symbolic = %return.patt (constants.%return.patt.9ec)] +// CHECK:STDOUT: +// CHECK:STDOUT: fn; +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: fn @Destroy.Op.loc8_13.1(%self.param: ref %empty_struct_type) = "no_op"; +// CHECK:STDOUT: +// CHECK:STDOUT: fn @Destroy.Op.loc8_13.2(%self.param: ref %C) { +// CHECK:STDOUT: !entry: +// CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: generic fn @F(%T.loc8_7.2: %I.type.8a7) { +// CHECK:STDOUT: %T.patt.loc8_7.2: %pattern_type.7b0 = symbolic_binding_pattern T, 0 [symbolic = %T.patt.loc8_7.2 (constants.%T.patt.fb5)] +// CHECK:STDOUT: %T.loc8_7.1: %I.type.8a7 = symbolic_binding T, 0 [symbolic = %T.loc8_7.1 (constants.%T.e69)] +// CHECK:STDOUT: %T.as_type.loc8_19.1: type = facet_access_type %T.loc8_7.1 [symbolic = %T.as_type.loc8_19.1 (constants.%T.as_type.a68)] +// CHECK:STDOUT: %pattern_type.loc8: type = pattern_type %T.as_type.loc8_19.1 [symbolic = %pattern_type.loc8 (constants.%pattern_type.cf2)] +// CHECK:STDOUT: %t.param_patt.loc8_17.2: @F.%pattern_type.loc8 (%pattern_type.cf2) = value_param_pattern [symbolic = %t.param_patt.loc8_17.2 (constants.%t.param_patt.135)] +// CHECK:STDOUT: %t.patt.loc8_17.2: @F.%pattern_type.loc8 (%pattern_type.cf2) = at_binding_pattern t, %t.param_patt.loc8_17.2 [symbolic = %t.patt.loc8_17.2 (constants.%t.patt.1b6)] +// CHECK:STDOUT: +// CHECK:STDOUT: !definition: +// CHECK:STDOUT: %require_complete.loc8: = require_complete_type %T.as_type.loc8_19.1 [symbolic = %require_complete.loc8 (constants.%require_complete.3ae)] +// CHECK:STDOUT: %I.lookup_impl_witness: = lookup_impl_witness %T.loc8_7.1, @I, @I(constants.%facet_value) [symbolic = %I.lookup_impl_witness (constants.%I.lookup_impl_witness.919)] +// CHECK:STDOUT: %impl.elem0.loc9_11.2: %facet_type.0e2 = impl_witness_access %I.lookup_impl_witness, element0 [symbolic = %impl.elem0.loc9_11.2 (constants.%impl.elem0.ae2)] +// CHECK:STDOUT: %as_type.loc9_11.2: type = facet_access_type %impl.elem0.loc9_11.2 [symbolic = %as_type.loc9_11.2 (constants.%as_type.93c)] +// CHECK:STDOUT: %require_complete.loc9: = require_complete_type %as_type.loc9_11.2 [symbolic = %require_complete.loc9 (constants.%require_complete.47f)] +// CHECK:STDOUT: %pattern_type.loc9: type = pattern_type %as_type.loc9_11.2 [symbolic = %pattern_type.loc9 (constants.%pattern_type.439)] +// CHECK:STDOUT: %u.patt.loc9_8.2: @F.%pattern_type.loc9 (%pattern_type.439) = ref_binding_pattern u [symbolic = %u.patt.loc9_8.2 (constants.%u.patt)] +// CHECK:STDOUT: %u.var_patt.loc9_3.2: @F.%pattern_type.loc9 (%pattern_type.439) = var_pattern %u.patt.loc9_8.2 [symbolic = %u.var_patt.loc9_3.2 (constants.%u.var_patt)] +// CHECK:STDOUT: %I.WithSelf.GetU.type: type = fn_type @I.WithSelf.GetU, @I.WithSelf(constants.%facet_value, %T.loc8_7.1) [symbolic = %I.WithSelf.GetU.type (constants.%I.WithSelf.GetU.type.fd3)] +// CHECK:STDOUT: %.loc9_17.2: type = fn_type_with_self_type %I.WithSelf.GetU.type, %T.loc8_7.1 [symbolic = %.loc9_17.2 (constants.%.086)] +// CHECK:STDOUT: %impl.elem1.loc9_17.2: @F.%.loc9_17.2 (%.086) = impl_witness_access %I.lookup_impl_witness, element1 [symbolic = %impl.elem1.loc9_17.2 (constants.%impl.elem1)] +// CHECK:STDOUT: %specific_impl_fn.loc9_17.2: = specific_impl_function %impl.elem1.loc9_17.2, @I.WithSelf.GetU(constants.%facet_value, %T.loc8_7.1) [symbolic = %specific_impl_fn.loc9_17.2 (constants.%specific_impl_fn.87f)] +// CHECK:STDOUT: %I.WithSelf.TakesT.type: type = fn_type @I.WithSelf.TakesT, @I.WithSelf(constants.%facet_value, %T.loc8_7.1) [symbolic = %I.WithSelf.TakesT.type (constants.%I.WithSelf.TakesT.type.f2f)] +// CHECK:STDOUT: %.loc19_4.2: type = fn_type_with_self_type %I.WithSelf.TakesT.type, %T.loc8_7.1 [symbolic = %.loc19_4.2 (constants.%.dea)] +// CHECK:STDOUT: %impl.elem2.loc19_4.2: @F.%.loc19_4.2 (%.dea) = impl_witness_access %I.lookup_impl_witness, element2 [symbolic = %impl.elem2.loc19_4.2 (constants.%impl.elem2)] +// CHECK:STDOUT: %Destroy.lookup_impl_witness: = lookup_impl_witness %impl.elem0.loc9_11.2, @Destroy [symbolic = %Destroy.lookup_impl_witness (constants.%Destroy.lookup_impl_witness)] +// CHECK:STDOUT: %Destroy.facet.loc9_3.3: %Destroy.type = facet_value %as_type.loc9_11.2, (%Destroy.lookup_impl_witness) [symbolic = %Destroy.facet.loc9_3.3 (constants.%Destroy.facet.707)] +// CHECK:STDOUT: %Destroy.WithSelf.Op.type: type = fn_type @Destroy.WithSelf.Op, @Destroy.WithSelf(%Destroy.facet.loc9_3.3) [symbolic = %Destroy.WithSelf.Op.type (constants.%Destroy.WithSelf.Op.type.83d)] +// CHECK:STDOUT: %.loc9_3.4: type = fn_type_with_self_type %Destroy.WithSelf.Op.type, %Destroy.facet.loc9_3.3 [symbolic = %.loc9_3.4 (constants.%.8d3)] +// CHECK:STDOUT: %impl.elem0.loc9_3.2: @F.%.loc9_3.4 (%.8d3) = impl_witness_access %Destroy.lookup_impl_witness, element0 [symbolic = %impl.elem0.loc9_3.2 (constants.%impl.elem0.706)] +// CHECK:STDOUT: %specific_impl_fn.loc9_3.2: = specific_impl_function %impl.elem0.loc9_3.2, @Destroy.WithSelf.Op(%Destroy.facet.loc9_3.3) [symbolic = %specific_impl_fn.loc9_3.2 (constants.%specific_impl_fn.977)] +// CHECK:STDOUT: +// CHECK:STDOUT: fn(%t.param: @F.%T.as_type.loc8_19.1 (%T.as_type.a68)) { +// CHECK:STDOUT: !entry: +// CHECK:STDOUT: %u.var: ref @F.%as_type.loc9_11.2 (%as_type.93c) = var_storage %u.var_patt.loc9_3.1 +// CHECK:STDOUT: %t.ref.loc9: @F.%T.as_type.loc8_19.1 (%T.as_type.a68) = name_ref t, %t +// CHECK:STDOUT: %.loc9_17.1: %I.assoc_type.cf6 = specific_constant imports.%Main.import_ref.c5a, @I.WithSelf(constants.%facet_value, constants.%T.e69) [concrete = constants.%assoc1.9b4] +// CHECK:STDOUT: %GetU.ref: %I.assoc_type.cf6 = name_ref GetU, %.loc9_17.1 [concrete = constants.%assoc1.9b4] +// CHECK:STDOUT: %impl.elem1.loc9_17.1: @F.%.loc9_17.2 (%.086) = impl_witness_access constants.%I.lookup_impl_witness.919, element1 [symbolic = %impl.elem1.loc9_17.2 (constants.%impl.elem1)] +// CHECK:STDOUT: %bound_method.loc9_17: = bound_method %t.ref.loc9, %impl.elem1.loc9_17.1 +// CHECK:STDOUT: %specific_impl_fn.loc9_17.1: = specific_impl_function %impl.elem1.loc9_17.1, @I.WithSelf.GetU(constants.%facet_value, constants.%T.e69) [symbolic = %specific_impl_fn.loc9_17.2 (constants.%specific_impl_fn.87f)] +// CHECK:STDOUT: %bound_method.loc9_23: = bound_method %t.ref.loc9, %specific_impl_fn.loc9_17.1 +// CHECK:STDOUT: %.loc9_3.1: ref @F.%as_type.loc9_11.2 (%as_type.93c) = splice_block %u.var {} +// CHECK:STDOUT: %I.WithSelf.GetU.call: init @F.%as_type.loc9_11.2 (%as_type.93c) to %.loc9_3.1 = call %bound_method.loc9_23(%t.ref.loc9) +// CHECK:STDOUT: assign %u.var, %I.WithSelf.GetU.call +// CHECK:STDOUT: %.loc9_11.1: type = splice_block %.loc9_11.4 [symbolic = %as_type.loc9_11.2 (constants.%as_type.93c)] { +// CHECK:STDOUT: %T.ref.loc9: %I.type.8a7 = name_ref T, %T.loc8_7.2 [symbolic = %T.loc8_7.1 (constants.%T.e69)] +// CHECK:STDOUT: %T.as_type.loc9: type = facet_access_type %T.ref.loc9 [symbolic = %T.as_type.loc8_19.1 (constants.%T.as_type.a68)] +// CHECK:STDOUT: %.loc9_11.2: type = converted %T.ref.loc9, %T.as_type.loc9 [symbolic = %T.as_type.loc8_19.1 (constants.%T.as_type.a68)] +// CHECK:STDOUT: %.loc9_11.3: %I.assoc_type.cf6 = specific_constant imports.%Main.import_ref.327, @I.WithSelf(constants.%facet_value, constants.%T.e69) [concrete = constants.%assoc0.64a] +// CHECK:STDOUT: %U.ref: %I.assoc_type.cf6 = name_ref U, %.loc9_11.3 [concrete = constants.%assoc0.64a] +// CHECK:STDOUT: %impl.elem0.loc9_11.1: %facet_type.0e2 = impl_witness_access constants.%I.lookup_impl_witness.919, element0 [symbolic = %impl.elem0.loc9_11.2 (constants.%impl.elem0.ae2)] +// CHECK:STDOUT: %as_type.loc9_11.1: type = facet_access_type %impl.elem0.loc9_11.1 [symbolic = %as_type.loc9_11.2 (constants.%as_type.93c)] +// CHECK:STDOUT: %.loc9_11.4: type = converted %impl.elem0.loc9_11.1, %as_type.loc9_11.1 [symbolic = %as_type.loc9_11.2 (constants.%as_type.93c)] +// CHECK:STDOUT: } +// CHECK:STDOUT: %u: ref @F.%as_type.loc9_11.2 (%as_type.93c) = wrapper_binding u, %u.var +// CHECK:STDOUT: name_binding_decl { +// CHECK:STDOUT: %u.patt.loc9_8.1: @F.%pattern_type.loc9 (%pattern_type.439) = ref_binding_pattern u [symbolic = %u.patt.loc9_8.2 (constants.%u.patt)] +// CHECK:STDOUT: %u.var_patt.loc9_3.1: @F.%pattern_type.loc9 (%pattern_type.439) = var_pattern %u.patt.loc9_8.1 [symbolic = %u.var_patt.loc9_3.2 (constants.%u.var_patt)] +// CHECK:STDOUT: } +// CHECK:STDOUT: %t.ref.loc19: @F.%T.as_type.loc8_19.1 (%T.as_type.a68) = name_ref t, %t +// CHECK:STDOUT: %.loc19_4.1: %I.assoc_type.cf6 = specific_constant imports.%Main.import_ref.f14, @I.WithSelf(constants.%facet_value, constants.%T.e69) [concrete = constants.%assoc2.e5d] +// CHECK:STDOUT: %TakesT.ref: %I.assoc_type.cf6 = name_ref TakesT, %.loc19_4.1 [concrete = constants.%assoc2.e5d] +// CHECK:STDOUT: %impl.elem2.loc19_4.1: @F.%.loc19_4.2 (%.dea) = impl_witness_access constants.%I.lookup_impl_witness.919, element2 [symbolic = %impl.elem2.loc19_4.2 (constants.%impl.elem2)] +// CHECK:STDOUT: %bound_method.loc19: = bound_method %t.ref.loc19, %impl.elem2.loc19_4.1 +// CHECK:STDOUT: %u.ref: ref @F.%as_type.loc9_11.2 (%as_type.93c) = name_ref u, %u +// CHECK:STDOUT: %facet_type: type = facet_type <@Destroy & @B> [concrete = constants.%facet_type.22d] +// CHECK:STDOUT: %impl.elem0.loc9_3.1: @F.%.loc9_3.4 (%.8d3) = impl_witness_access constants.%Destroy.lookup_impl_witness, element0 [symbolic = %impl.elem0.loc9_3.2 (constants.%impl.elem0.706)] +// CHECK:STDOUT: %bound_method.loc9_3.1: = bound_method %u.var, %impl.elem0.loc9_3.1 +// CHECK:STDOUT: %Destroy.facet.loc9_3.1: %Destroy.type = facet_value constants.%as_type.93c, (constants.%Destroy.lookup_impl_witness) [symbolic = %Destroy.facet.loc9_3.3 (constants.%Destroy.facet.707)] +// CHECK:STDOUT: %.loc9_3.2: %Destroy.type = converted constants.%as_type.93c, %Destroy.facet.loc9_3.1 [symbolic = %Destroy.facet.loc9_3.3 (constants.%Destroy.facet.707)] +// CHECK:STDOUT: %Destroy.facet.loc9_3.2: %Destroy.type = facet_value constants.%as_type.93c, (constants.%Destroy.lookup_impl_witness) [symbolic = %Destroy.facet.loc9_3.3 (constants.%Destroy.facet.707)] +// CHECK:STDOUT: %.loc9_3.3: %Destroy.type = converted constants.%as_type.93c, %Destroy.facet.loc9_3.2 [symbolic = %Destroy.facet.loc9_3.3 (constants.%Destroy.facet.707)] +// CHECK:STDOUT: %specific_impl_fn.loc9_3.1: = specific_impl_function %impl.elem0.loc9_3.1, @Destroy.WithSelf.Op(constants.%Destroy.facet.707) [symbolic = %specific_impl_fn.loc9_3.2 (constants.%specific_impl_fn.977)] +// CHECK:STDOUT: %bound_method.loc9_3.2: = bound_method %u.var, %specific_impl_fn.loc9_3.1 +// CHECK:STDOUT: %Destroy.WithSelf.Op.call: init %empty_tuple.type = call %bound_method.loc9_3.2(%u.var) +// CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: +// CHECK:STDOUT: } +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: specific @A.WithSelf(constants.%Self.626) { +// CHECK:STDOUT: !definition: +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: specific @A.WithSelf(constants.%A.facet) { +// CHECK:STDOUT: !definition: +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: specific @I(constants.%T.2b7) { +// CHECK:STDOUT: %T.patt => constants.%T.patt.196 +// CHECK:STDOUT: %T => constants.%T.2b7 +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: specific @B.WithSelf(constants.%Self.ed4) { +// CHECK:STDOUT: !definition: +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: specific @I.WithSelf(constants.%T.2b7, constants.%Self.a17) {} +// CHECK:STDOUT: +// CHECK:STDOUT: specific @I.WithSelf.TakesT(constants.%T.2b7, constants.%Self.a17) { +// CHECK:STDOUT: %T => constants.%T.2b7 +// CHECK:STDOUT: %I.type => constants.%I.type.715 +// CHECK:STDOUT: %Self => constants.%Self.a17 +// CHECK:STDOUT: %Self.as_type => constants.%Self.as_type.1df +// CHECK:STDOUT: %pattern_type.1 => constants.%pattern_type.e16 +// CHECK:STDOUT: %self.param_patt => constants.%self.param_patt.306 +// CHECK:STDOUT: %self.patt => constants.%self.patt.cad +// CHECK:STDOUT: %T.as_type => constants.%T.as_type.64c +// CHECK:STDOUT: %pattern_type.2 => constants.%pattern_type.bc3 +// CHECK:STDOUT: %t.param_patt => constants.%t.param_patt.2bb +// CHECK:STDOUT: %t.patt => constants.%t.patt.974 +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: specific @I.WithSelf.GetU(constants.%T.2b7, constants.%Self.a17) { +// CHECK:STDOUT: %T => constants.%T.2b7 +// CHECK:STDOUT: %I.type => constants.%I.type.715 +// CHECK:STDOUT: %Self => constants.%Self.a17 +// CHECK:STDOUT: %Self.as_type => constants.%Self.as_type.1df +// CHECK:STDOUT: %pattern_type.1 => constants.%pattern_type.e16 +// CHECK:STDOUT: %self.param_patt => constants.%self.param_patt.306 +// CHECK:STDOUT: %self.patt => constants.%self.patt.cad +// CHECK:STDOUT: %I.lookup_impl_witness => constants.%I.lookup_impl_witness.530 +// CHECK:STDOUT: %impl.elem0 => constants.%impl.elem0.0fe +// CHECK:STDOUT: %as_type => constants.%as_type.b29 +// CHECK:STDOUT: %.1 => constants.%.c94 +// CHECK:STDOUT: %pattern_type.2 => constants.%pattern_type.304 +// CHECK:STDOUT: %return.param_patt => constants.%return.param_patt.8e4 +// CHECK:STDOUT: %return.patt => constants.%return.patt.9ec +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: specific @I(constants.%facet_value) { +// CHECK:STDOUT: %T.patt => constants.%T.patt.196 +// CHECK:STDOUT: %T => constants.%facet_value +// CHECK:STDOUT: +// CHECK:STDOUT: !definition: +// CHECK:STDOUT: %I.type => constants.%I.type.8a7 +// CHECK:STDOUT: %Self => constants.%Self.3ca +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: specific @I.WithSelf(constants.%facet_value, constants.%Self.a17) { +// CHECK:STDOUT: !definition: +// CHECK:STDOUT: %T => constants.%facet_value +// CHECK:STDOUT: %I.assoc_type => constants.%I.assoc_type.cf6 +// CHECK:STDOUT: %assoc0 => constants.%assoc0.64a +// CHECK:STDOUT: %I.type => constants.%I.type.8a7 +// CHECK:STDOUT: %Self => constants.%Self.a17 +// CHECK:STDOUT: %I.WithSelf.GetU.type => constants.%I.WithSelf.GetU.type.0c5 +// CHECK:STDOUT: %I.WithSelf.GetU => constants.%I.WithSelf.GetU.878 +// CHECK:STDOUT: %assoc1 => constants.%assoc1.9b4 +// CHECK:STDOUT: %I.WithSelf.TakesT.type => constants.%I.WithSelf.TakesT.type.bd4 +// CHECK:STDOUT: %I.WithSelf.TakesT => constants.%I.WithSelf.TakesT.148 +// CHECK:STDOUT: %assoc2 => constants.%assoc2.e5d +// CHECK:STDOUT: %I.lookup_impl_witness => constants.%I.lookup_impl_witness.c15 +// CHECK:STDOUT: %impl.elem0 => constants.%impl.elem0.a31 +// CHECK:STDOUT: %as_type => constants.%as_type.7cc +// CHECK:STDOUT: %T.as_type => constants.%C +// CHECK:STDOUT: %eq => constants.%eq.f2b +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: specific @F(constants.%T.e69) { +// CHECK:STDOUT: %T.patt.loc8_7.2 => constants.%T.patt.fb5 +// CHECK:STDOUT: %T.loc8_7.1 => constants.%T.e69 +// CHECK:STDOUT: %T.as_type.loc8_19.1 => constants.%T.as_type.a68 +// CHECK:STDOUT: %pattern_type.loc8 => constants.%pattern_type.cf2 +// CHECK:STDOUT: %t.param_patt.loc8_17.2 => constants.%t.param_patt.135 +// CHECK:STDOUT: %t.patt.loc8_17.2 => constants.%t.patt.1b6 +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: specific @I.WithSelf(constants.%facet_value, constants.%T.e69) { +// CHECK:STDOUT: !definition: +// CHECK:STDOUT: %T => constants.%facet_value +// CHECK:STDOUT: %I.assoc_type => constants.%I.assoc_type.cf6 +// CHECK:STDOUT: %assoc0 => constants.%assoc0.64a +// CHECK:STDOUT: %I.type => constants.%I.type.8a7 +// CHECK:STDOUT: %Self => constants.%T.e69 +// CHECK:STDOUT: %I.WithSelf.GetU.type => constants.%I.WithSelf.GetU.type.fd3 +// CHECK:STDOUT: %I.WithSelf.GetU => constants.%I.WithSelf.GetU.01c +// CHECK:STDOUT: %assoc1 => constants.%assoc1.9b4 +// CHECK:STDOUT: %I.WithSelf.TakesT.type => constants.%I.WithSelf.TakesT.type.f2f +// CHECK:STDOUT: %I.WithSelf.TakesT => constants.%I.WithSelf.TakesT.9b6 +// CHECK:STDOUT: %assoc2 => constants.%assoc2.e5d +// CHECK:STDOUT: %I.lookup_impl_witness => constants.%I.lookup_impl_witness.919 +// CHECK:STDOUT: %impl.elem0 => constants.%impl.elem0.ae2 +// CHECK:STDOUT: %as_type => constants.%as_type.93c +// CHECK:STDOUT: %T.as_type => constants.%C +// CHECK:STDOUT: %eq => constants.%eq.e81 +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: specific @I.WithSelf.GetU(constants.%facet_value, constants.%T.e69) { +// CHECK:STDOUT: %T => constants.%facet_value +// CHECK:STDOUT: %I.type => constants.%I.type.8a7 +// CHECK:STDOUT: %Self => constants.%T.e69 +// CHECK:STDOUT: %Self.as_type => constants.%T.as_type.a68 +// CHECK:STDOUT: %pattern_type.1 => constants.%pattern_type.cf2 +// CHECK:STDOUT: %self.param_patt => constants.%self.param_patt.8a4 +// CHECK:STDOUT: %self.patt => constants.%self.patt.1fe +// CHECK:STDOUT: %I.lookup_impl_witness => constants.%I.lookup_impl_witness.919 +// CHECK:STDOUT: %impl.elem0 => constants.%impl.elem0.ae2 +// CHECK:STDOUT: %as_type => constants.%as_type.93c +// CHECK:STDOUT: %.1 => constants.%.295 +// CHECK:STDOUT: %pattern_type.2 => constants.%pattern_type.439 +// CHECK:STDOUT: %return.param_patt => constants.%return.param_patt.099 +// CHECK:STDOUT: %return.patt => constants.%return.patt.b38 +// CHECK:STDOUT: } +// CHECK:STDOUT: diff --git a/toolchain/check/testdata/interface/require.carbon b/toolchain/check/testdata/interface/require.carbon index 49828a24de32..ecccf916dd91 100644 --- a/toolchain/check/testdata/interface/require.carbon +++ b/toolchain/check/testdata/interface/require.carbon @@ -411,6 +411,8 @@ interface Z(T:! type) { // CHECK:STDOUT: @Z.WithSelf.Self.as_type.impls.Y.type.require { // CHECK:STDOUT: require @Z.WithSelf.Self.as_type.impls.Y.type.require.%Self.as_type.loc9_18.1 impls @Z.WithSelf.Self.as_type.impls.Y.type.require.%Y.ref // CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: generic require @Z.WithSelf.Self.as_type.impls.Y.type.require(@Z.%Self: %Z.type) { @@ -480,6 +482,8 @@ interface Z(T:! type) { // CHECK:STDOUT: @Z.WithSelf.Self.as_type.impls.Y.type.require { // CHECK:STDOUT: require @Z.WithSelf.Self.as_type.impls.Y.type.require.%Self.as_type.loc9_18.1 impls @Z.WithSelf.Self.as_type.impls.Y.type.require.%Y.type.loc9_30.1 // CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: generic require @Z.WithSelf.Self.as_type.impls.Y.type.require(@Z.%Self: %Z.type) { @@ -545,6 +549,8 @@ interface Z(T:! type) { // CHECK:STDOUT: @Z.WithSelf.Self.as_type.impls.Y.type.require { // CHECK:STDOUT: require @Z.WithSelf.Self.as_type.impls.Y.type.require.%Self.as_type.loc9_11.1 impls @Z.WithSelf.Self.as_type.impls.Y.type.require.%Y.ref // CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: generic require @Z.WithSelf.Self.as_type.impls.Y.type.require(@Z.%Self: %Z.type) { @@ -598,6 +604,8 @@ interface Z(T:! type) { // CHECK:STDOUT: @Z.WithSelf.Self.as_type.impls.Y.type.require { // CHECK:STDOUT: require @Z.WithSelf.Self.as_type.impls.Y.type.require.%.loc9 impls @Z.WithSelf.Self.as_type.impls.Y.type.require.%Y.ref // CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: generic require @Z.WithSelf.Self.as_type.impls.Y.type.require(@Z.%Self: %Z.type) { @@ -658,6 +666,8 @@ interface Z(T:! type) { // CHECK:STDOUT: @Z.WithSelf.C.impls.Y.type.require { // CHECK:STDOUT: require @Z.WithSelf.C.impls.Y.type.require.%C.loc9_17.1 impls @Z.WithSelf.C.impls.Y.type.require.%Y.ref // CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: generic require @Z.WithSelf.C.impls.Y.type.require(@Z.%Self: %Z.type) { @@ -730,6 +740,8 @@ interface Z(T:! type) { // CHECK:STDOUT: @Z.WithSelf.Self.as_type.impls.Y_where.type.require { // CHECK:STDOUT: require @Z.WithSelf.Self.as_type.impls.Y_where.type.require.%Self.as_type.loc7_11.1 impls @Z.WithSelf.Self.as_type.impls.Y_where.type.require.%.loc7_19 // CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: generic require @Z.WithSelf.Self.as_type.impls.Y_where.type.require(@Z.%Self: %Z.type) { @@ -809,6 +821,8 @@ interface Z(T:! type) { // CHECK:STDOUT: @Z.WithSelf.T.impls.Z.type.require { // CHECK:STDOUT: require @Z.WithSelf.T.impls.Z.type.require.%T.ref impls @Z.WithSelf.T.impls.Z.type.require.%Z.type.loc5_25.1 // CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: @@ -895,6 +909,8 @@ interface Z(T:! type) { // CHECK:STDOUT: @Z.WithSelf.Self.as_type.impls.Y_where.type.require { // CHECK:STDOUT: require @Z.WithSelf.Self.as_type.impls.Y_where.type.require.%Self.as_type.loc10_11.1 impls @Z.WithSelf.Self.as_type.impls.Y_where.type.require.%.loc10_19 // CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: generic require @Z.WithSelf.Self.as_type.impls.Y_where.type.require(@Z.%Self: %Z.type) { @@ -972,6 +988,8 @@ interface Z(T:! type) { // CHECK:STDOUT: @Z.WithSelf.Self.as_type.impls.Z.type.require { // CHECK:STDOUT: require @Z.WithSelf.Self.as_type.impls.Z.type.require.%Self.as_type.loc11_11.1 impls @Z.WithSelf.Self.as_type.impls.Z.type.require.%Z.type.loc11_20 // CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/interface/self.carbon b/toolchain/check/testdata/interface/self.carbon index eb83162a45bf..8b5e87eb4878 100644 --- a/toolchain/check/testdata/interface/self.carbon +++ b/toolchain/check/testdata/interface/self.carbon @@ -75,6 +75,8 @@ interface UseSelf { // CHECK:STDOUT: witness = (@UseSelf.WithSelf.%UseSelf.WithSelf.F.decl) // CHECK:STDOUT: // CHECK:STDOUT: !requires: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: generic fn @UseSelf.WithSelf.F(@UseSelf.%Self: %UseSelf.type) { diff --git a/toolchain/check/testdata/interface/syntactic_merge.carbon b/toolchain/check/testdata/interface/syntactic_merge.carbon index 582c4a6fdfb2..e52d8c432dc2 100644 --- a/toolchain/check/testdata/interface/syntactic_merge.carbon +++ b/toolchain/check/testdata/interface/syntactic_merge.carbon @@ -283,6 +283,8 @@ interface Foo(a:! const (const C)) {} // CHECK:STDOUT: witness = () // CHECK:STDOUT: // CHECK:STDOUT: !requires: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: @@ -303,6 +305,8 @@ interface Foo(a:! const (const C)) {} // CHECK:STDOUT: witness = () // CHECK:STDOUT: // CHECK:STDOUT: !requires: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: @@ -388,6 +392,8 @@ interface Foo(a:! const (const C)) {} // CHECK:STDOUT: witness = () // CHECK:STDOUT: // CHECK:STDOUT: !requires: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: @@ -475,6 +481,8 @@ interface Foo(a:! const (const C)) {} // CHECK:STDOUT: witness = () // CHECK:STDOUT: // CHECK:STDOUT: !requires: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: @@ -567,6 +575,8 @@ interface Foo(a:! const (const C)) {} // CHECK:STDOUT: witness = () // CHECK:STDOUT: // CHECK:STDOUT: !requires: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: @@ -758,6 +768,8 @@ interface Foo(a:! const (const C)) {} // CHECK:STDOUT: witness = () // CHECK:STDOUT: // CHECK:STDOUT: !requires: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: @@ -785,6 +797,8 @@ interface Foo(a:! const (const C)) {} // CHECK:STDOUT: witness = () // CHECK:STDOUT: // CHECK:STDOUT: !requires: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: @@ -893,6 +907,8 @@ interface Foo(a:! const (const C)) {} // CHECK:STDOUT: witness = () // CHECK:STDOUT: // CHECK:STDOUT: !requires: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: @@ -988,6 +1004,8 @@ interface Foo(a:! const (const C)) {} // CHECK:STDOUT: witness = () // CHECK:STDOUT: // CHECK:STDOUT: !requires: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: @@ -1083,6 +1101,8 @@ interface Foo(a:! const (const C)) {} // CHECK:STDOUT: witness = () // CHECK:STDOUT: // CHECK:STDOUT: !requires: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: @@ -1230,6 +1250,8 @@ interface Foo(a:! const (const C)) {} // CHECK:STDOUT: witness = () // CHECK:STDOUT: // CHECK:STDOUT: !requires: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: @@ -1325,6 +1347,8 @@ interface Foo(a:! const (const C)) {} // CHECK:STDOUT: witness = () // CHECK:STDOUT: // CHECK:STDOUT: !requires: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/interface/todo_define_not_default.carbon b/toolchain/check/testdata/interface/todo_define_not_default.carbon index 8fb290a2bdfe..f5a2ddcfdbb5 100644 --- a/toolchain/check/testdata/interface/todo_define_not_default.carbon +++ b/toolchain/check/testdata/interface/todo_define_not_default.carbon @@ -148,6 +148,8 @@ interface I { // CHECK:STDOUT: witness = (@I.WithSelf.%I.WithSelf.F.decl, @I.WithSelf.%I.WithSelf.G.decl, @I.WithSelf.%T, @I.WithSelf.%N) // CHECK:STDOUT: // CHECK:STDOUT: !requires: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: generic fn @I.WithSelf.F(@I.%Self: %I.type) { @@ -156,6 +158,8 @@ interface I { // CHECK:STDOUT: fn() { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/interop/cpp/basics/import/cpp_namespace.carbon b/toolchain/check/testdata/interop/cpp/basics/import/cpp_namespace.carbon index e67b11aec92c..0c0f5b5872a5 100644 --- a/toolchain/check/testdata/interop/cpp/basics/import/cpp_namespace.carbon +++ b/toolchain/check/testdata/interop/cpp/basics/import/cpp_namespace.carbon @@ -162,5 +162,7 @@ fn F() { // CHECK:STDOUT: %system_function.ref: %system_function.cpp_overload_set.type = name_ref system_function, imports.%system_function.cpp_overload_set.value [concrete = constants.%system_function.cpp_overload_set.value] // CHECK:STDOUT: %system_function.call: init %empty_tuple.type = call imports.%system_function.decl() // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/interop/cpp/basics/import/import.carbon b/toolchain/check/testdata/interop/cpp/basics/import/import.carbon index a43a19cd0215..172df7e5acff 100644 --- a/toolchain/check/testdata/interop/cpp/basics/import/import.carbon +++ b/toolchain/check/testdata/interop/cpp/basics/import/import.carbon @@ -140,6 +140,8 @@ fn F() { // CHECK:STDOUT: %x.ref: = name_ref x, %x [concrete = ] // CHECK:STDOUT: %Foo.ref: = name_ref Foo, [concrete = ] // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- fail_todo_import_function_api.carbon @@ -187,5 +189,7 @@ fn F() { // CHECK:STDOUT: %FooInt.ref: = name_ref FooInt, imports.%Main.FooInt [concrete = ] // CHECK:STDOUT: %int_9: Core.IntLiteral = int_value 9 [concrete = constants.%int_9] // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/interop/cpp/basics/import/indirect.carbon b/toolchain/check/testdata/interop/cpp/basics/import/indirect.carbon index 1d0d9ac233b2..9c2270669fc1 100644 --- a/toolchain/check/testdata/interop/cpp/basics/import/indirect.carbon +++ b/toolchain/check/testdata/interop/cpp/basics/import/indirect.carbon @@ -191,6 +191,8 @@ fn UseZ() -> Cpp.A.Z { // CHECK:STDOUT: %X.cpp_destructor.bound: = bound_method %.loc9_12.2, constants.%X.cpp_destructor // CHECK:STDOUT: %X.cpp_destructor.call: init %empty_tuple.type = call %X.cpp_destructor.bound(%.loc9_12.2) // CHECK:STDOUT: return %Int.as.Copy.impl.Op.call +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Function() -> out %return.param: %i32 { @@ -206,6 +208,8 @@ fn UseZ() -> Cpp.A.Z { // CHECK:STDOUT: %X.cpp_destructor.bound: = bound_method %.loc15_12.2, constants.%X.cpp_destructor // CHECK:STDOUT: %X.cpp_destructor.call: init %empty_tuple.type = call %X.cpp_destructor.bound(%.loc15_12.2) // CHECK:STDOUT: return %X.g.call +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- indirect_import_via_alias.carbon @@ -322,6 +326,8 @@ fn UseZ() -> Cpp.A.Z { // CHECK:STDOUT: %X.cpp_destructor.bound: = bound_method %ax.var, constants.%X.cpp_destructor // CHECK:STDOUT: %X.cpp_destructor.call: init %empty_tuple.type = call %X.cpp_destructor.bound(%ax.var) // CHECK:STDOUT: return %.loc10_24 to %return.param +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- import_template.carbon @@ -403,6 +409,8 @@ fn UseZ() -> Cpp.A.Z { // CHECK:STDOUT: %Y.cpp_destructor.bound: = bound_method %.loc9_12.2, constants.%Y.cpp_destructor.be1864.1 // CHECK:STDOUT: %Y.cpp_destructor.call: init %empty_tuple.type = call %Y.cpp_destructor.bound(%.loc9_12.2) // CHECK:STDOUT: return %Int.as.Copy.impl.Op.call +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @UseZ() -> out %return.param: %Z { @@ -430,5 +438,7 @@ fn UseZ() -> Cpp.A.Z { // CHECK:STDOUT: %Y.cpp_destructor.bound: = bound_method %.loc15_12.2, constants.%Y.cpp_destructor.be1864.2 // CHECK:STDOUT: %Y.cpp_destructor.call: init %empty_tuple.type = call %Y.cpp_destructor.bound(%.loc15_12.2) // CHECK:STDOUT: return %.loc15_13.7 to %return.param +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/interop/cpp/basics/inline/import.carbon b/toolchain/check/testdata/interop/cpp/basics/inline/import.carbon index 5c574872b584..aae9db9a2cdd 100644 --- a/toolchain/check/testdata/interop/cpp/basics/inline/import.carbon +++ b/toolchain/check/testdata/interop/cpp/basics/inline/import.carbon @@ -79,6 +79,8 @@ fn Run() { // CHECK:STDOUT: %func.ref: %func.cpp_overload_set.type = name_ref func, imports.%func.cpp_overload_set.value [concrete = constants.%func.cpp_overload_set.value] // CHECK:STDOUT: %func.call: init %empty_tuple.type = call imports.%func.decl() // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- with_language_marker.carbon @@ -112,5 +114,7 @@ fn Run() { // CHECK:STDOUT: %another_func.ref: %another_func.cpp_overload_set.type = name_ref another_func, imports.%another_func.cpp_overload_set.value [concrete = constants.%another_func.cpp_overload_set.value] // CHECK:STDOUT: %another_func.call: init %empty_tuple.type = call imports.%another_func.decl() // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/interop/cpp/basics/unsupported_decl_type.carbon b/toolchain/check/testdata/interop/cpp/basics/unsupported_decl_type.carbon index a2e284bdda8b..a11020038434 100644 --- a/toolchain/check/testdata/interop/cpp/basics/unsupported_decl_type.carbon +++ b/toolchain/check/testdata/interop/cpp/basics/unsupported_decl_type.carbon @@ -54,5 +54,7 @@ fn F() -> i32 { // CHECK:STDOUT: %Cpp.ref: = name_ref Cpp, imports.%Cpp [concrete = imports.%Cpp] // CHECK:STDOUT: %a.ref: = name_ref a, [concrete = ] // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/interop/cpp/class/import/abstract.carbon b/toolchain/check/testdata/interop/cpp/class/import/abstract.carbon index a18a6055f6c4..dbb73dbceea5 100644 --- a/toolchain/check/testdata/interop/cpp/class/import/abstract.carbon +++ b/toolchain/check/testdata/interop/cpp/class/import/abstract.carbon @@ -151,5 +151,7 @@ fn F() -> Cpp.AbstractFinal { // CHECK:STDOUT: %.loc11_14.1: ref %AbstractFinal = splice_block %return.param {} // CHECK:STDOUT: %F.call: init %AbstractFinal to %.loc11_14.1 = call %F.ref() // CHECK:STDOUT: return %F.call to %return.param +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/interop/cpp/class/import/access.carbon b/toolchain/check/testdata/interop/cpp/class/import/access.carbon index a2bdc80955b8..63d0edd98483 100644 --- a/toolchain/check/testdata/interop/cpp/class/import/access.carbon +++ b/toolchain/check/testdata/interop/cpp/class/import/access.carbon @@ -1666,6 +1666,8 @@ fn Call(var instance: Cpp.PublicPrivate) { // CHECK:STDOUT: %static_data.patt: %pattern_type.6b6 = value_binding_pattern static_data [concrete = constants.%static_data.patt.405] // CHECK:STDOUT: } // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- import_non_function_member_public_extend.carbon @@ -1713,6 +1715,8 @@ fn Call(var instance: Cpp.PublicPrivate) { // CHECK:STDOUT: %static_data.patt: %pattern_type.6b6 = value_binding_pattern static_data [concrete = constants.%static_data.patt.405] // CHECK:STDOUT: } // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- import_non_function_member_protected_extend_call_in_member.carbon @@ -1797,6 +1801,8 @@ fn Call(var instance: Cpp.PublicPrivate) { // CHECK:STDOUT: %base_static_data.patt: %pattern_type.6b6 = value_binding_pattern base_static_data [concrete = constants.%base_static_data.patt] // CHECK:STDOUT: } // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- import_function_member_public.carbon @@ -1843,6 +1849,8 @@ fn Call(var instance: Cpp.PublicPrivate) { // CHECK:STDOUT: %static_fn.ref: %S.static_fn.cpp_overload_set.type = name_ref static_fn, imports.%S.static_fn.cpp_overload_set.value [concrete = constants.%S.static_fn.cpp_overload_set.value] // CHECK:STDOUT: %S.static_fn.call: init %empty_tuple.type = call imports.%S.static_fn.decl() // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- fail_todo_import_function_member_protected_extend_call_instance_in_member.carbon @@ -1875,6 +1883,8 @@ fn Call(var instance: Cpp.PublicPrivate) { // CHECK:STDOUT: %instance_fn.ref: %C.instance_fn.cpp_overload_set.type = name_ref instance_fn, imports.%C.instance_fn.cpp_overload_set.value [concrete = constants.%C.instance_fn.cpp_overload_set.value] // CHECK:STDOUT: %bound_method: = bound_method %self.ref, %instance_fn.ref // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- import_function_member_protected_extend_call_static_in_member.carbon @@ -1924,6 +1934,8 @@ fn Call(var instance: Cpp.PublicPrivate) { // CHECK:STDOUT: %static_fn.ref.loc12: %C.static_fn.cpp_overload_set.type = name_ref static_fn, imports.%C.static_fn.cpp_overload_set.value [concrete = constants.%C.static_fn.cpp_overload_set.value] // CHECK:STDOUT: %C.static_fn.call.loc12: init %empty_tuple.type = call imports.%C.static_fn.decl() // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- import_overload_set_public.carbon @@ -2023,6 +2035,8 @@ fn Call(var instance: Cpp.PublicPrivate) { // CHECK:STDOUT: %PublicCall.cpp_destructor.bound.loc8: = bound_method %.loc8_37.3, constants.%PublicCall.cpp_destructor // CHECK:STDOUT: %PublicCall.cpp_destructor.call.loc8: init %empty_tuple.type = call %PublicCall.cpp_destructor.bound.loc8(%.loc8_37.3) // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- import_overload_set_protected_base.carbon @@ -2154,6 +2168,8 @@ fn Call(var instance: Cpp.PublicPrivate) { // CHECK:STDOUT: %PublicCall.cpp_destructor.bound: = bound_method %.loc11_49.3, constants.%PublicCall.cpp_destructor // CHECK:STDOUT: %PublicCall.cpp_destructor.call: init %empty_tuple.type = call %PublicCall.cpp_destructor.bound(%.loc11_49.3) // CHECK:STDOUT: return %.loc11_52 to %return.param +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @D.MakeProtected() -> out %return.param: %D { @@ -2183,6 +2199,8 @@ fn Call(var instance: Cpp.PublicPrivate) { // CHECK:STDOUT: %ProtectedCall.cpp_destructor.bound: = bound_method %.loc17_55.3, constants.%ProtectedCall.cpp_destructor // CHECK:STDOUT: %ProtectedCall.cpp_destructor.call: init %empty_tuple.type = call %ProtectedCall.cpp_destructor.bound(%.loc17_55.3) // CHECK:STDOUT: return %.loc17_58 to %return.param +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @D.CallPublic() { @@ -2203,6 +2221,8 @@ fn Call(var instance: Cpp.PublicPrivate) { // CHECK:STDOUT: %PublicCall.cpp_destructor.bound: = bound_method %.loc23_40.3, constants.%PublicCall.cpp_destructor // CHECK:STDOUT: %PublicCall.cpp_destructor.call: init %empty_tuple.type = call %PublicCall.cpp_destructor.bound(%.loc23_40.3) // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @D.CallProtected() { @@ -2223,6 +2243,8 @@ fn Call(var instance: Cpp.PublicPrivate) { // CHECK:STDOUT: %ProtectedCall.cpp_destructor.bound: = bound_method %.loc29_46.3, constants.%ProtectedCall.cpp_destructor // CHECK:STDOUT: %ProtectedCall.cpp_destructor.call: init %empty_tuple.type = call %ProtectedCall.cpp_destructor.bound(%.loc29_46.3) // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- import_overload_set_public_base_class_call_public.carbon @@ -2286,6 +2308,8 @@ fn Call(var instance: Cpp.PublicPrivate) { // CHECK:STDOUT: %PublicCall.cpp_destructor.bound: = bound_method %.loc8_49.3, constants.%PublicCall.cpp_destructor // CHECK:STDOUT: %PublicCall.cpp_destructor.call: init %empty_tuple.type = call %PublicCall.cpp_destructor.bound(%.loc8_49.3) // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- import_overload_set_public_base_class_derived_call_non_private.carbon @@ -2398,6 +2422,8 @@ fn Call(var instance: Cpp.PublicPrivate) { // CHECK:STDOUT: %PublicCall.cpp_destructor.bound: = bound_method %.loc11_40.3, constants.%PublicCall.cpp_destructor // CHECK:STDOUT: %PublicCall.cpp_destructor.call: init %empty_tuple.type = call %PublicCall.cpp_destructor.bound(%.loc11_40.3) // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- import_overload_set_protected_base_class_derived_call_non_private.carbon @@ -2510,6 +2536,8 @@ fn Call(var instance: Cpp.PublicPrivate) { // CHECK:STDOUT: %PublicCall.cpp_destructor.bound: = bound_method %.loc11_40.3, constants.%PublicCall.cpp_destructor // CHECK:STDOUT: %PublicCall.cpp_destructor.call: init %empty_tuple.type = call %PublicCall.cpp_destructor.bound(%.loc11_40.3) // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- base_class_public_access_allowed.carbon @@ -2592,6 +2620,8 @@ fn Call(var instance: Cpp.PublicPrivate) { // CHECK:STDOUT: %ProtectedStatic.ref.loc17: %Public.ProtectedStatic.cpp_overload_set.type = name_ref ProtectedStatic, imports.%Public.ProtectedStatic.cpp_overload_set.value [concrete = constants.%Public.ProtectedStatic.cpp_overload_set.value] // CHECK:STDOUT: %Base.ProtectedStatic.call.loc17: init %empty_tuple.type = call imports.%Base.ProtectedStatic.decl() // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Derived.CallInstance(%instance.param: ref %Public) { @@ -2611,6 +2641,8 @@ fn Call(var instance: Cpp.PublicPrivate) { // CHECK:STDOUT: %.loc26_5.3: ref %Base = converted %instance.ref.loc26, %.loc26_5.2 // CHECK:STDOUT: %Base.ProtectedInstance.call: init %empty_tuple.type = call imports.%Base.ProtectedInstance.decl(%.loc26_5.3) // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Call(%instance.param: ref %Public) { @@ -2637,6 +2669,8 @@ fn Call(var instance: Cpp.PublicPrivate) { // CHECK:STDOUT: %.loc37_3.3: ref %Base = converted %instance.ref.loc37, %.loc37_3.2 // CHECK:STDOUT: %Base.PublicInstance.call.loc37: init %empty_tuple.type = call imports.%Base.PublicInstance.decl(%.loc37_3.3) // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- fail_base_class_public_access_denied.carbon @@ -2665,6 +2699,8 @@ fn Call(var instance: Cpp.PublicPrivate) { // CHECK:STDOUT: %instance.ref: ref %Public = name_ref instance, %instance // CHECK:STDOUT: %PrivateInstance.ref: = name_ref PrivateInstance, [concrete = ] // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- base_class_protected_access_allowed.carbon @@ -2747,6 +2783,8 @@ fn Call(var instance: Cpp.PublicPrivate) { // CHECK:STDOUT: %ProtectedStatic.ref.loc17: %Protected.ProtectedStatic.cpp_overload_set.type = name_ref ProtectedStatic, imports.%Protected.ProtectedStatic.cpp_overload_set.value [concrete = constants.%Protected.ProtectedStatic.cpp_overload_set.value] // CHECK:STDOUT: %Base.ProtectedStatic.call.loc17: init %empty_tuple.type = call imports.%Base.ProtectedStatic.decl() // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Derived.CallInstance(%instance.param: ref %Protected) { @@ -2766,6 +2804,8 @@ fn Call(var instance: Cpp.PublicPrivate) { // CHECK:STDOUT: %.loc26_5.3: ref %Base = converted %instance.ref.loc26, %.loc26_5.2 // CHECK:STDOUT: %Base.ProtectedInstance.call: init %empty_tuple.type = call imports.%Base.ProtectedInstance.decl(%.loc26_5.3) // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- base_class_public_protected_access_allowed.carbon @@ -2849,6 +2889,8 @@ fn Call(var instance: Cpp.PublicPrivate) { // CHECK:STDOUT: %ProtectedStatic.ref.loc17: %PublicProtected.ProtectedStatic.cpp_overload_set.type = name_ref ProtectedStatic, imports.%PublicProtected.ProtectedStatic.cpp_overload_set.value [concrete = constants.%PublicProtected.ProtectedStatic.cpp_overload_set.value] // CHECK:STDOUT: %Base.ProtectedStatic.call.loc17: init %empty_tuple.type = call imports.%Base.ProtectedStatic.decl() // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Derived.CallInstance(%instance.param: ref %PublicProtected) { @@ -2870,5 +2912,7 @@ fn Call(var instance: Cpp.PublicPrivate) { // CHECK:STDOUT: %.loc26_5.4: ref %Base = converted %instance.ref.loc26, %.loc26_5.3 // CHECK:STDOUT: %Base.ProtectedInstance.call: init %empty_tuple.type = call imports.%Base.ProtectedInstance.decl(%.loc26_5.4) // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/interop/cpp/class/import/base.carbon b/toolchain/check/testdata/interop/cpp/class/import/base.carbon index 2ed9801c1947..4ee8714f9973 100644 --- a/toolchain/check/testdata/interop/cpp/class/import/base.carbon +++ b/toolchain/check/testdata/interop/cpp/class/import/base.carbon @@ -562,6 +562,8 @@ class V { // CHECK:STDOUT: %bound_method.loc8_11.2: = bound_method %.loc8_11.3, %specific_fn // CHECK:STDOUT: %ptr.as.Copy.impl.Op.call: init %ptr.0e0 = call %bound_method.loc8_11.2(%.loc8_11.3) // CHECK:STDOUT: return %ptr.as.Copy.impl.Op.call +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @ConvertVal(%d.param: %Derived) { @@ -574,6 +576,8 @@ class V { // CHECK:STDOUT: %.loc16_13.4: %Base = acquire_value %.loc16_13.3 // CHECK:STDOUT: %AcceptVal.call: init %empty_tuple.type = call %AcceptVal.ref(%.loc16_13.4) // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- use_static_member.carbon @@ -624,6 +628,8 @@ class V { // CHECK:STDOUT: %derived_fn.ref: %Derived.derived_fn.cpp_overload_set.type = name_ref derived_fn, imports.%Derived.derived_fn.cpp_overload_set.value [concrete = constants.%Derived.derived_fn.cpp_overload_set.value] // CHECK:STDOUT: %Derived.derived_fn.call: init %empty_tuple.type = call imports.%Derived.derived_fn.decl() // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- use_base_field.carbon @@ -674,6 +680,8 @@ class V { // CHECK:STDOUT: %bound_method.loc8_11.2: = bound_method %.loc8_11.5, %specific_fn // CHECK:STDOUT: %Int.as.Copy.impl.Op.call: init %i32 = call %bound_method.loc8_11.2(%.loc8_11.5) // CHECK:STDOUT: return %Int.as.Copy.impl.Op.call +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @AccessQualified(%d.param: %Derived) -> out %return.param: %i32 { @@ -693,6 +701,8 @@ class V { // CHECK:STDOUT: %bound_method.loc14_11.2: = bound_method %.loc14_11.5, %specific_fn // CHECK:STDOUT: %Int.as.Copy.impl.Op.call: init %i32 = call %bound_method.loc14_11.2(%.loc14_11.5) // CHECK:STDOUT: return %Int.as.Copy.impl.Op.call +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- use_base_method.carbon @@ -744,6 +754,8 @@ class V { // CHECK:STDOUT: %.loc8_3.4: %Base = acquire_value %.loc8_3.3 // CHECK:STDOUT: %f__carbon_thunk.call: init %empty_tuple.type = call imports.%f__carbon_thunk.decl(%.loc8_3.4) // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @CallQualified(%d.param: %Derived) { @@ -759,6 +771,8 @@ class V { // CHECK:STDOUT: %.loc14_3.4: %Base = acquire_value %.loc14_3.3 // CHECK:STDOUT: %g__carbon_thunk.call: init %empty_tuple.type = call imports.%g__carbon_thunk.decl(%.loc14_3.4) // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @CallBaseQualifiedByDerived(%d.param: %Derived, %b.param: %Base) { @@ -780,5 +794,7 @@ class V { // CHECK:STDOUT: %bound_method.loc24: = bound_method %b.ref, %f.ref.loc24 // CHECK:STDOUT: %f__carbon_thunk.call.loc24: init %empty_tuple.type = call imports.%f__carbon_thunk.decl(%b.ref) // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/interop/cpp/class/import/class.carbon b/toolchain/check/testdata/interop/cpp/class/import/class.carbon index 88dc7725b555..4b76c9742709 100644 --- a/toolchain/check/testdata/interop/cpp/class/import/class.carbon +++ b/toolchain/check/testdata/interop/cpp/class/import/class.carbon @@ -391,6 +391,8 @@ fn GenericUse(p2: Generic(Cpp.Class1)) { // CHECK:STDOUT: %foo.ref: %Bar.foo.cpp_overload_set.type = name_ref foo, imports.%Bar.foo.cpp_overload_set.value [concrete = constants.%Bar.foo.cpp_overload_set.value] // CHECK:STDOUT: %Bar.foo.call: init %empty_tuple.type = call imports.%Bar.foo.decl() // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- import_static_data_member.carbon @@ -431,6 +433,8 @@ fn GenericUse(p2: Generic(Cpp.Class1)) { // CHECK:STDOUT: %bar.patt: %pattern_type = value_binding_pattern bar [concrete = constants.%bar.patt] // CHECK:STDOUT: } // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- import_data_member.carbon @@ -487,6 +491,8 @@ fn GenericUse(p2: Generic(Cpp.Class1)) { // CHECK:STDOUT: %foo_bar.patt: %pattern_type = value_binding_pattern foo_bar [concrete = constants.%foo_bar.patt] // CHECK:STDOUT: } // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- call_dynamic.carbon @@ -549,6 +555,8 @@ fn GenericUse(p2: Generic(Cpp.Class1)) { // CHECK:STDOUT: %bound_method: = bound_method %.loc8, %f.ref // CHECK:STDOUT: %Bar.f.call: init %empty_tuple.type = call imports.%Bar.f.decl(%.loc8) // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- import_to_inherit_public.carbon @@ -603,6 +611,8 @@ fn GenericUse(p2: Generic(Cpp.Class1)) { // CHECK:STDOUT: %foo.ref: %Bar.foo.cpp_overload_set.type = name_ref foo, imports.%Bar.foo.cpp_overload_set.value [concrete = constants.%Bar.foo.cpp_overload_set.value] // CHECK:STDOUT: %Bar.foo.call: init %empty_tuple.type = call imports.%Bar.foo.decl() // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- import_template.carbon diff --git a/toolchain/check/testdata/interop/cpp/class/import/constructor.carbon b/toolchain/check/testdata/interop/cpp/class/import/constructor.carbon index 331a4de0151a..65ef093e3dfd 100644 --- a/toolchain/check/testdata/interop/cpp/class/import/constructor.carbon +++ b/toolchain/check/testdata/interop/cpp/class/import/constructor.carbon @@ -364,6 +364,8 @@ fn F() { // CHECK:STDOUT: %C.cpp_destructor.bound: = bound_method %.loc8_33.3, constants.%C.cpp_destructor // CHECK:STDOUT: %C.cpp_destructor.call: init %empty_tuple.type = call %C.cpp_destructor.bound(%.loc8_33.3) // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- implicit_default.carbon @@ -422,6 +424,8 @@ fn F() { // CHECK:STDOUT: %C.cpp_destructor.bound: = bound_method %c.var, constants.%C.cpp_destructor // CHECK:STDOUT: %C.cpp_destructor.call: init %empty_tuple.type = call %C.cpp_destructor.bound(%c.var) // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- import_non_default.carbon @@ -515,6 +519,8 @@ fn F() { // CHECK:STDOUT: %C.cpp_destructor.bound: = bound_method %.loc8_41.3, constants.%C.cpp_destructor // CHECK:STDOUT: %C.cpp_destructor.call: init %empty_tuple.type = call %C.cpp_destructor.bound(%.loc8_41.3) // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- import_multiple.carbon @@ -635,6 +641,8 @@ fn F() { // CHECK:STDOUT: %C.cpp_destructor.bound.loc8: = bound_method %.loc8_34.3, constants.%C.cpp_destructor // CHECK:STDOUT: %C.cpp_destructor.call.loc8: init %empty_tuple.type = call %C.cpp_destructor.bound.loc8(%.loc8_34.3) // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- import_default_arguments.carbon @@ -763,6 +771,8 @@ fn F() { // CHECK:STDOUT: %C.cpp_destructor.bound.loc8: = bound_method %.loc8_38.3, constants.%C.cpp_destructor // CHECK:STDOUT: %C.cpp_destructor.call.loc8: init %empty_tuple.type = call %C.cpp_destructor.bound.loc8(%.loc8_38.3) // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- import_template.carbon @@ -927,6 +937,8 @@ fn F() { // CHECK:STDOUT: %C.cpp_destructor.bound.loc8: = bound_method %c1.var, constants.%C.cpp_destructor // CHECK:STDOUT: %C.cpp_destructor.call.loc8: init %empty_tuple.type = call %C.cpp_destructor.bound.loc8(%c1.var) // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Destroy.Op(%self.param: ref bool) = "no_op"; @@ -1051,6 +1063,8 @@ fn F() { // CHECK:STDOUT: %C.cpp_destructor.bound.loc8: = bound_method %.loc8_35.3, constants.%C.cpp_destructor // CHECK:STDOUT: %C.cpp_destructor.call.loc8: init %empty_tuple.type = call %C.cpp_destructor.bound.loc8(%.loc8_35.3) // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- import_implicit_multi_arguments.carbon @@ -1220,5 +1234,7 @@ fn F() { // CHECK:STDOUT: %C.cpp_destructor.bound.loc8: = bound_method %.loc8_38.3, constants.%C.cpp_destructor // CHECK:STDOUT: %C.cpp_destructor.call.loc8: init %empty_tuple.type = call %C.cpp_destructor.bound.loc8(%.loc8_38.3) // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/interop/cpp/class/import/field.carbon b/toolchain/check/testdata/interop/cpp/class/import/field.carbon index b0e4edcfaba8..5cf4fde81a9b 100644 --- a/toolchain/check/testdata/interop/cpp/class/import/field.carbon +++ b/toolchain/check/testdata/interop/cpp/class/import/field.carbon @@ -329,6 +329,8 @@ fn Test(m: Cpp.UnsupportedMembers*) { // CHECK:STDOUT: %.loc8_43.7: init %tuple.type.ccd to %return.param = tuple_init (%.loc8_43.2, %.loc8_43.3, %.loc8_43.4, %.loc8_43.5, %.loc8_43.6) // CHECK:STDOUT: %.loc8_44: init %tuple.type.ccd = converted %.loc8_43.1, %.loc8_43.7 // CHECK:STDOUT: return %.loc8_44 to %return.param +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- use_union_fields.carbon @@ -370,6 +372,8 @@ fn Test(m: Cpp.UnsupportedMembers*) { // CHECK:STDOUT: %bound_method.loc8_11.2: = bound_method %.loc8_11.2, %specific_fn // CHECK:STDOUT: %Int.as.Copy.impl.Op.call: init %i32 = call %bound_method.loc8_11.2(%.loc8_11.2) // CHECK:STDOUT: return %Int.as.Copy.impl.Op.call +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @G(%u.param: %Union) -> out %return.param: %i32 { @@ -384,6 +388,8 @@ fn Test(m: Cpp.UnsupportedMembers*) { // CHECK:STDOUT: %bound_method.loc14_11.2: = bound_method %.loc14_11.2, %specific_fn // CHECK:STDOUT: %Int.as.Copy.impl.Op.call: init %i32 = call %bound_method.loc14_11.2(%.loc14_11.2) // CHECK:STDOUT: return %Int.as.Copy.impl.Op.call +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @H(%u.param: %Union) -> out %return.param: %i32 { @@ -400,6 +406,8 @@ fn Test(m: Cpp.UnsupportedMembers*) { // CHECK:STDOUT: %bound_method.loc20_10.2: = bound_method %.loc20_10.2, %specific_fn // CHECK:STDOUT: %Int.as.Copy.impl.Op.call: init %i32 = call %bound_method.loc20_10.2(%.loc20_10.2) // CHECK:STDOUT: return %Int.as.Copy.impl.Op.call +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- use_non_bitfields_in_type_with_bitfields.carbon @@ -441,6 +449,8 @@ fn Test(m: Cpp.UnsupportedMembers*) { // CHECK:STDOUT: %bound_method.loc8_11.2: = bound_method %.loc8_11.2, %specific_fn // CHECK:STDOUT: %Int.as.Copy.impl.Op.call: init %i32 = call %bound_method.loc8_11.2(%.loc8_11.2) // CHECK:STDOUT: return %Int.as.Copy.impl.Op.call +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @G(%s.param: %Union) -> out %return.param: %i32 { @@ -455,6 +465,8 @@ fn Test(m: Cpp.UnsupportedMembers*) { // CHECK:STDOUT: %bound_method.loc14_11.2: = bound_method %.loc14_11.2, %specific_fn // CHECK:STDOUT: %Int.as.Copy.impl.Op.call: init %i32 = call %bound_method.loc14_11.2(%.loc14_11.2) // CHECK:STDOUT: return %Int.as.Copy.impl.Op.call +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- fail_todo_use_bitfields.carbon @@ -471,6 +483,8 @@ fn Test(m: Cpp.UnsupportedMembers*) { // CHECK:STDOUT: %s.ref: %Struct = name_ref s, %s // CHECK:STDOUT: %b.ref: = name_ref b, [concrete = ] // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @G(%s.param: %Union) -> out %return.param: %i32 { @@ -478,5 +492,7 @@ fn Test(m: Cpp.UnsupportedMembers*) { // CHECK:STDOUT: %s.ref: %Union = name_ref s, %s // CHECK:STDOUT: %d.ref: = name_ref d, [concrete = ] // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/interop/cpp/class/import/method.carbon b/toolchain/check/testdata/interop/cpp/class/import/method.carbon index 5e66f15208bd..c5bc1748c6e6 100644 --- a/toolchain/check/testdata/interop/cpp/class/import/method.carbon +++ b/toolchain/check/testdata/interop/cpp/class/import/method.carbon @@ -491,6 +491,8 @@ fn Call(e: Cpp.ExplicitObjectParam, n: i32, a: Cpp.Another) { // CHECK:STDOUT: %HasQualifiers.cpp_destructor.bound.loc19: = bound_method %.loc19_8.2, %Op.ref.loc19 // CHECK:STDOUT: %HasQualifiers.cpp_destructor.call.loc19: init %empty_tuple.type = call %HasQualifiers.cpp_destructor.bound.loc19(%.loc19_8.2) // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- use_object_param_qualifiers_overloaded.carbon @@ -593,6 +595,8 @@ fn Call(e: Cpp.ExplicitObjectParam, n: i32, a: Cpp.Another) { // CHECK:STDOUT: %Destroy.Op.bound.loc8: = bound_method %a.var, constants.%Destroy.Op.1a2547.3 // CHECK:STDOUT: %Destroy.Op.call.loc8: init %empty_tuple.type = call %Destroy.Op.bound.loc8(%a.var) // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Destroy.Op.loc9(%self.param: ref %ptr.d08) = "no_op"; @@ -602,6 +606,8 @@ fn Call(e: Cpp.ExplicitObjectParam, n: i32, a: Cpp.Another) { // CHECK:STDOUT: fn @Destroy.Op.loc8_3.2(%self.param: ref %i32) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @CallFWithRefQualifier(%v.param: %WithRefQualifier, %p.param: %ptr.90c) { @@ -639,6 +645,8 @@ fn Call(e: Cpp.ExplicitObjectParam, n: i32, a: Cpp.Another) { // CHECK:STDOUT: %Destroy.Op.bound.loc15: = bound_method %a.var, constants.%Destroy.Op.1a2547.3 // CHECK:STDOUT: %Destroy.Op.call.loc15: init %empty_tuple.type = call %Destroy.Op.bound.loc15(%a.var) // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- call_explicit_object_param.carbon @@ -716,6 +724,8 @@ fn Call(e: Cpp.ExplicitObjectParam, n: i32, a: Cpp.Another) { // CHECK:STDOUT: %addr.loc10: %ptr.bad = addr_of %.loc10 // CHECK:STDOUT: %H__carbon_thunk.call: init %empty_tuple.type = call imports.%H__carbon_thunk.decl(%addr.loc10) // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- call_explicit_object_param_overloaded.carbon @@ -787,5 +797,7 @@ fn Call(e: Cpp.ExplicitObjectParam, n: i32, a: Cpp.Another) { // CHECK:STDOUT: %addr.loc10: %ptr.bad = addr_of %.loc10 // CHECK:STDOUT: %F__carbon_thunk.call.loc10: init %empty_tuple.type = call imports.%F__carbon_thunk.decl.828b0d.3(%addr.loc10) // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/interop/cpp/class/import/template.carbon b/toolchain/check/testdata/interop/cpp/class/import/template.carbon index 68ccdc7e76e5..78a06f5e8d68 100644 --- a/toolchain/check/testdata/interop/cpp/class/import/template.carbon +++ b/toolchain/check/testdata/interop/cpp/class/import/template.carbon @@ -166,6 +166,8 @@ fn F() { // CHECK:STDOUT: %bound_method.loc10_11.2: = bound_method %.loc10_11.2, %specific_fn // CHECK:STDOUT: %Int.as.Copy.impl.Op.call: init %i32 = call %bound_method.loc10_11.2(%.loc10_11.2) // CHECK:STDOUT: return %Int.as.Copy.impl.Op.call +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @G(%p.param: %ptr.f2d) -> out %return.param: %ptr.0e0 { @@ -181,6 +183,8 @@ fn F() { // CHECK:STDOUT: %bound_method.loc17_11.2: = bound_method %.loc17_11.3, %specific_fn // CHECK:STDOUT: %ptr.as.Copy.impl.Op.call: init %ptr.0e0 = call %bound_method.loc17_11.2(%.loc17_11.3) // CHECK:STDOUT: return %ptr.as.Copy.impl.Op.call +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- fail_use_instantiation_error.carbon @@ -270,5 +274,7 @@ fn F() { // CHECK:STDOUT: %.loc21: init %i32 = converted %int_0.loc21, %Core.IntLiteral.as.ImplicitAs.impl.Convert.call.loc21 [concrete = constants.%int_0.3c0] // CHECK:STDOUT: assign file.%y.var, %.loc21 // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/interop/cpp/class/import/union.carbon b/toolchain/check/testdata/interop/cpp/class/import/union.carbon index e7b26bceb22c..fc6f88644697 100644 --- a/toolchain/check/testdata/interop/cpp/class/import/union.carbon +++ b/toolchain/check/testdata/interop/cpp/class/import/union.carbon @@ -312,6 +312,8 @@ fn MyF(bar: Cpp.Bar(Cpp.X)*); // CHECK:STDOUT: %foo.ref: %Bar.foo.cpp_overload_set.type = name_ref foo, imports.%Bar.foo.cpp_overload_set.value [concrete = constants.%Bar.foo.cpp_overload_set.value] // CHECK:STDOUT: %Bar.foo.call: init %empty_tuple.type = call imports.%Bar.foo.decl() // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- import_static_data_member.carbon @@ -352,6 +354,8 @@ fn MyF(bar: Cpp.Bar(Cpp.X)*); // CHECK:STDOUT: %bar.patt: %pattern_type = value_binding_pattern bar [concrete = constants.%bar.patt] // CHECK:STDOUT: } // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- import_data_member.carbon @@ -408,6 +412,8 @@ fn MyF(bar: Cpp.Bar(Cpp.X)*); // CHECK:STDOUT: %foo_bar.patt: %pattern_type = value_binding_pattern foo_bar [concrete = constants.%foo_bar.patt] // CHECK:STDOUT: } // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- import_template.carbon diff --git a/toolchain/check/testdata/interop/cpp/enum/anonymous.carbon b/toolchain/check/testdata/interop/cpp/enum/anonymous.carbon index 2f3db4ac3f21..8eea2abcb9be 100644 --- a/toolchain/check/testdata/interop/cpp/enum/anonymous.carbon +++ b/toolchain/check/testdata/interop/cpp/enum/anonymous.carbon @@ -124,5 +124,7 @@ fn G() { // CHECK:STDOUT: %C.cpp_destructor.bound: = bound_method %.loc10_11.3, constants.%C.cpp_destructor // CHECK:STDOUT: %C.cpp_destructor.call: init %empty_tuple.type = call %C.cpp_destructor.bound(%.loc10_11.3) // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/interop/cpp/enum/convert.carbon b/toolchain/check/testdata/interop/cpp/enum/convert.carbon index ac7f35ef538d..089812e38ed9 100644 --- a/toolchain/check/testdata/interop/cpp/enum/convert.carbon +++ b/toolchain/check/testdata/interop/cpp/enum/convert.carbon @@ -188,5 +188,7 @@ fn F() { // CHECK:STDOUT: %c.patt: %pattern_type.d91 = value_binding_pattern c [concrete = constants.%c.patt] // CHECK:STDOUT: } // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/interop/cpp/enum/copy.carbon b/toolchain/check/testdata/interop/cpp/enum/copy.carbon index 44e3ed4abf94..10d1efd035d1 100644 --- a/toolchain/check/testdata/interop/cpp/enum/copy.carbon +++ b/toolchain/check/testdata/interop/cpp/enum/copy.carbon @@ -97,6 +97,8 @@ fn F() { // CHECK:STDOUT: %Destroy.Op.bound: = bound_method %a.var, constants.%Destroy.Op // CHECK:STDOUT: %Destroy.Op.call: init %empty_tuple.type = call %Destroy.Op.bound(%a.var) // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Destroy.Op(%self.param: ref %Enum) = "no_op"; diff --git a/toolchain/check/testdata/interop/cpp/enum/fixed.carbon b/toolchain/check/testdata/interop/cpp/enum/fixed.carbon index 0f2a615bbf2e..0de93c2c8c04 100644 --- a/toolchain/check/testdata/interop/cpp/enum/fixed.carbon +++ b/toolchain/check/testdata/interop/cpp/enum/fixed.carbon @@ -79,5 +79,7 @@ fn F() { // CHECK:STDOUT: %b.patt: %pattern_type = value_binding_pattern b [concrete = constants.%b.patt] // CHECK:STDOUT: } // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/interop/cpp/enum/member.carbon b/toolchain/check/testdata/interop/cpp/enum/member.carbon index b4b04072d625..b4971f08cc60 100644 --- a/toolchain/check/testdata/interop/cpp/enum/member.carbon +++ b/toolchain/check/testdata/interop/cpp/enum/member.carbon @@ -87,5 +87,7 @@ fn F() { // CHECK:STDOUT: %b.patt: %pattern_type = value_binding_pattern b [concrete = constants.%b.patt] // CHECK:STDOUT: } // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/interop/cpp/enum/scoped.carbon b/toolchain/check/testdata/interop/cpp/enum/scoped.carbon index 4f5afc77e354..7a672703c965 100644 --- a/toolchain/check/testdata/interop/cpp/enum/scoped.carbon +++ b/toolchain/check/testdata/interop/cpp/enum/scoped.carbon @@ -78,5 +78,7 @@ fn F() { // CHECK:STDOUT: %a.patt: %pattern_type = value_binding_pattern a [concrete = constants.%a.patt] // CHECK:STDOUT: } // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/interop/cpp/enum/unscoped.carbon b/toolchain/check/testdata/interop/cpp/enum/unscoped.carbon index c675076ebaaf..50854bed1241 100644 --- a/toolchain/check/testdata/interop/cpp/enum/unscoped.carbon +++ b/toolchain/check/testdata/interop/cpp/enum/unscoped.carbon @@ -121,5 +121,7 @@ fn F() { // CHECK:STDOUT: %b.patt: %pattern_type = value_binding_pattern b [concrete = constants.%b.patt] // CHECK:STDOUT: } // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/interop/cpp/enum/using.carbon b/toolchain/check/testdata/interop/cpp/enum/using.carbon index b83257cc6f05..45b78f8a5166 100644 --- a/toolchain/check/testdata/interop/cpp/enum/using.carbon +++ b/toolchain/check/testdata/interop/cpp/enum/using.carbon @@ -138,5 +138,7 @@ fn F() { // CHECK:STDOUT: %pet2.patt: %pattern_type.8cd = value_binding_pattern pet2 [concrete = constants.%pet2.patt] // CHECK:STDOUT: } // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/interop/cpp/function/export/generic.carbon b/toolchain/check/testdata/interop/cpp/function/export/generic.carbon index aaa14bf87a9f..0000f96c03b4 100644 --- a/toolchain/check/testdata/interop/cpp/function/export/generic.carbon +++ b/toolchain/check/testdata/interop/cpp/function/export/generic.carbon @@ -276,6 +276,8 @@ void G() { // CHECK:STDOUT: witness = (@I.WithSelf.%I.WithSelf.Doit.decl) // CHECK:STDOUT: // CHECK:STDOUT: !requires: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: impl @A.as.I.impl: %Self.ref as %I.ref { @@ -353,11 +355,15 @@ void G() { // CHECK:STDOUT: fn @A.as.I.impl.Doit(%self.param: %A) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @B.as.I.impl.Doit(%self.param: %B) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: generic fn @F(%T.loc20_7.2: %I.type) { @@ -388,6 +394,8 @@ void G() { // CHECK:STDOUT: %bound_method.loc21_10: = bound_method %t.ref, %specific_impl_fn.loc21_4.1 // CHECK:STDOUT: %I.WithSelf.Doit.call: init %empty_tuple.type = call %bound_method.loc21_10(%t.ref) // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: @@ -397,6 +405,8 @@ void G() { // CHECK:STDOUT: %bound_method: = bound_method %self.param, %impl.elem0 // CHECK:STDOUT: %Destroy.Op.call: init %empty_tuple.type = call %bound_method(%self.param) // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Destroy.Op.loc9_9.1(%self.param: ref %empty_struct_type) = "no_op"; @@ -404,6 +414,8 @@ void G() { // CHECK:STDOUT: fn @Destroy.Op.loc9_9.2(%self.param: ref %A) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @B.__destroy_thunk(%self.param: ref %B) { @@ -412,11 +424,15 @@ void G() { // CHECK:STDOUT: %bound_method: = bound_method %self.param, %impl.elem0 // CHECK:STDOUT: %Destroy.Op.call: init %empty_tuple.type = call %bound_method(%self.param) // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Destroy.Op.loc14(%self.param: ref %B) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @F__carbon_thunkinst64000035(%_.param: ref %A) { @@ -430,6 +446,8 @@ void G() { // CHECK:STDOUT: %.loc20_19.3: %A = acquire_value %_.param // CHECK:STDOUT: %F.call: init %empty_tuple.type = call %F.specific_fn(%.loc20_19.3) // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @F__carbon_thunkinst64000050(%_.param: ref %B) { @@ -443,6 +461,8 @@ void G() { // CHECK:STDOUT: %.loc20_19.3: %B = acquire_value %_.param // CHECK:STDOUT: %F.call: init %empty_tuple.type = call %F.specific_fn(%.loc20_19.3) // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: specific @I.WithSelf(constants.%Self.37e) { diff --git a/toolchain/check/testdata/interop/cpp/function/import/arithmetic_types_bridged.carbon b/toolchain/check/testdata/interop/cpp/function/import/arithmetic_types_bridged.carbon index 60768cd72d3a..4f53313c7893 100644 --- a/toolchain/check/testdata/interop/cpp/function/import/arithmetic_types_bridged.carbon +++ b/toolchain/check/testdata/interop/cpp/function/import/arithmetic_types_bridged.carbon @@ -605,6 +605,8 @@ fn F() { // CHECK:STDOUT: %addr: %ptr.bb2 = addr_of %.loc8_11.2 [concrete = constants.%addr] // CHECK:STDOUT: %foo__carbon_thunk.call: init %empty_tuple.type = call imports.%foo__carbon_thunk.decl(%addr) // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Destroy.Op(%self.param: ref bool) = "no_op"; @@ -659,6 +661,8 @@ fn F() { // CHECK:STDOUT: %addr: %ptr.bb2 = addr_of %.loc8_11.2 [concrete = constants.%addr] // CHECK:STDOUT: %foo__carbon_thunk.call: init %empty_tuple.type = call imports.%foo__carbon_thunk.decl(%addr) // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Destroy.Op(%self.param: ref bool) = "no_op"; @@ -767,6 +771,8 @@ fn F() { // CHECK:STDOUT: %foo__carbon_thunk.call: init %empty_tuple.type = call imports.%foo__carbon_thunk.decl(%addr) // CHECK:STDOUT: %Destroy.Op.call: init %empty_tuple.type = call constants.%Destroy.Op.bound(constants.%.309) // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Destroy.Op.loc8_11.1(%self.param: ref %i8.builtin) = "no_op"; @@ -774,6 +780,8 @@ fn F() { // CHECK:STDOUT: fn @Destroy.Op.loc8_11.2(%self.param: ref %i8) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- import_unsigned_char_param.carbon @@ -863,6 +871,8 @@ fn F() { // CHECK:STDOUT: %foo__carbon_thunk.call: init %empty_tuple.type = call imports.%foo__carbon_thunk.decl(%addr) // CHECK:STDOUT: %Destroy.Op.call: init %empty_tuple.type = call constants.%Destroy.Op.bound(constants.%.599) // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Destroy.Op.loc8_11.1(%self.param: ref %u8.builtin) = "no_op"; @@ -870,6 +880,8 @@ fn F() { // CHECK:STDOUT: fn @Destroy.Op.loc8_11.2(%self.param: ref %u8) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- import_char_param.carbon @@ -946,6 +958,8 @@ fn F() { // CHECK:STDOUT: %foo__carbon_thunk.call: init %empty_tuple.type = call imports.%foo__carbon_thunk.decl(%addr) // CHECK:STDOUT: %Destroy.Op.call: init %empty_tuple.type = call constants.%Destroy.Op.bound(constants.%.2ff) // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Destroy.Op.loc8_11.1(%self.param: ref %u8.builtin) = "no_op"; @@ -953,11 +967,15 @@ fn F() { // CHECK:STDOUT: fn @Destroy.Op.loc8_11.2(%self.param: ref %u8) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Destroy.Op.loc8_11.3(%self.param: ref %char) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- fail_todo_import_wchar_t_param.carbon @@ -982,6 +1000,8 @@ fn F() { // CHECK:STDOUT: %foo.ref: %foo.cpp_overload_set.type = name_ref foo, imports.%foo.cpp_overload_set.value [concrete = constants.%foo.cpp_overload_set.value] // CHECK:STDOUT: %.loc12: Core.CharLiteral = char_value U+0058 [concrete = constants.%.d16] // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- fail_todo_import_char8_t_param.carbon @@ -1040,6 +1060,8 @@ fn F() { // CHECK:STDOUT: %.loc13_11.2: %i32 = converted %int_1, %.loc13_11.1 [concrete = constants.%int_1.0c6] // CHECK:STDOUT: %foo.call: init %empty_tuple.type = call imports.%foo.decl(%.loc13_11.2) // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- fail_todo_import_char16_t_param.carbon @@ -1064,6 +1086,8 @@ fn F() { // CHECK:STDOUT: %foo.ref: %foo.cpp_overload_set.type = name_ref foo, imports.%foo.cpp_overload_set.value [concrete = constants.%foo.cpp_overload_set.value] // CHECK:STDOUT: %int_1: Core.IntLiteral = int_value 1 [concrete = constants.%int_1] // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- fail_todo_import_char32_t_param.carbon @@ -1088,6 +1112,8 @@ fn F() { // CHECK:STDOUT: %foo.ref: %foo.cpp_overload_set.type = name_ref foo, imports.%foo.cpp_overload_set.value [concrete = constants.%foo.cpp_overload_set.value] // CHECK:STDOUT: %int_1: Core.IntLiteral = int_value 1 [concrete = constants.%int_1] // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- import_short_param.carbon @@ -1178,6 +1204,8 @@ fn F() { // CHECK:STDOUT: %foo__carbon_thunk.call: init %empty_tuple.type = call imports.%foo__carbon_thunk.decl(%addr) // CHECK:STDOUT: %Destroy.Op.call: init %empty_tuple.type = call constants.%Destroy.Op.bound(constants.%.597) // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Destroy.Op.loc8_13.1(%self.param: ref %i16.builtin) = "no_op"; @@ -1185,6 +1213,8 @@ fn F() { // CHECK:STDOUT: fn @Destroy.Op.loc8_13.2(%self.param: ref %i16) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- import_short_param_max.carbon @@ -1274,6 +1304,8 @@ fn F() { // CHECK:STDOUT: %foo__carbon_thunk.call: init %empty_tuple.type = call imports.%foo__carbon_thunk.decl(%addr) // CHECK:STDOUT: %Destroy.Op.call: init %empty_tuple.type = call constants.%Destroy.Op.bound(constants.%.0d8) // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Destroy.Op.loc8_11.1(%self.param: ref %i16.builtin) = "no_op"; @@ -1281,6 +1313,8 @@ fn F() { // CHECK:STDOUT: fn @Destroy.Op.loc8_11.2(%self.param: ref %i16) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- import_short_param_min.carbon @@ -1387,6 +1421,8 @@ fn F() { // CHECK:STDOUT: %foo__carbon_thunk.call: init %empty_tuple.type = call imports.%foo__carbon_thunk.decl(%addr) // CHECK:STDOUT: %Destroy.Op.call: init %empty_tuple.type = call constants.%Destroy.Op.bound(constants.%.60a) // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Destroy.Op.loc8_11.1(%self.param: ref %i16.builtin) = "no_op"; @@ -1394,6 +1430,8 @@ fn F() { // CHECK:STDOUT: fn @Destroy.Op.loc8_11.2(%self.param: ref %i16) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- import_short_int_param.carbon @@ -1484,6 +1522,8 @@ fn F() { // CHECK:STDOUT: %foo__carbon_thunk.call: init %empty_tuple.type = call imports.%foo__carbon_thunk.decl(%addr) // CHECK:STDOUT: %Destroy.Op.call: init %empty_tuple.type = call constants.%Destroy.Op.bound(constants.%.597) // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Destroy.Op.loc8_13.1(%self.param: ref %i16.builtin) = "no_op"; @@ -1491,6 +1531,8 @@ fn F() { // CHECK:STDOUT: fn @Destroy.Op.loc8_13.2(%self.param: ref %i16) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- import_signed_short_param.carbon @@ -1581,6 +1623,8 @@ fn F() { // CHECK:STDOUT: %foo__carbon_thunk.call: init %empty_tuple.type = call imports.%foo__carbon_thunk.decl(%addr) // CHECK:STDOUT: %Destroy.Op.call: init %empty_tuple.type = call constants.%Destroy.Op.bound(constants.%.597) // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Destroy.Op.loc8_13.1(%self.param: ref %i16.builtin) = "no_op"; @@ -1588,6 +1632,8 @@ fn F() { // CHECK:STDOUT: fn @Destroy.Op.loc8_13.2(%self.param: ref %i16) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- import_signed_short_int_param.carbon @@ -1678,6 +1724,8 @@ fn F() { // CHECK:STDOUT: %foo__carbon_thunk.call: init %empty_tuple.type = call imports.%foo__carbon_thunk.decl(%addr) // CHECK:STDOUT: %Destroy.Op.call: init %empty_tuple.type = call constants.%Destroy.Op.bound(constants.%.597) // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Destroy.Op.loc8_13.1(%self.param: ref %i16.builtin) = "no_op"; @@ -1685,6 +1733,8 @@ fn F() { // CHECK:STDOUT: fn @Destroy.Op.loc8_13.2(%self.param: ref %i16) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- import_int16_t_param.carbon @@ -1775,6 +1825,8 @@ fn F() { // CHECK:STDOUT: %foo__carbon_thunk.call: init %empty_tuple.type = call imports.%foo__carbon_thunk.decl(%addr) // CHECK:STDOUT: %Destroy.Op.call: init %empty_tuple.type = call constants.%Destroy.Op.bound(constants.%.597) // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Destroy.Op.loc8_13.1(%self.param: ref %i16.builtin) = "no_op"; @@ -1782,6 +1834,8 @@ fn F() { // CHECK:STDOUT: fn @Destroy.Op.loc8_13.2(%self.param: ref %i16) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- import_float16_param.carbon @@ -1871,6 +1925,8 @@ fn F() { // CHECK:STDOUT: %foo__carbon_thunk.call: init %empty_tuple.type = call imports.%foo__carbon_thunk.decl(%addr) // CHECK:STDOUT: %Destroy.Op.call: init %empty_tuple.type = call constants.%Destroy.Op.bound(constants.%.b6a) // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Destroy.Op.loc8_15.1(%self.param: ref %f16.3ab) = "no_op"; @@ -1878,6 +1934,8 @@ fn F() { // CHECK:STDOUT: fn @Destroy.Op.loc8_15.2(%self.param: ref %f16.907) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- import_float_param.carbon @@ -1967,6 +2025,8 @@ fn F() { // CHECK:STDOUT: %foo__carbon_thunk.call: init %empty_tuple.type = call imports.%foo__carbon_thunk.decl(%addr) // CHECK:STDOUT: %Destroy.Op.call: init %empty_tuple.type = call constants.%Destroy.Op.bound(constants.%.798) // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Destroy.Op.loc8_15.1(%self.param: ref %f32.9b3) = "no_op"; @@ -1974,6 +2034,8 @@ fn F() { // CHECK:STDOUT: fn @Destroy.Op.loc8_15.2(%self.param: ref %f32.c73) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- import_double_param.carbon @@ -2063,6 +2125,8 @@ fn F() { // CHECK:STDOUT: %foo__carbon_thunk.call: init %empty_tuple.type = call imports.%foo__carbon_thunk.decl(%addr) // CHECK:STDOUT: %Destroy.Op.call: init %empty_tuple.type = call constants.%Destroy.Op.bound(constants.%.2a9) // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Destroy.Op.loc8_15.1(%self.param: ref %f64.794) = "no_op"; @@ -2070,6 +2134,8 @@ fn F() { // CHECK:STDOUT: fn @Destroy.Op.loc8_15.2(%self.param: ref %f64.dc1) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- import_float128_param.carbon @@ -2159,6 +2225,8 @@ fn F() { // CHECK:STDOUT: %foo__carbon_thunk.call: init %empty_tuple.type = call imports.%foo__carbon_thunk.decl(%addr) // CHECK:STDOUT: %Destroy.Op.call: init %empty_tuple.type = call constants.%Destroy.Op.bound(constants.%.4aa) // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Destroy.Op.loc8_15.1(%self.param: ref %f128.853) = "no_op"; @@ -2166,6 +2234,8 @@ fn F() { // CHECK:STDOUT: fn @Destroy.Op.loc8_15.2(%self.param: ref %f128.e39) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- import_bool_return.carbon @@ -2214,6 +2284,8 @@ fn F() { // CHECK:STDOUT: %Destroy.Op.bound: = bound_method %.loc8_37.3, constants.%Destroy.Op // CHECK:STDOUT: %Destroy.Op.call: init %empty_tuple.type = call %Destroy.Op.bound(%.loc8_37.3) // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Destroy.Op(%self.param: ref bool) = "no_op"; @@ -2267,6 +2339,8 @@ fn F() { // CHECK:STDOUT: %Destroy.Op.bound: = bound_method %.loc8_37.3, constants.%Destroy.Op.1a2547.2 // CHECK:STDOUT: %Destroy.Op.call: init %empty_tuple.type = call %Destroy.Op.bound(%.loc8_37.3) // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Destroy.Op.loc8_37.1(%self.param: ref %i16.builtin) = "no_op"; @@ -2274,6 +2348,8 @@ fn F() { // CHECK:STDOUT: fn @Destroy.Op.loc8_37.2(%self.param: ref %i16) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- fail_todo_import_bit_int_24_param.carbon @@ -2298,6 +2374,8 @@ fn F() { // CHECK:STDOUT: %foo.ref: %foo.cpp_overload_set.type = name_ref foo, imports.%foo.cpp_overload_set.value [concrete = constants.%foo.cpp_overload_set.value] // CHECK:STDOUT: %int_1: Core.IntLiteral = int_value 1 [concrete = constants.%int_1] // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- import_double_return.carbon @@ -2349,6 +2427,8 @@ fn F() { // CHECK:STDOUT: %Destroy.Op.bound: = bound_method %.loc8_38.3, constants.%Destroy.Op.1a2547.2 // CHECK:STDOUT: %Destroy.Op.call: init %empty_tuple.type = call %Destroy.Op.bound(%.loc8_38.3) // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Destroy.Op.loc8_38.1(%self.param: ref %f64.794) = "no_op"; @@ -2356,5 +2436,7 @@ fn F() { // CHECK:STDOUT: fn @Destroy.Op.loc8_38.2(%self.param: ref %f64.dc1) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/interop/cpp/function/import/arithmetic_types_direct.carbon b/toolchain/check/testdata/interop/cpp/function/import/arithmetic_types_direct.carbon index 2a1e8543d92e..6614156238b9 100644 --- a/toolchain/check/testdata/interop/cpp/function/import/arithmetic_types_direct.carbon +++ b/toolchain/check/testdata/interop/cpp/function/import/arithmetic_types_direct.carbon @@ -372,6 +372,8 @@ fn F() { // CHECK:STDOUT: %.loc8_11.2: %i32 = converted %int_1, %.loc8_11.1 [concrete = constants.%int_1.0c6] // CHECK:STDOUT: %foo.call: init %empty_tuple.type = call imports.%foo.decl(%.loc8_11.2) // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- import_int_param_max.carbon @@ -430,6 +432,8 @@ fn F() { // CHECK:STDOUT: %.loc8_11.2: %i32 = converted %int_2147483647, %.loc8_11.1 [concrete = constants.%int_2147483647.a0e] // CHECK:STDOUT: %foo.call: init %empty_tuple.type = call imports.%foo.decl(%.loc8_11.2) // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- import_int_param_min.carbon @@ -505,6 +509,8 @@ fn F() { // CHECK:STDOUT: %.loc8_11.4: %i32 = converted %Core.IntLiteral.as.Negate.impl.Op.call, %.loc8_11.3 [concrete = constants.%int_-2147483648.45f] // CHECK:STDOUT: %foo.call: init %empty_tuple.type = call imports.%foo.decl(%.loc8_11.4) // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- import_signed_int_param.carbon @@ -563,6 +569,8 @@ fn F() { // CHECK:STDOUT: %.loc8_11.2: %i32 = converted %int_1, %.loc8_11.1 [concrete = constants.%int_1.0c6] // CHECK:STDOUT: %foo.call: init %empty_tuple.type = call imports.%foo.decl(%.loc8_11.2) // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- import_signed_param.carbon @@ -621,6 +629,8 @@ fn F() { // CHECK:STDOUT: %.loc8_11.2: %i32 = converted %int_1, %.loc8_11.1 [concrete = constants.%int_1.0c6] // CHECK:STDOUT: %foo.call: init %empty_tuple.type = call imports.%foo.decl(%.loc8_11.2) // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- import_unsigned_int_param.carbon @@ -679,6 +689,8 @@ fn F() { // CHECK:STDOUT: %.loc8_11.2: %u32 = converted %int_1, %.loc8_11.1 [concrete = constants.%int_1.92d] // CHECK:STDOUT: %foo.call: init %empty_tuple.type = call imports.%foo.decl(%.loc8_11.2) // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- import_int32_t_param.carbon @@ -737,6 +749,8 @@ fn F() { // CHECK:STDOUT: %.loc8_11.2: %i32 = converted %int_1, %.loc8_11.1 [concrete = constants.%int_1.0c6] // CHECK:STDOUT: %foo.call: init %empty_tuple.type = call imports.%foo.decl(%.loc8_11.2) // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- import_int_params.carbon @@ -807,6 +821,8 @@ fn F() { // CHECK:STDOUT: %.loc8_14.2: %i32 = converted %int_2, %.loc8_14.1 [concrete = constants.%int_2.295] // CHECK:STDOUT: %foo.call: init %empty_tuple.type = call imports.%foo.decl(%.loc8_11.2, %.loc8_14.2) // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- import_multiple_int_params.carbon @@ -915,6 +931,8 @@ fn F() { // CHECK:STDOUT: %.loc9_15.2: %i32 = converted %int_4, %.loc9_15.1 [concrete = constants.%int_4.4eb] // CHECK:STDOUT: %foo2.call: init %empty_tuple.type = call imports.%foo2.decl(%.loc9_12.2, %.loc9_15.2) // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- import_unnamed_int_param.carbon @@ -973,6 +991,8 @@ fn F() { // CHECK:STDOUT: %.loc8_11.2: %i32 = converted %int_1, %.loc8_11.1 [concrete = constants.%int_1.0c6] // CHECK:STDOUT: %foo.call: init %empty_tuple.type = call imports.%foo.decl(%.loc8_11.2) // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- import_int_return.carbon @@ -1012,6 +1032,8 @@ fn F() { // CHECK:STDOUT: %.loc10_26.2: %i32 = converted %foo_int.call, %.loc10_26.1 // CHECK:STDOUT: %Carbon_foo.call: init %empty_tuple.type = call %Carbon_foo.ref(%.loc10_26.2) // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- import_long_param.carbon @@ -1070,5 +1092,7 @@ fn F() { // CHECK:STDOUT: %.loc8_11.2: %i64 = converted %int_1, %.loc8_11.1 [concrete = constants.%int_1.d98] // CHECK:STDOUT: %foo.call: init %empty_tuple.type = call imports.%foo.decl(%.loc8_11.2) // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/interop/cpp/function/import/class.carbon b/toolchain/check/testdata/interop/cpp/function/import/class.carbon index 77858665ecd8..1e149310f941 100644 --- a/toolchain/check/testdata/interop/cpp/function/import/class.carbon +++ b/toolchain/check/testdata/interop/cpp/function/import/class.carbon @@ -632,6 +632,8 @@ fn F() { // CHECK:STDOUT: %addr: %ptr.0a2 = addr_of %.loc8 // CHECK:STDOUT: %foo__carbon_thunk.call: init %empty_tuple.type = call imports.%foo__carbon_thunk.decl(%addr) // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- fail_import_non_copyable_param_type.carbon @@ -667,6 +669,8 @@ fn F() { // CHECK:STDOUT: %c.ref: %C = name_ref c, %c // CHECK:STDOUT: %foo.call: init %empty_tuple.type = call imports.%foo.decl(%c.ref) // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- pass_move_only_param_temporary.carbon @@ -719,6 +723,8 @@ fn F() { // CHECK:STDOUT: %addr.loc8_21: %ptr.0a2 = addr_of %_.var // CHECK:STDOUT: %foo__carbon_thunk.call: init %empty_tuple.type = call imports.%foo__carbon_thunk.decl(%addr.loc8_21) // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- import_definition_single_data_member_value_param_type.carbon @@ -757,6 +763,8 @@ fn F() { // CHECK:STDOUT: %addr: %ptr.0a2 = addr_of %.loc8 // CHECK:STDOUT: %foo__carbon_thunk.call: init %empty_tuple.type = call imports.%foo__carbon_thunk.decl(%addr) // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- import_definition_multiple_data_members_value_param_type.carbon @@ -795,6 +803,8 @@ fn F() { // CHECK:STDOUT: %addr: %ptr.0a2 = addr_of %.loc8 // CHECK:STDOUT: %foo__carbon_thunk.call: init %empty_tuple.type = call imports.%foo__carbon_thunk.decl(%addr) // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- import_definition_in_namespace_value_param_type.carbon @@ -876,6 +886,8 @@ fn F() { // CHECK:STDOUT: %C.cpp_destructor.bound: = bound_method %x.var, constants.%C.cpp_destructor // CHECK:STDOUT: %C.cpp_destructor.call: init %empty_tuple.type = call %C.cpp_destructor.bound(%x.var) // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- import_definition_in_relative_namespace_value_param_type.carbon @@ -923,6 +935,8 @@ fn F() { // CHECK:STDOUT: %addr: %ptr.eda = addr_of %.loc8 // CHECK:STDOUT: %foo__carbon_thunk.call: init %empty_tuple.type = call imports.%foo__carbon_thunk.decl(%addr) // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- import_definition_in_outer_definition.carbon @@ -1000,6 +1014,8 @@ fn F() { // CHECK:STDOUT: %O.cpp_destructor.bound: = bound_method %x.var, constants.%O.cpp_destructor // CHECK:STDOUT: %O.cpp_destructor.call: init %empty_tuple.type = call %O.cpp_destructor.bound(%x.var) // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- import_definition_and_static_method_call_before.carbon @@ -1048,6 +1064,8 @@ fn F() { // CHECK:STDOUT: %addr: %ptr.0a2 = addr_of %.loc9 // CHECK:STDOUT: %foo__carbon_thunk.call: init %empty_tuple.type = call imports.%foo__carbon_thunk.decl(%addr) // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- import_definition_and_static_method_call_after.carbon @@ -1096,6 +1114,8 @@ fn F() { // CHECK:STDOUT: %bar.ref: %C.bar.cpp_overload_set.type = name_ref bar, imports.%C.bar.cpp_overload_set.value [concrete = constants.%C.bar.cpp_overload_set.value] // CHECK:STDOUT: %C.bar.call: init %empty_tuple.type = call imports.%C.bar.decl() // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- import_decl_pointer_param_type.carbon @@ -1132,6 +1152,8 @@ fn F() { // CHECK:STDOUT: %c.ref: %ptr = name_ref c, %c // CHECK:STDOUT: %foo.call: init %empty_tuple.type = call imports.%foo.decl(%c.ref) // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- import_definition_pointer_param_type.carbon @@ -1168,6 +1190,8 @@ fn F() { // CHECK:STDOUT: %c.ref: %ptr = name_ref c, %c // CHECK:STDOUT: %foo.call: init %empty_tuple.type = call imports.%foo.decl(%c.ref) // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- import_definition_value_return_type.carbon @@ -1209,6 +1233,8 @@ fn F() { // CHECK:STDOUT: %C.cpp_destructor.bound: = bound_method %.loc8_11.3, constants.%C.cpp_destructor // CHECK:STDOUT: %C.cpp_destructor.call: init %empty_tuple.type = call %C.cpp_destructor.bound(%.loc8_11.3) // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- import_decl_pointer_return_type.carbon @@ -1241,6 +1267,8 @@ fn F() { // CHECK:STDOUT: %foo.ref: %foo.cpp_overload_set.type = name_ref foo, imports.%foo.cpp_overload_set.value [concrete = constants.%foo.cpp_overload_set.value] // CHECK:STDOUT: %foo.call: init %ptr = call imports.%foo.decl() // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- import_definition_pointer_return_type.carbon @@ -1273,5 +1301,7 @@ fn F() { // CHECK:STDOUT: %foo.ref: %foo.cpp_overload_set.type = name_ref foo, imports.%foo.cpp_overload_set.value [concrete = constants.%foo.cpp_overload_set.value] // CHECK:STDOUT: %foo.call: init %ptr = call imports.%foo.decl() // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/interop/cpp/function/import/decayed_param.carbon b/toolchain/check/testdata/interop/cpp/function/import/decayed_param.carbon index 062ff8231e70..20df42c0a1e5 100644 --- a/toolchain/check/testdata/interop/cpp/function/import/decayed_param.carbon +++ b/toolchain/check/testdata/interop/cpp/function/import/decayed_param.carbon @@ -281,21 +281,29 @@ fn F() { // CHECK:STDOUT: %Destroy.Op.bound.loc10: = bound_method %n.var, constants.%Destroy.Op.1a2547.8 // CHECK:STDOUT: %Destroy.Op.call.loc10: init %empty_tuple.type = call %Destroy.Op.bound.loc10(%n.var) // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Destroy.Op.loc13_21.1(%self.param: ref %.0f8) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Destroy.Op.loc13_21.2(%self.param: ref %MaybeUnformed.b84) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Destroy.Op.loc13_21.3(%self.param: ref %Optional.c4d) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Destroy.Op.loc10_3.1(%self.param: ref %i32.builtin) = "no_op"; @@ -303,11 +311,15 @@ fn F() { // CHECK:STDOUT: fn @Destroy.Op.loc10_3.2(%self.param: ref %i32) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Destroy.Op.loc10_3.3(%self.param: ref %array_type.d58) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- fail_todo_call_params_2.carbon @@ -427,6 +439,8 @@ fn F() { // CHECK:STDOUT: %Destroy.Op.bound: = bound_method %n.var, constants.%Destroy.Op.1a2547.4 // CHECK:STDOUT: %Destroy.Op.call: init %empty_tuple.type = call %Destroy.Op.bound(%n.var) // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Destroy.Op.loc22_3.1(%self.param: ref %i32.builtin) = "no_op"; @@ -434,10 +448,14 @@ fn F() { // CHECK:STDOUT: fn @Destroy.Op.loc22_3.2(%self.param: ref %i32) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Destroy.Op.loc22_3.3(%self.param: ref %array_type.d58) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/interop/cpp/function/import/default_arg.carbon b/toolchain/check/testdata/interop/cpp/function/import/default_arg.carbon index 791a4deb4ab9..5d450f93d87d 100644 --- a/toolchain/check/testdata/interop/cpp/function/import/default_arg.carbon +++ b/toolchain/check/testdata/interop/cpp/function/import/default_arg.carbon @@ -408,6 +408,8 @@ fn Call() { // CHECK:STDOUT: %Op.ref.loc12: %X.cpp_destructor.type = name_ref Op, imports.%X.cpp_destructor.decl [concrete = constants.%X.cpp_destructor] // CHECK:STDOUT: %Op.ref.loc10: %X.cpp_destructor.type = name_ref Op, imports.%X.cpp_destructor.decl [concrete = constants.%X.cpp_destructor] // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- call_with_default.carbon @@ -825,6 +827,8 @@ fn Call() { // CHECK:STDOUT: %Op.ref.loc13: %X.cpp_destructor.type = name_ref Op, imports.%X.cpp_destructor.decl [concrete = constants.%X.cpp_destructor] // CHECK:STDOUT: %Op.ref.loc11: %X.cpp_destructor.type = name_ref Op, imports.%X.cpp_destructor.decl [concrete = constants.%X.cpp_destructor] // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @GlobalNoReturn.1(%a.param: %i32, %b.param: %i32); @@ -859,6 +863,8 @@ fn Call() { // CHECK:STDOUT: %X.cpp_destructor.bound: = bound_method %self.param, %Op.ref // CHECK:STDOUT: %X.cpp_destructor.call: init %empty_tuple.type = call %X.cpp_destructor.bound(%self.param) // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- fail_call_too_few_args.carbon @@ -943,5 +949,7 @@ fn Call() { // CHECK:STDOUT: %Op.ref.loc76: %X.cpp_destructor.type = name_ref Op, imports.%X.cpp_destructor.decl [concrete = constants.%X.cpp_destructor] // CHECK:STDOUT: %Op.ref.loc56: %X.cpp_destructor.type = name_ref Op, imports.%X.cpp_destructor.decl [concrete = constants.%X.cpp_destructor] // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/interop/cpp/function/import/extern_c.carbon b/toolchain/check/testdata/interop/cpp/function/import/extern_c.carbon index 1a4c7c37ab2c..92682b97d6b4 100644 --- a/toolchain/check/testdata/interop/cpp/function/import/extern_c.carbon +++ b/toolchain/check/testdata/interop/cpp/function/import/extern_c.carbon @@ -94,6 +94,8 @@ fn MyF(a: Cpp.X, b: Cpp.X) -> Cpp.X { // CHECK:STDOUT: %foo.ref: %foo.cpp_overload_set.type = name_ref foo, imports.%foo.cpp_overload_set.value [concrete = constants.%foo.cpp_overload_set.value] // CHECK:STDOUT: %foo.call: init %empty_tuple.type = call imports.%foo.decl() // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- extern_c_function_with_cpp_overload_set.carbon @@ -158,6 +160,8 @@ fn MyF(a: Cpp.X, b: Cpp.X) -> Cpp.X { // CHECK:STDOUT: %.loc12_11.2: %i32 = converted %int_5, %.loc12_11.1 [concrete = constants.%int_5.eef] // CHECK:STDOUT: %foo.call.loc12: init %empty_tuple.type = call imports.%foo.decl.6431a3.2(%.loc12_11.2) // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- extern_c_variable.carbon @@ -205,6 +209,8 @@ fn MyF(a: Cpp.X, b: Cpp.X) -> Cpp.X { // CHECK:STDOUT: %bound_method.loc10_13.2: = bound_method %.loc10, %specific_fn // CHECK:STDOUT: %Int.as.Copy.impl.Op.call: init %i32 = call %bound_method.loc10_13.2(%.loc10) // CHECK:STDOUT: return %Int.as.Copy.impl.Op.call +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- extern_c_with_special_name.carbon @@ -238,5 +244,7 @@ fn MyF(a: Cpp.X, b: Cpp.X) -> Cpp.X { // CHECK:STDOUT: %operator_Plus__carbon_thunk.call: init %empty_tuple.type = call imports.%operator_Plus__carbon_thunk.decl(%addr.loc11_12.1, %addr.loc11_12.2, %addr.loc11_12.3) // CHECK:STDOUT: %.loc11_12: init %X to %.loc9_34.1 = mark_in_place_init %operator_Plus__carbon_thunk.call // CHECK:STDOUT: return %.loc11_12 to %return.param +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/interop/cpp/function/import/full_semir.carbon b/toolchain/check/testdata/interop/cpp/function/import/full_semir.carbon index c37982ed9442..3bd5c5500bfc 100644 --- a/toolchain/check/testdata/interop/cpp/function/import/full_semir.carbon +++ b/toolchain/check/testdata/interop/cpp/function/import/full_semir.carbon @@ -195,6 +195,8 @@ fn F() { // CHECK:STDOUT: %foo__carbon_thunk.call: init %empty_tuple.type = call imports.%foo__carbon_thunk.decl(%addr) // CHECK:STDOUT: %Destroy.Op.call: init %empty_tuple.type = call constants.%Destroy.Op.bound(constants.%.597) // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @foo(%a.param: %i16); @@ -206,6 +208,8 @@ fn F() { // CHECK:STDOUT: fn @Destroy.Op.loc7_13.2(%self.param: ref %i16) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- import_int_param.carbon @@ -301,6 +305,8 @@ fn F() { // CHECK:STDOUT: %.loc7_11.2: %i32 = converted %int_1, %.loc7_11.1 [concrete = constants.%int_1.0c6] // CHECK:STDOUT: %foo.call: init %empty_tuple.type = call imports.%foo.decl(%.loc7_11.2) // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @foo(%a.param: %i32); @@ -390,6 +396,8 @@ fn F() { // CHECK:STDOUT: %Destroy.Op.bound: = bound_method %.loc7_37.3, constants.%Destroy.Op.1a2547.2 // CHECK:STDOUT: %Destroy.Op.call: init %empty_tuple.type = call %Destroy.Op.bound(%.loc7_37.3) // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @foo_short() -> out %return.param: %i16; @@ -401,5 +409,7 @@ fn F() { // CHECK:STDOUT: fn @Destroy.Op.loc7_37.2(%self.param: ref %i16) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/interop/cpp/function/import/function.carbon b/toolchain/check/testdata/interop/cpp/function/import/function.carbon index 270d2969ee18..029929f469dd 100644 --- a/toolchain/check/testdata/interop/cpp/function/import/function.carbon +++ b/toolchain/check/testdata/interop/cpp/function/import/function.carbon @@ -207,6 +207,8 @@ fn G() -> i32 { // CHECK:STDOUT: %foo.ref: %foo.cpp_overload_set.type = name_ref foo, imports.%foo.cpp_overload_set.value [concrete = constants.%foo.cpp_overload_set.value] // CHECK:STDOUT: %foo.call: init %empty_tuple.type = call imports.%foo.decl() // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- import_special_name_call_escaped.carbon @@ -234,6 +236,8 @@ fn G() -> i32 { // CHECK:STDOUT: %base.ref: %base.cpp_overload_set.type = name_ref r#base, imports.%base.cpp_overload_set.value [concrete = constants.%base.cpp_overload_set.value] // CHECK:STDOUT: %base.call: init %empty_tuple.type = call imports.%base.decl() // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- import_overloaded.carbon @@ -261,6 +265,8 @@ fn G() -> i32 { // CHECK:STDOUT: %foo.ref: %foo.cpp_overload_set.type = name_ref foo, imports.%foo.cpp_overload_set.value [concrete = constants.%foo.cpp_overload_set.value] // CHECK:STDOUT: %foo.call: init %empty_tuple.type = call imports.%foo.decl() // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- fail_todo_import_variadic.carbon @@ -285,6 +291,8 @@ fn G() -> i32 { // CHECK:STDOUT: %foo.ref: %foo.cpp_overload_set.type = name_ref foo, imports.%foo.cpp_overload_set.value [concrete = constants.%foo.cpp_overload_set.value] // CHECK:STDOUT: %int_8: Core.IntLiteral = int_value 8 [concrete = constants.%int_8] // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- todo_fail_import_static.carbon @@ -312,6 +320,8 @@ fn G() -> i32 { // CHECK:STDOUT: %foo.ref: %foo.cpp_overload_set.type = name_ref foo, imports.%foo.cpp_overload_set.value [concrete = constants.%foo.cpp_overload_set.value] // CHECK:STDOUT: %foo.call: init %empty_tuple.type = call imports.%foo.decl() // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- import_template_function.carbon @@ -382,6 +392,8 @@ fn G() -> i32 { // CHECK:STDOUT: %.loc8_13.2: %i32 = converted %int_1, %.loc8_13.1 [concrete = constants.%int_1.0c6] // CHECK:STDOUT: %foo.call: init %empty_tuple.type = call imports.%foo.decl(%.loc8_13.2) // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @G() -> out %return.param: %i32 { @@ -399,5 +411,7 @@ fn G() -> i32 { // CHECK:STDOUT: %.loc14_20.2: %i32 = converted %int_1, %.loc14_20.1 [concrete = constants.%int_1.0c6] // CHECK:STDOUT: %bar.call: init %i32 = call imports.%bar.decl(%.loc14_20.2) // CHECK:STDOUT: return %bar.call +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/interop/cpp/function/import/in_template.carbon b/toolchain/check/testdata/interop/cpp/function/import/in_template.carbon index 2436995927a9..049bf496081f 100644 --- a/toolchain/check/testdata/interop/cpp/function/import/in_template.carbon +++ b/toolchain/check/testdata/interop/cpp/function/import/in_template.carbon @@ -92,5 +92,7 @@ fn F() { // CHECK:STDOUT: %.loc8_11.2: %i32 = converted %int_42, %.loc8_11.1 [concrete = constants.%int_42.ac4] // CHECK:STDOUT: %X.f.call: init %empty_tuple.type = call imports.%X.f.decl(%.loc8_11.2) // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/interop/cpp/function/import/inline.carbon b/toolchain/check/testdata/interop/cpp/function/import/inline.carbon index 58ec72be9574..60ac9423a2e5 100644 --- a/toolchain/check/testdata/interop/cpp/function/import/inline.carbon +++ b/toolchain/check/testdata/interop/cpp/function/import/inline.carbon @@ -111,6 +111,8 @@ fn MyF() { // CHECK:STDOUT: %foo.ref: %foo.cpp_overload_set.type = name_ref foo, imports.%foo.cpp_overload_set.value [concrete = constants.%foo.cpp_overload_set.value] // CHECK:STDOUT: %foo.call: init %empty_tuple.type = call imports.%foo.decl() // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- todo_fail_import_without_definition.carbon @@ -141,6 +143,8 @@ fn MyF() { // CHECK:STDOUT: %foo.ref.loc20: %foo.cpp_overload_set.type = name_ref foo, imports.%foo.cpp_overload_set.value [concrete = constants.%foo.cpp_overload_set.value] // CHECK:STDOUT: %foo.call.loc20: init %empty_tuple.type = call imports.%foo.decl() // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- automatic_return_type.carbon @@ -362,6 +366,8 @@ fn MyF() { // CHECK:STDOUT: %Destroy.Op.call.loc15: init %empty_tuple.type = call %Destroy.Op.bound.loc15(%.loc15_43.3) // CHECK:STDOUT: %Destroy.Op.call.loc14: init %empty_tuple.type = call constants.%Destroy.Op.bound(constants.%.597) // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Destroy.Op.loc16_41.1(%self.param: ref %i16.builtin) = "no_op"; @@ -369,5 +375,7 @@ fn MyF() { // CHECK:STDOUT: fn @Destroy.Op.loc16_41.2(%self.param: ref %i16) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/interop/cpp/function/import/multiple_too_few_args_calls.carbon b/toolchain/check/testdata/interop/cpp/function/import/multiple_too_few_args_calls.carbon index 32fc26d17b8e..c925a442237a 100644 --- a/toolchain/check/testdata/interop/cpp/function/import/multiple_too_few_args_calls.carbon +++ b/toolchain/check/testdata/interop/cpp/function/import/multiple_too_few_args_calls.carbon @@ -67,5 +67,7 @@ fn Call() { // CHECK:STDOUT: %Cpp.ref.loc27: = name_ref Cpp, imports.%Cpp [concrete = imports.%Cpp] // CHECK:STDOUT: %F2.ref: %F2.cpp_overload_set.type = name_ref F2, imports.%F2.cpp_overload_set.value [concrete = constants.%F2.cpp_overload_set.value] // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/interop/cpp/function/import/overloads.carbon b/toolchain/check/testdata/interop/cpp/function/import/overloads.carbon index 00165c9e212c..027a27828cf8 100644 --- a/toolchain/check/testdata/interop/cpp/function/import/overloads.carbon +++ b/toolchain/check/testdata/interop/cpp/function/import/overloads.carbon @@ -920,6 +920,8 @@ fn F() { // CHECK:STDOUT: %bar__carbon_thunk.call: init %empty_tuple.type = call imports.%bar__carbon_thunk.decl(%addr) // CHECK:STDOUT: %Destroy.Op.call: init %empty_tuple.type = call constants.%Destroy.Op.bound(constants.%.597) // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @bar(%a.param: %i16); @@ -931,6 +933,8 @@ fn F() { // CHECK:STDOUT: fn @Destroy.Op.loc7_13.2(%self.param: ref %i16) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- import_overloaded_functions.carbon @@ -1027,6 +1031,8 @@ fn F() { // CHECK:STDOUT: %.loc7_13.2: %i32 = converted %int_1, %.loc7_13.1 [concrete = constants.%int_1.0c6] // CHECK:STDOUT: %foo.call: init %empty_tuple.type = call imports.%foo.decl(%.loc7_13.2) // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @foo(%a.param: %i32); @@ -1203,6 +1209,8 @@ fn F() { // CHECK:STDOUT: %foo__carbon_thunk.call: init %empty_tuple.type = call imports.%foo__carbon_thunk.decl(%addr) // CHECK:STDOUT: %Destroy.Op.call: init %empty_tuple.type = call constants.%Destroy.Op.bound(constants.%.597) // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @foo.1(%a.param: %i32); @@ -1216,6 +1224,8 @@ fn F() { // CHECK:STDOUT: fn @Destroy.Op.loc8_13.2(%self.param: ref %i16) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- import_multiple_overloaded_sets.carbon @@ -1342,6 +1352,8 @@ fn F() { // CHECK:STDOUT: %.loc8_13.2: %i32 = converted %int_1.loc8, %.loc8_13.1 [concrete = constants.%int_1.0c6] // CHECK:STDOUT: %bar.call: init %empty_tuple.type = call imports.%bar.decl(%.loc8_13.2) // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @foo(%a.param: %i32); @@ -1807,6 +1819,8 @@ fn F() { // CHECK:STDOUT: %Destroy.Op.call.loc22_51: init %empty_tuple.type = call %Destroy.Op.bound.loc22(%.loc22_51.3) // CHECK:STDOUT: %Destroy.Op.call.loc22_32: init %empty_tuple.type = call constants.%Destroy.Op.bound.eaa(constants.%.e05) // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @foo.1(%a.param: %i32) -> out %return.param: %i32; @@ -1822,6 +1836,8 @@ fn F() { // CHECK:STDOUT: fn @Destroy.Op.loc31_71.2(%self.param: ref %i128) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- fail_import_large_int_literal.carbon @@ -1878,6 +1894,8 @@ fn F() { // CHECK:STDOUT: %h.patt: %pattern_type.97f = value_binding_pattern h [concrete = constants.%h.patt] // CHECK:STDOUT: } // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- import_negative_int_literal.carbon @@ -1992,6 +2010,8 @@ fn F() { // CHECK:STDOUT: %.loc8_11.4: %i32 = converted %Core.IntLiteral.as.Negate.impl.Op.call, %.loc8_11.3 [concrete = constants.%int_-1.4ef] // CHECK:STDOUT: %foo.call: init %empty_tuple.type = call imports.%foo.decl(%.loc8_11.4) // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @foo(%a.param: %i32); @@ -2108,6 +2128,8 @@ fn F() { // CHECK:STDOUT: %.loc15_11.4: %u32 = converted %Core.IntLiteral.as.Negate.impl.Op.call, %.loc15_11.3 [concrete = constants.%int_-1.002] // CHECK:STDOUT: %foo.call: init %empty_tuple.type = call imports.%foo.decl(%.loc15_11.4) // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @foo(%a.param: %u32); @@ -2266,6 +2288,8 @@ fn F() { // CHECK:STDOUT: %Destroy.Op.call.loc7_34: init %empty_tuple.type = call %Destroy.Op.bound(%.loc7_34.3) // CHECK:STDOUT: %Destroy.Op.call.loc7_31: init %empty_tuple.type = call constants.%Destroy.Op.bound(constants.%.011) // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @foo(%a.param: %f64.dc1) -> out %return.param: %f64.dc1; @@ -2277,6 +2301,8 @@ fn F() { // CHECK:STDOUT: fn @Destroy.Op.loc7_34.2(%self.param: ref %f64.dc1) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- fail_import_large_floating_point_literal.carbon @@ -2418,6 +2444,8 @@ fn F() { // CHECK:STDOUT: %Destroy.Op.bound: = bound_method %.loc15_19.3, constants.%Destroy.Op.1a2547.2 // CHECK:STDOUT: %Destroy.Op.call: init %empty_tuple.type = call %Destroy.Op.bound(%.loc15_19.3) // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @foo(%a.param: %f64.dc1) -> out %return.param: %f64.dc1; @@ -2429,6 +2457,8 @@ fn F() { // CHECK:STDOUT: fn @Destroy.Op.loc15_19.2(%self.param: ref %f64.dc1) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- struct_init.carbon @@ -2592,6 +2622,8 @@ fn F() { // CHECK:STDOUT: %Destroy.Op.bound: = bound_method %.loc15_30.2, constants.%Destroy.Op // CHECK:STDOUT: %Destroy.Op.call: init %empty_tuple.type = call %Destroy.Op.bound(%.loc15_30.2) // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @PassNoFields(%s.param: %NoFields); @@ -2781,6 +2813,8 @@ fn F() { // CHECK:STDOUT: %addr.loc72: %ptr.6c3 = addr_of [concrete = ] // CHECK:STDOUT: %PassThreeFields__carbon_thunk.call.loc72: init %empty_tuple.type = call imports.%PassThreeFields__carbon_thunk.decl(%addr.loc72) // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @PassThreeFields(%t.param: %ThreeFields.1b4); @@ -2845,6 +2879,8 @@ fn F() { // CHECK:STDOUT: %int_3.loc25: Core.IntLiteral = int_value 3 [concrete = constants.%int_3] // CHECK:STDOUT: %.loc25: %struct_type.a.x.c = struct_literal (%int_1.loc25, %int_2.loc25, %int_3.loc25) [concrete = constants.%struct.11a] // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- fail_struct_init_unsupported_field_name.carbon @@ -2891,6 +2927,8 @@ fn F() { // CHECK:STDOUT: %int_1: Core.IntLiteral = int_value 1 [concrete = constants.%int_1] // CHECK:STDOUT: %.loc11: %struct_type.base = struct_literal (%int_1) [concrete = constants.%struct] // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- fail_struct_init_from_tuple.carbon @@ -3135,6 +3173,8 @@ fn F() { // CHECK:STDOUT: %addr.loc62: %ptr.027 = addr_of [concrete = ] // CHECK:STDOUT: %PassNoFields__carbon_thunk.call.loc62: init %empty_tuple.type = call imports.%PassNoFields__carbon_thunk.decl(%addr.loc62) // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @PassNoFields(%s.param: %NoFields); @@ -3175,6 +3215,8 @@ fn F() { // CHECK:STDOUT: %addr.loc118: %ptr.6c3 = addr_of [concrete = ] // CHECK:STDOUT: %PassThreeFields__carbon_thunk.call.loc118: init %empty_tuple.type = call imports.%PassThreeFields__carbon_thunk.decl(%addr.loc118) // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @PassThreeFields(%t.param: %ThreeFields.1b4); @@ -3259,6 +3301,8 @@ fn F() { // CHECK:STDOUT: %.loc33_16.2: %i32 = converted %.loc33_16.1, [concrete = ] // CHECK:STDOUT: %PassInt.call.loc33: init %empty_tuple.type = call imports.%PassInt.decl() // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @PassInt(%n.param: %i32); @@ -3341,6 +3385,8 @@ fn F() { // CHECK:STDOUT: %.loc34_23.2: %i32 = converted %.loc34_23.1, [concrete = ] // CHECK:STDOUT: %PassOverloaded.call.loc34: init %empty_tuple.type = call imports.%PassOverloaded.decl() // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @PassOverloaded(%n.param: %i32); @@ -3396,6 +3442,8 @@ fn F() { // CHECK:STDOUT: %int_3: Core.IntLiteral = int_value 3 [concrete = constants.%int_3] // CHECK:STDOUT: %.loc15_43: %struct_type.a.n = struct_literal (%.loc15_34, %int_3) [concrete = constants.%struct.7ea] // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- fail_todo_pass_nested_structs.carbon @@ -3516,6 +3564,8 @@ fn F() { // CHECK:STDOUT: %addr: %ptr.dc0 = addr_of [concrete = ] // CHECK:STDOUT: %TakeB__carbon_thunk.call: init %empty_tuple.type = call imports.%TakeB__carbon_thunk.decl(%addr) // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @TakeB(%_.param: %B); @@ -3623,6 +3673,8 @@ fn F() { // CHECK:STDOUT: %.loc18_13.3: %i32 = converted %.loc18_13.2, [concrete = ] // CHECK:STDOUT: %foo.call: init %empty_tuple.type = call imports.%foo.decl() // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @foo(%a.param: %i32); @@ -3730,6 +3782,8 @@ fn F() { // CHECK:STDOUT: %addr: %ptr = addr_of [concrete = ] // CHECK:STDOUT: %foo__carbon_thunk.call: init %empty_tuple.type = call imports.%foo__carbon_thunk.decl(%addr) // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @foo(%a.param: %i16); @@ -3811,6 +3865,8 @@ fn F() { // CHECK:STDOUT: %.loc15_13.1: %i64 = value_of_initializer %Core.IntLiteral.as.As.impl.Convert.call [concrete = constants.%int_1.d98] // CHECK:STDOUT: %.loc15_13.2: %i64 = converted %int_1, %.loc15_13.1 [concrete = constants.%int_1.d98] // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- fail_import_ambiguous_overload.carbon @@ -3888,6 +3944,8 @@ fn F() { // CHECK:STDOUT: %.loc19_13.1: %i64 = value_of_initializer %Core.IntLiteral.as.As.impl.Convert.call [concrete = constants.%int_1.d98] // CHECK:STDOUT: %.loc19_13.2: %i64 = converted %int_1, %.loc19_13.1 [concrete = constants.%int_1.d98] // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- fail_import_deleted_function.carbon @@ -3965,6 +4023,8 @@ fn F() { // CHECK:STDOUT: %.loc19_13.1: %i32 = value_of_initializer %Core.IntLiteral.as.As.impl.Convert.call [concrete = constants.%int_1.0c6] // CHECK:STDOUT: %.loc19_13.2: %i32 = converted %int_1, %.loc19_13.1 [concrete = constants.%int_1.0c6] // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- fail_missing_impl.carbon @@ -4043,6 +4103,8 @@ fn F() { // CHECK:STDOUT: witness = () // CHECK:STDOUT: // CHECK:STDOUT: !requires: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: generic fn @EchoValue(%ValueT.loc10_20.2: %I.type, %value.loc10_38.2: @EchoValue.%ValueT.as_type.loc10_41.1 (%ValueT.as_type)) { @@ -4058,6 +4120,8 @@ fn F() { // CHECK:STDOUT: fn() { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: @@ -4067,6 +4131,8 @@ fn F() { // CHECK:STDOUT: %Cpp.ref: = name_ref Cpp, imports.%Cpp [concrete = imports.%Cpp] // CHECK:STDOUT: %foo.ref: %foo.cpp_overload_set.type = name_ref foo, imports.%foo.cpp_overload_set.value [concrete = constants.%foo.cpp_overload_set.value] // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: specific @I.WithSelf(constants.%Self) { diff --git a/toolchain/check/testdata/interop/cpp/function/import/param_unsupported.carbon b/toolchain/check/testdata/interop/cpp/function/import/param_unsupported.carbon index c2e5a4d6bc08..ee022a5a9697 100644 --- a/toolchain/check/testdata/interop/cpp/function/import/param_unsupported.carbon +++ b/toolchain/check/testdata/interop/cpp/function/import/param_unsupported.carbon @@ -118,6 +118,8 @@ fn F(x: i8388608) { // CHECK:STDOUT: %foo.ref: %foo.cpp_overload_set.type = name_ref foo, imports.%foo.cpp_overload_set.value [concrete = constants.%foo.cpp_overload_set.value] // CHECK:STDOUT: %int_11: Core.IntLiteral = int_value 11 [concrete = constants.%int_11] // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- fail_todo_import_unsupported_primitive_type_among_params.carbon @@ -144,5 +146,7 @@ fn F(x: i8388608) { // CHECK:STDOUT: %int_1: Core.IntLiteral = int_value 1 [concrete = constants.%int_1] // CHECK:STDOUT: %int_20: Core.IntLiteral = int_value 20 [concrete = constants.%int_20] // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/interop/cpp/function/import/pointer.carbon b/toolchain/check/testdata/interop/cpp/function/import/pointer.carbon index a2eef6cc9c23..822e48e8046b 100644 --- a/toolchain/check/testdata/interop/cpp/function/import/pointer.carbon +++ b/toolchain/check/testdata/interop/cpp/function/import/pointer.carbon @@ -486,6 +486,8 @@ fn F() { // CHECK:STDOUT: %S.cpp_destructor.bound: = bound_method %s.var, constants.%S.cpp_destructor // CHECK:STDOUT: %S.cpp_destructor.call: init %empty_tuple.type = call %S.cpp_destructor.bound(%s.var) // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- import_non_nullable_pointer_param_using_const_pointer.carbon @@ -550,6 +552,8 @@ fn F() { // CHECK:STDOUT: %Destroy.Op.bound: = bound_method %p.var, constants.%Destroy.Op.1a2547.2 // CHECK:STDOUT: %Destroy.Op.call: init %empty_tuple.type = call %Destroy.Op.bound(%p.var) // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Destroy.Op.loc10_3.1(%self.param: ref %ptr) = "no_op"; @@ -557,6 +561,8 @@ fn F() { // CHECK:STDOUT: fn @Destroy.Op.loc10_3.2(%self.param: ref %const) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- import_double_non_nullable_pointer_param.carbon @@ -658,6 +664,8 @@ fn F() { // CHECK:STDOUT: %S.cpp_destructor.bound: = bound_method %s.var, constants.%S.cpp_destructor // CHECK:STDOUT: %S.cpp_destructor.call: init %empty_tuple.type = call %S.cpp_destructor.bound(%s.var) // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Destroy.Op(%self.param: ref %ptr.037) = "no_op"; @@ -722,11 +730,15 @@ fn F() { // CHECK:STDOUT: %Destroy.Op.bound: = bound_method %s.var, constants.%Destroy.Op // CHECK:STDOUT: %Destroy.Op.call: init %empty_tuple.type = call %Destroy.Op.bound(%s.var) // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Destroy.Op(%self.param: ref %const) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- import_non_nullable_pointer_to_const_param_using_non_const.carbon @@ -791,6 +803,8 @@ fn F() { // CHECK:STDOUT: %S.cpp_destructor.bound: = bound_method %s.var, constants.%S.cpp_destructor // CHECK:STDOUT: %S.cpp_destructor.call: init %empty_tuple.type = call %S.cpp_destructor.bound(%s.var) // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- import_const_non_nullable_pointer_param_using_const.carbon @@ -855,6 +869,8 @@ fn F() { // CHECK:STDOUT: %Destroy.Op.bound: = bound_method %p.var, constants.%Destroy.Op.1a2547.2 // CHECK:STDOUT: %Destroy.Op.call: init %empty_tuple.type = call %Destroy.Op.bound(%p.var) // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Destroy.Op.loc10_3.1(%self.param: ref %ptr) = "no_op"; @@ -862,6 +878,8 @@ fn F() { // CHECK:STDOUT: fn @Destroy.Op.loc10_3.2(%self.param: ref %const) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- import_const_non_nullable_pointer_param_using_non_const.carbon @@ -922,6 +940,8 @@ fn F() { // CHECK:STDOUT: %Destroy.Op.bound: = bound_method %p.var, constants.%Destroy.Op // CHECK:STDOUT: %Destroy.Op.call: init %empty_tuple.type = call %Destroy.Op.bound(%p.var) // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Destroy.Op(%self.param: ref %ptr) = "no_op"; @@ -1060,26 +1080,36 @@ fn F() { // CHECK:STDOUT: %Destroy.Op.bound.loc10: = bound_method %p.var, constants.%Destroy.Op.1a2547.5 // CHECK:STDOUT: %Destroy.Op.call.loc10: init %empty_tuple.type = call %Destroy.Op.bound.loc10(%p.var) // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Destroy.Op.loc11_11.1(%self.param: ref %.08a0) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Destroy.Op.loc11_11.2(%self.param: ref %MaybeUnformed.9f2) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Destroy.Op.loc11_11.3(%self.param: ref %Optional.659) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Destroy.Op.loc10(%self.param: ref %const.f96) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- import_const_nullable_pointer_param_using_non_const.carbon @@ -1204,21 +1234,29 @@ fn F() { // CHECK:STDOUT: %Destroy.Op.bound.loc10: = bound_method %p.var, constants.%Destroy.Op.1a2547.1 // CHECK:STDOUT: %Destroy.Op.call.loc10: init %empty_tuple.type = call %Destroy.Op.bound.loc10(%p.var) // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Destroy.Op.loc11_11.1(%self.param: ref %.08a0) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Destroy.Op.loc11_11.2(%self.param: ref %MaybeUnformed.9f2) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Destroy.Op.loc11_11.3(%self.param: ref %Optional.659) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- import_non_nullable_pointer_return.carbon @@ -1263,6 +1301,8 @@ fn F() { // CHECK:STDOUT: %foo.ref.loc11: %foo.cpp_overload_set.type = name_ref foo, imports.%foo.cpp_overload_set.value [concrete = constants.%foo.cpp_overload_set.value] // CHECK:STDOUT: %foo.call.loc11: init %ptr = call imports.%foo.decl() // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- import_double_pointer_return.carbon @@ -1308,6 +1348,8 @@ fn F() { // CHECK:STDOUT: %foo.ref.loc11: %foo.cpp_overload_set.type = name_ref foo, imports.%foo.cpp_overload_set.value [concrete = constants.%foo.cpp_overload_set.value] // CHECK:STDOUT: %foo.call.loc11: init %ptr.65c = call imports.%foo.decl() // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- import_const_non_nullable_pointer_return.carbon @@ -1353,6 +1395,8 @@ fn F() { // CHECK:STDOUT: %foo.ref.loc11: %foo.cpp_overload_set.type = name_ref foo, imports.%foo.cpp_overload_set.value [concrete = constants.%foo.cpp_overload_set.value] // CHECK:STDOUT: %foo.call.loc11: init %ptr = call imports.%foo.decl() // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- non_nullable_pointer_arg_to_pointer_param.carbon @@ -1480,21 +1524,29 @@ fn F() { // CHECK:STDOUT: %S.cpp_destructor.bound: = bound_method %s.var, constants.%S.cpp_destructor // CHECK:STDOUT: %S.cpp_destructor.call: init %empty_tuple.type = call %S.cpp_destructor.bound(%s.var) // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Destroy.Op.loc9_11.1(%self.param: ref %.08a0) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Destroy.Op.loc9_11.2(%self.param: ref %MaybeUnformed.9f2) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Destroy.Op.loc9_11.3(%self.param: ref %Optional.659) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- null_pointer_arg_to_pointer_param.carbon @@ -1597,21 +1649,29 @@ fn F() { // CHECK:STDOUT: %Destroy.Op.bound: = bound_method %.loc8_38.2, constants.%Destroy.Op.1a2547.4 // CHECK:STDOUT: %Destroy.Op.call: init %empty_tuple.type = call %Destroy.Op.bound(%.loc8_38.2) // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Destroy.Op.loc8_38.1(%self.param: ref %.08a) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Destroy.Op.loc8_38.2(%self.param: ref %MaybeUnformed.9f2) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Destroy.Op.loc8_38.3(%self.param: ref %Optional.db1) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- nonnull_pointer_arg_to_pointer_param.carbon @@ -1744,21 +1804,29 @@ fn F() { // CHECK:STDOUT: %S.cpp_destructor.bound: = bound_method %s.var, constants.%S.cpp_destructor // CHECK:STDOUT: %S.cpp_destructor.call: init %empty_tuple.type = call %S.cpp_destructor.bound(%s.var) // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Destroy.Op.loc9_40.1(%self.param: ref %.08a0) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Destroy.Op.loc9_40.2(%self.param: ref %MaybeUnformed.9f2) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Destroy.Op.loc9_40.3(%self.param: ref %Optional.659) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- forward_nullable_pointer.carbon @@ -1845,21 +1913,29 @@ fn F() { // CHECK:STDOUT: %Destroy.Op.bound: = bound_method %.loc8_19.2, constants.%Destroy.Op.1a2547.4 // CHECK:STDOUT: %Destroy.Op.call: init %empty_tuple.type = call %Destroy.Op.bound(%.loc8_19.2) // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Destroy.Op.loc8_19.1(%self.param: ref %.08a) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Destroy.Op.loc8_19.2(%self.param: ref %MaybeUnformed.9f2) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Destroy.Op.loc8_19.3(%self.param: ref %Optional.19d) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- import_deduced_any_param_as_pointer.carbon @@ -1934,6 +2010,8 @@ fn F() { // CHECK:STDOUT: %S.cpp_destructor.bound: = bound_method %s.var, constants.%S.cpp_destructor // CHECK:STDOUT: %S.cpp_destructor.call: init %empty_tuple.type = call %S.cpp_destructor.bound(%s.var) // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- import_deduced_pointer_param_as_pointer.carbon @@ -2127,20 +2205,28 @@ fn F() { // CHECK:STDOUT: %S.cpp_destructor.bound: = bound_method %s.var, constants.%S.cpp_destructor // CHECK:STDOUT: %S.cpp_destructor.call: init %empty_tuple.type = call %S.cpp_destructor.bound(%s.var) // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Destroy.Op.loc13_65.1(%self.param: ref %.08a0) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Destroy.Op.loc13_65.2(%self.param: ref %MaybeUnformed.9f2) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Destroy.Op.loc13_65.3(%self.param: ref %Optional.659) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/interop/cpp/function/import/qualified_param.carbon b/toolchain/check/testdata/interop/cpp/function/import/qualified_param.carbon index 19470127db03..62e34c5098b0 100644 --- a/toolchain/check/testdata/interop/cpp/function/import/qualified_param.carbon +++ b/toolchain/check/testdata/interop/cpp/function/import/qualified_param.carbon @@ -139,5 +139,7 @@ fn F() { // CHECK:STDOUT: %S.cpp_destructor.bound: = bound_method %s.var, constants.%S.cpp_destructor // CHECK:STDOUT: %S.cpp_destructor.call: init %empty_tuple.type = call %S.cpp_destructor.bound(%s.var) // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/interop/cpp/function/import/reference.carbon b/toolchain/check/testdata/interop/cpp/function/import/reference.carbon index 6a7717e68589..6888e00eb0ff 100644 --- a/toolchain/check/testdata/interop/cpp/function/import/reference.carbon +++ b/toolchain/check/testdata/interop/cpp/function/import/reference.carbon @@ -540,6 +540,8 @@ fn PassConstRef(ref x: const X) { // CHECK:STDOUT: %S.cpp_destructor.bound: = bound_method %s.var, constants.%S.cpp_destructor // CHECK:STDOUT: %S.cpp_destructor.call: init %empty_tuple.type = call %S.cpp_destructor.bound(%s.var) // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- fail_param_lvalue_ref.carbon @@ -692,6 +694,8 @@ fn PassConstRef(ref x: const X) { // CHECK:STDOUT: %S.cpp_destructor.bound.loc8: = bound_method %v.var, constants.%S.cpp_destructor // CHECK:STDOUT: %S.cpp_destructor.call.loc8: init %empty_tuple.type = call %S.cpp_destructor.bound.loc8(%v.var) // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- call_param_rvalue_ref.carbon @@ -738,6 +742,8 @@ fn PassConstRef(ref x: const X) { // CHECK:STDOUT: %addr: %ptr.037 = addr_of %_.var // CHECK:STDOUT: %TakesRValue__carbon_thunk.call: init %empty_tuple.type = call imports.%TakesRValue__carbon_thunk.decl(%addr) // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- fail_param_rvalue_ref.carbon @@ -858,6 +864,8 @@ fn PassConstRef(ref x: const X) { // CHECK:STDOUT: %S.cpp_destructor.bound: = bound_method %s.var, constants.%S.cpp_destructor // CHECK:STDOUT: %S.cpp_destructor.call: init %empty_tuple.type = call %S.cpp_destructor.bound(%s.var) // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- call_param_const_lvalue_ref_with_ref.carbon @@ -941,6 +949,8 @@ fn PassConstRef(ref x: const X) { // CHECK:STDOUT: %S.cpp_destructor.bound: = bound_method %s.var, constants.%S.cpp_destructor // CHECK:STDOUT: %S.cpp_destructor.call: init %empty_tuple.type = call %S.cpp_destructor.bound(%s.var) // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- call_param_const_lvalue_ref_with_value.carbon @@ -1018,6 +1028,8 @@ fn PassConstRef(ref x: const X) { // CHECK:STDOUT: %.loc11_40.2: %ptr.711 = converted %addr.loc11, %.loc11_40.1 // CHECK:STDOUT: %TakesConstLValue__carbon_thunk.call.loc11: init %empty_tuple.type = call imports.%TakesConstLValue__carbon_thunk.decl(%.loc11_40.2) // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- param_value_arg_for_const_rvalue_ref.carbon @@ -1070,6 +1082,8 @@ fn PassConstRef(ref x: const X) { // CHECK:STDOUT: %.loc9_26.2: %ptr.711 = converted %addr.loc9, %.loc9_26.1 // CHECK:STDOUT: %TakesConstRValue__carbon_thunk.call.loc9: init %empty_tuple.type = call imports.%TakesConstRValue__carbon_thunk.decl(%.loc9_26.2) // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- fail_param_lvalue_ref_arg_const_rvalue_ref.carbon @@ -1172,6 +1186,8 @@ fn PassConstRef(ref x: const X) { // CHECK:STDOUT: %S.cpp_destructor.bound: = bound_method %s.var, constants.%S.cpp_destructor // CHECK:STDOUT: %S.cpp_destructor.call: init %empty_tuple.type = call %S.cpp_destructor.bound(%s.var) // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- call_return_lvalue_ref.carbon @@ -1211,6 +1227,8 @@ fn PassConstRef(ref x: const X) { // CHECK:STDOUT: %s.patt: %pattern_type = ref_binding_pattern s [concrete = constants.%s.patt] // CHECK:STDOUT: } // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- call_return_rvalue_ref.carbon @@ -1250,6 +1268,8 @@ fn PassConstRef(ref x: const X) { // CHECK:STDOUT: %s.patt: %pattern_type = ref_binding_pattern s [concrete = constants.%s.patt] // CHECK:STDOUT: } // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- call_return_const_lvalue_ref.carbon @@ -1291,6 +1311,8 @@ fn PassConstRef(ref x: const X) { // CHECK:STDOUT: %s.patt: %pattern_type = ref_binding_pattern s [concrete = constants.%s.patt] // CHECK:STDOUT: } // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- forwarding_reference.carbon @@ -1366,6 +1388,8 @@ fn PassConstRef(ref x: const X) { // CHECK:STDOUT: %.loc28_37.2: %ptr.faf = converted %addr, %.loc28_37.1 // CHECK:STDOUT: %TakeAnything_ExpectConstRRef__carbon_thunk.call: init %empty_tuple.type = call imports.%TakeAnything_ExpectConstRRef__carbon_thunk.decl(%.loc28_37.2) // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @PassRef(%x.param: ref %X) { @@ -1376,6 +1400,8 @@ fn PassConstRef(ref x: const X) { // CHECK:STDOUT: %.loc34: %X = ref_tag %x.ref // CHECK:STDOUT: %TakeAnything_ExpectLRef.call: init %empty_tuple.type = call imports.%TakeAnything_ExpectLRef.decl(%x.ref) // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @PassConstRef(%x.param: ref %const) { @@ -1392,6 +1418,8 @@ fn PassConstRef(ref x: const X) { // CHECK:STDOUT: %.loc40_37.2: %ptr.faf = converted %addr, %.loc40_37.1 // CHECK:STDOUT: %TakeAnything_ExpectConstLRef__carbon_thunk.call: init %empty_tuple.type = call imports.%TakeAnything_ExpectConstLRef__carbon_thunk.decl(%.loc40_37.2) // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @PassInit() { @@ -1405,5 +1433,7 @@ fn PassConstRef(ref x: const X) { // CHECK:STDOUT: %addr: %ptr.db8 = addr_of %_.var // CHECK:STDOUT: %TakeAnything_ExpectRRef__carbon_thunk.call: init %empty_tuple.type = call imports.%TakeAnything_ExpectRRef__carbon_thunk.decl(%addr) // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/interop/cpp/function/import/return.carbon b/toolchain/check/testdata/interop/cpp/function/import/return.carbon index b4a76de06e77..d23475cd1331 100644 --- a/toolchain/check/testdata/interop/cpp/function/import/return.carbon +++ b/toolchain/check/testdata/interop/cpp/function/import/return.carbon @@ -172,6 +172,8 @@ fn Var() { // CHECK:STDOUT: %Destroy.Op.bound: = bound_method %.loc11_22.3, constants.%Destroy.Op.1a2547.2 // CHECK:STDOUT: %Destroy.Op.call: init %empty_tuple.type = call %Destroy.Op.bound(%.loc11_22.3) // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Destroy.Op.loc11_22.1(%self.param: ref %i16.builtin) = "no_op"; @@ -179,6 +181,8 @@ fn Var() { // CHECK:STDOUT: fn @Destroy.Op.loc11_22.2(%self.param: ref %i16) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- var_from_thunk_param.carbon @@ -243,6 +247,8 @@ fn Var() { // CHECK:STDOUT: %Destroy.Op.bound: = bound_method %c.var, constants.%Destroy.Op.1a2547.5 // CHECK:STDOUT: %Destroy.Op.call: init %empty_tuple.type = call %Destroy.Op.bound(%c.var) // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Destroy.Op.loc11_3.1(%self.param: ref %ptr.00a) = "no_op"; @@ -250,16 +256,22 @@ fn Var() { // CHECK:STDOUT: fn @Destroy.Op.loc11_3.2(%self.param: ref %.a7d) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Destroy.Op.loc11_3.3(%self.param: ref %MaybeUnformed.399) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Destroy.Op.loc11_3.4(%self.param: ref %Cpp.nullptr_t) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- return_from_thunk_param.carbon @@ -342,6 +354,8 @@ fn Var() { // CHECK:STDOUT: %ReturnU8__carbon_thunk.call: init %empty_tuple.type = call imports.%ReturnU8__carbon_thunk.decl(%addr) // CHECK:STDOUT: %.loc8_40.2: init %u8 to %.loc8_40.1 = mark_in_place_init %ReturnU8__carbon_thunk.call // CHECK:STDOUT: return %.loc8_40.2 +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @ReturnU8() -> out %return.param: %u8; @@ -428,6 +442,8 @@ fn Var() { // CHECK:STDOUT: %Destroy.Op.bound: = bound_method %my_u32.var, constants.%Destroy.Op.1a2547.2 // CHECK:STDOUT: %Destroy.Op.call: init %empty_tuple.type = call %Destroy.Op.bound(%my_u32.var) // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @ReturnU32() -> out %return.param: %u32; @@ -437,5 +453,7 @@ fn Var() { // CHECK:STDOUT: fn @Destroy.Op.loc9_3.2(%self.param: ref %u32) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/interop/cpp/function/import/struct.carbon b/toolchain/check/testdata/interop/cpp/function/import/struct.carbon index f3b1a5a03318..1b758df97f6f 100644 --- a/toolchain/check/testdata/interop/cpp/function/import/struct.carbon +++ b/toolchain/check/testdata/interop/cpp/function/import/struct.carbon @@ -527,6 +527,8 @@ fn F() { // CHECK:STDOUT: %addr: %ptr.037 = addr_of %.loc8 // CHECK:STDOUT: %foo__carbon_thunk.call: init %empty_tuple.type = call imports.%foo__carbon_thunk.decl(%addr) // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- fail_import_non_copyable_param_type.carbon @@ -562,6 +564,8 @@ fn F() { // CHECK:STDOUT: %s.ref: %S = name_ref s, %s // CHECK:STDOUT: %foo.call: init %empty_tuple.type = call imports.%foo.decl(%s.ref) // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- definition_single_data_member_value_param_type.carbon @@ -600,6 +604,8 @@ fn F() { // CHECK:STDOUT: %addr: %ptr.037 = addr_of %.loc8 // CHECK:STDOUT: %foo__carbon_thunk.call: init %empty_tuple.type = call imports.%foo__carbon_thunk.decl(%addr) // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- definition_multiple_data_members_value_param_type.carbon @@ -638,6 +644,8 @@ fn F() { // CHECK:STDOUT: %addr: %ptr.037 = addr_of %.loc8 // CHECK:STDOUT: %foo__carbon_thunk.call: init %empty_tuple.type = call imports.%foo__carbon_thunk.decl(%addr) // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- import_definition_in_namespace_value_param_type.carbon @@ -719,6 +727,8 @@ fn F() { // CHECK:STDOUT: %S.cpp_destructor.bound: = bound_method %x.var, constants.%S.cpp_destructor // CHECK:STDOUT: %S.cpp_destructor.call: init %empty_tuple.type = call %S.cpp_destructor.bound(%x.var) // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- import_definition_in_relative_namespace_value_param_type.carbon @@ -766,6 +776,8 @@ fn F() { // CHECK:STDOUT: %addr: %ptr.b0f = addr_of %.loc8 // CHECK:STDOUT: %foo__carbon_thunk.call: init %empty_tuple.type = call imports.%foo__carbon_thunk.decl(%addr) // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- import_definition_in_outer_definition.carbon @@ -843,6 +855,8 @@ fn F() { // CHECK:STDOUT: %O.cpp_destructor.bound: = bound_method %x.var, constants.%O.cpp_destructor // CHECK:STDOUT: %O.cpp_destructor.call: init %empty_tuple.type = call %O.cpp_destructor.bound(%x.var) // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- import_definition_and_static_method_call_before.carbon @@ -891,6 +905,8 @@ fn F() { // CHECK:STDOUT: %addr: %ptr.037 = addr_of %.loc9 // CHECK:STDOUT: %foo__carbon_thunk.call: init %empty_tuple.type = call imports.%foo__carbon_thunk.decl(%addr) // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- import_definition_and_static_method_call_after.carbon @@ -939,6 +955,8 @@ fn F() { // CHECK:STDOUT: %bar.ref: %S.bar.cpp_overload_set.type = name_ref bar, imports.%S.bar.cpp_overload_set.value [concrete = constants.%S.bar.cpp_overload_set.value] // CHECK:STDOUT: %S.bar.call: init %empty_tuple.type = call imports.%S.bar.decl() // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- import_decl_pointer_param_type.carbon @@ -975,6 +993,8 @@ fn F() { // CHECK:STDOUT: %s.ref: %ptr = name_ref s, %s // CHECK:STDOUT: %foo.call: init %empty_tuple.type = call imports.%foo.decl(%s.ref) // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- import_definition_pointer_param_type.carbon @@ -1011,6 +1031,8 @@ fn F() { // CHECK:STDOUT: %s.ref: %ptr = name_ref s, %s // CHECK:STDOUT: %foo.call: init %empty_tuple.type = call imports.%foo.decl(%s.ref) // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- import_definition_value_return_type.carbon @@ -1052,6 +1074,8 @@ fn F() { // CHECK:STDOUT: %S.cpp_destructor.bound: = bound_method %.loc8_11.3, constants.%S.cpp_destructor // CHECK:STDOUT: %S.cpp_destructor.call: init %empty_tuple.type = call %S.cpp_destructor.bound(%.loc8_11.3) // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- import_decl_pointer_return_type.carbon @@ -1084,6 +1108,8 @@ fn F() { // CHECK:STDOUT: %foo.ref: %foo.cpp_overload_set.type = name_ref foo, imports.%foo.cpp_overload_set.value [concrete = constants.%foo.cpp_overload_set.value] // CHECK:STDOUT: %foo.call: init %ptr = call imports.%foo.decl() // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- import_definition_pointer_return_type.carbon @@ -1116,5 +1142,7 @@ fn F() { // CHECK:STDOUT: %foo.ref: %foo.cpp_overload_set.type = name_ref foo, imports.%foo.cpp_overload_set.value [concrete = constants.%foo.cpp_overload_set.value] // CHECK:STDOUT: %foo.call: init %ptr = call imports.%foo.decl() // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/interop/cpp/function/import/union.carbon b/toolchain/check/testdata/interop/cpp/function/import/union.carbon index 99d6e5f00d77..f4055da1cfd4 100644 --- a/toolchain/check/testdata/interop/cpp/function/import/union.carbon +++ b/toolchain/check/testdata/interop/cpp/function/import/union.carbon @@ -487,6 +487,8 @@ fn F() { // CHECK:STDOUT: %addr: %ptr.2fe = addr_of %.loc8 // CHECK:STDOUT: %foo__carbon_thunk.call: init %empty_tuple.type = call imports.%foo__carbon_thunk.decl(%addr) // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- import_definition_single_data_member_value_param_type.carbon @@ -525,6 +527,8 @@ fn F() { // CHECK:STDOUT: %addr: %ptr.2fe = addr_of %.loc8 // CHECK:STDOUT: %foo__carbon_thunk.call: init %empty_tuple.type = call imports.%foo__carbon_thunk.decl(%addr) // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- import_definition_multiple_data_members_value_param_type.carbon @@ -563,6 +567,8 @@ fn F() { // CHECK:STDOUT: %addr: %ptr.2fe = addr_of %.loc8 // CHECK:STDOUT: %foo__carbon_thunk.call: init %empty_tuple.type = call imports.%foo__carbon_thunk.decl(%addr) // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- import_definition_in_namespace_value_param_type.carbon @@ -644,6 +650,8 @@ fn F() { // CHECK:STDOUT: %U.cpp_destructor.bound: = bound_method %x.var, constants.%U.cpp_destructor // CHECK:STDOUT: %U.cpp_destructor.call: init %empty_tuple.type = call %U.cpp_destructor.bound(%x.var) // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- import_definition_in_relative_namespace_value_param_type.carbon @@ -691,6 +699,8 @@ fn F() { // CHECK:STDOUT: %addr: %ptr.6d9 = addr_of %.loc8 // CHECK:STDOUT: %foo__carbon_thunk.call: init %empty_tuple.type = call imports.%foo__carbon_thunk.decl(%addr) // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- import_definition_in_outer_definition.carbon @@ -768,6 +778,8 @@ fn F() { // CHECK:STDOUT: %O.cpp_destructor.bound: = bound_method %x.var, constants.%O.cpp_destructor // CHECK:STDOUT: %O.cpp_destructor.call: init %empty_tuple.type = call %O.cpp_destructor.bound(%x.var) // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- import_definition_and_static_method_call_before.carbon @@ -816,6 +828,8 @@ fn F() { // CHECK:STDOUT: %addr: %ptr.2fe = addr_of %.loc9 // CHECK:STDOUT: %foo__carbon_thunk.call: init %empty_tuple.type = call imports.%foo__carbon_thunk.decl(%addr) // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- import_definition_and_static_method_call_after.carbon @@ -864,6 +878,8 @@ fn F() { // CHECK:STDOUT: %bar.ref: %U.bar.cpp_overload_set.type = name_ref bar, imports.%U.bar.cpp_overload_set.value [concrete = constants.%U.bar.cpp_overload_set.value] // CHECK:STDOUT: %U.bar.call: init %empty_tuple.type = call imports.%U.bar.decl() // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- import_decl_pointer_param_type.carbon @@ -900,6 +916,8 @@ fn F() { // CHECK:STDOUT: %u.ref: %ptr = name_ref u, %u // CHECK:STDOUT: %foo.call: init %empty_tuple.type = call imports.%foo.decl(%u.ref) // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- import_definition_pointer_param_type.carbon @@ -936,6 +954,8 @@ fn F() { // CHECK:STDOUT: %u.ref: %ptr = name_ref u, %u // CHECK:STDOUT: %foo.call: init %empty_tuple.type = call imports.%foo.decl(%u.ref) // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- import_definition_value_return_type.carbon @@ -977,6 +997,8 @@ fn F() { // CHECK:STDOUT: %U.cpp_destructor.bound: = bound_method %.loc8_11.3, constants.%U.cpp_destructor // CHECK:STDOUT: %U.cpp_destructor.call: init %empty_tuple.type = call %U.cpp_destructor.bound(%.loc8_11.3) // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- import_decl_pointer_return_type.carbon @@ -1009,6 +1031,8 @@ fn F() { // CHECK:STDOUT: %foo.ref: %foo.cpp_overload_set.type = name_ref foo, imports.%foo.cpp_overload_set.value [concrete = constants.%foo.cpp_overload_set.value] // CHECK:STDOUT: %foo.call: init %ptr = call imports.%foo.decl() // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- import_definition_pointer_return_type.carbon @@ -1041,5 +1065,7 @@ fn F() { // CHECK:STDOUT: %foo.ref: %foo.cpp_overload_set.type = name_ref foo, imports.%foo.cpp_overload_set.value [concrete = constants.%foo.cpp_overload_set.value] // CHECK:STDOUT: %foo.call: init %ptr = call imports.%foo.decl() // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/interop/cpp/function/import/variadic.carbon b/toolchain/check/testdata/interop/cpp/function/import/variadic.carbon index 479ddc7987f7..db121568ce80 100644 --- a/toolchain/check/testdata/interop/cpp/function/import/variadic.carbon +++ b/toolchain/check/testdata/interop/cpp/function/import/variadic.carbon @@ -117,6 +117,8 @@ fn Call3() { // CHECK:STDOUT: %.loc8_11.2: %i32 = converted %int_1, %.loc8_11.1 [concrete = constants.%int_1.0c6] // CHECK:STDOUT: %foo.call: init %empty_tuple.type = call imports.%foo.decl.6431a3.1(%.loc8_11.2) // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Call2() { @@ -141,6 +143,8 @@ fn Call3() { // CHECK:STDOUT: %.loc14_14.2: %i32 = converted %int_2, %.loc14_14.1 [concrete = constants.%int_2.295] // CHECK:STDOUT: %foo.call: init %empty_tuple.type = call imports.%foo.decl.6431a3.2(%.loc14_11.2, %.loc14_14.2) // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Call3() { @@ -173,5 +177,7 @@ fn Call3() { // CHECK:STDOUT: %.loc20_17.2: %i32 = converted %int_3, %.loc20_17.1 [concrete = constants.%int_3.410] // CHECK:STDOUT: %foo.call: init %empty_tuple.type = call imports.%foo.decl.6431a3.3(%.loc20_11.2, %.loc20_14.2, %.loc20_17.2) // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/interop/cpp/function/import/void_pointer.carbon b/toolchain/check/testdata/interop/cpp/function/import/void_pointer.carbon index c3dfddf4bfcc..6904175b3620 100644 --- a/toolchain/check/testdata/interop/cpp/function/import/void_pointer.carbon +++ b/toolchain/check/testdata/interop/cpp/function/import/void_pointer.carbon @@ -145,6 +145,8 @@ fn F() { // CHECK:STDOUT: %input.ref: %ptr = name_ref input, %input // CHECK:STDOUT: %foo.call: init %empty_tuple.type = call imports.%foo.decl(%input.ref) // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- non_nullable_return_value.carbon @@ -191,6 +193,8 @@ fn F() { // CHECK:STDOUT: %output.patt: %pattern_type = value_binding_pattern output [concrete = constants.%output.patt] // CHECK:STDOUT: } // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- nullable_param.carbon @@ -292,21 +296,29 @@ fn F() { // CHECK:STDOUT: %Destroy.Op.bound: = bound_method %.loc10_11.3, constants.%Destroy.Op.1a2547.4 // CHECK:STDOUT: %Destroy.Op.call: init %empty_tuple.type = call %Destroy.Op.bound(%.loc10_11.3) // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Destroy.Op.loc10_11.1(%self.param: ref %.a7d) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Destroy.Op.loc10_11.2(%self.param: ref %MaybeUnformed.399) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Destroy.Op.loc10_11.3(%self.param: ref %Optional.c11) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- null_param.carbon @@ -416,21 +428,29 @@ fn F() { // CHECK:STDOUT: %Destroy.Op.bound: = bound_method %.loc10_41.2, constants.%Destroy.Op.1a2547.4 // CHECK:STDOUT: %Destroy.Op.call: init %empty_tuple.type = call %Destroy.Op.bound(%.loc10_41.2) // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Destroy.Op.loc10_41.1(%self.param: ref %.a7d) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Destroy.Op.loc10_41.2(%self.param: ref %MaybeUnformed.399) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Destroy.Op.loc10_41.3(%self.param: ref %Optional.d90) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- nullable_return_value.carbon @@ -532,21 +552,29 @@ fn F() { // CHECK:STDOUT: %Destroy.Op.bound: = bound_method %.loc10_57.2, constants.%Destroy.Op.1a2547.4 // CHECK:STDOUT: %Destroy.Op.call: init %empty_tuple.type = call %Destroy.Op.bound(%.loc10_57.2) // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Destroy.Op.loc10_57.1(%self.param: ref %.a7d) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Destroy.Op.loc10_57.2(%self.param: ref %MaybeUnformed.399) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Destroy.Op.loc10_57.3(%self.param: ref %Optional.752) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- non_nullable_pointer.carbon @@ -618,6 +646,8 @@ fn F() { // CHECK:STDOUT: %Destroy.Op.bound: = bound_method %non_nullable_pointer.var, constants.%Destroy.Op // CHECK:STDOUT: %Destroy.Op.call: init %empty_tuple.type = call %Destroy.Op.bound(%non_nullable_pointer.var) // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Destroy.Op(%self.param: ref %ptr.6f9) = "no_op"; @@ -691,6 +721,8 @@ fn F() { // CHECK:STDOUT: %Destroy.Op.bound: = bound_method %const_void_pointer.var, constants.%Destroy.Op // CHECK:STDOUT: %Destroy.Op.call: init %empty_tuple.type = call %Destroy.Op.bound(%const_void_pointer.var) // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Destroy.Op(%self.param: ref %ptr) = "no_op"; diff --git a/toolchain/check/testdata/interop/cpp/impls/as.carbon b/toolchain/check/testdata/interop/cpp/impls/as.carbon index 7a2b6f404222..ba213fe4ea1f 100644 --- a/toolchain/check/testdata/interop/cpp/impls/as.carbon +++ b/toolchain/check/testdata/interop/cpp/impls/as.carbon @@ -236,6 +236,8 @@ fn ConversionExplicit(s: Cpp.ConditionallyExplicitFalse) { // CHECK:STDOUT: %Dest.cpp_destructor.bound: = bound_method %.loc8_5.4, %Op.ref // CHECK:STDOUT: %Dest.cpp_destructor.call: init %empty_tuple.type = call %Dest.cpp_destructor.bound(%.loc8_5.4) // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @ConstructorConversion(%s.param: %Source2) { @@ -257,6 +259,8 @@ fn ConversionExplicit(s: Cpp.ConditionallyExplicitFalse) { // CHECK:STDOUT: %Dest2.cpp_destructor.bound: = bound_method %.loc14_5.4, %Op.ref // CHECK:STDOUT: %Dest2.cpp_destructor.call: init %empty_tuple.type = call %Dest2.cpp_destructor.bound(%.loc14_5.4) // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @ExplicitConstructorTest(%s.param: %Source) { @@ -278,6 +282,8 @@ fn ConversionExplicit(s: Cpp.ConditionallyExplicitFalse) { // CHECK:STDOUT: %ExplicitConstructor.cpp_destructor.bound: = bound_method %.loc20_5.4, %Op.ref // CHECK:STDOUT: %ExplicitConstructor.cpp_destructor.call: init %empty_tuple.type = call %ExplicitConstructor.cpp_destructor.bound(%.loc20_5.4) // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @ExplicitConversionTest(%s.param: %ExplicitConversion) { @@ -296,6 +302,8 @@ fn ConversionExplicit(s: Cpp.ConditionallyExplicitFalse) { // CHECK:STDOUT: %Dest.cpp_destructor.bound: = bound_method %.loc26_5.4, %Op.ref // CHECK:STDOUT: %Dest.cpp_destructor.call: init %empty_tuple.type = call %Dest.cpp_destructor.bound(%.loc26_5.4) // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- conditionally_explicit.carbon @@ -419,6 +427,8 @@ fn ConversionExplicit(s: Cpp.ConditionallyExplicitFalse) { // CHECK:STDOUT: %ConditionallyExplicit.cpp_destructor.bound.loc8: = bound_method %.loc8_43.5, %Op.ref.loc8 // CHECK:STDOUT: %ConditionallyExplicit.cpp_destructor.call.loc8: init %empty_tuple.type = call %ConditionallyExplicit.cpp_destructor.bound.loc8(%.loc8_43.5) // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @ConstructorExplicit(%s.param: %Source) { @@ -440,6 +450,8 @@ fn ConversionExplicit(s: Cpp.ConditionallyExplicitFalse) { // CHECK:STDOUT: %ConditionallyExplicit.cpp_destructor.bound: = bound_method %.loc15_5.4, %Op.ref // CHECK:STDOUT: %ConditionallyExplicit.cpp_destructor.call: init %empty_tuple.type = call %ConditionallyExplicit.cpp_destructor.bound(%.loc15_5.4) // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @ConversionNotExplicit(%s.param: %ConditionallyExplicit.3cd) { @@ -479,6 +491,8 @@ fn ConversionExplicit(s: Cpp.ConditionallyExplicitFalse) { // CHECK:STDOUT: %Dest.cpp_destructor.bound.loc21: = bound_method %.loc21_21.4, %Op.ref.loc21 // CHECK:STDOUT: %Dest.cpp_destructor.call.loc21: init %empty_tuple.type = call %Dest.cpp_destructor.bound.loc21(%.loc21_21.4) // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @ConversionExplicit(%s.param: %ConditionallyExplicit.3cd) { @@ -497,6 +511,8 @@ fn ConversionExplicit(s: Cpp.ConditionallyExplicitFalse) { // CHECK:STDOUT: %Dest.cpp_destructor.bound: = bound_method %.loc28_5.4, %Op.ref // CHECK:STDOUT: %Dest.cpp_destructor.call: init %empty_tuple.type = call %Dest.cpp_destructor.bound(%.loc28_5.4) // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- fail_conditionally_explicit_implicit.carbon @@ -557,6 +573,8 @@ fn ConversionExplicit(s: Cpp.ConditionallyExplicitFalse) { // CHECK:STDOUT: %_.patt: %pattern_type.04c = value_binding_pattern _ [concrete = constants.%_.patt.d67] // CHECK:STDOUT: } // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @ConversionExplicit(%s.param: %ConditionallyExplicit.3cd) { @@ -583,5 +601,7 @@ fn ConversionExplicit(s: Cpp.ConditionallyExplicitFalse) { // CHECK:STDOUT: %Dest.cpp_destructor.bound: = bound_method %.loc21_21.4, %Op.ref // CHECK:STDOUT: %Dest.cpp_destructor.call: init %empty_tuple.type = call %Dest.cpp_destructor.bound(%.loc21_21.4) // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/interop/cpp/impls/copy.carbon b/toolchain/check/testdata/interop/cpp/impls/copy.carbon index dc25704db06a..2b0b0d0307e5 100644 --- a/toolchain/check/testdata/interop/cpp/impls/copy.carbon +++ b/toolchain/check/testdata/interop/cpp/impls/copy.carbon @@ -267,6 +267,8 @@ fn EqualWitnesses(p: Wrap(Cpp.Copyable)*) -> Wrap(Cpp.Copyable)* { // CHECK:STDOUT: %Copyable__carbon_thunk.call: init %empty_tuple.type = call imports.%Copyable__carbon_thunk.decl(%.loc8_10.4, %addr.loc8_10.2) // CHECK:STDOUT: %.loc8_10.5: init %Copyable to %.loc6_40.1 = mark_in_place_init %Copyable__carbon_thunk.call // CHECK:STDOUT: return %.loc8_10.5 to %return.param +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @CopyExplicitCopy(%c.param: %ExplicitCopy) -> out %return.param: %ExplicitCopy { @@ -286,6 +288,8 @@ fn EqualWitnesses(p: Wrap(Cpp.Copyable)*) -> Wrap(Cpp.Copyable)* { // CHECK:STDOUT: %ExplicitCopy__carbon_thunk.call: init %empty_tuple.type = call imports.%ExplicitCopy__carbon_thunk.decl(%.loc14_10.4, %addr.loc14_10.2) // CHECK:STDOUT: %.loc14_10.5: init %ExplicitCopy to %.loc12_48.1 = mark_in_place_init %ExplicitCopy__carbon_thunk.call // CHECK:STDOUT: return %.loc14_10.5 to %return.param +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- copy_generically.carbon @@ -332,6 +336,8 @@ fn EqualWitnesses(p: Wrap(Cpp.Copyable)*) -> Wrap(Cpp.Copyable)* { // CHECK:STDOUT: // CHECK:STDOUT: %Copy.call: init %Copyable to %.loc10_34.1 = call %Copy.specific_fn(%c.ref) // CHECK:STDOUT: return %Copy.call to %return.param +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @EqualWitnesses(%p.param: %ptr.fa1) -> out %return.param: %ptr.fa1 { @@ -343,5 +349,7 @@ fn EqualWitnesses(p: Wrap(Cpp.Copyable)*) -> Wrap(Cpp.Copyable)* { // CHECK:STDOUT: %bound_method.loc20_10.2: = bound_method %p.ref, %specific_fn // CHECK:STDOUT: %ptr.as.Copy.impl.Op.call: init %ptr.fa1 = call %bound_method.loc20_10.2(%p.ref) // CHECK:STDOUT: return %ptr.as.Copy.impl.Op.call +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/interop/cpp/impls/destroy.carbon b/toolchain/check/testdata/interop/cpp/impls/destroy.carbon index 0fb98663f899..47971bbb5401 100644 --- a/toolchain/check/testdata/interop/cpp/impls/destroy.carbon +++ b/toolchain/check/testdata/interop/cpp/impls/destroy.carbon @@ -337,6 +337,8 @@ fn F() { // CHECK:STDOUT: %PublicDestructor.cpp_destructor.bound: = bound_method %a.var, constants.%PublicDestructor.cpp_destructor // CHECK:STDOUT: %PublicDestructor.cpp_destructor.call: init %empty_tuple.type = call %PublicDestructor.cpp_destructor.bound(%a.var) // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @PublicDestructor.cpp_destructor(%self.param: ref %PublicDestructor); @@ -369,6 +371,8 @@ fn F() { // CHECK:STDOUT: %TrivialDestructor.cpp_destructor.bound: = bound_method %a.var, %Op.ref // CHECK:STDOUT: %TrivialDestructor.cpp_destructor.call: init %empty_tuple.type = call %TrivialDestructor.cpp_destructor.bound(%a.var) // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @TrivialDestructor.cpp_destructor(%self.param: ref %TrivialDestructor) = "no_op"; @@ -379,6 +383,8 @@ fn F() { // CHECK:STDOUT: %TrivialDestructor.cpp_destructor.bound: = bound_method %self.param, %Op.ref // CHECK:STDOUT: %TrivialDestructor.cpp_destructor.call: init %empty_tuple.type = call %TrivialDestructor.cpp_destructor.bound(%self.param) // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- fail_todo_destroy_protected_base_destructor.carbon @@ -424,16 +430,22 @@ fn F() { // CHECK:STDOUT: %Destroy.Op.bound: = bound_method %a.var, constants.%Destroy.Op.1a2547.2 // CHECK:STDOUT: %Destroy.Op.call: init %empty_tuple.type = call %Destroy.Op.bound(%a.var) // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Destroy.Op.loc20_3.1(%self.param: ref %struct_type.base.454) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Destroy.Op.loc20_3.2(%self.param: ref %Derived) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- fail_destroy_private_base_destructor.carbon @@ -479,15 +491,21 @@ fn F() { // CHECK:STDOUT: %Destroy.Op.bound: = bound_method %a.var, constants.%Destroy.Op.1a2547.2 // CHECK:STDOUT: %Destroy.Op.call: init %empty_tuple.type = call %Destroy.Op.bound(%a.var) // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Destroy.Op.loc21_3.1(%self.param: ref %struct_type.base.9aa) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Destroy.Op.loc21_3.2(%self.param: ref %Derived) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/interop/cpp/impls/implicit_as.carbon b/toolchain/check/testdata/interop/cpp/impls/implicit_as.carbon index 8109fa1d2658..874f2276b79b 100644 --- a/toolchain/check/testdata/interop/cpp/impls/implicit_as.carbon +++ b/toolchain/check/testdata/interop/cpp/impls/implicit_as.carbon @@ -508,6 +508,8 @@ fn InitFromStruct() { // CHECK:STDOUT: %Dest.cpp_destructor.bound: = bound_method %.loc8_21.4, %Op.ref // CHECK:STDOUT: %Dest.cpp_destructor.call: init %empty_tuple.type = call %Dest.cpp_destructor.bound(%.loc8_21.4) // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @NonConstConversion.loc12(%s.param: ref %NonConstConversion.689) { @@ -533,6 +535,8 @@ fn InitFromStruct() { // CHECK:STDOUT: %Dest.cpp_destructor.bound: = bound_method %.loc14_21.4, %Op.ref // CHECK:STDOUT: %Dest.cpp_destructor.call: init %empty_tuple.type = call %Dest.cpp_destructor.bound(%.loc14_21.4) // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @ConstructorConversion(%s.param: %Source2) { @@ -561,6 +565,8 @@ fn InitFromStruct() { // CHECK:STDOUT: %Dest2.cpp_destructor.bound: = bound_method %.loc20_22.5, %Op.ref // CHECK:STDOUT: %Dest2.cpp_destructor.call: init %empty_tuple.type = call %Dest2.cpp_destructor.bound(%.loc20_22.5) // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- fail_expr_category.carbon @@ -595,6 +601,8 @@ fn InitFromStruct() { // CHECK:STDOUT: %_.patt: %pattern_type.b72 = value_binding_pattern _ [concrete = constants.%_.patt] // CHECK:STDOUT: } // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- fail_access.carbon @@ -686,6 +694,8 @@ fn InitFromStruct() { // CHECK:STDOUT: %InaccessibleConstructor.cpp_destructor.bound: = bound_method %.loc16_40.5, %Op.ref // CHECK:STDOUT: %InaccessibleConstructor.cpp_destructor.call: init %empty_tuple.type = call %InaccessibleConstructor.cpp_destructor.bound(%.loc16_40.5) // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @InaccessibleConversionTest(%s.param: %InaccessibleConversion) { @@ -712,6 +722,8 @@ fn InitFromStruct() { // CHECK:STDOUT: %Dest.cpp_destructor.bound: = bound_method %.loc30_21.4, %Op.ref // CHECK:STDOUT: %Dest.cpp_destructor.call: init %empty_tuple.type = call %Dest.cpp_destructor.bound(%.loc30_21.4) // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- fail_deleted.carbon @@ -754,6 +766,8 @@ fn InitFromStruct() { // CHECK:STDOUT: %_.patt: %pattern_type.937 = value_binding_pattern _ [concrete = constants.%_.patt.a57] // CHECK:STDOUT: } // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @DeletedConversionTest(%s.param: %DeletedConversion) { @@ -769,6 +783,8 @@ fn InitFromStruct() { // CHECK:STDOUT: %_.patt: %pattern_type.b72 = value_binding_pattern _ [concrete = constants.%_.patt.664] // CHECK:STDOUT: } // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- fail_explicit.carbon @@ -811,6 +827,8 @@ fn InitFromStruct() { // CHECK:STDOUT: %_.patt: %pattern_type.eae = value_binding_pattern _ [concrete = constants.%_.patt.411] // CHECK:STDOUT: } // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @ExplicitConversionTest(%s.param: %ExplicitConversion) { @@ -826,6 +844,8 @@ fn InitFromStruct() { // CHECK:STDOUT: %_.patt: %pattern_type.b72 = value_binding_pattern _ [concrete = constants.%_.patt.664] // CHECK:STDOUT: } // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- i32_to_int.carbon @@ -888,6 +908,8 @@ fn InitFromStruct() { // CHECK:STDOUT: %IntConstructor.cpp_destructor.bound: = bound_method %.loc8_31.4, %Op.ref // CHECK:STDOUT: %IntConstructor.cpp_destructor.call: init %empty_tuple.type = call %IntConstructor.cpp_destructor.bound(%.loc8_31.4) // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- fail_no_u32_to_int_conversion_in_carbon.carbon @@ -952,6 +974,8 @@ fn InitFromStruct() { // CHECK:STDOUT: %IntConstructor.cpp_destructor.bound: = bound_method %.loc19_31.5, %Op.ref // CHECK:STDOUT: %IntConstructor.cpp_destructor.call: init %empty_tuple.type = call %IntConstructor.cpp_destructor.bound(%.loc19_31.5) // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- default_constructor.carbon @@ -1013,6 +1037,8 @@ fn InitFromStruct() { // CHECK:STDOUT: %DefaultConstructor.cpp_destructor.bound: = bound_method %.loc9_36.5, %Op.ref // CHECK:STDOUT: %DefaultConstructor.cpp_destructor.call: init %empty_tuple.type = call %DefaultConstructor.cpp_destructor.bound(%.loc9_36.5) // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- construct_multi_argument.carbon @@ -1230,6 +1256,8 @@ fn InitFromStruct() { // CHECK:STDOUT: %Two.cpp_destructor.bound: = bound_method %.loc8_25.5, %Op.ref.loc8 // CHECK:STDOUT: %Two.cpp_destructor.call: init %empty_tuple.type = call %Two.cpp_destructor.bound(%.loc8_25.5) // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- fail_todo_aggregate_from_tuple.carbon @@ -1292,6 +1320,8 @@ fn InitFromStruct() { // CHECK:STDOUT: %_.patt.loc31: %pattern_type.5dc = value_binding_pattern _ [concrete = constants.%_.patt] // CHECK:STDOUT: } // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- fail_todo_aggregate_from_struct.carbon @@ -1354,6 +1384,8 @@ fn InitFromStruct() { // CHECK:STDOUT: %_.patt.loc31: %pattern_type.5dc = value_binding_pattern _ [concrete = constants.%_.patt] // CHECK:STDOUT: } // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- non_aggregate_from_tuple.carbon @@ -1520,6 +1552,8 @@ fn InitFromStruct() { // CHECK:STDOUT: %NonAggregate.cpp_destructor.bound.loc8: = bound_method %.loc8_30.5, %Op.ref.loc8 // CHECK:STDOUT: %NonAggregate.cpp_destructor.call.loc8: init %empty_tuple.type = call %NonAggregate.cpp_destructor.bound.loc8(%.loc8_30.5) // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- fail_non_aggregate_from_struct.carbon @@ -1582,5 +1616,7 @@ fn InitFromStruct() { // CHECK:STDOUT: %_.patt.loc31: %pattern_type.273 = value_binding_pattern _ [concrete = constants.%_.patt] // CHECK:STDOUT: } // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/interop/cpp/macros/macros.carbon b/toolchain/check/testdata/interop/cpp/macros/macros.carbon index 01966a03f193..5718778adf79 100644 --- a/toolchain/check/testdata/interop/cpp/macros/macros.carbon +++ b/toolchain/check/testdata/interop/cpp/macros/macros.carbon @@ -1059,6 +1059,8 @@ fn F() { // CHECK:STDOUT: %f.patt: %pattern_type.6b6 = value_binding_pattern f [concrete = constants.%f.patt] // CHECK:STDOUT: } // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- import_macro_and_non_macro_same_name.carbon @@ -1183,6 +1185,8 @@ fn F() { // CHECK:STDOUT: %Destroy.Op.bound: = bound_method %a.var, constants.%Destroy.Op.1a2547.3 // CHECK:STDOUT: %Destroy.Op.call: init %empty_tuple.type = call %Destroy.Op.bound(%a.var) // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Destroy.Op.loc10_3.1(%self.param: ref %f32.9b3) = "no_op"; @@ -1190,11 +1194,15 @@ fn F() { // CHECK:STDOUT: fn @Destroy.Op.loc10_3.2(%self.param: ref %f32.c73) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Destroy.Op.loc10_3.3(%self.param: ref %array_type) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- import_unary_operator.carbon @@ -1225,6 +1233,8 @@ fn F() { // CHECK:STDOUT: %a.patt: %pattern_type.6b6 = value_binding_pattern a [concrete = constants.%a.patt] // CHECK:STDOUT: } // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- import_binary_operator.carbon @@ -1255,6 +1265,8 @@ fn F() { // CHECK:STDOUT: %a.patt: %pattern_type.6b6 = value_binding_pattern a [concrete = constants.%a.patt] // CHECK:STDOUT: } // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- import_casting.carbon @@ -1320,6 +1332,8 @@ fn F() { // CHECK:STDOUT: %d.patt: %pattern_type.6b6 = value_binding_pattern d [concrete = constants.%d.patt] // CHECK:STDOUT: } // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- import_nested_macros.carbon @@ -1350,6 +1364,8 @@ fn F() { // CHECK:STDOUT: %a.patt: %pattern_type.6b6 = value_binding_pattern a [concrete = constants.%a.patt] // CHECK:STDOUT: } // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- import_string_literal_object_like_macro.carbon @@ -1461,6 +1477,8 @@ fn F() { // CHECK:STDOUT: %g.patt: %pattern_type.adf = value_binding_pattern g [concrete = constants.%g.patt] // CHECK:STDOUT: } // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- import_floating_point_literal_macro.carbon @@ -1516,6 +1534,8 @@ fn F() { // CHECK:STDOUT: %c.patt: %pattern_type.240 = value_binding_pattern c [concrete = constants.%c.patt] // CHECK:STDOUT: } // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- import_character_literals.carbon @@ -1600,6 +1620,8 @@ fn F() { // CHECK:STDOUT: %f.patt: %pattern_type.2ff = value_binding_pattern f [concrete = constants.%f.patt] // CHECK:STDOUT: } // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- import_character_literals_operators.carbon @@ -1654,6 +1676,8 @@ fn F() { // CHECK:STDOUT: %c.patt: %pattern_type.831 = value_binding_pattern c [concrete = constants.%c.patt] // CHECK:STDOUT: } // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- import_boolean_literal_macro.carbon @@ -1779,6 +1803,8 @@ fn F() { // CHECK:STDOUT: %k.patt: %pattern_type.6b6 = value_binding_pattern k [concrete = constants.%k.patt] // CHECK:STDOUT: } // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- nullptr.carbon @@ -1878,21 +1904,29 @@ fn F() { // CHECK:STDOUT: %Destroy.Op.bound: = bound_method %.loc11_14.3, constants.%Destroy.Op.1a2547.5 // CHECK:STDOUT: %Destroy.Op.call: init %empty_tuple.type = call %Destroy.Op.bound(%.loc11_14.3) // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Destroy.Op.loc11_14.1(%self.param: ref %.0f8) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Destroy.Op.loc11_14.2(%self.param: ref %MaybeUnformed.b84) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Destroy.Op.loc11_14.3(%self.param: ref %Optional.a18) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- enums.carbon @@ -1926,6 +1960,8 @@ fn F() { // CHECK:STDOUT: %a.patt: %pattern_type = value_binding_pattern a [concrete = constants.%a.patt] // CHECK:STDOUT: } // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- constexpr_int.carbon @@ -1968,6 +2004,8 @@ fn F() { // CHECK:STDOUT: %a.patt: %pattern_type.6b6 = value_binding_pattern a [concrete = constants.%a.patt.bb2] // CHECK:STDOUT: } // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- constexpr_int_addr.carbon @@ -2014,6 +2052,8 @@ fn F() { // CHECK:STDOUT: %N.ref: ref %const = name_ref N, imports.%n.var [concrete = imports.%n.var] // CHECK:STDOUT: %addr: %ptr = addr_of %N.ref [concrete = constants.%addr] // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- lambda.carbon @@ -2044,6 +2084,8 @@ fn F() { // CHECK:STDOUT: %i.patt: %pattern_type.6b6 = value_binding_pattern i [concrete = constants.%i.patt] // CHECK:STDOUT: } // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- import_macro_redefined.carbon @@ -2074,6 +2116,8 @@ fn F() { // CHECK:STDOUT: %a.patt: %pattern_type.6b6 = value_binding_pattern a [concrete = constants.%a.patt] // CHECK:STDOUT: } // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- import_macro_defined_twice.carbon @@ -2104,6 +2148,8 @@ fn F() { // CHECK:STDOUT: %a.patt: %pattern_type.6b6 = value_binding_pattern a [concrete = constants.%a.patt] // CHECK:STDOUT: } // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- assign.carbon @@ -2157,6 +2203,8 @@ fn F() { // CHECK:STDOUT: %.loc10: init %i32 = converted %int_2, %Core.IntLiteral.as.ImplicitAs.impl.Convert.call [concrete = constants.%int_2.295] // CHECK:STDOUT: assign %m.ref, %.loc10 // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- assign_subobject.carbon @@ -2220,5 +2268,7 @@ fn F() { // CHECK:STDOUT: %.loc17_9: init %i32 = converted %int_2, %Core.IntLiteral.as.ImplicitAs.impl.Convert.call [concrete = constants.%int_2.295] // CHECK:STDOUT: assign %m.ref, %.loc17_9 // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/interop/cpp/namespace/import.carbon b/toolchain/check/testdata/interop/cpp/namespace/import.carbon index 6b1820b6233d..87ba0632c279 100644 --- a/toolchain/check/testdata/interop/cpp/namespace/import.carbon +++ b/toolchain/check/testdata/interop/cpp/namespace/import.carbon @@ -395,6 +395,8 @@ fn F() { // CHECK:STDOUT: %foo.ref: %foo.cpp_overload_set.type = name_ref foo, imports.%foo.cpp_overload_set.value [concrete = constants.%foo.cpp_overload_set.value] // CHECK:STDOUT: %foo.call: init %empty_tuple.type = call imports.%foo.decl() // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- import_multiple.carbon @@ -460,6 +462,8 @@ fn F() { // CHECK:STDOUT: %foo3.ref: %foo3.cpp_overload_set.type = name_ref foo3, imports.%foo3.cpp_overload_set.value [concrete = constants.%foo3.cpp_overload_set.value] // CHECK:STDOUT: %foo3.call: init %empty_tuple.type = call imports.%foo3.decl() // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- import_inline.carbon @@ -492,6 +496,8 @@ fn F() { // CHECK:STDOUT: %foo.ref: %foo.cpp_overload_set.type = name_ref foo, imports.%foo.cpp_overload_set.value [concrete = constants.%foo.cpp_overload_set.value] // CHECK:STDOUT: %foo.call: init %empty_tuple.type = call imports.%foo.decl() // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- import_inline_ambiguity_not_triggered.carbon @@ -533,6 +539,8 @@ fn F() { // CHECK:STDOUT: %X.cpp_destructor.bound: = bound_method %.loc8_11.3, constants.%X.cpp_destructor // CHECK:STDOUT: %X.cpp_destructor.call: init %empty_tuple.type = call %X.cpp_destructor.bound(%.loc8_11.3) // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- import_special_name_call_escpaed.carbon @@ -565,5 +573,7 @@ fn F() { // CHECK:STDOUT: %foo.ref: %foo.cpp_overload_set.type = name_ref foo, imports.%foo.cpp_overload_set.value [concrete = constants.%foo.cpp_overload_set.value] // CHECK:STDOUT: %foo.call: init %empty_tuple.type = call imports.%foo.decl() // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/interop/cpp/operators/arithmetic_operators.carbon b/toolchain/check/testdata/interop/cpp/operators/arithmetic_operators.carbon index 10eaadd0be4a..8baa76eef20d 100644 --- a/toolchain/check/testdata/interop/cpp/operators/arithmetic_operators.carbon +++ b/toolchain/check/testdata/interop/cpp/operators/arithmetic_operators.carbon @@ -1534,6 +1534,8 @@ fn TestUnaryOperators(a: Cpp.Int16, b: Cpp.Int32) { // CHECK:STDOUT: %bound_method.loc126_5.4: = bound_method %.loc126_5.3, %specific_impl_fn.loc126_5.2 // CHECK:STDOUT: %Destroy.WithSelf.Op.call: init %empty_tuple.type = call %bound_method.loc126_5.4(%.loc126_5.3) // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: @@ -1578,6 +1580,8 @@ fn TestUnaryOperators(a: Cpp.Int16, b: Cpp.Int32) { // CHECK:STDOUT: %bound_method.loc137_5.4: = bound_method %.loc137_5.3, %specific_impl_fn.loc137_5.2 // CHECK:STDOUT: %Destroy.WithSelf.Op.call: init %empty_tuple.type = call %bound_method.loc137_5.4(%.loc137_5.3) // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: @@ -1622,6 +1626,8 @@ fn TestUnaryOperators(a: Cpp.Int16, b: Cpp.Int32) { // CHECK:STDOUT: %bound_method.loc148_5.4: = bound_method %.loc148_5.3, %specific_impl_fn.loc148_5.2 // CHECK:STDOUT: %Destroy.WithSelf.Op.call: init %empty_tuple.type = call %bound_method.loc148_5.4(%.loc148_5.3) // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: @@ -1666,6 +1672,8 @@ fn TestUnaryOperators(a: Cpp.Int16, b: Cpp.Int32) { // CHECK:STDOUT: %bound_method.loc159_5.4: = bound_method %.loc159_5.3, %specific_impl_fn.loc159_5.2 // CHECK:STDOUT: %Destroy.WithSelf.Op.call: init %empty_tuple.type = call %bound_method.loc159_5.4(%.loc159_5.3) // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: @@ -1710,6 +1718,8 @@ fn TestUnaryOperators(a: Cpp.Int16, b: Cpp.Int32) { // CHECK:STDOUT: %bound_method.loc170_5.4: = bound_method %.loc170_5.3, %specific_impl_fn.loc170_5.2 // CHECK:STDOUT: %Destroy.WithSelf.Op.call: init %empty_tuple.type = call %bound_method.loc170_5.4(%.loc170_5.3) // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: @@ -1740,6 +1750,8 @@ fn TestUnaryOperators(a: Cpp.Int16, b: Cpp.Int32) { // CHECK:STDOUT: %bound_method.loc227_5.2: = bound_method %x.ref, %specific_impl_fn.loc227_5.1 // CHECK:STDOUT: %AddAssignWith.WithSelf.Op.call: init %empty_tuple.type = call %bound_method.loc227_5.2(%x.ref, %y.ref) // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: @@ -1770,6 +1782,8 @@ fn TestUnaryOperators(a: Cpp.Int16, b: Cpp.Int32) { // CHECK:STDOUT: %bound_method.loc233_5.2: = bound_method %x.ref, %specific_impl_fn.loc233_5.1 // CHECK:STDOUT: %SubAssignWith.WithSelf.Op.call: init %empty_tuple.type = call %bound_method.loc233_5.2(%x.ref, %y.ref) // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: @@ -1800,6 +1814,8 @@ fn TestUnaryOperators(a: Cpp.Int16, b: Cpp.Int32) { // CHECK:STDOUT: %bound_method.loc239_5.2: = bound_method %x.ref, %specific_impl_fn.loc239_5.1 // CHECK:STDOUT: %MulAssignWith.WithSelf.Op.call: init %empty_tuple.type = call %bound_method.loc239_5.2(%x.ref, %y.ref) // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: @@ -1830,6 +1846,8 @@ fn TestUnaryOperators(a: Cpp.Int16, b: Cpp.Int32) { // CHECK:STDOUT: %bound_method.loc245_5.2: = bound_method %x.ref, %specific_impl_fn.loc245_5.1 // CHECK:STDOUT: %DivAssignWith.WithSelf.Op.call: init %empty_tuple.type = call %bound_method.loc245_5.2(%x.ref, %y.ref) // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: @@ -1860,6 +1878,8 @@ fn TestUnaryOperators(a: Cpp.Int16, b: Cpp.Int32) { // CHECK:STDOUT: %bound_method.loc251_5.2: = bound_method %x.ref, %specific_impl_fn.loc251_5.1 // CHECK:STDOUT: %ModAssignWith.WithSelf.Op.call: init %empty_tuple.type = call %bound_method.loc251_5.2(%x.ref, %y.ref) // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: @@ -1885,6 +1905,8 @@ fn TestUnaryOperators(a: Cpp.Int16, b: Cpp.Int32) { // CHECK:STDOUT: %bound_method.loc280_3.2: = bound_method %x.ref, %specific_impl_fn.loc280_3.1 // CHECK:STDOUT: %Inc.WithSelf.Op.call: init %empty_tuple.type = call %bound_method.loc280_3.2(%x.ref) // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: @@ -1910,6 +1932,8 @@ fn TestUnaryOperators(a: Cpp.Int16, b: Cpp.Int32) { // CHECK:STDOUT: %bound_method.loc286_3.2: = bound_method %x.ref, %specific_impl_fn.loc286_3.1 // CHECK:STDOUT: %Dec.WithSelf.Op.call: init %empty_tuple.type = call %bound_method.loc286_3.2(%x.ref) // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: @@ -1952,6 +1976,8 @@ fn TestUnaryOperators(a: Cpp.Int16, b: Cpp.Int32) { // CHECK:STDOUT: %bound_method.loc296_3.4: = bound_method %.loc296_3.4, %specific_impl_fn.loc296_3.2 // CHECK:STDOUT: %Destroy.WithSelf.Op.call: init %empty_tuple.type = call %bound_method.loc296_3.4(%.loc296_3.4) // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/interop/cpp/operators/deref.carbon b/toolchain/check/testdata/interop/cpp/operators/deref.carbon index d6a95f3453e1..6d9ee560f49e 100644 --- a/toolchain/check/testdata/interop/cpp/operators/deref.carbon +++ b/toolchain/check/testdata/interop/cpp/operators/deref.carbon @@ -181,6 +181,8 @@ fn TestDerefFail(not_ptr: Cpp.NotAPtr) { // CHECK:STDOUT: %ConstDeref.cpp_operator.bound: = bound_method %.loc13, %Op.ref.loc13_43 // CHECK:STDOUT: %operator_Star__carbon_thunk.call: ref %i32 = call imports.%operator_Star__carbon_thunk.decl(%.loc13) // CHECK:STDOUT: return %operator_Star__carbon_thunk.call +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- mutable_deref.carbon @@ -230,5 +232,7 @@ fn TestDerefFail(not_ptr: Cpp.NotAPtr) { // CHECK:STDOUT: %.loc13: %MutableDeref = acquire_value %int_ptr.ref // CHECK:STDOUT: %MutableDeref.cpp_operator.call: ref %i32 = call %bound_method(%.loc13) // CHECK:STDOUT: return %MutableDeref.cpp_operator.call +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/interop/cpp/operators/eq_with.carbon b/toolchain/check/testdata/interop/cpp/operators/eq_with.carbon index 9932a929ad9c..37ebf981f078 100644 --- a/toolchain/check/testdata/interop/cpp/operators/eq_with.carbon +++ b/toolchain/check/testdata/interop/cpp/operators/eq_with.carbon @@ -475,6 +475,8 @@ fn Test(only_neq: Cpp.OnlyNeq, // CHECK:STDOUT: %bound_method.loc14_5.2: = bound_method %x.ref.loc14, %specific_impl_fn.loc14_5.1 // CHECK:STDOUT: %EqWith.WithSelf.NotEqual.call: init bool = call %bound_method.loc14_5.2(%x.ref.loc14, %y.ref.loc14) // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: @@ -739,6 +741,8 @@ fn Test(only_neq: Cpp.OnlyNeq, // CHECK:STDOUT: %bound_method.loc37_5.2: = bound_method %x.ref.loc37, %specific_impl_fn.loc37_5.1 // CHECK:STDOUT: %EqWith.WithSelf.NotEqual.call: init bool = call %bound_method.loc37_5.2(%x.ref.loc37, %y.ref.loc37) // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/interop/cpp/operators/operators.carbon b/toolchain/check/testdata/interop/cpp/operators/operators.carbon index e478711c578c..1ee8086a8427 100644 --- a/toolchain/check/testdata/interop/cpp/operators/operators.carbon +++ b/toolchain/check/testdata/interop/cpp/operators/operators.carbon @@ -1161,6 +1161,8 @@ fn F() { // CHECK:STDOUT: %C.cpp_destructor.bound.loc8: = bound_method %c.var, %Op.ref.loc8 // CHECK:STDOUT: %C.cpp_destructor.call.loc8: init %empty_tuple.type = call %C.cpp_destructor.bound.loc8(%c.var) // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- import_binary_operators.carbon @@ -1968,6 +1970,8 @@ fn F() { // CHECK:STDOUT: %C.cpp_destructor.bound.loc8: = bound_method %c1.var, %Op.ref.loc8 // CHECK:STDOUT: %C.cpp_destructor.call.loc8: init %empty_tuple.type = call %C.cpp_destructor.bound.loc8(%c1.var) // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Destroy.Op(%self.param: ref bool) = "no_op"; @@ -2138,6 +2142,8 @@ fn F() { // CHECK:STDOUT: %C.cpp_destructor.bound.loc8: = bound_method %.loc8_27.3, %Op.ref.loc8 // CHECK:STDOUT: %C.cpp_destructor.call.loc8: init %empty_tuple.type = call %C.cpp_destructor.bound.loc8(%.loc8_27.3) // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- fail_todo_rewrite_spaceship.carbon @@ -2306,6 +2312,8 @@ fn F() { // CHECK:STDOUT: %C.cpp_destructor.bound.loc15: = bound_method %c1.var, %Op.ref.loc15 // CHECK:STDOUT: %C.cpp_destructor.call.loc15: init %empty_tuple.type = call %C.cpp_destructor.bound.loc15(%c1.var) // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Destroy.Op(%self.param: ref bool) = "no_op"; @@ -2439,6 +2447,8 @@ fn F() { // CHECK:STDOUT: %C.cpp_destructor.bound.loc12: = bound_method %c1.var, %Op.ref.loc12 // CHECK:STDOUT: %C.cpp_destructor.call.loc12: init %empty_tuple.type = call %C.cpp_destructor.bound.loc12(%c1.var) // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Destroy.Op(%self.param: ref bool) = "no_op"; @@ -2568,6 +2578,8 @@ fn F() { // CHECK:STDOUT: %C.cpp_destructor.bound.loc8: = bound_method %.loc8_31.3, %Op.ref.loc8 // CHECK:STDOUT: %C.cpp_destructor.call.loc8: init %empty_tuple.type = call %C.cpp_destructor.bound.loc8(%.loc8_31.3) // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- import_multiple_namespaces.carbon @@ -2757,6 +2769,8 @@ fn F() { // CHECK:STDOUT: %C1.cpp_destructor.bound: = bound_method %.loc8_36.3, %Op.ref.loc8 // CHECK:STDOUT: %C1.cpp_destructor.call: init %empty_tuple.type = call %C1.cpp_destructor.bound(%.loc8_36.3) // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- fail_todo_import_operands_in_namespace_operator_in_global.carbon @@ -2863,6 +2877,8 @@ fn F() { // CHECK:STDOUT: %C.cpp_destructor.bound.loc8: = bound_method %.loc8_31.3, %Op.ref.loc8 // CHECK:STDOUT: %C.cpp_destructor.call.loc8: init %empty_tuple.type = call %C.cpp_destructor.bound.loc8(%.loc8_31.3) // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- import_inner_class.carbon @@ -2988,6 +3004,8 @@ fn F() { // CHECK:STDOUT: %C.cpp_destructor.bound.loc8: = bound_method %.loc8_31.3, %Op.ref.loc8 // CHECK:STDOUT: %C.cpp_destructor.call.loc8: init %empty_tuple.type = call %C.cpp_destructor.bound.loc8(%.loc8_31.3) // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- import_inner_class_in_namespace.carbon @@ -3122,6 +3140,8 @@ fn F() { // CHECK:STDOUT: %C.cpp_destructor.bound.loc8: = bound_method %.loc8_35.3, %Op.ref.loc8 // CHECK:STDOUT: %C.cpp_destructor.call.loc8: init %empty_tuple.type = call %C.cpp_destructor.bound.loc8(%.loc8_35.3) // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- import_member_add_with.carbon @@ -3250,6 +3270,8 @@ fn F() { // CHECK:STDOUT: %C.cpp_destructor.bound.loc8: = bound_method %c1.var, %Op.ref.loc8 // CHECK:STDOUT: %C.cpp_destructor.call.loc8: init %empty_tuple.type = call %C.cpp_destructor.bound.loc8(%c1.var) // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- indirect_template_instantiation.carbon @@ -3281,6 +3303,8 @@ fn F() { // CHECK:STDOUT: %addr.loc14_12.2: %ptr.307 = addr_of %.loc14_14 // CHECK:STDOUT: %operator_Plus__carbon_thunk.call: init %i32 = call imports.%operator_Plus__carbon_thunk.decl(%addr.loc14_12.1, %addr.loc14_12.2) // CHECK:STDOUT: return %operator_Plus__carbon_thunk.call +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- import_overloading.carbon @@ -3346,5 +3370,7 @@ fn F() { // CHECK:STDOUT: %C.cpp_destructor.bound.loc10: = bound_method %.loc10_29.3, %Op.ref.loc10 // CHECK:STDOUT: %C.cpp_destructor.call.loc10: init %empty_tuple.type = call %C.cpp_destructor.bound.loc10(%.loc10_29.3) // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/interop/cpp/operators/ordered_with.carbon b/toolchain/check/testdata/interop/cpp/operators/ordered_with.carbon index c6b702d3cf84..8313e21b3cf9 100644 --- a/toolchain/check/testdata/interop/cpp/operators/ordered_with.carbon +++ b/toolchain/check/testdata/interop/cpp/operators/ordered_with.carbon @@ -569,6 +569,8 @@ fn Test(missing_less: Cpp.MissingLess, // CHECK:STDOUT: %bound_method.loc18_5.2: = bound_method %x.ref.loc18, %specific_impl_fn.loc18_5.1 // CHECK:STDOUT: %OrderedWith.WithSelf.GreaterOrEquivalent.call: init bool = call %bound_method.loc18_5.2(%x.ref.loc18, %y.ref.loc18) // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: @@ -945,6 +947,8 @@ fn Test(missing_less: Cpp.MissingLess, // CHECK:STDOUT: %bound_method.loc59_5.2: = bound_method %x.ref.loc59, %specific_impl_fn.loc59_5.1 // CHECK:STDOUT: %OrderedWith.WithSelf.GreaterOrEquivalent.call: init bool = call %bound_method.loc59_5.2(%x.ref.loc59, %y.ref.loc59) // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/interop/cpp/operators/spaceship.carbon b/toolchain/check/testdata/interop/cpp/operators/spaceship.carbon index 3e253d53c28f..9d79f0928983 100644 --- a/toolchain/check/testdata/interop/cpp/operators/spaceship.carbon +++ b/toolchain/check/testdata/interop/cpp/operators/spaceship.carbon @@ -415,6 +415,8 @@ fn Test(returns_strong_ordering: Cpp.ReturnsStrongOrdering) { // CHECK:STDOUT: %bound_method.loc7_5.2: = bound_method %x.ref.loc7, %specific_impl_fn.loc7_5.1 // CHECK:STDOUT: %EqWith.WithSelf.NotEqual.call: init bool = call %bound_method.loc7_5.2(%x.ref.loc7, %y.ref.loc7) // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: @@ -490,6 +492,8 @@ fn Test(returns_strong_ordering: Cpp.ReturnsStrongOrdering) { // CHECK:STDOUT: %bound_method.loc16_5.2: = bound_method %x.ref.loc16, %specific_impl_fn.loc16_5.1 // CHECK:STDOUT: %OrderedWith.WithSelf.GreaterOrEquivalent.call: init bool = call %bound_method.loc16_5.2(%x.ref.loc16, %y.ref.loc16) // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/interop/cpp/primitive_types/arithmetic.carbon b/toolchain/check/testdata/interop/cpp/primitive_types/arithmetic.carbon index 648d2f9097b2..78e16e15d70b 100644 --- a/toolchain/check/testdata/interop/cpp/primitive_types/arithmetic.carbon +++ b/toolchain/check/testdata/interop/cpp/primitive_types/arithmetic.carbon @@ -465,6 +465,8 @@ fn F() { // CHECK:STDOUT: %carbon_double.patt: %pattern_type.fb7 = value_binding_pattern carbon_double [concrete = constants.%carbon_double.patt] // CHECK:STDOUT: } // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- fail_todo_unsupported_types.carbon @@ -519,6 +521,8 @@ fn F() { // CHECK:STDOUT: %carbon_long_double.patt: %pattern_type.fb7 = value_binding_pattern carbon_long_double [concrete = constants.%carbon_long_double.patt] // CHECK:STDOUT: } // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- override_builtin.carbon @@ -602,5 +606,7 @@ fn F() { // CHECK:STDOUT: %unsigned_int.cpp_destructor.bound: = bound_method %unsigned_int.var, constants.%unsigned_int.cpp_destructor // CHECK:STDOUT: %unsigned_int.cpp_destructor.call: init %empty_tuple.type = call %unsigned_int.cpp_destructor.bound(%unsigned_int.var) // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/interop/cpp/primitive_types/long_and_long_long.llp64.carbon b/toolchain/check/testdata/interop/cpp/primitive_types/long_and_long_long.llp64.carbon index 36e9bbd6dac0..01e70b3c0608 100644 --- a/toolchain/check/testdata/interop/cpp/primitive_types/long_and_long_long.llp64.carbon +++ b/toolchain/check/testdata/interop/cpp/primitive_types/long_and_long_long.llp64.carbon @@ -847,6 +847,8 @@ fn CopyUnsignedLong() { // CHECK:STDOUT: %Destroy.Op.bound: = bound_method %a.var, constants.%Destroy.Op.1a2547.3 // CHECK:STDOUT: %Destroy.Op.call: init %empty_tuple.type = call %Destroy.Op.bound(%a.var) // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Destroy.Op.loc11_3.1(%self.param: ref %f32.9b3) = "no_op"; @@ -854,11 +856,15 @@ fn CopyUnsignedLong() { // CHECK:STDOUT: fn @Destroy.Op.loc11_3.2(%self.param: ref %f32.c73) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Destroy.Op.loc11_3.3(%self.param: ref %array_type) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- unsigned_long_long.carbon @@ -1024,6 +1030,8 @@ fn CopyUnsignedLong() { // CHECK:STDOUT: %Destroy.Op.bound: = bound_method %a.var, constants.%Destroy.Op.1a2547.3 // CHECK:STDOUT: %Destroy.Op.call: init %empty_tuple.type = call %Destroy.Op.bound(%a.var) // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Destroy.Op.loc11_3.1(%self.param: ref %f32.9b3) = "no_op"; @@ -1031,11 +1039,15 @@ fn CopyUnsignedLong() { // CHECK:STDOUT: fn @Destroy.Op.loc11_3.2(%self.param: ref %f32.c73) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Destroy.Op.loc11_3.3(%self.param: ref %array_type) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- long.carbon @@ -1342,6 +1354,8 @@ fn CopyUnsignedLong() { // CHECK:STDOUT: %LongResult.cpp_destructor.bound.loc16: = bound_method %.loc16_69.3, constants.%LongResult.cpp_destructor // CHECK:STDOUT: %LongResult.cpp_destructor.call.loc16: init %empty_tuple.type = call %LongResult.cpp_destructor.bound.loc16(%.loc16_69.3) // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Destroy.Op.loc26_3.1(%self.param: ref %f32.9b3) = "no_op"; @@ -1349,11 +1363,15 @@ fn CopyUnsignedLong() { // CHECK:STDOUT: fn @Destroy.Op.loc26_3.2(%self.param: ref %f32.c73) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Destroy.Op.loc26_3.3(%self.param: ref %array_type) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- copy_long.carbon @@ -1440,6 +1458,8 @@ fn CopyUnsignedLong() { // CHECK:STDOUT: %Destroy.Op.bound.loc8: = bound_method %a.var, constants.%Destroy.Op.1a2547.3 // CHECK:STDOUT: %Destroy.Op.call.loc8: init %empty_tuple.type = call %Destroy.Op.bound.loc8(%a.var) // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Destroy.Op.loc9_3.1(%self.param: ref %i32.builtin) = "no_op"; @@ -1447,11 +1467,15 @@ fn CopyUnsignedLong() { // CHECK:STDOUT: fn @Destroy.Op.loc9_3.2(%self.param: ref %i32) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Destroy.Op.loc9_3.3(%self.param: ref %Cpp.long) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- comparisons_homogeneous_long.carbon @@ -1581,6 +1605,8 @@ fn CopyUnsignedLong() { // CHECK:STDOUT: %bound_method.loc15: = bound_method %a.ref.loc15, %impl.elem1.loc15 // CHECK:STDOUT: %Cpp.long.as.OrderedWith.impl.LessOrEquivalent.call: init bool = call %bound_method.loc15(%a.ref.loc15, %b.ref.loc15) // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- comparisons_heterogeneous_long_left_side.carbon @@ -2037,6 +2063,8 @@ fn CopyUnsignedLong() { // CHECK:STDOUT: %.loc22_8.2: %Cpp.long = converted %int_1.loc22, %.loc22_8.1 [concrete = constants.%int_1.9ce] // CHECK:STDOUT: %Cpp.long.as.OrderedWith.impl.LessOrEquivalent.call.loc22: init bool = call %bound_method.loc22_5.3(%a.ref.loc22, %.loc22_8.2) // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- comparisons_heterogeneous_long_right_side.carbon @@ -2515,6 +2543,8 @@ fn CopyUnsignedLong() { // CHECK:STDOUT: %.loc22_3.2: %Cpp.long = converted %int_1.loc22, %.loc22_3.1 [concrete = constants.%int_1.9ce] // CHECK:STDOUT: %T.as_type.as.OrderedWith.impl.LessOrEquivalent.call.loc22: init bool = call %bound_method.loc22_5.3(%.loc22_3.2, %a.ref.loc22) // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- arithmetic_homogeneous_long.carbon @@ -2731,6 +2761,8 @@ fn CopyUnsignedLong() { // CHECK:STDOUT: %f.patt: %pattern_type.25e = value_binding_pattern f [concrete = constants.%f.patt] // CHECK:STDOUT: } // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- compound_assignment_homogeneous_long.carbon @@ -3173,6 +3205,8 @@ fn CopyUnsignedLong() { // CHECK:STDOUT: %Destroy.Op.bound.loc8: = bound_method %a.var, constants.%Destroy.Op.1a2547.3 // CHECK:STDOUT: %Destroy.Op.call.loc8: init %empty_tuple.type = call %Destroy.Op.bound.loc8(%a.var) // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Destroy.Op.loc9_3.1(%self.param: ref %i32.builtin) = "no_op"; @@ -3180,11 +3214,15 @@ fn CopyUnsignedLong() { // CHECK:STDOUT: fn @Destroy.Op.loc9_3.2(%self.param: ref %i32) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Destroy.Op.loc9_3.3(%self.param: ref %Cpp.long) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- compound_assignment_hereogeneous_long_and_i32.carbon @@ -3642,6 +3680,8 @@ fn CopyUnsignedLong() { // CHECK:STDOUT: %Destroy.Op.bound: = bound_method %a.var, constants.%Destroy.Op.1a2547.3 // CHECK:STDOUT: %Destroy.Op.call: init %empty_tuple.type = call %Destroy.Op.bound(%a.var) // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Destroy.Op.loc9_3.1(%self.param: ref %i32.builtin) = "no_op"; @@ -3649,11 +3689,15 @@ fn CopyUnsignedLong() { // CHECK:STDOUT: fn @Destroy.Op.loc9_3.2(%self.param: ref %i32) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Destroy.Op.loc9_3.3(%self.param: ref %Cpp.long) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- compound_assignment_heterogeneous_long_and_int_literal.carbon @@ -3751,6 +3795,8 @@ fn CopyUnsignedLong() { // CHECK:STDOUT: %Destroy.Op.bound: = bound_method %a.var, constants.%Destroy.Op.1a2547.3 // CHECK:STDOUT: %Destroy.Op.call: init %empty_tuple.type = call %Destroy.Op.bound(%a.var) // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Destroy.Op.loc8_3.1(%self.param: ref %i32.builtin) = "no_op"; @@ -3758,11 +3804,15 @@ fn CopyUnsignedLong() { // CHECK:STDOUT: fn @Destroy.Op.loc8_3.2(%self.param: ref %i32) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Destroy.Op.loc8_3.3(%self.param: ref %Cpp.long) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- compound_assignment_heterogeneous_long_and_runtime_i32.carbon @@ -3899,6 +3949,8 @@ fn CopyUnsignedLong() { // CHECK:STDOUT: %Destroy.Op.bound: = bound_method %a.var, constants.%Destroy.Op.1a2547.3 // CHECK:STDOUT: %Destroy.Op.call: init %empty_tuple.type = call %Destroy.Op.bound(%a.var) // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Destroy.Op.loc8_3.1(%self.param: ref %i32.builtin) = "no_op"; @@ -3906,11 +3958,15 @@ fn CopyUnsignedLong() { // CHECK:STDOUT: fn @Destroy.Op.loc8_3.2(%self.param: ref %i32) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Destroy.Op.loc8_3.3(%self.param: ref %Cpp.long) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- increment_decrement_long.carbon @@ -3994,6 +4050,8 @@ fn CopyUnsignedLong() { // CHECK:STDOUT: %Destroy.Op.bound: = bound_method %a.var, constants.%Destroy.Op.1a2547.3 // CHECK:STDOUT: %Destroy.Op.call: init %empty_tuple.type = call %Destroy.Op.bound(%a.var) // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Destroy.Op.loc8_3.1(%self.param: ref %i32.builtin) = "no_op"; @@ -4001,11 +4059,15 @@ fn CopyUnsignedLong() { // CHECK:STDOUT: fn @Destroy.Op.loc8_3.2(%self.param: ref %i32) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Destroy.Op.loc8_3.3(%self.param: ref %Cpp.long) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- unsigned_long.carbon @@ -4308,6 +4370,8 @@ fn CopyUnsignedLong() { // CHECK:STDOUT: %ULongResult.cpp_destructor.bound.loc16: = bound_method %.loc16_89.3, constants.%ULongResult.cpp_destructor // CHECK:STDOUT: %ULongResult.cpp_destructor.call.loc16: init %empty_tuple.type = call %ULongResult.cpp_destructor.bound.loc16(%.loc16_89.3) // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Destroy.Op.loc24_3.1(%self.param: ref %f32.9b3) = "no_op"; @@ -4315,11 +4379,15 @@ fn CopyUnsignedLong() { // CHECK:STDOUT: fn @Destroy.Op.loc24_3.2(%self.param: ref %f32.c73) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Destroy.Op.loc24_3.3(%self.param: ref %array_type) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- copy_unsigned_long.carbon @@ -4406,6 +4474,8 @@ fn CopyUnsignedLong() { // CHECK:STDOUT: %Destroy.Op.bound.loc8: = bound_method %a.var, constants.%Destroy.Op.1a2547.3 // CHECK:STDOUT: %Destroy.Op.call.loc8: init %empty_tuple.type = call %Destroy.Op.bound.loc8(%a.var) // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Destroy.Op.loc9_3.1(%self.param: ref %u32.builtin) = "no_op"; @@ -4413,10 +4483,14 @@ fn CopyUnsignedLong() { // CHECK:STDOUT: fn @Destroy.Op.loc9_3.2(%self.param: ref %u32) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Destroy.Op.loc9_3.3(%self.param: ref %Cpp.unsigned_long) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/interop/cpp/primitive_types/long_and_long_long.lp64.carbon b/toolchain/check/testdata/interop/cpp/primitive_types/long_and_long_long.lp64.carbon index fd05007f9fc2..89aa7e483570 100644 --- a/toolchain/check/testdata/interop/cpp/primitive_types/long_and_long_long.lp64.carbon +++ b/toolchain/check/testdata/interop/cpp/primitive_types/long_and_long_long.lp64.carbon @@ -795,6 +795,8 @@ fn CopyUnsignedLongLong() { // CHECK:STDOUT: %Destroy.Op.bound: = bound_method %a.var, constants.%Destroy.Op.1a2547.3 // CHECK:STDOUT: %Destroy.Op.call: init %empty_tuple.type = call %Destroy.Op.bound(%a.var) // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Destroy.Op.loc11_3.1(%self.param: ref %f32.9b3) = "no_op"; @@ -802,11 +804,15 @@ fn CopyUnsignedLongLong() { // CHECK:STDOUT: fn @Destroy.Op.loc11_3.2(%self.param: ref %f32.c73) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Destroy.Op.loc11_3.3(%self.param: ref %array_type) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- unsigned_long.carbon @@ -972,6 +978,8 @@ fn CopyUnsignedLongLong() { // CHECK:STDOUT: %Destroy.Op.bound: = bound_method %a.var, constants.%Destroy.Op.1a2547.3 // CHECK:STDOUT: %Destroy.Op.call: init %empty_tuple.type = call %Destroy.Op.bound(%a.var) // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Destroy.Op.loc11_3.1(%self.param: ref %f32.9b3) = "no_op"; @@ -979,11 +987,15 @@ fn CopyUnsignedLongLong() { // CHECK:STDOUT: fn @Destroy.Op.loc11_3.2(%self.param: ref %f32.c73) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Destroy.Op.loc11_3.3(%self.param: ref %array_type) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- long_long.carbon @@ -1267,6 +1279,8 @@ fn CopyUnsignedLongLong() { // CHECK:STDOUT: %LongLongResult.cpp_destructor.bound.loc16: = bound_method %.loc16_87.3, constants.%LongLongResult.cpp_destructor // CHECK:STDOUT: %LongLongResult.cpp_destructor.call.loc16: init %empty_tuple.type = call %LongLongResult.cpp_destructor.bound.loc16(%.loc16_87.3) // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Destroy.Op.loc24_3.1(%self.param: ref %f32.9b3) = "no_op"; @@ -1274,11 +1288,15 @@ fn CopyUnsignedLongLong() { // CHECK:STDOUT: fn @Destroy.Op.loc24_3.2(%self.param: ref %f32.c73) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Destroy.Op.loc24_3.3(%self.param: ref %array_type) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- copy_long_long.carbon @@ -1365,6 +1383,8 @@ fn CopyUnsignedLongLong() { // CHECK:STDOUT: %Destroy.Op.bound.loc8: = bound_method %a.var, constants.%Destroy.Op.1a2547.3 // CHECK:STDOUT: %Destroy.Op.call.loc8: init %empty_tuple.type = call %Destroy.Op.bound.loc8(%a.var) // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Destroy.Op.loc9_3.1(%self.param: ref %i64.builtin) = "no_op"; @@ -1372,11 +1392,15 @@ fn CopyUnsignedLongLong() { // CHECK:STDOUT: fn @Destroy.Op.loc9_3.2(%self.param: ref %i64) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Destroy.Op.loc9_3.3(%self.param: ref %Cpp.long_long) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- comparisons_homogeneous_long_long.carbon @@ -1506,6 +1530,8 @@ fn CopyUnsignedLongLong() { // CHECK:STDOUT: %bound_method.loc15: = bound_method %a.ref.loc15, %impl.elem1.loc15 // CHECK:STDOUT: %Cpp.long_long.as.OrderedWith.impl.LessOrEquivalent.call: init bool = call %bound_method.loc15(%a.ref.loc15, %b.ref.loc15) // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- comparisons_heterogeneous_long_long_left_side.carbon @@ -1962,6 +1988,8 @@ fn CopyUnsignedLongLong() { // CHECK:STDOUT: %.loc22_8.2: %Cpp.long_long = converted %int_1.loc22, %.loc22_8.1 [concrete = constants.%int_1.b19] // CHECK:STDOUT: %Cpp.long_long.as.OrderedWith.impl.LessOrEquivalent.call.loc22: init bool = call %bound_method.loc22_5.3(%a.ref.loc22, %.loc22_8.2) // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- comparisons_heterogeneous_long_long_right_side.carbon @@ -2440,6 +2468,8 @@ fn CopyUnsignedLongLong() { // CHECK:STDOUT: %.loc22_3.2: %Cpp.long_long = converted %int_1.loc22, %.loc22_3.1 [concrete = constants.%int_1.b19] // CHECK:STDOUT: %T.as_type.as.OrderedWith.impl.LessOrEquivalent.call.loc22: init bool = call %bound_method.loc22_5.3(%.loc22_3.2, %a.ref.loc22) // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- compound_assignment_homogeneous_long_long.carbon @@ -2882,6 +2912,8 @@ fn CopyUnsignedLongLong() { // CHECK:STDOUT: %Destroy.Op.bound.loc8: = bound_method %a.var, constants.%Destroy.Op.1a2547.3 // CHECK:STDOUT: %Destroy.Op.call.loc8: init %empty_tuple.type = call %Destroy.Op.bound.loc8(%a.var) // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Destroy.Op.loc9_3.1(%self.param: ref %i64.builtin) = "no_op"; @@ -2889,11 +2921,15 @@ fn CopyUnsignedLongLong() { // CHECK:STDOUT: fn @Destroy.Op.loc9_3.2(%self.param: ref %i64) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Destroy.Op.loc9_3.3(%self.param: ref %Cpp.long_long) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- compound_assignment_hereogeneous_long_long_and_i64.carbon @@ -3351,6 +3387,8 @@ fn CopyUnsignedLongLong() { // CHECK:STDOUT: %Destroy.Op.bound: = bound_method %a.var, constants.%Destroy.Op.1a2547.3 // CHECK:STDOUT: %Destroy.Op.call: init %empty_tuple.type = call %Destroy.Op.bound(%a.var) // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Destroy.Op.loc9_3.1(%self.param: ref %i64.builtin) = "no_op"; @@ -3358,11 +3396,15 @@ fn CopyUnsignedLongLong() { // CHECK:STDOUT: fn @Destroy.Op.loc9_3.2(%self.param: ref %i64) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Destroy.Op.loc9_3.3(%self.param: ref %Cpp.long_long) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- compound_assignment_heterogeneous_long_long_and_int_literal.carbon @@ -3460,6 +3502,8 @@ fn CopyUnsignedLongLong() { // CHECK:STDOUT: %Destroy.Op.bound: = bound_method %a.var, constants.%Destroy.Op.1a2547.3 // CHECK:STDOUT: %Destroy.Op.call: init %empty_tuple.type = call %Destroy.Op.bound(%a.var) // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Destroy.Op.loc8_3.1(%self.param: ref %i64.builtin) = "no_op"; @@ -3467,11 +3511,15 @@ fn CopyUnsignedLongLong() { // CHECK:STDOUT: fn @Destroy.Op.loc8_3.2(%self.param: ref %i64) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Destroy.Op.loc8_3.3(%self.param: ref %Cpp.long_long) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- compound_assignment_heterogeneous_long_long_and_runtime_i64.carbon @@ -3608,6 +3656,8 @@ fn CopyUnsignedLongLong() { // CHECK:STDOUT: %Destroy.Op.bound: = bound_method %a.var, constants.%Destroy.Op.1a2547.3 // CHECK:STDOUT: %Destroy.Op.call: init %empty_tuple.type = call %Destroy.Op.bound(%a.var) // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Destroy.Op.loc8_3.1(%self.param: ref %i64.builtin) = "no_op"; @@ -3615,11 +3665,15 @@ fn CopyUnsignedLongLong() { // CHECK:STDOUT: fn @Destroy.Op.loc8_3.2(%self.param: ref %i64) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Destroy.Op.loc8_3.3(%self.param: ref %Cpp.long_long) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- increment_decrement_long_long.carbon @@ -3703,6 +3757,8 @@ fn CopyUnsignedLongLong() { // CHECK:STDOUT: %Destroy.Op.bound: = bound_method %a.var, constants.%Destroy.Op.1a2547.3 // CHECK:STDOUT: %Destroy.Op.call: init %empty_tuple.type = call %Destroy.Op.bound(%a.var) // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Destroy.Op.loc8_3.1(%self.param: ref %i64.builtin) = "no_op"; @@ -3710,11 +3766,15 @@ fn CopyUnsignedLongLong() { // CHECK:STDOUT: fn @Destroy.Op.loc8_3.2(%self.param: ref %i64) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Destroy.Op.loc8_3.3(%self.param: ref %Cpp.long_long) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- unsigned_long_long.carbon @@ -4018,6 +4078,8 @@ fn CopyUnsignedLongLong() { // CHECK:STDOUT: %ULongLongResult.cpp_destructor.bound.loc16: = bound_method %.loc16_107.3, constants.%ULongLongResult.cpp_destructor // CHECK:STDOUT: %ULongLongResult.cpp_destructor.call.loc16: init %empty_tuple.type = call %ULongLongResult.cpp_destructor.bound.loc16(%.loc16_107.3) // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Destroy.Op.loc24_3.1(%self.param: ref %f32.9b3) = "no_op"; @@ -4025,11 +4087,15 @@ fn CopyUnsignedLongLong() { // CHECK:STDOUT: fn @Destroy.Op.loc24_3.2(%self.param: ref %f32.c73) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Destroy.Op.loc24_3.3(%self.param: ref %array_type) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- copy_unsigned_long_long.carbon @@ -4116,6 +4182,8 @@ fn CopyUnsignedLongLong() { // CHECK:STDOUT: %Destroy.Op.bound.loc8: = bound_method %a.var, constants.%Destroy.Op.1a2547.3 // CHECK:STDOUT: %Destroy.Op.call.loc8: init %empty_tuple.type = call %Destroy.Op.bound.loc8(%a.var) // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Destroy.Op.loc9_3.1(%self.param: ref %u64.builtin) = "no_op"; @@ -4123,10 +4191,14 @@ fn CopyUnsignedLongLong() { // CHECK:STDOUT: fn @Destroy.Op.loc9_3.2(%self.param: ref %u64) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Destroy.Op.loc9_3.3(%self.param: ref %Cpp.unsigned_long_long) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/interop/cpp/primitive_types/void_pointer.carbon b/toolchain/check/testdata/interop/cpp/primitive_types/void_pointer.carbon index 0a1b9c4454a6..6197819b06b1 100644 --- a/toolchain/check/testdata/interop/cpp/primitive_types/void_pointer.carbon +++ b/toolchain/check/testdata/interop/cpp/primitive_types/void_pointer.carbon @@ -189,6 +189,8 @@ fn F(input: Cpp.void*) { // CHECK:STDOUT: %p.patt: %pattern_type.712 = value_binding_pattern p [concrete = constants.%p.patt] // CHECK:STDOUT: } // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- implicit_as_from_carbon_class_pointer_to_void_pointer.carbon @@ -242,6 +244,8 @@ fn F(input: Cpp.void*) { // CHECK:STDOUT: %p.patt: %pattern_type.712 = value_binding_pattern p [concrete = constants.%p.patt] // CHECK:STDOUT: } // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- explicit_as_from_cpp_class_pointer_to_void_pointer.carbon @@ -310,6 +314,8 @@ fn F(input: Cpp.void*) { // CHECK:STDOUT: %p.patt: %pattern_type.712 = value_binding_pattern p [concrete = constants.%p.patt] // CHECK:STDOUT: } // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- explicit_as_from_carbon_class_pointer_to_void_pointer.carbon @@ -376,6 +382,8 @@ fn F(input: Cpp.void*) { // CHECK:STDOUT: %p.patt: %pattern_type.712 = value_binding_pattern p [concrete = constants.%p.patt] // CHECK:STDOUT: } // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- fail_explicit_as_from_void_pointer_to_cpp_class_pointer.carbon @@ -415,6 +423,8 @@ fn F(input: Cpp.void*) { // CHECK:STDOUT: %p.patt: %pattern_type.de6 = value_binding_pattern p [concrete = constants.%p.patt] // CHECK:STDOUT: } // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- fail_explicit_as_from_void_pointer_to_carbon_class_pointer.carbon @@ -443,6 +453,8 @@ fn F(input: Cpp.void*) { // CHECK:STDOUT: %p.patt: %pattern_type.fcb = value_binding_pattern p [concrete = constants.%p.patt] // CHECK:STDOUT: } // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- unsafe_as_from_void_pointer_to_cpp_class_pointer.carbon @@ -502,6 +514,8 @@ fn F(input: Cpp.void*) { // CHECK:STDOUT: %p.patt: %pattern_type.de6 = value_binding_pattern p [concrete = constants.%p.patt] // CHECK:STDOUT: } // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- unsafe_as_from_void_pointer_to_carbon_class_pointer.carbon @@ -553,5 +567,7 @@ fn F(input: Cpp.void*) { // CHECK:STDOUT: %p.patt: %pattern_type.fcb = value_binding_pattern p [concrete = constants.%p.patt] // CHECK:STDOUT: } // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/interop/cpp/range_for.carbon b/toolchain/check/testdata/interop/cpp/range_for.carbon index d4d3f0dbabec..3797dffcfc79 100644 --- a/toolchain/check/testdata/interop/cpp/range_for.carbon +++ b/toolchain/check/testdata/interop/cpp/range_for.carbon @@ -1085,17 +1085,23 @@ fn TestDriver(var no_begin_end: Cpp.NoBeginEnd, // CHECK:STDOUT: %bound_method.loc34_19.8: = bound_method %var, %specific_impl_fn.loc34_19.3 // CHECK:STDOUT: %Destroy.WithSelf.Op.call: init %empty_tuple.type = call %bound_method.loc34_19.8(%var) // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Destroy.Op.loc34_19.1(%self.param: ref %.1d6a7) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Destroy.Op.loc34_19.2(%self.param: ref %MaybeUnformed.023) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Destroy.Op.loc34_19.3(%self.param: ref bool) = "no_op"; @@ -1103,16 +1109,22 @@ fn TestDriver(var no_begin_end: Cpp.NoBeginEnd, // CHECK:STDOUT: fn @Destroy.Op.loc34_19.4(%self.param: ref %struct_type.value.has_value.ad0) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Destroy.Op.loc34_19.5(%self.param: ref %DefaultOptionalStorage.970) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Destroy.Op.loc34_19.6(%self.param: ref %Optional.e28) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @TestRangeFor(%m.param: ref %MutableRange, %c.param: %ConstRange) { @@ -1265,6 +1277,8 @@ fn TestDriver(var no_begin_end: Cpp.NoBeginEnd, // CHECK:STDOUT: %Destroy.Op.bound.loc49_19.2: = bound_method %var.loc49, constants.%Destroy.Op.1a2547.10 // CHECK:STDOUT: %Destroy.Op.call.loc49_19.2: init %empty_tuple.type = call %Destroy.Op.bound.loc49_19.2(%var.loc49) // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: specific @TestIterate(constants.%R.891) { @@ -1712,17 +1726,23 @@ fn TestDriver(var no_begin_end: Cpp.NoBeginEnd, // CHECK:STDOUT: %bound_method.loc44_29.8: = bound_method %var, %specific_impl_fn.loc44_29.3 // CHECK:STDOUT: %Destroy.WithSelf.Op.call: init %empty_tuple.type = call %bound_method.loc44_29.8(%var) // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Destroy.Op.loc44_29.1(%self.param: ref %.98c) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Destroy.Op.loc44_29.2(%self.param: ref %MaybeUnformed.02e) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Destroy.Op.loc44_29.3(%self.param: ref bool) = "no_op"; @@ -1730,16 +1750,22 @@ fn TestDriver(var no_begin_end: Cpp.NoBeginEnd, // CHECK:STDOUT: fn @Destroy.Op.loc44_29.4(%self.param: ref %struct_type.value.has_value.761) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Destroy.Op.loc44_29.5(%self.param: ref %DefaultOptionalStorage.84c) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Destroy.Op.loc44_29.6(%self.param: ref %Optional.95f) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @TestRangeFor(%m.param: ref %MutableRange, %c.param: %ConstRange) { @@ -1898,6 +1924,8 @@ fn TestDriver(var no_begin_end: Cpp.NoBeginEnd, // CHECK:STDOUT: %Destroy.Op.bound.loc59_29.2: = bound_method %var.loc59, constants.%Destroy.Op.1a2547.8 // CHECK:STDOUT: %Destroy.Op.call.loc59_29.2: init %empty_tuple.type = call %Destroy.Op.bound.loc59_29.2(%var.loc59) // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: specific @TestIterate(constants.%R.de1) { @@ -2261,17 +2289,23 @@ fn TestDriver(var no_begin_end: Cpp.NoBeginEnd, // CHECK:STDOUT: %bound_method.loc24_19.8: = bound_method %var, %specific_impl_fn.loc24_19.3 // CHECK:STDOUT: %Destroy.WithSelf.Op.call: init %empty_tuple.type = call %bound_method.loc24_19.8(%var) // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Destroy.Op.loc24_19.1(%self.param: ref %.cc0) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Destroy.Op.loc24_19.2(%self.param: ref %MaybeUnformed.b7e) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Destroy.Op.loc24_19.3(%self.param: ref bool) = "no_op"; @@ -2279,16 +2313,22 @@ fn TestDriver(var no_begin_end: Cpp.NoBeginEnd, // CHECK:STDOUT: fn @Destroy.Op.loc24_19.4(%self.param: ref %struct_type.value.has_value.ad9) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Destroy.Op.loc24_19.5(%self.param: ref %DefaultOptionalStorage.541) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Destroy.Op.loc24_19.6(%self.param: ref %Optional.f48) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @TestRangeFor(%c.param: %ConstRange) { @@ -2362,6 +2402,8 @@ fn TestDriver(var no_begin_end: Cpp.NoBeginEnd, // CHECK:STDOUT: %Destroy.Op.bound.loc38_19.2: = bound_method %var, constants.%Destroy.Op.1a2547.10 // CHECK:STDOUT: %Destroy.Op.call.loc38_19.2: init %empty_tuple.type = call %Destroy.Op.bound.loc38_19.2(%var) // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: specific @TestIterate(constants.%R.7b2) { @@ -2694,17 +2736,23 @@ fn TestDriver(var no_begin_end: Cpp.NoBeginEnd, // CHECK:STDOUT: %bound_method.loc26_19.8: = bound_method %var, %specific_impl_fn.loc26_19.3 // CHECK:STDOUT: %Destroy.WithSelf.Op.call: init %empty_tuple.type = call %bound_method.loc26_19.8(%var) // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Destroy.Op.loc26_19.1(%self.param: ref %.cc0) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Destroy.Op.loc26_19.2(%self.param: ref %MaybeUnformed.b7e) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Destroy.Op.loc26_19.3(%self.param: ref bool) = "no_op"; @@ -2712,16 +2760,22 @@ fn TestDriver(var no_begin_end: Cpp.NoBeginEnd, // CHECK:STDOUT: fn @Destroy.Op.loc26_19.4(%self.param: ref %struct_type.value.has_value.ad9) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Destroy.Op.loc26_19.5(%self.param: ref %DefaultOptionalStorage.541) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Destroy.Op.loc26_19.6(%self.param: ref %Optional.f48) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @TestRangeFor(%m.param: ref %MutableRange) { @@ -2797,6 +2851,8 @@ fn TestDriver(var no_begin_end: Cpp.NoBeginEnd, // CHECK:STDOUT: %Destroy.Op.bound.loc68_19.2: = bound_method %var, constants.%Destroy.Op.1a2547.10 // CHECK:STDOUT: %Destroy.Op.call.loc68_19.2: init %empty_tuple.type = call %Destroy.Op.bound.loc68_19.2(%var) // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: specific @TestIterate(constants.%R.7b2) { @@ -3157,17 +3213,23 @@ fn TestDriver(var no_begin_end: Cpp.NoBeginEnd, // CHECK:STDOUT: %bound_method.loc31_31.8: = bound_method %var, %specific_impl_fn.loc31_31.3 // CHECK:STDOUT: %Destroy.WithSelf.Op.call: init %empty_tuple.type = call %bound_method.loc31_31.8(%var) // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Destroy.Op.loc31_31.1(%self.param: ref %.b36) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Destroy.Op.loc31_31.2(%self.param: ref %MaybeUnformed.669) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Destroy.Op.loc31_31.3(%self.param: ref bool) = "no_op"; @@ -3175,16 +3237,22 @@ fn TestDriver(var no_begin_end: Cpp.NoBeginEnd, // CHECK:STDOUT: fn @Destroy.Op.loc31_31.4(%self.param: ref %struct_type.value.has_value.5a1) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Destroy.Op.loc31_31.5(%self.param: ref %DefaultOptionalStorage.257) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Destroy.Op.loc31_31.6(%self.param: ref %Optional.552) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @TestRangeFor(%c.param: %ConstRange) { @@ -3267,6 +3335,8 @@ fn TestDriver(var no_begin_end: Cpp.NoBeginEnd, // CHECK:STDOUT: %Destroy.Op.bound.loc45_31.2: = bound_method %var, constants.%Destroy.Op.1a2547.8 // CHECK:STDOUT: %Destroy.Op.call.loc45_31.2: init %empty_tuple.type = call %Destroy.Op.bound.loc45_31.2(%var) // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: specific @TestIterate(constants.%R.623) { @@ -3536,17 +3606,23 @@ fn TestDriver(var no_begin_end: Cpp.NoBeginEnd, // CHECK:STDOUT: %bound_method.loc31_31.8: = bound_method %var, %specific_impl_fn.loc31_31.3 // CHECK:STDOUT: %Destroy.WithSelf.Op.call: init %empty_tuple.type = call %bound_method.loc31_31.8(%var) // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Destroy.Op.loc31_31.1(%self.param: ref %.b36) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Destroy.Op.loc31_31.2(%self.param: ref %MaybeUnformed.669) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Destroy.Op.loc31_31.3(%self.param: ref bool) = "no_op"; @@ -3554,16 +3630,22 @@ fn TestDriver(var no_begin_end: Cpp.NoBeginEnd, // CHECK:STDOUT: fn @Destroy.Op.loc31_31.4(%self.param: ref %struct_type.value.has_value.5a1) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Destroy.Op.loc31_31.5(%self.param: ref %DefaultOptionalStorage.257) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Destroy.Op.loc31_31.6(%self.param: ref %Optional.be6) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @TestRangeFor(%m.param: ref %MutableRange) { @@ -3596,6 +3678,8 @@ fn TestDriver(var no_begin_end: Cpp.NoBeginEnd, // CHECK:STDOUT: // CHECK:STDOUT: !for.done: // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: specific @TestIterate(constants.%R.623) { @@ -3918,17 +4002,23 @@ fn TestDriver(var no_begin_end: Cpp.NoBeginEnd, // CHECK:STDOUT: %bound_method.loc38_31.8: = bound_method %var, %specific_impl_fn.loc38_31.3 // CHECK:STDOUT: %Destroy.WithSelf.Op.call: init %empty_tuple.type = call %bound_method.loc38_31.8(%var) // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Destroy.Op.loc38_31.1(%self.param: ref %.b36) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Destroy.Op.loc38_31.2(%self.param: ref %MaybeUnformed.669) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Destroy.Op.loc38_31.3(%self.param: ref bool) = "no_op"; @@ -3936,16 +4026,22 @@ fn TestDriver(var no_begin_end: Cpp.NoBeginEnd, // CHECK:STDOUT: fn @Destroy.Op.loc38_31.4(%self.param: ref %struct_type.value.has_value.5a1) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Destroy.Op.loc38_31.5(%self.param: ref %DefaultOptionalStorage.257) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Destroy.Op.loc38_31.6(%self.param: ref %Optional.552) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @TestRangeFor(%mc.param: ref %MutableAndConstRange) { @@ -4030,6 +4126,8 @@ fn TestDriver(var no_begin_end: Cpp.NoBeginEnd, // CHECK:STDOUT: %Destroy.Op.bound.loc80_32.2: = bound_method %var, constants.%Destroy.Op.1a2547.8 // CHECK:STDOUT: %Destroy.Op.call.loc80_32.2: init %empty_tuple.type = call %Destroy.Op.bound.loc80_32.2(%var) // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: specific @TestIterate(constants.%R.623) { diff --git a/toolchain/check/testdata/interop/cpp/stdlib/initializer_list.carbon b/toolchain/check/testdata/interop/cpp/stdlib/initializer_list.carbon index 7c95450d5b28..ec71788a0d20 100644 --- a/toolchain/check/testdata/interop/cpp/stdlib/initializer_list.carbon +++ b/toolchain/check/testdata/interop/cpp/stdlib/initializer_list.carbon @@ -369,6 +369,8 @@ fn F() { // CHECK:STDOUT: %initializer_list.cpp_destructor.call.loc8: init %empty_tuple.type = call %initializer_list.cpp_destructor.bound.loc8(%.loc8_50.18) // CHECK:STDOUT: %Destroy.Op.call.loc8: init %empty_tuple.type = call constants.%Destroy.Op.bound(constants.%.981) // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @initializer_list.initializer_list.loc8(%_.param: %array_type) -> out %return.param: %initializer_list = "cpp.std.initializer_list.make"; @@ -382,10 +384,14 @@ fn F() { // CHECK:STDOUT: fn @Destroy.Op.loc12_44.2(%self.param: ref %i32) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Destroy.Op.loc12_44.3(%self.param: ref %array_type) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/interop/cpp/stdlib/string_view.carbon b/toolchain/check/testdata/interop/cpp/stdlib/string_view.carbon index 6c24d8ca5dba..a8e1142e6e5c 100644 --- a/toolchain/check/testdata/interop/cpp/stdlib/string_view.carbon +++ b/toolchain/check/testdata/interop/cpp/stdlib/string_view.carbon @@ -148,6 +148,8 @@ fn StarstWith(a: str, b: str) -> bool { // CHECK:STDOUT: %addr: %ptr.e6f = addr_of %.loc8 // CHECK:STDOUT: %Consume__carbon_thunk.call: init %empty_tuple.type = call imports.%Consume__carbon_thunk.decl(%addr) // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @G() -> out %return.param: %str.3d4 { @@ -159,6 +161,8 @@ fn StarstWith(a: str, b: str) -> bool { // CHECK:STDOUT: %Produce__carbon_thunk.call: init %empty_tuple.type = call imports.%Produce__carbon_thunk.decl(%addr) // CHECK:STDOUT: %.loc14: init %str.3d4 to %.loc13_11.1 = mark_in_place_init %Produce__carbon_thunk.call // CHECK:STDOUT: return %.loc14 to %return.param +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- call_base_method.carbon @@ -237,5 +241,7 @@ fn StarstWith(a: str, b: str) -> bool { // CHECK:STDOUT: %starts_with__carbon_thunk.call: init %empty_tuple.type = call imports.%starts_with__carbon_thunk.decl(%a.ref, %addr.loc8_53.1, %addr.loc8_53.2) // CHECK:STDOUT: %.loc8_53.2: init bool to %.loc8_53.1 = mark_in_place_init %starts_with__carbon_thunk.call // CHECK:STDOUT: return %.loc8_53.2 +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/interop/cpp/template/alias_template.carbon b/toolchain/check/testdata/interop/cpp/template/alias_template.carbon index ff9727ae0280..57abec565565 100644 --- a/toolchain/check/testdata/interop/cpp/template/alias_template.carbon +++ b/toolchain/check/testdata/interop/cpp/template/alias_template.carbon @@ -151,5 +151,7 @@ var a2: Cpp.Second(Cpp.B, Cpp.A) = Cpp.A.A(); // CHECK:STDOUT: %.loc10_44: init %A to %.loc10_1 = mark_in_place_init %A__carbon_thunk.call.loc10 // CHECK:STDOUT: assign file.%a2.var, %.loc10_44 // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/interop/cpp/template/argument_count.carbon b/toolchain/check/testdata/interop/cpp/template/argument_count.carbon index 3e78084e9d05..d9e4462e36a4 100644 --- a/toolchain/check/testdata/interop/cpp/template/argument_count.carbon +++ b/toolchain/check/testdata/interop/cpp/template/argument_count.carbon @@ -163,6 +163,8 @@ var too_many: Cpp.FixedSizePack(Cpp.A, Cpp.A).Inner(Cpp.B, Cpp.B, Cpp.B); // CHECK:STDOUT: %T.as_type.as.DefaultOrUnformed.impl.Op.call: init %TwoTypes to %.loc7_1 = call %T.as_type.as.DefaultOrUnformed.impl.Op.specific_fn() // CHECK:STDOUT: assign file.%x.var, %T.as_type.as.DefaultOrUnformed.impl.Op.call // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- pack.carbon @@ -282,5 +284,7 @@ var too_many: Cpp.FixedSizePack(Cpp.A, Cpp.A).Inner(Cpp.B, Cpp.B, Cpp.B); // CHECK:STDOUT: %T.as_type.as.DefaultOrUnformed.impl.Op.call.loc10: init %TypePack.186 to %.loc10_1 = call %T.as_type.as.DefaultOrUnformed.impl.Op.specific_fn.4() // CHECK:STDOUT: assign file.%a3.var, %T.as_type.as.DefaultOrUnformed.impl.Op.call.loc10 // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/interop/cpp/template/class_template.carbon b/toolchain/check/testdata/interop/cpp/template/class_template.carbon index d7d0fde490ff..6277623f0395 100644 --- a/toolchain/check/testdata/interop/cpp/template/class_template.carbon +++ b/toolchain/check/testdata/interop/cpp/template/class_template.carbon @@ -109,5 +109,7 @@ var a: Cpp.A = Cpp.X(Cpp.A, Cpp.B).f({} as Cpp.B); // CHECK:STDOUT: %.loc7_49: init %A to %.loc7_1 = mark_in_place_init %f__carbon_thunk.call // CHECK:STDOUT: assign file.%a.var, %.loc7_49 // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/interop/cpp/template/concept.carbon b/toolchain/check/testdata/interop/cpp/template/concept.carbon index f1757f7fd960..1e9fdc93ef91 100644 --- a/toolchain/check/testdata/interop/cpp/template/concept.carbon +++ b/toolchain/check/testdata/interop/cpp/template/concept.carbon @@ -126,5 +126,7 @@ var x2: X(Cpp.IsLarge(Cpp.Large)) = X(true).Make(); // CHECK:STDOUT: %X.Make.call.loc12: init %X.7b4 to %.loc12_1 = call %X.Make.specific_fn.loc12() // CHECK:STDOUT: assign file.%x2.var, %X.Make.call.loc12 // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/interop/cpp/template/non_type_param.carbon b/toolchain/check/testdata/interop/cpp/template/non_type_param.carbon index 61d289b9d26e..8c18f9aba7dc 100644 --- a/toolchain/check/testdata/interop/cpp/template/non_type_param.carbon +++ b/toolchain/check/testdata/interop/cpp/template/non_type_param.carbon @@ -206,6 +206,8 @@ fn G() -> i32 { // CHECK:STDOUT: %.loc7_1: init %TwoNonType = converted %.loc7_32.1, %.loc7_32.2 [concrete = constants.%TwoNonType.val] // CHECK:STDOUT: assign file.%x.var, %.loc7_1 // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- dependent.carbon @@ -285,5 +287,7 @@ fn G() -> i32 { // CHECK:STDOUT: %.loc8_1: init %DependentNonType.d43 = converted %.loc8_54.1, %.loc8_54.2 [concrete = constants.%DependentNonType.val] // CHECK:STDOUT: assign file.%y.var, %.loc8_1 // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/interop/cpp/template/template_template_param.carbon b/toolchain/check/testdata/interop/cpp/template/template_template_param.carbon index e6f6e32cff40..75c26abe6789 100644 --- a/toolchain/check/testdata/interop/cpp/template/template_template_param.carbon +++ b/toolchain/check/testdata/interop/cpp/template/template_template_param.carbon @@ -125,6 +125,8 @@ var x: Cpp.TwoTemplates(Cpp.A, true); // CHECK:STDOUT: %T.as_type.as.DefaultOrUnformed.impl.Op.call: init %TwoTemplates to %.loc7_1 = call %T.as_type.as.DefaultOrUnformed.impl.Op.specific_fn() // CHECK:STDOUT: assign file.%x.var, %T.as_type.as.DefaultOrUnformed.impl.Op.call // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- fail_template_mismatch.carbon @@ -142,5 +144,7 @@ var x: Cpp.TwoTemplates(Cpp.A, true); // CHECK:STDOUT: !entry: // CHECK:STDOUT: assign file.%x.var, // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/interop/cpp/template/type_param.carbon b/toolchain/check/testdata/interop/cpp/template/type_param.carbon index a0f979eaaded..cabb27b38e80 100644 --- a/toolchain/check/testdata/interop/cpp/template/type_param.carbon +++ b/toolchain/check/testdata/interop/cpp/template/type_param.carbon @@ -109,6 +109,8 @@ var x: Cpp.TwoTypes(Cpp.A, {}); // CHECK:STDOUT: %T.as_type.as.DefaultOrUnformed.impl.Op.call: init %TwoTypes to %.loc7_1 = call %T.as_type.as.DefaultOrUnformed.impl.Op.specific_fn() // CHECK:STDOUT: assign file.%x.var, %T.as_type.as.DefaultOrUnformed.impl.Op.call // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- char.carbon @@ -156,5 +158,7 @@ var x: Cpp.TwoTypes(Cpp.A, {}); // CHECK:STDOUT: %T.as_type.as.DefaultOrUnformed.impl.Op.call: init %TwoTypes to %.loc7_1 = call %T.as_type.as.DefaultOrUnformed.impl.Op.specific_fn() // CHECK:STDOUT: assign file.%x.var, %T.as_type.as.DefaultOrUnformed.impl.Op.call // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/interop/cpp/template/var_template.carbon b/toolchain/check/testdata/interop/cpp/template/var_template.carbon index 9e3ec05e5bce..e9bca1e82723 100644 --- a/toolchain/check/testdata/interop/cpp/template/var_template.carbon +++ b/toolchain/check/testdata/interop/cpp/template/var_template.carbon @@ -159,5 +159,7 @@ let pwb: Cpp.B* = &Cpp.Wrap.r#var(Cpp.B); // CHECK:STDOUT: %B.ref.loc10: type = name_ref B, imports.%B.decl [concrete = constants.%B] // CHECK:STDOUT: %addr.loc10: %ptr.dc0 = addr_of imports.%var.var.302 [concrete = constants.%addr.cd4] // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/interop/cpp/type_alias/import.carbon b/toolchain/check/testdata/interop/cpp/type_alias/import.carbon index 4dd26a3dfde6..10e025279c85 100644 --- a/toolchain/check/testdata/interop/cpp/type_alias/import.carbon +++ b/toolchain/check/testdata/interop/cpp/type_alias/import.carbon @@ -153,6 +153,8 @@ fn H(var c: Cpp.C, var d: Cpp.D) { // CHECK:STDOUT: %Destroy.Op.bound.loc8: = bound_method %n.var, constants.%Destroy.Op.1a2547.3 // CHECK:STDOUT: %Destroy.Op.call.loc8: init %empty_tuple.type = call %Destroy.Op.bound.loc8(%n.var) // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Destroy.Op.loc10(%self.param: ref %ptr.d08) = "no_op"; @@ -162,6 +164,8 @@ fn H(var c: Cpp.C, var d: Cpp.D) { // CHECK:STDOUT: fn @Destroy.Op.loc8_3.2(%self.param: ref %i32) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- use_class_typedef.carbon @@ -246,6 +250,8 @@ fn H(var c: Cpp.C, var d: Cpp.D) { // CHECK:STDOUT: %Destroy.Op.bound.loc9: = bound_method %pd.var, constants.%Destroy.Op // CHECK:STDOUT: %Destroy.Op.call.loc9: init %empty_tuple.type = call %Destroy.Op.bound.loc9(%pd.var) // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Destroy.Op(%self.param: ref %ptr.0a2) = "no_op"; diff --git a/toolchain/check/testdata/interop/cpp/var/import/global.carbon b/toolchain/check/testdata/interop/cpp/var/import/global.carbon index aefc2b1a9e42..02bf0ffb013a 100644 --- a/toolchain/check/testdata/interop/cpp/var/import/global.carbon +++ b/toolchain/check/testdata/interop/cpp/var/import/global.carbon @@ -182,6 +182,8 @@ fn MyF() { // CHECK:STDOUT: %local_ref.patt: %pattern_type.8fa = value_binding_pattern local_ref [concrete = constants.%local_ref.patt] // CHECK:STDOUT: } // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- fail_import_unsupported_type.carbon @@ -229,5 +231,7 @@ fn MyF() { // CHECK:STDOUT: %local.patt: = value_binding_pattern local [concrete = ] // CHECK:STDOUT: } // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/interop/cpp/var/import/namespace.carbon b/toolchain/check/testdata/interop/cpp/var/import/namespace.carbon index c561037f735d..25dbe5e9e897 100644 --- a/toolchain/check/testdata/interop/cpp/var/import/namespace.carbon +++ b/toolchain/check/testdata/interop/cpp/var/import/namespace.carbon @@ -75,5 +75,7 @@ fn F() { // CHECK:STDOUT: %Cpp.ref: = name_ref Cpp, imports.%Cpp [concrete = imports.%Cpp] // CHECK:STDOUT: %c.ref: ref %C = name_ref c, imports.%c.var [concrete = imports.%c.var] // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/let/compile_time_bindings.carbon b/toolchain/check/testdata/let/compile_time_bindings.carbon index 2786e97f859d..2ad2353be926 100644 --- a/toolchain/check/testdata/let/compile_time_bindings.carbon +++ b/toolchain/check/testdata/let/compile_time_bindings.carbon @@ -245,6 +245,8 @@ impl i32 as Empty { // CHECK:STDOUT: %.loc5_25: init %empty_tuple.type = tuple_init () [concrete = constants.%empty_tuple] // CHECK:STDOUT: %.loc5_26: init %empty_tuple.type = converted %x.ref, %.loc5_25 [concrete = constants.%empty_tuple] // CHECK:STDOUT: return %.loc5_26 +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- fail_let_before.carbon @@ -320,6 +322,8 @@ impl i32 as Empty { // CHECK:STDOUT: %.loc10_25: init %empty_tuple.type = tuple_init () [concrete = constants.%empty_tuple] // CHECK:STDOUT: %.loc10_26: init %empty_tuple.type = converted %x.ref, %.loc10_25 [concrete = constants.%empty_tuple] // CHECK:STDOUT: return %.loc10_26 +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- fail_multiple_lets.carbon @@ -483,6 +487,8 @@ impl i32 as Empty { // CHECK:STDOUT: %.loc5_25: init %empty_tuple.type = tuple_init () [concrete = constants.%empty_tuple] // CHECK:STDOUT: %.loc5_26: init %empty_tuple.type = converted %x.ref, %.loc5_25 [concrete = constants.%empty_tuple] // CHECK:STDOUT: return %.loc5_26 +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- fail_todo_use_in_function.carbon @@ -571,6 +577,8 @@ impl i32 as Empty { // CHECK:STDOUT: witness = (@I.WithSelf.%T, @I.WithSelf.%I.WithSelf.F.decl) // CHECK:STDOUT: // CHECK:STDOUT: !requires: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: generic fn @I.WithSelf.F(@I.%Self: %I.type) { @@ -713,6 +721,8 @@ impl i32 as Empty { // CHECK:STDOUT: !entry: // CHECK:STDOUT: %i32: type = type_literal constants.%i32 [concrete = constants.%i32] // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- fail_use_in_impl.carbon @@ -784,6 +794,8 @@ impl i32 as Empty { // CHECK:STDOUT: witness = () // CHECK:STDOUT: // CHECK:STDOUT: !requires: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: impl @i32.as.Empty.impl: %i32.loc6 as %Empty.ref { diff --git a/toolchain/check/testdata/let/convert.carbon b/toolchain/check/testdata/let/convert.carbon index b16a83b8386f..9b7787a0a9dd 100644 --- a/toolchain/check/testdata/let/convert.carbon +++ b/toolchain/check/testdata/let/convert.carbon @@ -80,5 +80,7 @@ fn G() { // CHECK:STDOUT: %w.patt: %pattern_type.777 = value_binding_pattern w [concrete = constants.%w.patt] // CHECK:STDOUT: } // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/let/fail_duplicate_decl.carbon b/toolchain/check/testdata/let/fail_duplicate_decl.carbon index 9b2b1d00125a..8a0ba819a893 100644 --- a/toolchain/check/testdata/let/fail_duplicate_decl.carbon +++ b/toolchain/check/testdata/let/fail_duplicate_decl.carbon @@ -110,5 +110,7 @@ fn F() { // CHECK:STDOUT: %a.patt.loc24: %pattern_type.6b6 = value_binding_pattern a [concrete = constants.%a.patt.bb2e5b.2] // CHECK:STDOUT: } // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/let/fail_generic_import.carbon b/toolchain/check/testdata/let/fail_generic_import.carbon index 8840428fcb5d..db4f676887a9 100644 --- a/toolchain/check/testdata/let/fail_generic_import.carbon +++ b/toolchain/check/testdata/let/fail_generic_import.carbon @@ -75,6 +75,8 @@ let a: T = 0; // CHECK:STDOUT: !entry: // CHECK:STDOUT: %i32: type = type_literal constants.%i32 [concrete = constants.%i32] // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- fail_implicit.impl.carbon @@ -111,5 +113,7 @@ let a: T = 0; // CHECK:STDOUT: !entry: // CHECK:STDOUT: %int_0: Core.IntLiteral = int_value 0 [concrete = constants.%int_0] // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/let/fail_missing_value.carbon b/toolchain/check/testdata/let/fail_missing_value.carbon index 06835b84423c..71be338d28a4 100644 --- a/toolchain/check/testdata/let/fail_missing_value.carbon +++ b/toolchain/check/testdata/let/fail_missing_value.carbon @@ -68,5 +68,7 @@ fn F() { // CHECK:STDOUT: %n.patt: %pattern_type.6b6 = value_binding_pattern n [concrete = constants.%n.patt.c48] // CHECK:STDOUT: } // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/let/fail_modifiers.carbon b/toolchain/check/testdata/let/fail_modifiers.carbon index 5e92a375b049..bd71e91cfb0e 100644 --- a/toolchain/check/testdata/let/fail_modifiers.carbon +++ b/toolchain/check/testdata/let/fail_modifiers.carbon @@ -258,5 +258,7 @@ protected protected let i: i32 = 1; // CHECK:STDOUT: %int_1.loc76: Core.IntLiteral = int_value 1 [concrete = constants.%int_1.5b8] // CHECK:STDOUT: %int_1.loc89: Core.IntLiteral = int_value 1 [concrete = constants.%int_1.5b8] // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/let/fail_use_in_init.carbon b/toolchain/check/testdata/let/fail_use_in_init.carbon index 91b96370a71c..4e40b6b880cb 100644 --- a/toolchain/check/testdata/let/fail_use_in_init.carbon +++ b/toolchain/check/testdata/let/fail_use_in_init.carbon @@ -67,5 +67,7 @@ fn F() { // CHECK:STDOUT: %a.patt: %pattern_type.6b6 = value_binding_pattern a [concrete = constants.%a.patt] // CHECK:STDOUT: } // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/let/generic_import.carbon b/toolchain/check/testdata/let/generic_import.carbon index ef37cc7af433..636cfde7d20d 100644 --- a/toolchain/check/testdata/let/generic_import.carbon +++ b/toolchain/check/testdata/let/generic_import.carbon @@ -79,6 +79,8 @@ var b: T = *a; // CHECK:STDOUT: !entry: // CHECK:STDOUT: %i32: type = type_literal constants.%i32 [concrete = constants.%i32] // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- fail_implicit.impl.carbon @@ -127,5 +129,7 @@ var b: T = *a; // CHECK:STDOUT: %.loc13: ref = deref [concrete = ] // CHECK:STDOUT: assign file.%b.var, // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/let/global.carbon b/toolchain/check/testdata/let/global.carbon index 56e25f6a9760..ef54392a0b4c 100644 --- a/toolchain/check/testdata/let/global.carbon +++ b/toolchain/check/testdata/let/global.carbon @@ -116,11 +116,15 @@ fn F() -> i32 { return n; } // CHECK:STDOUT: %bound_method.loc17_24.2: = bound_method %n.ref, %specific_fn // CHECK:STDOUT: %Int.as.Copy.impl.Op.call: init %i32 = call %bound_method.loc17_24.2(%n.ref) // CHECK:STDOUT: return %Int.as.Copy.impl.Op.call +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @__global_init() { // CHECK:STDOUT: !entry: // CHECK:STDOUT: %int_1: Core.IntLiteral = int_value 1 [concrete = constants.%int_1.5b8] // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/let/import.carbon b/toolchain/check/testdata/let/import.carbon index 581c915038ae..fc08905862c8 100644 --- a/toolchain/check/testdata/let/import.carbon +++ b/toolchain/check/testdata/let/import.carbon @@ -65,6 +65,8 @@ let b: () = Other.a; // CHECK:STDOUT: !entry: // CHECK:STDOUT: %.loc4: %empty_tuple.type = tuple_literal () [concrete = constants.%empty_tuple] // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- implicit.impl.carbon @@ -101,6 +103,8 @@ let b: () = Other.a; // CHECK:STDOUT: !entry: // CHECK:STDOUT: %a.ref: %empty_tuple.type = name_ref a, imports.%Implicit.a // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- other.carbon @@ -132,6 +136,8 @@ let b: () = Other.a; // CHECK:STDOUT: !entry: // CHECK:STDOUT: %.loc4: %empty_tuple.type = tuple_literal () [concrete = constants.%empty_tuple] // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- import_other.carbon @@ -172,5 +178,7 @@ let b: () = Other.a; // CHECK:STDOUT: %Other.ref: = name_ref Other, imports.%Other [concrete = imports.%Other] // CHECK:STDOUT: %a.ref: %empty_tuple.type = name_ref a, imports.%Other.a // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/let/import_access.carbon b/toolchain/check/testdata/let/import_access.carbon index 1957b569d606..1dc0c5dac946 100644 --- a/toolchain/check/testdata/let/import_access.carbon +++ b/toolchain/check/testdata/let/import_access.carbon @@ -85,6 +85,8 @@ let v2: () = Test.v; // CHECK:STDOUT: !entry: // CHECK:STDOUT: %.loc4: %empty_tuple.type = tuple_literal () [concrete = constants.%empty_tuple] // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- def.impl.carbon @@ -121,6 +123,8 @@ let v2: () = Test.v; // CHECK:STDOUT: !entry: // CHECK:STDOUT: %v.ref: %empty_tuple.type = name_ref v, imports.%Test.v // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- fail_local_def.carbon @@ -152,6 +156,8 @@ let v2: () = Test.v; // CHECK:STDOUT: !entry: // CHECK:STDOUT: %v.ref: = name_ref v, [concrete = ] // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- fail_other_def.carbon @@ -191,5 +197,7 @@ let v2: () = Test.v; // CHECK:STDOUT: %Test.ref: = name_ref Test, imports.%Test [concrete = imports.%Test] // CHECK:STDOUT: %v.ref: = name_ref v, [concrete = ] // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/let/local.carbon b/toolchain/check/testdata/let/local.carbon index c1f0acf3cb44..2f5bb6f4e7e4 100644 --- a/toolchain/check/testdata/let/local.carbon +++ b/toolchain/check/testdata/let/local.carbon @@ -78,6 +78,8 @@ fn CallF() { // CHECK:STDOUT: %bound_method.loc6_10.2: = bound_method %b.ref, %specific_fn // CHECK:STDOUT: %Int.as.Copy.impl.Op.call: init %i32 = call %bound_method.loc6_10.2(%b.ref) // CHECK:STDOUT: return %Int.as.Copy.impl.Op.call +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- fail_todo_symbolic.carbon diff --git a/toolchain/check/testdata/let/ref.carbon b/toolchain/check/testdata/let/ref.carbon index 29773804dd45..67df67d59d09 100644 --- a/toolchain/check/testdata/let/ref.carbon +++ b/toolchain/check/testdata/let/ref.carbon @@ -84,5 +84,7 @@ fn F() { // CHECK:STDOUT: %.loc8_44: %pattern_type.394 = tuple_pattern (%d.patt, %e.patt) [concrete = constants.%.dd8] // CHECK:STDOUT: } // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/let/shadowed_decl.carbon b/toolchain/check/testdata/let/shadowed_decl.carbon index 20b8d4a0f510..3d89f4fbf516 100644 --- a/toolchain/check/testdata/let/shadowed_decl.carbon +++ b/toolchain/check/testdata/let/shadowed_decl.carbon @@ -125,5 +125,7 @@ fn F(unused a: i32) -> i32 { // CHECK:STDOUT: %bound_method.loc18_10.2: = bound_method %a.ref, %specific_fn.loc18 // CHECK:STDOUT: %Int.as.Copy.impl.Op.call: init %i32 = call %bound_method.loc18_10.2(%a.ref) // CHECK:STDOUT: return %Int.as.Copy.impl.Op.call +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/main_run/no_return.carbon b/toolchain/check/testdata/main_run/no_return.carbon index 40daebd2f6ec..64bd1737acf0 100644 --- a/toolchain/check/testdata/main_run/no_return.carbon +++ b/toolchain/check/testdata/main_run/no_return.carbon @@ -50,6 +50,8 @@ fn Run(unused argc: i32, unused argv: i32*) {} // CHECK:STDOUT: fn @Run() { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- with_params.carbon @@ -106,5 +108,7 @@ fn Run(unused argc: i32, unused argv: i32*) {} // CHECK:STDOUT: fn @Run(%argc.param: %i32, %argv.param: %ptr) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/main_run/return_i32.carbon b/toolchain/check/testdata/main_run/return_i32.carbon index 2d6baf66ec7e..bac8eac92132 100644 --- a/toolchain/check/testdata/main_run/return_i32.carbon +++ b/toolchain/check/testdata/main_run/return_i32.carbon @@ -96,6 +96,8 @@ fn Run(unused argc: i32, unused argv: i32*) -> i32 { return 0; } // CHECK:STDOUT: %Core.IntLiteral.as.ImplicitAs.impl.Convert.call: init %i32 = call %bound_method.loc4_27.2(%int_0) [concrete = constants.%int_0.3c0] // CHECK:STDOUT: %.loc4_27: init %i32 = converted %int_0, %Core.IntLiteral.as.ImplicitAs.impl.Convert.call [concrete = constants.%int_0.3c0] // CHECK:STDOUT: return %.loc4_27 +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- with_params.carbon @@ -189,5 +191,7 @@ fn Run(unused argc: i32, unused argv: i32*) -> i32 { return 0; } // CHECK:STDOUT: %Core.IntLiteral.as.ImplicitAs.impl.Convert.call: init %i32 = call %bound_method.loc5_62.2(%int_0) [concrete = constants.%int_0.3c0] // CHECK:STDOUT: %.loc5_62: init %i32 = converted %int_0, %Core.IntLiteral.as.ImplicitAs.impl.Convert.call [concrete = constants.%int_0.3c0] // CHECK:STDOUT: return %.loc5_62 +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/named_constraint/convert.carbon b/toolchain/check/testdata/named_constraint/convert.carbon index 478988a05eb1..433f5041a85a 100644 --- a/toolchain/check/testdata/named_constraint/convert.carbon +++ b/toolchain/check/testdata/named_constraint/convert.carbon @@ -121,6 +121,8 @@ fn G(T:! Z) { // CHECK:STDOUT: %F.specific_fn.loc9_3.1: = specific_function %F.ref, @F(constants.%T.f45530.2) [symbolic = %F.specific_fn.loc9_3.2 (constants.%F.specific_fn)] // CHECK:STDOUT: %F.call: init %empty_tuple.type = call %F.specific_fn.loc9_3.1() // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: @@ -180,6 +182,8 @@ fn G(T:! Z) { // CHECK:STDOUT: %F.specific_fn.loc10_3.1: = specific_function %F.ref, @F(constants.%E1.facet) [symbolic = %F.specific_fn.loc10_3.2 (constants.%F.specific_fn)] // CHECK:STDOUT: %F.call: init %empty_tuple.type = call %F.specific_fn.loc10_3.1() // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/named_constraint/empty.carbon b/toolchain/check/testdata/named_constraint/empty.carbon index 492984688462..042dd16b1bb9 100644 --- a/toolchain/check/testdata/named_constraint/empty.carbon +++ b/toolchain/check/testdata/named_constraint/empty.carbon @@ -110,6 +110,8 @@ fn G(T:! Z, U:! type, V:! Empty) { // CHECK:STDOUT: fn() { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: @@ -161,6 +163,8 @@ fn G(T:! Z, U:! type, V:! Empty) { // CHECK:STDOUT: %F.specific_fn.loc30_3.1: = specific_function %F.ref.loc30, @F(constants.%V) [symbolic = %F.specific_fn.loc30_3.2 (constants.%F.specific_fn.b7e)] // CHECK:STDOUT: %F.call.loc30: init %empty_tuple.type = call %F.specific_fn.loc30_3.1() // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/named_constraint/empty_generic.carbon b/toolchain/check/testdata/named_constraint/empty_generic.carbon index 4bc18db49471..ce45bd5375b0 100644 --- a/toolchain/check/testdata/named_constraint/empty_generic.carbon +++ b/toolchain/check/testdata/named_constraint/empty_generic.carbon @@ -161,6 +161,8 @@ fn G(T:! Z, U:! Empty(T), V:! type) { // CHECK:STDOUT: fn() { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: @@ -235,6 +237,8 @@ fn G(T:! Z, U:! Empty(T), V:! type) { // CHECK:STDOUT: %F.specific_fn.loc25_3.1: = specific_function %F.ref.loc25, @F(constants.%T.as_type, constants.%Empty.facet.ed5) [symbolic = %F.specific_fn.loc25_3.2 (constants.%F.specific_fn.67d)] // CHECK:STDOUT: %F.call.loc25: init %empty_tuple.type = call %F.specific_fn.loc25_3.1() // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/named_constraint/extend_name_lookup.carbon b/toolchain/check/testdata/named_constraint/extend_name_lookup.carbon index 98e17a0ea4cb..a40aff788565 100644 --- a/toolchain/check/testdata/named_constraint/extend_name_lookup.carbon +++ b/toolchain/check/testdata/named_constraint/extend_name_lookup.carbon @@ -178,6 +178,8 @@ fn F(T:! type where .Self impls W) { // CHECK:STDOUT: %specific_impl_fn.loc16_4.1: = specific_impl_function %impl.elem0.loc16_4.1, @Y.WithSelf.YF(constants.%Y.facet) [symbolic = %specific_impl_fn.loc16_4.2 (constants.%specific_impl_fn.aad)] // CHECK:STDOUT: %Y.WithSelf.YF.call: init %empty_tuple.type = call %specific_impl_fn.loc16_4.1() // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: @@ -282,6 +284,8 @@ fn F(T:! type where .Self impls W) { // CHECK:STDOUT: %specific_impl_fn.loc16_4.1: = specific_impl_function %impl.elem0.loc16_4.1, @Y.WithSelf.YF(constants.%Y.facet) [symbolic = %specific_impl_fn.loc16_4.2 (constants.%specific_impl_fn.aad)] // CHECK:STDOUT: %Y.WithSelf.YF.call: init %empty_tuple.type = call %specific_impl_fn.loc16_4.1() // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/named_constraint/generic.carbon b/toolchain/check/testdata/named_constraint/generic.carbon index d3c76b5f480e..882ec02fa755 100644 --- a/toolchain/check/testdata/named_constraint/generic.carbon +++ b/toolchain/check/testdata/named_constraint/generic.carbon @@ -157,6 +157,8 @@ fn F(unused T:! Generic((), ())) {} // CHECK:STDOUT: witness = () // CHECK:STDOUT: // CHECK:STDOUT: !requires: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: generic constraint @GenericType(%T.loc4_25.2: type) { diff --git a/toolchain/check/testdata/named_constraint/import_constraint_decl.carbon b/toolchain/check/testdata/named_constraint/import_constraint_decl.carbon index 55fa8d7a052b..4e025b84d161 100644 --- a/toolchain/check/testdata/named_constraint/import_constraint_decl.carbon +++ b/toolchain/check/testdata/named_constraint/import_constraint_decl.carbon @@ -129,6 +129,8 @@ impl C as B {} // CHECK:STDOUT: witness = () // CHECK:STDOUT: // CHECK:STDOUT: !requires: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: constraint @B [from "b.carbon"] { @@ -156,6 +158,8 @@ impl C as B {} // CHECK:STDOUT: fn() { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/named_constraint/import_type_and.carbon b/toolchain/check/testdata/named_constraint/import_type_and.carbon index 19df0e72d09d..8c957719afee 100644 --- a/toolchain/check/testdata/named_constraint/import_type_and.carbon +++ b/toolchain/check/testdata/named_constraint/import_type_and.carbon @@ -85,6 +85,8 @@ fn F(_:! N) {} // CHECK:STDOUT: witness = () // CHECK:STDOUT: // CHECK:STDOUT: !requires: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: interface @Z { @@ -96,6 +98,8 @@ fn F(_:! N) {} // CHECK:STDOUT: witness = () // CHECK:STDOUT: // CHECK:STDOUT: !requires: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: constraint @N { @@ -207,6 +211,8 @@ fn F(_:! N) {} // CHECK:STDOUT: witness = () // CHECK:STDOUT: // CHECK:STDOUT: !requires: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: interface @Y [from "import.carbon"] { @@ -215,6 +221,8 @@ fn F(_:! N) {} // CHECK:STDOUT: witness = () // CHECK:STDOUT: // CHECK:STDOUT: !requires: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: constraint @N [from "import.carbon"] { @@ -241,6 +249,8 @@ fn F(_:! N) {} // CHECK:STDOUT: fn() { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/named_constraint/require.carbon b/toolchain/check/testdata/named_constraint/require.carbon index e777c9dfaddc..5184edd59c97 100644 --- a/toolchain/check/testdata/named_constraint/require.carbon +++ b/toolchain/check/testdata/named_constraint/require.carbon @@ -835,6 +835,8 @@ constraint N { // CHECK:STDOUT: %specific_impl_fn.loc18: = specific_impl_function %impl.elem0.loc18, @Y.WithSelf.YY(constants.%Y.facet) [symbolic = %specific_impl_fn.loc15_4.2 (constants.%specific_impl_fn)] // CHECK:STDOUT: %Y.WithSelf.YY.call.loc18: init %empty_tuple.type = call %specific_impl_fn.loc18() // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: @@ -985,6 +987,8 @@ constraint N { // CHECK:STDOUT: %specific_impl_fn.loc18: = specific_impl_function %impl.elem0.loc18, @Y.WithSelf.YY(constants.%T.as_type, constants.%Y.facet) [symbolic = %specific_impl_fn.loc15_4.2 (constants.%specific_impl_fn)] // CHECK:STDOUT: %Y.WithSelf.YY.call.loc18: init %empty_tuple.type = call %specific_impl_fn.loc18() // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/namespace/add_to_import.carbon b/toolchain/check/testdata/namespace/add_to_import.carbon index 8f07b108b664..c08a813182e5 100644 --- a/toolchain/check/testdata/namespace/add_to_import.carbon +++ b/toolchain/check/testdata/namespace/add_to_import.carbon @@ -132,6 +132,8 @@ var a: i32 = NS.A(); // CHECK:STDOUT: %Core.IntLiteral.as.ImplicitAs.impl.Convert.call: init %i32 = call %bound_method.loc4_28.2(%int_0) [concrete = constants.%int_0.3c0] // CHECK:STDOUT: %.loc4_28: init %i32 = converted %int_0, %Core.IntLiteral.as.ImplicitAs.impl.Convert.call [concrete = constants.%int_0.3c0] // CHECK:STDOUT: return %.loc4_28 +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @__global_init() { @@ -141,5 +143,7 @@ var a: i32 = NS.A(); // CHECK:STDOUT: %A.call: init %i32 = call %A.ref() // CHECK:STDOUT: assign file.%a.var, %A.call // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/namespace/alias.carbon b/toolchain/check/testdata/namespace/alias.carbon index fb752dac47ed..29cb87b4bc3c 100644 --- a/toolchain/check/testdata/namespace/alias.carbon +++ b/toolchain/check/testdata/namespace/alias.carbon @@ -130,6 +130,8 @@ fn D() -> i32 { return C(); } // CHECK:STDOUT: %Core.IntLiteral.as.ImplicitAs.impl.Convert.call: init %i32 = call %bound_method.loc19_28.2(%int_0) [concrete = constants.%int_0.3c0] // CHECK:STDOUT: %.loc19_28: init %i32 = converted %int_0, %Core.IntLiteral.as.ImplicitAs.impl.Convert.call [concrete = constants.%int_0.3c0] // CHECK:STDOUT: return %.loc19_28 +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @B() -> out %return.param: %i32 { @@ -138,6 +140,8 @@ fn D() -> i32 { return C(); } // CHECK:STDOUT: %A.ref: %A.type = name_ref A, file.%A.decl [concrete = constants.%A] // CHECK:STDOUT: %A.call: init %i32 = call %A.ref() // CHECK:STDOUT: return %A.call +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @D() -> out %return.param: %i32 { @@ -145,5 +149,7 @@ fn D() -> i32 { return C(); } // CHECK:STDOUT: %C.ref: %A.type = name_ref C, file.%C [concrete = constants.%A] // CHECK:STDOUT: %A.call: init %i32 = call %C.ref() // CHECK:STDOUT: return %A.call +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/namespace/fail_conflict_in_imports_namespace_first.carbon b/toolchain/check/testdata/namespace/fail_conflict_in_imports_namespace_first.carbon index 86a0b77cdc1f..21df65252d4f 100644 --- a/toolchain/check/testdata/namespace/fail_conflict_in_imports_namespace_first.carbon +++ b/toolchain/check/testdata/namespace/fail_conflict_in_imports_namespace_first.carbon @@ -72,6 +72,8 @@ fn NS.Bar() {} // CHECK:STDOUT: fn @Foo() { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- fn.carbon @@ -100,6 +102,8 @@ fn NS.Bar() {} // CHECK:STDOUT: fn @NS() { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- fail_conflict.carbon @@ -135,5 +139,7 @@ fn NS.Bar() {} // CHECK:STDOUT: fn @Bar() { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/namespace/fail_conflict_in_imports_namespace_second.carbon b/toolchain/check/testdata/namespace/fail_conflict_in_imports_namespace_second.carbon index fef9ddfa1121..16e4058209f4 100644 --- a/toolchain/check/testdata/namespace/fail_conflict_in_imports_namespace_second.carbon +++ b/toolchain/check/testdata/namespace/fail_conflict_in_imports_namespace_second.carbon @@ -69,6 +69,8 @@ fn NS.Bar() {} // CHECK:STDOUT: fn @NS() { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- namespace.carbon @@ -100,6 +102,8 @@ fn NS.Bar() {} // CHECK:STDOUT: fn @Foo() { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- fail_conflict.carbon @@ -135,5 +139,7 @@ fn NS.Bar() {} // CHECK:STDOUT: fn @Bar() { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/namespace/fail_decl_in_alias.carbon b/toolchain/check/testdata/namespace/fail_decl_in_alias.carbon index 4ab9121e464a..1aa9d9597854 100644 --- a/toolchain/check/testdata/namespace/fail_decl_in_alias.carbon +++ b/toolchain/check/testdata/namespace/fail_decl_in_alias.carbon @@ -102,5 +102,7 @@ fn ns.A() -> i32 { return 0; } // CHECK:STDOUT: %Core.IntLiteral.as.ImplicitAs.impl.Convert.call: init %i32 = call %bound_method.loc27_28.2(%int_0) [concrete = constants.%int_0.3c0] // CHECK:STDOUT: %.loc27_28: init %i32 = converted %int_0, %Core.IntLiteral.as.ImplicitAs.impl.Convert.call [concrete = constants.%int_0.3c0] // CHECK:STDOUT: return %.loc27_28 +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/namespace/fail_duplicate.carbon b/toolchain/check/testdata/namespace/fail_duplicate.carbon index 39b486f74833..90107a8fe082 100644 --- a/toolchain/check/testdata/namespace/fail_duplicate.carbon +++ b/toolchain/check/testdata/namespace/fail_duplicate.carbon @@ -59,10 +59,14 @@ fn Foo.Baz() { // CHECK:STDOUT: fn @Baz.loc17() { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Baz.loc27() { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/namespace/fail_not_top_level.carbon b/toolchain/check/testdata/namespace/fail_not_top_level.carbon index 59d0b12ee53c..47fb0b25e9af 100644 --- a/toolchain/check/testdata/namespace/fail_not_top_level.carbon +++ b/toolchain/check/testdata/namespace/fail_not_top_level.carbon @@ -93,6 +93,8 @@ interface I { // CHECK:STDOUT: witness = () // CHECK:STDOUT: // CHECK:STDOUT: !requires: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: class @C { @@ -115,16 +117,22 @@ interface I { // CHECK:STDOUT: } // CHECK:STDOUT: %F.decl: %F.type.23e = fn_decl @F.loc21 [concrete = constants.%F.7e0] {} {} // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @F.loc21() { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @F.loc30() { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: generic fn @I.loc39(@I.loc33.%Self: %I.type.8e7) { @@ -133,6 +141,8 @@ interface I { // CHECK:STDOUT: fn() { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/namespace/fail_params.carbon b/toolchain/check/testdata/namespace/fail_params.carbon index 9a6e43bbf96a..cec162dbad1b 100644 --- a/toolchain/check/testdata/namespace/fail_params.carbon +++ b/toolchain/check/testdata/namespace/fail_params.carbon @@ -109,6 +109,8 @@ fn D(unused T:! type).F() {} // CHECK:STDOUT: fn @F.loc22() { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: generic fn @F.loc48(%T.loc48_14.3: type) { @@ -121,6 +123,8 @@ fn D(unused T:! type).F() {} // CHECK:STDOUT: fn() { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/namespace/fail_unresolved_scope.carbon b/toolchain/check/testdata/namespace/fail_unresolved_scope.carbon index 2b86079e43c3..2c804d97992f 100644 --- a/toolchain/check/testdata/namespace/fail_unresolved_scope.carbon +++ b/toolchain/check/testdata/namespace/fail_unresolved_scope.carbon @@ -44,5 +44,7 @@ fn Foo.Baz() { // CHECK:STDOUT: fn @Baz() { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/namespace/function.carbon b/toolchain/check/testdata/namespace/function.carbon index 2741fa6ed7a6..bed354545ace 100644 --- a/toolchain/check/testdata/namespace/function.carbon +++ b/toolchain/check/testdata/namespace/function.carbon @@ -63,11 +63,15 @@ fn Bar() { // CHECK:STDOUT: fn @Baz.loc18() { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Baz.loc21() { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Bar() { @@ -76,5 +80,7 @@ fn Bar() { // CHECK:STDOUT: %Baz.ref: %Baz.type.280 = name_ref Baz, file.%Baz.decl.loc21 [concrete = constants.%Baz.f49] // CHECK:STDOUT: %Baz.call: init %empty_tuple.type = call %Baz.ref() // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/namespace/imported.carbon b/toolchain/check/testdata/namespace/imported.carbon index 5c56489f861c..51bd589d1dbc 100644 --- a/toolchain/check/testdata/namespace/imported.carbon +++ b/toolchain/check/testdata/namespace/imported.carbon @@ -188,5 +188,7 @@ var package_b: () = package.NS.ChildNS.B(); // CHECK:STDOUT: %B.call.loc8: init %empty_tuple.type = call %B.ref.loc8() // CHECK:STDOUT: assign file.%package_b.var, %B.call.loc8 // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/namespace/imported_indirect.carbon b/toolchain/check/testdata/namespace/imported_indirect.carbon index 242ee0f1a805..52cc2aaa19aa 100644 --- a/toolchain/check/testdata/namespace/imported_indirect.carbon +++ b/toolchain/check/testdata/namespace/imported_indirect.carbon @@ -237,6 +237,8 @@ fn G() { Same.F(); } // CHECK:STDOUT: fn @D() { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- e.carbon @@ -302,6 +304,8 @@ fn G() { Same.F(); } // CHECK:STDOUT: %D.call: init %empty_tuple.type = call %D.ref() // CHECK:STDOUT: assign file.%e.var, %D.call // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- fail_named_indirectly_same_package.carbon @@ -346,6 +350,8 @@ fn G() { Same.F(); } // CHECK:STDOUT: %F.ref: %F.type = name_ref F, imports.%Same.F [concrete = constants.%F] // CHECK:STDOUT: %F.call: init = call %F.ref() // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @F [from "b.carbon"]; @@ -390,6 +396,8 @@ fn G() { Same.F(); } // CHECK:STDOUT: %F.ref: %F.type = name_ref F, imports.%Same.F [concrete = constants.%F] // CHECK:STDOUT: %F.call: init = call %F.ref() // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @F [from "b.carbon"]; diff --git a/toolchain/check/testdata/namespace/merging.carbon b/toolchain/check/testdata/namespace/merging.carbon index bc087b23ee5a..5848735a6c58 100644 --- a/toolchain/check/testdata/namespace/merging.carbon +++ b/toolchain/check/testdata/namespace/merging.carbon @@ -79,6 +79,8 @@ fn Run() { // CHECK:STDOUT: fn @A() { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- b.carbon @@ -118,11 +120,15 @@ fn Run() { // CHECK:STDOUT: fn @B1() { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @B2() { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- c.carbon @@ -179,6 +185,8 @@ fn Run() { // CHECK:STDOUT: fn @C() { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Run() { @@ -196,6 +204,8 @@ fn Run() { // CHECK:STDOUT: %C.ref: %C.type = name_ref C, file.%C.decl [concrete = constants.%C] // CHECK:STDOUT: %C.call: init %empty_tuple.type = call %C.ref() // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @A [from "a.carbon"]; diff --git a/toolchain/check/testdata/namespace/merging_with_indirections.carbon b/toolchain/check/testdata/namespace/merging_with_indirections.carbon index 128abc8623ea..0e3feae18969 100644 --- a/toolchain/check/testdata/namespace/merging_with_indirections.carbon +++ b/toolchain/check/testdata/namespace/merging_with_indirections.carbon @@ -158,6 +158,8 @@ fn Run() { // CHECK:STDOUT: %.loc8_27.2: init %A to %return.param = class_init () [concrete = constants.%A.val] // CHECK:STDOUT: %.loc8_28: init %A = converted %.loc8_27.1, %.loc8_27.2 [concrete = constants.%A.val] // CHECK:STDOUT: return %.loc8_28 to %return.param +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- main.carbon @@ -272,6 +274,8 @@ fn Run() { // CHECK:STDOUT: %Destroy.Op.bound.loc7: = bound_method %.loc7_11.2, constants.%Destroy.Op.1a2547.2 // CHECK:STDOUT: %Destroy.Op.call.loc7: init %empty_tuple.type = call %Destroy.Op.bound.loc7(%.loc7_11.2) // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @F [from "b.carbon"]; @@ -281,5 +285,7 @@ fn Run() { // CHECK:STDOUT: fn @Destroy.Op.loc10_3.2(%self.param: ref %A) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/namespace/nested.carbon b/toolchain/check/testdata/namespace/nested.carbon index f9eaf7f9147b..67fd7367335e 100644 --- a/toolchain/check/testdata/namespace/nested.carbon +++ b/toolchain/check/testdata/namespace/nested.carbon @@ -61,6 +61,8 @@ fn Foo.Bar.Baz() { // CHECK:STDOUT: fn @Wiz() { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Baz() { @@ -70,5 +72,7 @@ fn Foo.Bar.Baz() { // CHECK:STDOUT: %Wiz.ref: %Wiz.type = name_ref Wiz, file.%Wiz.decl [concrete = constants.%Wiz] // CHECK:STDOUT: %Wiz.call: init %empty_tuple.type = call %Wiz.ref() // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/namespace/shadow.carbon b/toolchain/check/testdata/namespace/shadow.carbon index b24d583f18a4..1da6b6b0fa9c 100644 --- a/toolchain/check/testdata/namespace/shadow.carbon +++ b/toolchain/check/testdata/namespace/shadow.carbon @@ -182,6 +182,8 @@ fn N.M.B() -> i32 { // CHECK:STDOUT: %Destroy.Op.bound.loc26_5.2: = bound_method %A.var, constants.%Destroy.Op.1a2547.2 // CHECK:STDOUT: %Destroy.Op.call.loc26_5.2: init %empty_tuple.type = call %Destroy.Op.bound.loc26_5.2(%A.var) // CHECK:STDOUT: return %.loc31 +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Destroy.Op.loc26_5.1(%self.param: ref %i32.builtin) = "no_op"; @@ -189,5 +191,7 @@ fn N.M.B() -> i32 { // CHECK:STDOUT: fn @Destroy.Op.loc26_5.2(%self.param: ref %i32) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/namespace/unqualified_lookup.carbon b/toolchain/check/testdata/namespace/unqualified_lookup.carbon index 2de7140c025e..2271b602c556 100644 --- a/toolchain/check/testdata/namespace/unqualified_lookup.carbon +++ b/toolchain/check/testdata/namespace/unqualified_lookup.carbon @@ -98,6 +98,8 @@ fn OuterN.InnerN.CallABC() { // CHECK:STDOUT: %A.ref: %A.type = name_ref A, file.%A.decl [concrete = constants.%A] // CHECK:STDOUT: %A.call: init %empty_tuple.type = call %A.ref() // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @CallAB() { @@ -107,6 +109,8 @@ fn OuterN.InnerN.CallABC() { // CHECK:STDOUT: %B.ref: %B.type = name_ref B, file.%B.decl [concrete = constants.%B] // CHECK:STDOUT: %B.call: init %empty_tuple.type = call %B.ref() // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @CallABC() { @@ -118,5 +122,7 @@ fn OuterN.InnerN.CallABC() { // CHECK:STDOUT: %C.ref: %C.type = name_ref C, file.%C.decl [concrete = constants.%C] // CHECK:STDOUT: %C.call: init %empty_tuple.type = call %C.ref() // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/operators/builtin/and.carbon b/toolchain/check/testdata/operators/builtin/and.carbon index 849ee6aab7f7..febfd19e249a 100644 --- a/toolchain/check/testdata/operators/builtin/and.carbon +++ b/toolchain/check/testdata/operators/builtin/and.carbon @@ -149,6 +149,8 @@ fn PartialConstant(x: bool) { // CHECK:STDOUT: %bound_method: = bound_method %true, %impl.elem0 [concrete = constants.%bool.as.Copy.impl.Op.bound] // CHECK:STDOUT: %bool.as.Copy.impl.Op.call: init bool = call %bound_method(%true) [concrete = constants.%true] // CHECK:STDOUT: return %bool.as.Copy.impl.Op.call +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @G() -> out %return.param: bool { @@ -158,6 +160,8 @@ fn PartialConstant(x: bool) { // CHECK:STDOUT: %bound_method: = bound_method %true, %impl.elem0 [concrete = constants.%bool.as.Copy.impl.Op.bound] // CHECK:STDOUT: %bool.as.Copy.impl.Op.call: init bool = call %bound_method(%true) [concrete = constants.%true] // CHECK:STDOUT: return %bool.as.Copy.impl.Op.call +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @And() -> out %return.param: bool { @@ -182,6 +186,8 @@ fn PartialConstant(x: bool) { // CHECK:STDOUT: %bound_method: = bound_method %.loc19_14.5, %impl.elem0 // CHECK:STDOUT: %bool.as.Copy.impl.Op.call: init bool = call %bound_method(%.loc19_14.5) // CHECK:STDOUT: return %bool.as.Copy.impl.Op.call +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Constant() { @@ -352,6 +358,8 @@ fn PartialConstant(x: bool) { // CHECK:STDOUT: %Destroy.Op.bound.loc23: = bound_method %a.var, constants.%Destroy.Op.1a2547.2 // CHECK:STDOUT: %Destroy.Op.call.loc23: init %empty_tuple.type = call %Destroy.Op.bound.loc23(%a.var) // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Destroy.Op.loc26(%self.param: ref %empty_tuple.type) = "no_op"; @@ -402,5 +410,7 @@ fn PartialConstant(x: bool) { // CHECK:STDOUT: %Destroy.Op.bound: = bound_method %a.var, constants.%Destroy.Op.1a2547.1 // CHECK:STDOUT: %Destroy.Op.call: init %empty_tuple.type = call %Destroy.Op.bound(%a.var) // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/operators/builtin/assignment.carbon b/toolchain/check/testdata/operators/builtin/assignment.carbon index 3960deb883ab..6f44bd8fcf6f 100644 --- a/toolchain/check/testdata/operators/builtin/assignment.carbon +++ b/toolchain/check/testdata/operators/builtin/assignment.carbon @@ -358,6 +358,8 @@ fn Main() { // CHECK:STDOUT: %Destroy.Op.bound.loc16: = bound_method %a.var, constants.%Destroy.Op.1a2547.3 // CHECK:STDOUT: %Destroy.Op.call.loc16: init %empty_tuple.type = call %Destroy.Op.bound.loc16(%a.var) // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Destroy.Op.loc27(%self.param: ref %ptr.d08) = "no_op"; @@ -367,15 +369,21 @@ fn Main() { // CHECK:STDOUT: fn @Destroy.Op.loc23_3.2(%self.param: ref %i32) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Destroy.Op.loc23_3.3(%self.param: ref %struct_type.a.b.b4c) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Destroy.Op.loc19(%self.param: ref %tuple.type.e55) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/operators/builtin/fail_and_or_not_in_function.carbon b/toolchain/check/testdata/operators/builtin/fail_and_or_not_in_function.carbon index 6807e42ed4ea..c12a9990ff4c 100644 --- a/toolchain/check/testdata/operators/builtin/fail_and_or_not_in_function.carbon +++ b/toolchain/check/testdata/operators/builtin/fail_and_or_not_in_function.carbon @@ -122,6 +122,8 @@ fn F() { // CHECK:STDOUT: %bound_method: = bound_method %.loc6, %impl.elem0 // CHECK:STDOUT: %type.as.Copy.impl.Op.call: init type = call %bound_method(%.loc6) // CHECK:STDOUT: return %type.as.Copy.impl.Op.call +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- fail_and_val.carbon @@ -161,6 +163,8 @@ fn F() { // CHECK:STDOUT: %bound_method: = bound_method %.loc6, %impl.elem0 // CHECK:STDOUT: %type.as.Copy.impl.Op.call: init type = call %bound_method(%.loc6) // CHECK:STDOUT: return %type.as.Copy.impl.Op.call +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- fail_or_val.carbon diff --git a/toolchain/check/testdata/operators/builtin/fail_and_or_partial_constant.carbon b/toolchain/check/testdata/operators/builtin/fail_and_or_partial_constant.carbon index 0ada35ac693e..d70d5247dbfb 100644 --- a/toolchain/check/testdata/operators/builtin/fail_and_or_partial_constant.carbon +++ b/toolchain/check/testdata/operators/builtin/fail_and_or_partial_constant.carbon @@ -166,6 +166,8 @@ fn KnownValueButNonConstantCondition(x: bool) { // CHECK:STDOUT: %b.var_patt: = var_pattern %b.patt [concrete = ] // CHECK:STDOUT: } // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- fail_despite_known_result.carbon @@ -286,5 +288,7 @@ fn KnownValueButNonConstantCondition(x: bool) { // CHECK:STDOUT: %d.var_patt: = var_pattern %d.patt [concrete = ] // CHECK:STDOUT: } // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/operators/builtin/fail_assignment_to_error.carbon b/toolchain/check/testdata/operators/builtin/fail_assignment_to_error.carbon index 4c3769b6797f..7f198fcc1741 100644 --- a/toolchain/check/testdata/operators/builtin/fail_assignment_to_error.carbon +++ b/toolchain/check/testdata/operators/builtin/fail_assignment_to_error.carbon @@ -61,5 +61,7 @@ fn Main() { // CHECK:STDOUT: %int_42.loc25: Core.IntLiteral = int_value 42 [concrete = constants.%int_42] // CHECK:STDOUT: assign %.loc25, // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/operators/builtin/fail_assignment_to_non_assignable.carbon b/toolchain/check/testdata/operators/builtin/fail_assignment_to_non_assignable.carbon index 7d5a09041f66..b60a85b8fbfb 100644 --- a/toolchain/check/testdata/operators/builtin/fail_assignment_to_non_assignable.carbon +++ b/toolchain/check/testdata/operators/builtin/fail_assignment_to_non_assignable.carbon @@ -391,6 +391,8 @@ fn Main() { // CHECK:STDOUT: %Destroy.Op.bound.loc33: = bound_method %n.var, constants.%Destroy.Op.1a2547.2 // CHECK:STDOUT: %Destroy.Op.call.loc33: init %empty_tuple.type = call %Destroy.Op.bound.loc33(%n.var) // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Destroy.Op.loc56_3.1(%self.param: ref %i32.builtin) = "no_op"; @@ -398,5 +400,7 @@ fn Main() { // CHECK:STDOUT: fn @Destroy.Op.loc56_3.2(%self.param: ref %i32) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/operators/builtin/fail_redundant_compound_access.carbon b/toolchain/check/testdata/operators/builtin/fail_redundant_compound_access.carbon index 7ec4ecbcc736..b126467729a3 100644 --- a/toolchain/check/testdata/operators/builtin/fail_redundant_compound_access.carbon +++ b/toolchain/check/testdata/operators/builtin/fail_redundant_compound_access.carbon @@ -132,6 +132,8 @@ fn Main() { // CHECK:STDOUT: %Core.IntLiteral.as.ImplicitAs.impl.Convert.call: init %i32 = call %bound_method.loc15_25.2(%int_0) [concrete = constants.%int_0.3c0] // CHECK:STDOUT: %.loc15_25: init %i32 = converted %int_0, %Core.IntLiteral.as.ImplicitAs.impl.Convert.call [concrete = constants.%int_0.3c0] // CHECK:STDOUT: return %.loc15_25 +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Main() { @@ -169,6 +171,8 @@ fn Main() { // CHECK:STDOUT: %Destroy.Op.bound: = bound_method %a.var, constants.%Destroy.Op.1a2547.2 // CHECK:STDOUT: %Destroy.Op.call: init %empty_tuple.type = call %Destroy.Op.bound(%a.var) // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Destroy.Op.loc18_3.1(%self.param: ref %i32.builtin) = "no_op"; @@ -176,5 +180,7 @@ fn Main() { // CHECK:STDOUT: fn @Destroy.Op.loc18_3.2(%self.param: ref %i32) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/operators/builtin/fail_type_mismatch.carbon b/toolchain/check/testdata/operators/builtin/fail_type_mismatch.carbon index 75634b227f9d..b7926eb589f4 100644 --- a/toolchain/check/testdata/operators/builtin/fail_type_mismatch.carbon +++ b/toolchain/check/testdata/operators/builtin/fail_type_mismatch.carbon @@ -78,6 +78,8 @@ fn Main() { // CHECK:STDOUT: %Destroy.Op.bound: = bound_method %x.var, constants.%Destroy.Op // CHECK:STDOUT: %Destroy.Op.call: init %empty_tuple.type = call %Destroy.Op.bound(%x.var) // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Destroy.Op(%self.param: ref bool) = "no_op"; diff --git a/toolchain/check/testdata/operators/builtin/fail_type_mismatch_assignment.carbon b/toolchain/check/testdata/operators/builtin/fail_type_mismatch_assignment.carbon index 83fdbe5a7f85..0baa494c081a 100644 --- a/toolchain/check/testdata/operators/builtin/fail_type_mismatch_assignment.carbon +++ b/toolchain/check/testdata/operators/builtin/fail_type_mismatch_assignment.carbon @@ -109,6 +109,8 @@ fn Main() { // CHECK:STDOUT: %Destroy.Op.bound: = bound_method %a.var, constants.%Destroy.Op.1a2547.2 // CHECK:STDOUT: %Destroy.Op.call: init %empty_tuple.type = call %Destroy.Op.bound(%a.var) // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Destroy.Op.loc16_3.1(%self.param: ref %i32.builtin) = "no_op"; @@ -116,5 +118,7 @@ fn Main() { // CHECK:STDOUT: fn @Destroy.Op.loc16_3.2(%self.param: ref %i32) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/operators/builtin/fail_type_mismatch_once.carbon b/toolchain/check/testdata/operators/builtin/fail_type_mismatch_once.carbon index 38372be4610e..d9aced358b83 100644 --- a/toolchain/check/testdata/operators/builtin/fail_type_mismatch_once.carbon +++ b/toolchain/check/testdata/operators/builtin/fail_type_mismatch_once.carbon @@ -77,5 +77,7 @@ fn Main() -> i32 { // CHECK:STDOUT: %float: Core.FloatLiteral = float_literal_value 34e-1 [concrete = constants.%float] // CHECK:STDOUT: %int_12: Core.IntLiteral = int_value 12 [concrete = constants.%int_12] // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/operators/builtin/fail_unimplemented_op.carbon b/toolchain/check/testdata/operators/builtin/fail_unimplemented_op.carbon index 2f41e2c918b4..551cdca0509e 100644 --- a/toolchain/check/testdata/operators/builtin/fail_unimplemented_op.carbon +++ b/toolchain/check/testdata/operators/builtin/fail_unimplemented_op.carbon @@ -73,5 +73,7 @@ fn Main() -> i32 { // CHECK:STDOUT: %.loc20: %empty_struct_type = struct_literal () [concrete = constants.%empty_struct] // CHECK:STDOUT: %int_34: Core.IntLiteral = int_value 34 [concrete = constants.%int_34] // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/operators/builtin/or.carbon b/toolchain/check/testdata/operators/builtin/or.carbon index c5c852dcff62..8b3e851aa7ab 100644 --- a/toolchain/check/testdata/operators/builtin/or.carbon +++ b/toolchain/check/testdata/operators/builtin/or.carbon @@ -149,6 +149,8 @@ fn PartialConstant(x: bool) { // CHECK:STDOUT: %bound_method: = bound_method %true, %impl.elem0 [concrete = constants.%bool.as.Copy.impl.Op.bound] // CHECK:STDOUT: %bool.as.Copy.impl.Op.call: init bool = call %bound_method(%true) [concrete = constants.%true] // CHECK:STDOUT: return %bool.as.Copy.impl.Op.call +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @G() -> out %return.param: bool { @@ -158,6 +160,8 @@ fn PartialConstant(x: bool) { // CHECK:STDOUT: %bound_method: = bound_method %true, %impl.elem0 [concrete = constants.%bool.as.Copy.impl.Op.bound] // CHECK:STDOUT: %bool.as.Copy.impl.Op.call: init bool = call %bound_method(%true) [concrete = constants.%true] // CHECK:STDOUT: return %bool.as.Copy.impl.Op.call +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Or() -> out %return.param: bool { @@ -183,6 +187,8 @@ fn PartialConstant(x: bool) { // CHECK:STDOUT: %bound_method: = bound_method %.loc19_14.6, %impl.elem0 // CHECK:STDOUT: %bool.as.Copy.impl.Op.call: init bool = call %bound_method(%.loc19_14.6) // CHECK:STDOUT: return %bool.as.Copy.impl.Op.call +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Constant() { @@ -359,6 +365,8 @@ fn PartialConstant(x: bool) { // CHECK:STDOUT: %Destroy.Op.bound.loc23: = bound_method %a.var, constants.%Destroy.Op.1a2547.2 // CHECK:STDOUT: %Destroy.Op.call.loc23: init %empty_tuple.type = call %Destroy.Op.bound.loc23(%a.var) // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Destroy.Op.loc26(%self.param: ref %empty_tuple.type) = "no_op"; @@ -411,5 +419,7 @@ fn PartialConstant(x: bool) { // CHECK:STDOUT: %Destroy.Op.bound: = bound_method %a.var, constants.%Destroy.Op.1a2547.2 // CHECK:STDOUT: %Destroy.Op.call: init %empty_tuple.type = call %Destroy.Op.bound(%a.var) // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/operators/builtin/unary_op.carbon b/toolchain/check/testdata/operators/builtin/unary_op.carbon index b7e082dec9fa..5695bce7e822 100644 --- a/toolchain/check/testdata/operators/builtin/unary_op.carbon +++ b/toolchain/check/testdata/operators/builtin/unary_op.carbon @@ -122,6 +122,8 @@ fn Constant() { // CHECK:STDOUT: %bound_method: = bound_method %.loc16, %impl.elem0 // CHECK:STDOUT: %bool.as.Copy.impl.Op.call: init bool = call %bound_method(%.loc16) // CHECK:STDOUT: return %bool.as.Copy.impl.Op.call +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Constant() { @@ -194,6 +196,8 @@ fn Constant() { // CHECK:STDOUT: %Destroy.Op.bound.loc23: = bound_method %a.var, constants.%Destroy.Op.1a2547.2 // CHECK:STDOUT: %Destroy.Op.call.loc23: init %empty_tuple.type = call %Destroy.Op.bound.loc23(%a.var) // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Destroy.Op.loc24(%self.param: ref bool) = "no_op"; @@ -207,5 +211,7 @@ fn Constant() { // CHECK:STDOUT: %false: bool = bool_literal false [concrete = constants.%false] // CHECK:STDOUT: %.loc20: bool = not %false [concrete = constants.%true] // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/operators/overloaded/add.carbon b/toolchain/check/testdata/operators/overloaded/add.carbon index 55b18ce1ae9f..a5e3e5ba6f4b 100644 --- a/toolchain/check/testdata/operators/overloaded/add.carbon +++ b/toolchain/check/testdata/operators/overloaded/add.carbon @@ -70,6 +70,8 @@ fn TestAssign(a: C*, b: C) { // CHECK:STDOUT: // CHECK:STDOUT: %C.as.AddWith.impl.Op.call: init %C to %.loc30_26.1 = call %bound_method(%a.ref, %b.ref) // CHECK:STDOUT: return %C.as.AddWith.impl.Op.call to %return.param +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @TestAssign(%a.param: %ptr.00e, %b.param: %C) { @@ -81,5 +83,7 @@ fn TestAssign(a: C*, b: C) { // CHECK:STDOUT: %bound_method: = bound_method %.loc38, %impl.elem0 // CHECK:STDOUT: %C.as.AddAssignWith.impl.Op.call: init %empty_tuple.type = call %bound_method(%.loc38, %b.ref) // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/operators/overloaded/bit_and.carbon b/toolchain/check/testdata/operators/overloaded/bit_and.carbon index 0af34c40cf74..045e30f78e9c 100644 --- a/toolchain/check/testdata/operators/overloaded/bit_and.carbon +++ b/toolchain/check/testdata/operators/overloaded/bit_and.carbon @@ -70,6 +70,8 @@ fn TestAssign(a: C*, b: C) { // CHECK:STDOUT: // CHECK:STDOUT: %C.as.BitAndWith.impl.Op.call: init %C to %.loc30_26.1 = call %bound_method(%a.ref, %b.ref) // CHECK:STDOUT: return %C.as.BitAndWith.impl.Op.call to %return.param +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @TestAssign(%a.param: %ptr.00e, %b.param: %C) { @@ -81,5 +83,7 @@ fn TestAssign(a: C*, b: C) { // CHECK:STDOUT: %bound_method: = bound_method %.loc38, %impl.elem0 // CHECK:STDOUT: %C.as.BitAndAssignWith.impl.Op.call: init %empty_tuple.type = call %bound_method(%.loc38, %b.ref) // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/operators/overloaded/bit_complement.carbon b/toolchain/check/testdata/operators/overloaded/bit_complement.carbon index 96785343b8db..e7750b75b30b 100644 --- a/toolchain/check/testdata/operators/overloaded/bit_complement.carbon +++ b/toolchain/check/testdata/operators/overloaded/bit_complement.carbon @@ -51,5 +51,7 @@ fn TestOp(a: C) -> C { // CHECK:STDOUT: // CHECK:STDOUT: %C.as.BitComplement.impl.Op.call: init %C to %.loc27_20.1 = call %bound_method(%a.ref) // CHECK:STDOUT: return %C.as.BitComplement.impl.Op.call to %return.param +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/operators/overloaded/bit_or.carbon b/toolchain/check/testdata/operators/overloaded/bit_or.carbon index 04b1f7a44b8e..be682efa2209 100644 --- a/toolchain/check/testdata/operators/overloaded/bit_or.carbon +++ b/toolchain/check/testdata/operators/overloaded/bit_or.carbon @@ -70,6 +70,8 @@ fn TestAssign(a: C*, b: C) { // CHECK:STDOUT: // CHECK:STDOUT: %C.as.BitOrWith.impl.Op.call: init %C to %.loc30_26.1 = call %bound_method(%a.ref, %b.ref) // CHECK:STDOUT: return %C.as.BitOrWith.impl.Op.call to %return.param +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @TestAssign(%a.param: %ptr.00e, %b.param: %C) { @@ -81,5 +83,7 @@ fn TestAssign(a: C*, b: C) { // CHECK:STDOUT: %bound_method: = bound_method %.loc38, %impl.elem0 // CHECK:STDOUT: %C.as.BitOrAssignWith.impl.Op.call: init %empty_tuple.type = call %bound_method(%.loc38, %b.ref) // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/operators/overloaded/bit_xor.carbon b/toolchain/check/testdata/operators/overloaded/bit_xor.carbon index 6c3adf54b168..8782d0856676 100644 --- a/toolchain/check/testdata/operators/overloaded/bit_xor.carbon +++ b/toolchain/check/testdata/operators/overloaded/bit_xor.carbon @@ -70,6 +70,8 @@ fn TestAssign(a: C*, b: C) { // CHECK:STDOUT: // CHECK:STDOUT: %C.as.BitXorWith.impl.Op.call: init %C to %.loc30_26.1 = call %bound_method(%a.ref, %b.ref) // CHECK:STDOUT: return %C.as.BitXorWith.impl.Op.call to %return.param +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @TestAssign(%a.param: %ptr.00e, %b.param: %C) { @@ -81,5 +83,7 @@ fn TestAssign(a: C*, b: C) { // CHECK:STDOUT: %bound_method: = bound_method %.loc38, %impl.elem0 // CHECK:STDOUT: %C.as.BitXorAssignWith.impl.Op.call: init %empty_tuple.type = call %bound_method(%.loc38, %b.ref) // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/operators/overloaded/dec.carbon b/toolchain/check/testdata/operators/overloaded/dec.carbon index ee1fd43a4234..ecbd41fc2de9 100644 --- a/toolchain/check/testdata/operators/overloaded/dec.carbon +++ b/toolchain/check/testdata/operators/overloaded/dec.carbon @@ -51,5 +51,7 @@ fn TestOp() { // CHECK:STDOUT: %bound_method: = bound_method %c.ref, %impl.elem0 // CHECK:STDOUT: %C.as.Dec.impl.Op.call: init %empty_tuple.type = call %bound_method(%c.ref) // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/operators/overloaded/div.carbon b/toolchain/check/testdata/operators/overloaded/div.carbon index 3e1b9f924dde..c067ef6a5d44 100644 --- a/toolchain/check/testdata/operators/overloaded/div.carbon +++ b/toolchain/check/testdata/operators/overloaded/div.carbon @@ -70,6 +70,8 @@ fn TestAssign(a: C*, b: C) { // CHECK:STDOUT: // CHECK:STDOUT: %C.as.DivWith.impl.Op.call: init %C to %.loc30_26.1 = call %bound_method(%a.ref, %b.ref) // CHECK:STDOUT: return %C.as.DivWith.impl.Op.call to %return.param +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @TestAssign(%a.param: %ptr.00e, %b.param: %C) { @@ -81,5 +83,7 @@ fn TestAssign(a: C*, b: C) { // CHECK:STDOUT: %bound_method: = bound_method %.loc38, %impl.elem0 // CHECK:STDOUT: %C.as.DivAssignWith.impl.Op.call: init %empty_tuple.type = call %bound_method(%.loc38, %b.ref) // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/operators/overloaded/eq.carbon b/toolchain/check/testdata/operators/overloaded/eq.carbon index 00d608d60ffd..c45944f86621 100644 --- a/toolchain/check/testdata/operators/overloaded/eq.carbon +++ b/toolchain/check/testdata/operators/overloaded/eq.carbon @@ -256,6 +256,8 @@ fn TestLhsBad(a: D, b: C) -> bool { // CHECK:STDOUT: %bound_method: = bound_method %a.ref, %impl.elem0 // CHECK:STDOUT: %C.as.EqWith.impl.Equal.call: init bool = call %bound_method(%a.ref, %b.ref) // CHECK:STDOUT: return %C.as.EqWith.impl.Equal.call +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @TestNotEqual(%a.param: %C, %b.param: %C) -> out %return.param: bool { @@ -266,6 +268,8 @@ fn TestLhsBad(a: D, b: C) -> bool { // CHECK:STDOUT: %bound_method: = bound_method %a.ref, %impl.elem1 // CHECK:STDOUT: %C.as.EqWith.impl.NotEqual.call: init bool = call %bound_method(%a.ref, %b.ref) // CHECK:STDOUT: return %C.as.EqWith.impl.NotEqual.call +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- fail_no_impl.carbon @@ -364,6 +368,8 @@ fn TestLhsBad(a: D, b: C) -> bool { // CHECK:STDOUT: %a.ref: %D = name_ref a, %a // CHECK:STDOUT: %b.ref: %D = name_ref b, %b // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @TestNotEqual(%a.param: %D, %b.param: %D) -> out %return.param: bool { @@ -371,6 +377,8 @@ fn TestLhsBad(a: D, b: C) -> bool { // CHECK:STDOUT: %a.ref: %D = name_ref a, %a // CHECK:STDOUT: %b.ref: %D = name_ref b, %b // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- fail_no_impl_for_args.carbon @@ -556,6 +564,8 @@ fn TestLhsBad(a: D, b: C) -> bool { // CHECK:STDOUT: %a.ref: %C = name_ref a, %a // CHECK:STDOUT: %b.ref: %D = name_ref b, %b // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @TestLhsBad(%a.param: %D, %b.param: %C) -> out %return.param: bool { @@ -563,5 +573,7 @@ fn TestLhsBad(a: D, b: C) -> bool { // CHECK:STDOUT: %a.ref: %D = name_ref a, %a // CHECK:STDOUT: %b.ref: %C = name_ref b, %b // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/operators/overloaded/fail_assign_non_ref.carbon b/toolchain/check/testdata/operators/overloaded/fail_assign_non_ref.carbon index 8d3a4df5c59e..2a54eaa517f2 100644 --- a/toolchain/check/testdata/operators/overloaded/fail_assign_non_ref.carbon +++ b/toolchain/check/testdata/operators/overloaded/fail_assign_non_ref.carbon @@ -200,6 +200,8 @@ fn TestAddAssignNonRef(a: C, b: C) { // CHECK:STDOUT: %bound_method: = bound_method %a.ref, %impl.elem0 // CHECK:STDOUT: %C.as.Inc.impl.Op.call: init %empty_tuple.type = call %bound_method() // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @TestAddAssignNonRef(%a.param: %C, %b.param: %C) { @@ -210,5 +212,7 @@ fn TestAddAssignNonRef(a: C, b: C) { // CHECK:STDOUT: %bound_method: = bound_method %a.ref, %impl.elem0 // CHECK:STDOUT: %C.as.AddAssignWith.impl.Op.call: init %empty_tuple.type = call %bound_method(, %b.ref) // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/operators/overloaded/fail_error_recovery.carbon b/toolchain/check/testdata/operators/overloaded/fail_error_recovery.carbon index 79dd3cc786e9..ca8c7b7c9c68 100644 --- a/toolchain/check/testdata/operators/overloaded/fail_error_recovery.carbon +++ b/toolchain/check/testdata/operators/overloaded/fail_error_recovery.carbon @@ -86,6 +86,8 @@ fn G(n: i32) { // CHECK:STDOUT: %int_1: Core.IntLiteral = int_value 1 [concrete = constants.%int_1] // CHECK:STDOUT: %impl.elem1: = impl_witness_access , element1 [concrete = ] // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @G(%n.param: %i32) { @@ -93,5 +95,7 @@ fn G(n: i32) { // CHECK:STDOUT: %n.ref: %i32 = name_ref n, %n // CHECK:STDOUT: %undeclared.ref: = name_ref undeclared, [concrete = ] // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/operators/overloaded/fail_no_impl.carbon b/toolchain/check/testdata/operators/overloaded/fail_no_impl.carbon index 71e0cc278656..7e2b4bb0a4fe 100644 --- a/toolchain/check/testdata/operators/overloaded/fail_no_impl.carbon +++ b/toolchain/check/testdata/operators/overloaded/fail_no_impl.carbon @@ -164,6 +164,8 @@ fn TestRef(b: C) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: %a.ref: %C = name_ref a, %a // CHECK:STDOUT: return to %return.param +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @TestBinary(%a.param: %C, %b.param: %C) -> out %return.param: %C { @@ -171,6 +173,8 @@ fn TestRef(b: C) { // CHECK:STDOUT: %a.ref: %C = name_ref a, %a // CHECK:STDOUT: %b.ref: %C = name_ref b, %b // CHECK:STDOUT: return to %return.param +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @TestRef(%b.param: %C) { @@ -192,6 +196,8 @@ fn TestRef(b: C) { // CHECK:STDOUT: %Destroy.Op.bound: = bound_method %a.var, constants.%Destroy.Op.1a2547.2 // CHECK:STDOUT: %Destroy.Op.call: init %empty_tuple.type = call %Destroy.Op.bound(%a.var) // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Destroy.Op.loc36_3.1(%self.param: ref %empty_struct_type) = "no_op"; @@ -199,5 +205,7 @@ fn TestRef(b: C) { // CHECK:STDOUT: fn @Destroy.Op.loc36_3.2(%self.param: ref %C) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/operators/overloaded/implicit_as.carbon b/toolchain/check/testdata/operators/overloaded/implicit_as.carbon index f0801abca61a..c2117cdc738b 100644 --- a/toolchain/check/testdata/operators/overloaded/implicit_as.carbon +++ b/toolchain/check/testdata/operators/overloaded/implicit_as.carbon @@ -269,6 +269,8 @@ fn Test() { // CHECK:STDOUT: %.loc20_49.4: init %X to %return.param = class_init (%.loc20_49.3) // CHECK:STDOUT: %.loc20_50: init %X = converted %.loc20_49.1, %.loc20_49.4 // CHECK:STDOUT: return %.loc20_50 to %return.param +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @X.as.ImplicitAs.impl.Convert(%self.param: %X) -> out %return.param: %i32 { @@ -283,6 +285,8 @@ fn Test() { // CHECK:STDOUT: %bound_method.loc24_43.2: = bound_method %.loc24_43.2, %specific_fn // CHECK:STDOUT: %Int.as.Copy.impl.Op.call: init %i32 = call %bound_method.loc24_43.2(%.loc24_43.2) // CHECK:STDOUT: return %Int.as.Copy.impl.Op.call +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Sink_i32(%n.param: %i32); @@ -309,6 +313,8 @@ fn Test() { // CHECK:STDOUT: %.loc31_24.1: ref @Source.%T.loc31_12.1 (%T.67d) = splice_block %return.param {} // CHECK:STDOUT: %Source.call: init @Source.%T.loc31_12.1 (%T.67d) to %.loc31_24.1 = call %Source.specific_fn.loc31_35.1() // CHECK:STDOUT: return %Source.call to %return.param +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: @@ -348,6 +354,8 @@ fn Test() { // CHECK:STDOUT: %Destroy.Op.bound.loc34: = bound_method %.loc34_20.2, constants.%Destroy.Op.1a2547.4 // CHECK:STDOUT: %Destroy.Op.call.loc34: init %empty_tuple.type = call %Destroy.Op.bound.loc34(%.loc34_20.2) // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Destroy.Op.loc35_20.1(%self.param: ref %i32.builtin) = "no_op"; @@ -355,16 +363,22 @@ fn Test() { // CHECK:STDOUT: fn @Destroy.Op.loc35_20.2(%self.param: ref %i32) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Destroy.Op.loc35_20.3(%self.param: ref %struct_type.n) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Destroy.Op.loc35_20.4(%self.param: ref %X) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: specific @Source(constants.%T.67d) { diff --git a/toolchain/check/testdata/operators/overloaded/inc.carbon b/toolchain/check/testdata/operators/overloaded/inc.carbon index 93c03a65a2ac..d8aa524ff388 100644 --- a/toolchain/check/testdata/operators/overloaded/inc.carbon +++ b/toolchain/check/testdata/operators/overloaded/inc.carbon @@ -51,5 +51,7 @@ fn TestOp() { // CHECK:STDOUT: %bound_method: = bound_method %c.ref, %impl.elem0 // CHECK:STDOUT: %C.as.Inc.impl.Op.call: init %empty_tuple.type = call %bound_method(%c.ref) // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/operators/overloaded/index.carbon b/toolchain/check/testdata/operators/overloaded/index.carbon index 09c830cbfe56..6f2ded064138 100644 --- a/toolchain/check/testdata/operators/overloaded/index.carbon +++ b/toolchain/check/testdata/operators/overloaded/index.carbon @@ -144,6 +144,8 @@ fn F() { // CHECK:STDOUT: %int_0: Core.IntLiteral = int_value 0 [concrete = constants.%int_0] // CHECK:STDOUT: %int_1: Core.IntLiteral = int_value 1 [concrete = constants.%int_1] // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- fail_missing_index_with.carbon @@ -177,6 +179,8 @@ fn F() { // CHECK:STDOUT: %int_0: Core.IntLiteral = int_value 0 [concrete = constants.%int_0] // CHECK:STDOUT: %int_1: Core.IntLiteral = int_value 1 [concrete = constants.%int_1] // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- core_wrong_arg_count.carbon @@ -282,6 +286,8 @@ fn F() { // CHECK:STDOUT: witness = (@IndexWith.WithSelf.%IndexWith.WithSelf.At.decl) // CHECK:STDOUT: // CHECK:STDOUT: !requires: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: @@ -455,6 +461,8 @@ fn F() { // CHECK:STDOUT: witness = (imports.%Core.At) // CHECK:STDOUT: // CHECK:STDOUT: !requires: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: @@ -525,6 +533,8 @@ fn F() { // CHECK:STDOUT: %.loc10_13.2: init %empty_tuple.type = tuple_init () [concrete = constants.%empty_tuple] // CHECK:STDOUT: %.loc10_14: init %empty_tuple.type = converted %.loc10_13.1, %.loc10_13.2 [concrete = constants.%empty_tuple] // CHECK:STDOUT: return %.loc10_14 +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @F() { @@ -544,6 +554,8 @@ fn F() { // CHECK:STDOUT: %.loc23: %empty_tuple.type = tuple_literal () [concrete = constants.%empty_tuple] // CHECK:STDOUT: %Destroy.Op.call: init %empty_tuple.type = call constants.%Destroy.Op.bound(constants.%.115) // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Destroy.Op.loc15_15.1(%self.param: ref %empty_struct_type) = "no_op"; @@ -551,6 +563,8 @@ fn F() { // CHECK:STDOUT: fn @Destroy.Op.loc15_15.2(%self.param: ref %C) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: specific @IndexWith(constants.%SubscriptType, constants.%ElementType) { diff --git a/toolchain/check/testdata/operators/overloaded/index_with_prelude.carbon b/toolchain/check/testdata/operators/overloaded/index_with_prelude.carbon index f34f3fc68388..2784a85504fe 100644 --- a/toolchain/check/testdata/operators/overloaded/index_with_prelude.carbon +++ b/toolchain/check/testdata/operators/overloaded/index_with_prelude.carbon @@ -271,6 +271,8 @@ let x: i32 = c[0]; // CHECK:STDOUT: %.loc10_13.2: init %ElementType to %return.param = class_init () [concrete = constants.%ElementType.val] // CHECK:STDOUT: %.loc10_14: init %ElementType = converted %.loc10_13.1, %.loc10_13.2 [concrete = constants.%ElementType.val] // CHECK:STDOUT: return %.loc10_14 to %return.param +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @__global_init() { @@ -284,6 +286,8 @@ let x: i32 = c[0]; // CHECK:STDOUT: %.loc16: ref %ElementType = temporary_storage // CHECK:STDOUT: %C.as.IndexWith.impl.At.call: init %ElementType to %.loc16 = call %bound_method(%c.ref, %s.ref) // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- overloaded_builtin.carbon @@ -459,6 +463,8 @@ let x: i32 = c[0]; // CHECK:STDOUT: %.loc10_18.3: init %C = as_compatible %.loc10_18.2 [concrete = constants.%empty_tuple.4db] // CHECK:STDOUT: %.loc10_18.4: init %C = converted %tuple.elem0, %.loc10_18.3 [concrete = constants.%empty_tuple.4db] // CHECK:STDOUT: return %.loc10_18.4 +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @__global_init() { @@ -480,6 +486,8 @@ let x: i32 = c[0]; // CHECK:STDOUT: %bound_method: = bound_method %s.ref, %impl.elem1 // CHECK:STDOUT: %tuple.type.as.IndexWith.impl.At.call: init %C = call %bound_method(%s.ref, %int_0) // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- fail_invalid_subscript_type.carbon @@ -653,6 +661,8 @@ let x: i32 = c[0]; // CHECK:STDOUT: %.loc10_13.2: init %ElementType to %return.param = class_init () [concrete = constants.%ElementType.val] // CHECK:STDOUT: %.loc10_14: init %ElementType = converted %.loc10_13.1, %.loc10_13.2 [concrete = constants.%ElementType.val] // CHECK:STDOUT: return %.loc10_14 to %return.param +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @__global_init() { @@ -661,6 +671,8 @@ let x: i32 = c[0]; // CHECK:STDOUT: %c.ref: %C = name_ref c, file.%c // CHECK:STDOUT: %int_0: Core.IntLiteral = int_value 0 [concrete = constants.%int_0] // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- fail_index_with_not_implemented.carbon @@ -736,5 +748,7 @@ let x: i32 = c[0]; // CHECK:STDOUT: %c.ref: %C = name_ref c, file.%c // CHECK:STDOUT: %int_0: Core.IntLiteral = int_value 0 [concrete = constants.%int_0] // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/operators/overloaded/left_shift.carbon b/toolchain/check/testdata/operators/overloaded/left_shift.carbon index 71083fcf82e0..936c89e902ab 100644 --- a/toolchain/check/testdata/operators/overloaded/left_shift.carbon +++ b/toolchain/check/testdata/operators/overloaded/left_shift.carbon @@ -70,6 +70,8 @@ fn TestAssign(a: C*, b: C) { // CHECK:STDOUT: // CHECK:STDOUT: %C.as.LeftShiftWith.impl.Op.call: init %C to %.loc30_26.1 = call %bound_method(%a.ref, %b.ref) // CHECK:STDOUT: return %C.as.LeftShiftWith.impl.Op.call to %return.param +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @TestAssign(%a.param: %ptr.00e, %b.param: %C) { @@ -81,5 +83,7 @@ fn TestAssign(a: C*, b: C) { // CHECK:STDOUT: %bound_method: = bound_method %.loc38, %impl.elem0 // CHECK:STDOUT: %C.as.LeftShiftAssignWith.impl.Op.call: init %empty_tuple.type = call %bound_method(%.loc38, %b.ref) // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/operators/overloaded/mod.carbon b/toolchain/check/testdata/operators/overloaded/mod.carbon index 5ca938eb22eb..3e50b95646e2 100644 --- a/toolchain/check/testdata/operators/overloaded/mod.carbon +++ b/toolchain/check/testdata/operators/overloaded/mod.carbon @@ -70,6 +70,8 @@ fn TestAssign(a: C*, b: C) { // CHECK:STDOUT: // CHECK:STDOUT: %C.as.ModWith.impl.Op.call: init %C to %.loc30_26.1 = call %bound_method(%a.ref, %b.ref) // CHECK:STDOUT: return %C.as.ModWith.impl.Op.call to %return.param +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @TestAssign(%a.param: %ptr.00e, %b.param: %C) { @@ -81,5 +83,7 @@ fn TestAssign(a: C*, b: C) { // CHECK:STDOUT: %bound_method: = bound_method %.loc38, %impl.elem0 // CHECK:STDOUT: %C.as.ModAssignWith.impl.Op.call: init %empty_tuple.type = call %bound_method(%.loc38, %b.ref) // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/operators/overloaded/mul.carbon b/toolchain/check/testdata/operators/overloaded/mul.carbon index 46eaf5e68766..3b7885aabbc5 100644 --- a/toolchain/check/testdata/operators/overloaded/mul.carbon +++ b/toolchain/check/testdata/operators/overloaded/mul.carbon @@ -70,6 +70,8 @@ fn TestAssign(a: C*, b: C) { // CHECK:STDOUT: // CHECK:STDOUT: %C.as.MulWith.impl.Op.call: init %C to %.loc30_26.1 = call %bound_method(%a.ref, %b.ref) // CHECK:STDOUT: return %C.as.MulWith.impl.Op.call to %return.param +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @TestAssign(%a.param: %ptr.00e, %b.param: %C) { @@ -81,5 +83,7 @@ fn TestAssign(a: C*, b: C) { // CHECK:STDOUT: %bound_method: = bound_method %.loc38, %impl.elem0 // CHECK:STDOUT: %C.as.MulAssignWith.impl.Op.call: init %empty_tuple.type = call %bound_method(%.loc38, %b.ref) // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/operators/overloaded/negate.carbon b/toolchain/check/testdata/operators/overloaded/negate.carbon index f3d919958830..1ab78724adbb 100644 --- a/toolchain/check/testdata/operators/overloaded/negate.carbon +++ b/toolchain/check/testdata/operators/overloaded/negate.carbon @@ -51,5 +51,7 @@ fn TestOp(a: C) -> C { // CHECK:STDOUT: // CHECK:STDOUT: %C.as.Negate.impl.Op.call: init %C to %.loc27_20.1 = call %bound_method(%a.ref) // CHECK:STDOUT: return %C.as.Negate.impl.Op.call to %return.param +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/operators/overloaded/ordered.carbon b/toolchain/check/testdata/operators/overloaded/ordered.carbon index 7869f75d3381..1fc7b1ad7231 100644 --- a/toolchain/check/testdata/operators/overloaded/ordered.carbon +++ b/toolchain/check/testdata/operators/overloaded/ordered.carbon @@ -350,6 +350,8 @@ fn TestGreaterEqual(a: D, b: D) -> bool { // CHECK:STDOUT: %bound_method: = bound_method %a.ref, %impl.elem0 // CHECK:STDOUT: %C.as.OrderedWith.impl.Less.call: init bool = call %bound_method(%a.ref, %b.ref) // CHECK:STDOUT: return %C.as.OrderedWith.impl.Less.call +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @TestLessEqual(%a.param: %C, %b.param: %C) -> out %return.param: bool { @@ -360,6 +362,8 @@ fn TestGreaterEqual(a: D, b: D) -> bool { // CHECK:STDOUT: %bound_method: = bound_method %a.ref, %impl.elem1 // CHECK:STDOUT: %C.as.OrderedWith.impl.LessOrEquivalent.call: init bool = call %bound_method(%a.ref, %b.ref) // CHECK:STDOUT: return %C.as.OrderedWith.impl.LessOrEquivalent.call +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @TestGreater(%a.param: %C, %b.param: %C) -> out %return.param: bool { @@ -370,6 +374,8 @@ fn TestGreaterEqual(a: D, b: D) -> bool { // CHECK:STDOUT: %bound_method: = bound_method %a.ref, %impl.elem2 // CHECK:STDOUT: %C.as.OrderedWith.impl.Greater.call: init bool = call %bound_method(%a.ref, %b.ref) // CHECK:STDOUT: return %C.as.OrderedWith.impl.Greater.call +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @TestGreaterEqual(%a.param: %C, %b.param: %C) -> out %return.param: bool { @@ -380,6 +386,8 @@ fn TestGreaterEqual(a: D, b: D) -> bool { // CHECK:STDOUT: %bound_method: = bound_method %a.ref, %impl.elem3 // CHECK:STDOUT: %C.as.OrderedWith.impl.GreaterOrEquivalent.call: init bool = call %bound_method(%a.ref, %b.ref) // CHECK:STDOUT: return %C.as.OrderedWith.impl.GreaterOrEquivalent.call +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- fail_no_impl.carbon @@ -522,6 +530,8 @@ fn TestGreaterEqual(a: D, b: D) -> bool { // CHECK:STDOUT: %a.ref: %D = name_ref a, %a // CHECK:STDOUT: %b.ref: %D = name_ref b, %b // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @TestLessEqual(%a.param: %D, %b.param: %D) -> out %return.param: bool { @@ -529,6 +539,8 @@ fn TestGreaterEqual(a: D, b: D) -> bool { // CHECK:STDOUT: %a.ref: %D = name_ref a, %a // CHECK:STDOUT: %b.ref: %D = name_ref b, %b // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @TestGreater(%a.param: %D, %b.param: %D) -> out %return.param: bool { @@ -536,6 +548,8 @@ fn TestGreaterEqual(a: D, b: D) -> bool { // CHECK:STDOUT: %a.ref: %D = name_ref a, %a // CHECK:STDOUT: %b.ref: %D = name_ref b, %b // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @TestGreaterEqual(%a.param: %D, %b.param: %D) -> out %return.param: bool { @@ -543,5 +557,7 @@ fn TestGreaterEqual(a: D, b: D) -> bool { // CHECK:STDOUT: %a.ref: %D = name_ref a, %a // CHECK:STDOUT: %b.ref: %D = name_ref b, %b // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/operators/overloaded/right_shift.carbon b/toolchain/check/testdata/operators/overloaded/right_shift.carbon index 32d1c6d58479..40602fd662c0 100644 --- a/toolchain/check/testdata/operators/overloaded/right_shift.carbon +++ b/toolchain/check/testdata/operators/overloaded/right_shift.carbon @@ -70,6 +70,8 @@ fn TestAssign(a: C*, b: C) { // CHECK:STDOUT: // CHECK:STDOUT: %C.as.RightShiftWith.impl.Op.call: init %C to %.loc30_26.1 = call %bound_method(%a.ref, %b.ref) // CHECK:STDOUT: return %C.as.RightShiftWith.impl.Op.call to %return.param +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @TestAssign(%a.param: %ptr.00e, %b.param: %C) { @@ -81,5 +83,7 @@ fn TestAssign(a: C*, b: C) { // CHECK:STDOUT: %bound_method: = bound_method %.loc38, %impl.elem0 // CHECK:STDOUT: %C.as.RightShiftAssignWith.impl.Op.call: init %empty_tuple.type = call %bound_method(%.loc38, %b.ref) // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/operators/overloaded/string_indexing.carbon b/toolchain/check/testdata/operators/overloaded/string_indexing.carbon index 10277dd1727b..a042cd63bf94 100644 --- a/toolchain/check/testdata/operators/overloaded/string_indexing.carbon +++ b/toolchain/check/testdata/operators/overloaded/string_indexing.carbon @@ -99,6 +99,8 @@ fn TestStringIndexing() { // CHECK:STDOUT: %String.val: %str.3d4 = struct_value (%str, %int_4) [concrete = constants.%String.val] // CHECK:STDOUT: %C.ref: type = name_ref C, %C.decl [concrete = constants.%C] // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- test_string_indexing.carbon @@ -189,5 +191,7 @@ fn TestStringIndexing() { // CHECK:STDOUT: %d.patt: %pattern_type.2ff = value_binding_pattern d [concrete = constants.%d.patt] // CHECK:STDOUT: } // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/operators/overloaded/sub.carbon b/toolchain/check/testdata/operators/overloaded/sub.carbon index 3d94192e8718..018fb0e74f3f 100644 --- a/toolchain/check/testdata/operators/overloaded/sub.carbon +++ b/toolchain/check/testdata/operators/overloaded/sub.carbon @@ -70,6 +70,8 @@ fn TestAssign(a: C*, b: C) { // CHECK:STDOUT: // CHECK:STDOUT: %C.as.SubWith.impl.Op.call: init %C to %.loc30_26.1 = call %bound_method(%a.ref, %b.ref) // CHECK:STDOUT: return %C.as.SubWith.impl.Op.call to %return.param +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @TestAssign(%a.param: %ptr.00e, %b.param: %C) { @@ -81,5 +83,7 @@ fn TestAssign(a: C*, b: C) { // CHECK:STDOUT: %bound_method: = bound_method %.loc38, %impl.elem0 // CHECK:STDOUT: %C.as.SubAssignWith.impl.Op.call: init %empty_tuple.type = call %bound_method(%.loc38, %b.ref) // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/package_expr/syntax.carbon b/toolchain/check/testdata/package_expr/syntax.carbon index 7810d81bb9a4..bf28fd9d0893 100644 --- a/toolchain/check/testdata/package_expr/syntax.carbon +++ b/toolchain/check/testdata/package_expr/syntax.carbon @@ -147,6 +147,8 @@ fn Main() { // CHECK:STDOUT: %Int.as.Copy.impl.Op.call: init %i32 = call %bound_method.loc5_21.2(%.loc5) // CHECK:STDOUT: assign file.%y.var, %Int.as.Copy.impl.Op.call // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- inside_fn.carbon @@ -278,6 +280,8 @@ fn Main() { // CHECK:STDOUT: %Destroy.Op.bound.loc7: = bound_method %x.var, constants.%Destroy.Op.1a2547.2 // CHECK:STDOUT: %Destroy.Op.call.loc7: init %empty_tuple.type = call %Destroy.Op.bound.loc7(%x.var) // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Destroy.Op.loc9_3.1(%self.param: ref %i32.builtin) = "no_op"; @@ -285,6 +289,8 @@ fn Main() { // CHECK:STDOUT: fn @Destroy.Op.loc9_3.2(%self.param: ref %i32) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @__global_init() { @@ -298,6 +304,8 @@ fn Main() { // CHECK:STDOUT: %.loc4: init %i32 = converted %int_0, %Core.IntLiteral.as.ImplicitAs.impl.Convert.call [concrete = constants.%int_0.3c0] // CHECK:STDOUT: assign file.%x.var, %.loc4 // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- namespace.carbon @@ -347,6 +355,8 @@ fn Main() { // CHECK:STDOUT: fn @C.Foo() { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Main() { @@ -357,5 +367,7 @@ fn Main() { // CHECK:STDOUT: %Foo.ref: %C.Foo.type = name_ref Foo, @C.%C.Foo.decl [concrete = constants.%C.Foo] // CHECK:STDOUT: %C.Foo.call: init %empty_tuple.type = call %Foo.ref() // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/packages/cross_package_export.carbon b/toolchain/check/testdata/packages/cross_package_export.carbon index 56629ce0ae54..f4234484c3e1 100644 --- a/toolchain/check/testdata/packages/cross_package_export.carbon +++ b/toolchain/check/testdata/packages/cross_package_export.carbon @@ -240,6 +240,8 @@ alias C = Other.C; // CHECK:STDOUT: fn @C() { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- export_import.carbon @@ -443,6 +445,8 @@ alias C = Other.C; // CHECK:STDOUT: %.loc6_1: init %C = converted %.loc6_26.1, %.loc6_26.5 [concrete = constants.%C.val] // CHECK:STDOUT: assign file.%c.var, %.loc6_1 // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- use_export_import_with_copy.carbon @@ -512,6 +516,8 @@ alias C = Other.C; // CHECK:STDOUT: %.loc7_1: init %C = converted %.loc7_26.1, %.loc7_26.5 [concrete = constants.%C.val] // CHECK:STDOUT: assign file.%c.var, %.loc7_1 // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- use_export_import_indirect.carbon @@ -581,6 +587,8 @@ alias C = Other.C; // CHECK:STDOUT: %.loc6_1: init %C = converted %.loc6_26.1, %.loc6_26.5 [concrete = constants.%C.val] // CHECK:STDOUT: assign file.%c.var, %.loc6_1 // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- use_export_name.carbon @@ -648,6 +656,8 @@ alias C = Other.C; // CHECK:STDOUT: %.loc6_1: init %C = converted %.loc6_26.1, %.loc6_26.5 [concrete = constants.%C.val] // CHECK:STDOUT: assign file.%c.var, %.loc6_1 // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- use_export_name_with_copy.carbon @@ -716,6 +726,8 @@ alias C = Other.C; // CHECK:STDOUT: %.loc7_1: init %C = converted %.loc7_26.1, %.loc7_26.5 [concrete = constants.%C.val] // CHECK:STDOUT: assign file.%c.var, %.loc7_1 // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- use_export_name_indirect.carbon @@ -783,6 +795,8 @@ alias C = Other.C; // CHECK:STDOUT: %.loc6_1: init %C = converted %.loc6_26.1, %.loc6_26.5 [concrete = constants.%C.val] // CHECK:STDOUT: assign file.%c.var, %.loc6_1 // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- use_export_all.carbon @@ -856,6 +870,8 @@ alias C = Other.C; // CHECK:STDOUT: %.loc11_1: init %C = converted %.loc11_26.1, %.loc11_26.5 [concrete = constants.%C.val] // CHECK:STDOUT: assign file.%c.var, %.loc11_1 // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- unused_conflict_on_export_import.carbon diff --git a/toolchain/check/testdata/packages/cross_package_import.carbon b/toolchain/check/testdata/packages/cross_package_import.carbon index a9ed6dda50c7..9ea0ae2b0eb3 100644 --- a/toolchain/check/testdata/packages/cross_package_import.carbon +++ b/toolchain/check/testdata/packages/cross_package_import.carbon @@ -228,6 +228,8 @@ fn UseF() { Other.F(); } // CHECK:STDOUT: fn @F() { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- other_fn_extern.carbon @@ -278,6 +280,8 @@ fn UseF() { Other.F(); } // CHECK:STDOUT: fn @F(%x.param: %empty_tuple.type) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- other_fn2.carbon @@ -297,6 +301,8 @@ fn UseF() { Other.F(); } // CHECK:STDOUT: fn @F2() { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- other_fn_use.carbon @@ -327,6 +333,8 @@ fn UseF() { Other.F(); } // CHECK:STDOUT: %F.ref: %F.type = name_ref F, imports.%Other.F [concrete = constants.%F] // CHECK:STDOUT: %F.call: init %empty_tuple.type = call %F.ref() // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @F [from "other_fn.carbon"]; @@ -381,6 +389,8 @@ fn UseF() { Other.F(); } // CHECK:STDOUT: %F2.ref: %F2.type = name_ref F2, imports.%Other.F2 [concrete = constants.%F2] // CHECK:STDOUT: %F2.call: init %empty_tuple.type = call %F2.ref() // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @F [from "other_fn.carbon"]; @@ -421,6 +431,8 @@ fn UseF() { Other.F(); } // CHECK:STDOUT: %F.ref: %F.type = name_ref F, imports.%Other.F [concrete = constants.%F] // CHECK:STDOUT: %F.call: init %empty_tuple.type = call %F.ref() // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @F [from "other_fn.carbon"]; @@ -475,6 +487,8 @@ fn UseF() { Other.F(); } // CHECK:STDOUT: %F.ref: %F.type = name_ref F, imports.%Other.F [concrete = constants.%F] // CHECK:STDOUT: %F.call: init %empty_tuple.type = call %F.ref() // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @F [from "other_fn.carbon"]; @@ -511,6 +525,8 @@ fn UseF() { Other.F(); } // CHECK:STDOUT: fn @F.loc23() { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- fail_main_reopen_other.carbon @@ -542,6 +558,8 @@ fn UseF() { Other.F(); } // CHECK:STDOUT: fn @G() { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- fail_main_reopen_other_nested.carbon @@ -572,6 +590,8 @@ fn UseF() { Other.F(); } // CHECK:STDOUT: fn @F() { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- fail_main_add_to_other.carbon @@ -599,6 +619,8 @@ fn UseF() { Other.F(); } // CHECK:STDOUT: fn @G() { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- fail_use_other_fn_use.carbon @@ -629,5 +651,7 @@ fn UseF() { Other.F(); } // CHECK:STDOUT: %Other.ref: = name_ref Other, imports.%Other [concrete = imports.%Other] // CHECK:STDOUT: %F.ref: = name_ref F, [concrete = ] // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/packages/export_import.carbon b/toolchain/check/testdata/packages/export_import.carbon index def95f0588f1..c54942d678fb 100644 --- a/toolchain/check/testdata/packages/export_import.carbon +++ b/toolchain/check/testdata/packages/export_import.carbon @@ -346,6 +346,8 @@ export Poison; // CHECK:STDOUT: %.loc6_1: init %C = converted %.loc6_20.1, %.loc6_20.5 [concrete = constants.%C.val] // CHECK:STDOUT: assign file.%c.var, %.loc6_1 // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- fail_export_in_impl.impl.carbon @@ -409,6 +411,8 @@ export Poison; // CHECK:STDOUT: %.loc4_1: init %C = converted %.loc4_20.1, %.loc4_20.5 [concrete = constants.%C.val] // CHECK:STDOUT: assign file.%c.var, %.loc4_1 // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- use_export_export.carbon @@ -469,6 +473,8 @@ export Poison; // CHECK:STDOUT: %.loc6_1: init %C = converted %.loc6_20.1, %.loc6_20.5 [concrete = constants.%C.val] // CHECK:STDOUT: assign file.%c.var, %.loc6_1 // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- use_import_then_export.carbon @@ -529,6 +535,8 @@ export Poison; // CHECK:STDOUT: %.loc6_1: init %C = converted %.loc6_20.1, %.loc6_20.5 [concrete = constants.%C.val] // CHECK:STDOUT: assign file.%c.var, %.loc6_1 // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- use_import_when_export.carbon @@ -589,6 +597,8 @@ export Poison; // CHECK:STDOUT: %.loc6_1: init %C = converted %.loc6_20.1, %.loc6_20.5 [concrete = constants.%C.val] // CHECK:STDOUT: assign file.%c.var, %.loc6_1 // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- use_base_and_export.carbon @@ -649,6 +659,8 @@ export Poison; // CHECK:STDOUT: %.loc7_1: init %C = converted %.loc7_20.1, %.loc7_20.5 [concrete = constants.%C.val] // CHECK:STDOUT: assign file.%c.var, %.loc7_1 // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- use_export_and_base.carbon @@ -709,6 +721,8 @@ export Poison; // CHECK:STDOUT: %.loc7_1: init %C = converted %.loc7_20.1, %.loc7_20.5 [concrete = constants.%C.val] // CHECK:STDOUT: assign file.%c.var, %.loc7_1 // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- use_export_copy.carbon @@ -769,6 +783,8 @@ export Poison; // CHECK:STDOUT: %.loc7_1: init %C = converted %.loc7_20.1, %.loc7_20.5 [concrete = constants.%C.val] // CHECK:STDOUT: assign file.%c.var, %.loc7_1 // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- fail_use_non_export.carbon @@ -841,6 +857,8 @@ export Poison; // CHECK:STDOUT: %.loc7_1: init %C = converted %.loc7_20.1, %.loc7_20.5 [concrete = constants.%C.val] // CHECK:STDOUT: assign file.%c.var, %.loc7_1 // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- indirect_use_non_export_then_base.carbon @@ -903,6 +921,8 @@ export Poison; // CHECK:STDOUT: %.loc6_1: init %C = converted %.loc6_29.1, %.loc6_29.5 [concrete = constants.%C.val] // CHECK:STDOUT: assign file.%indirect_c.var, %.loc6_1 // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- fail_export_poisoned.carbon diff --git a/toolchain/check/testdata/packages/export_mixed.carbon b/toolchain/check/testdata/packages/export_mixed.carbon index 01247dcdc9ce..987252e76a23 100644 --- a/toolchain/check/testdata/packages/export_mixed.carbon +++ b/toolchain/check/testdata/packages/export_mixed.carbon @@ -315,6 +315,8 @@ var d: D = {.y = ()}; // CHECK:STDOUT: %.loc6_1: init %C = converted %.loc6_20.1, %.loc6_20.5 [concrete = constants.%C.val] // CHECK:STDOUT: assign file.%c.var, %.loc6_1 // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- use_export_name_then_import.carbon @@ -375,6 +377,8 @@ var d: D = {.y = ()}; // CHECK:STDOUT: %.loc6_1: init %C = converted %.loc6_20.1, %.loc6_20.5 [concrete = constants.%C.val] // CHECK:STDOUT: assign file.%c.var, %.loc6_1 // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- use_both.carbon @@ -435,6 +439,8 @@ var d: D = {.y = ()}; // CHECK:STDOUT: %.loc7_1: init %C = converted %.loc7_20.1, %.loc7_20.5 [concrete = constants.%C.val] // CHECK:STDOUT: assign file.%c.var, %.loc7_1 // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- fail_nonexport_use_both.carbon @@ -472,6 +478,8 @@ var d: D = {.y = ()}; // CHECK:STDOUT: %.loc11_20: %struct_type.y = struct_literal (%.loc11_19) [concrete = constants.%struct] // CHECK:STDOUT: assign file.%d.var, // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- use_both_reversed.carbon @@ -532,6 +540,8 @@ var d: D = {.y = ()}; // CHECK:STDOUT: %.loc7_1: init %C = converted %.loc7_20.1, %.loc7_20.5 [concrete = constants.%C.val] // CHECK:STDOUT: assign file.%c.var, %.loc7_1 // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- use_both_and_export_import.carbon @@ -631,5 +641,7 @@ var d: D = {.y = ()}; // CHECK:STDOUT: %.loc9_1: init %D = converted %.loc9_20.1, %.loc9_20.5 [concrete = constants.%D.val] // CHECK:STDOUT: assign file.%d.var, %.loc9_1 // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/packages/export_name.carbon b/toolchain/check/testdata/packages/export_name.carbon index ca449f39560e..51fd1b4ecc61 100644 --- a/toolchain/check/testdata/packages/export_name.carbon +++ b/toolchain/check/testdata/packages/export_name.carbon @@ -486,6 +486,8 @@ private export C; // CHECK:STDOUT: %.loc7_1: init %NSC = converted %.loc7_27.1, %.loc7_27.5 [concrete = constants.%NSC.val] // CHECK:STDOUT: assign file.%nsc.var, %.loc7_1 // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- export_export.impl.carbon @@ -593,6 +595,8 @@ private export C; // CHECK:STDOUT: %.loc5_1: init %NSC = converted %.loc5_27.1, %.loc5_27.5 [concrete = constants.%NSC.val] // CHECK:STDOUT: assign file.%nsc.var, %.loc5_1 // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- use_export_export.carbon @@ -699,6 +703,8 @@ private export C; // CHECK:STDOUT: %.loc7_1: init %NSC = converted %.loc7_27.1, %.loc7_27.5 [concrete = constants.%NSC.val] // CHECK:STDOUT: assign file.%nsc.var, %.loc7_1 // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- fail_export_ns.carbon @@ -884,6 +890,8 @@ private export C; // CHECK:STDOUT: %.loc8_1: init %NSC = converted %.loc8_27.1, %.loc8_27.5 [concrete = constants.%NSC.val] // CHECK:STDOUT: assign file.%nsc.var, %.loc8_1 // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- import_both_reversed.carbon @@ -990,6 +998,8 @@ private export C; // CHECK:STDOUT: %.loc8_1: init %NSC = converted %.loc8_27.1, %.loc8_27.5 [concrete = constants.%NSC.val] // CHECK:STDOUT: assign file.%nsc.var, %.loc8_1 // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- fail_use_not_reexporting.carbon @@ -1105,6 +1115,8 @@ private export C; // CHECK:STDOUT: %.loc6_1: init %C = converted %.loc6_20.1, %.loc6_20.5 [concrete = constants.%C.val] // CHECK:STDOUT: assign file.%c.var, %.loc6_1 // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- fail_modifiers.carbon diff --git a/toolchain/check/testdata/packages/fail_conflict_no_namespaces.carbon b/toolchain/check/testdata/packages/fail_conflict_no_namespaces.carbon index c2eaee75aa9d..73b387bd2f46 100644 --- a/toolchain/check/testdata/packages/fail_conflict_no_namespaces.carbon +++ b/toolchain/check/testdata/packages/fail_conflict_no_namespaces.carbon @@ -124,6 +124,8 @@ import library "var"; // CHECK:STDOUT: %T.as.DefaultOrUnformed.impl.Op.call: init %i32 = call %T.as.DefaultOrUnformed.impl.Op.specific_fn() // CHECK:STDOUT: assign file.%Foo.var, %T.as.DefaultOrUnformed.impl.Op.call // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- fail_conflict.carbon diff --git a/toolchain/check/testdata/packages/fail_import_type_error.carbon b/toolchain/check/testdata/packages/fail_import_type_error.carbon index f67feddebd95..7ab4445352c1 100644 --- a/toolchain/check/testdata/packages/fail_import_type_error.carbon +++ b/toolchain/check/testdata/packages/fail_import_type_error.carbon @@ -113,6 +113,8 @@ var d: i32 = d_ref; // CHECK:STDOUT: assign file.%c_ref.var, // CHECK:STDOUT: assign file.%d_ref.var, // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- implicit.impl.carbon @@ -202,5 +204,7 @@ var d: i32 = d_ref; // CHECK:STDOUT: %d_ref.ref: = name_ref d_ref, imports.%Implicit.d_ref [concrete = ] // CHECK:STDOUT: assign file.%d.var, // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/packages/fail_name_with_import_failure.carbon b/toolchain/check/testdata/packages/fail_name_with_import_failure.carbon index d901e092fe6d..950c67830c22 100644 --- a/toolchain/check/testdata/packages/fail_name_with_import_failure.carbon +++ b/toolchain/check/testdata/packages/fail_name_with_import_failure.carbon @@ -56,5 +56,7 @@ var a: () = A(); // CHECK:STDOUT: %A.ref: = name_ref A, [concrete = ] // CHECK:STDOUT: assign file.%a.var, // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/packages/implicit_imports_entities.carbon b/toolchain/check/testdata/packages/implicit_imports_entities.carbon index b13f45786172..2d06d5bedb5f 100644 --- a/toolchain/check/testdata/packages/implicit_imports_entities.carbon +++ b/toolchain/check/testdata/packages/implicit_imports_entities.carbon @@ -400,6 +400,8 @@ import Other library "o1"; // CHECK:STDOUT: %.loc7_1: init %C2 = converted %.loc7_15.1, %.loc7_15.2 [concrete = constants.%C2.val] // CHECK:STDOUT: assign file.%c2.var, %.loc7_1 // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- dup_c1.carbon @@ -464,6 +466,8 @@ import Other library "o1"; // CHECK:STDOUT: %.loc6_1: init %C1 = converted %.loc6_15.1, %.loc6_15.2 [concrete = constants.%C1.val] // CHECK:STDOUT: assign file.%c1.var, %.loc6_1 // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- use_ns.carbon @@ -539,6 +543,8 @@ import Other library "o1"; // CHECK:STDOUT: %.loc4_1: init %C = converted %.loc4_16.1, %.loc4_16.2 [concrete = constants.%C.val] // CHECK:STDOUT: assign file.%c.var, %.loc4_1 // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- mix_other.carbon @@ -645,6 +651,8 @@ import Other library "o1"; // CHECK:STDOUT: %.loc7_1: init %O2 = converted %.loc7_21.1, %.loc7_21.2 [concrete = constants.%O2.val] // CHECK:STDOUT: assign file.%o2.var, %.loc7_1 // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- dup_o1.carbon @@ -719,6 +727,8 @@ import Other library "o1"; // CHECK:STDOUT: %.loc6_1: init %O1 = converted %.loc6_21.1, %.loc6_21.2 [concrete = constants.%O1.val] // CHECK:STDOUT: assign file.%o1.var, %.loc6_1 // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- import_conflict.carbon diff --git a/toolchain/check/testdata/packages/implicit_imports_prelude.carbon b/toolchain/check/testdata/packages/implicit_imports_prelude.carbon index 0db7c8ea5385..be577d371645 100644 --- a/toolchain/check/testdata/packages/implicit_imports_prelude.carbon +++ b/toolchain/check/testdata/packages/implicit_imports_prelude.carbon @@ -94,6 +94,8 @@ var b: i32 = a; // CHECK:STDOUT: %.loc4: init %i32 = converted %int_0, %Core.IntLiteral.as.ImplicitAs.impl.Convert.call [concrete = constants.%int_0.3c0] // CHECK:STDOUT: assign file.%a.var, %.loc4 // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- lib.impl.carbon @@ -165,5 +167,7 @@ var b: i32 = a; // CHECK:STDOUT: %Int.as.Copy.impl.Op.call: init %i32 = call %bound_method.loc4_14.2(%.loc4) // CHECK:STDOUT: assign file.%b.var, %Int.as.Copy.impl.Op.call // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/packages/loaded_global.carbon b/toolchain/check/testdata/packages/loaded_global.carbon index 0e452ad3a78d..95b14b97eba3 100644 --- a/toolchain/check/testdata/packages/loaded_global.carbon +++ b/toolchain/check/testdata/packages/loaded_global.carbon @@ -118,6 +118,8 @@ var package_b: () = package.B(); // CHECK:STDOUT: %A.call.loc6: init %empty_tuple.type = call %A.ref.loc6() // CHECK:STDOUT: assign file.%package_a.var, %A.call.loc6 // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- same_package.carbon @@ -195,5 +197,7 @@ var package_b: () = package.B(); // CHECK:STDOUT: %B.call.loc8: init %empty_tuple.type = call %B.ref.loc8() // CHECK:STDOUT: assign file.%package_b.var, %B.call.loc8 // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/packages/missing_prelude.carbon b/toolchain/check/testdata/packages/missing_prelude.carbon index 789647ae2330..5c1b19f1b54e 100644 --- a/toolchain/check/testdata/packages/missing_prelude.carbon +++ b/toolchain/check/testdata/packages/missing_prelude.carbon @@ -144,6 +144,8 @@ let n: type = i32; // CHECK:STDOUT: !entry: // CHECK:STDOUT: assign file.%n.var, // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- prelude_empty.carbon @@ -180,6 +182,8 @@ let n: type = i32; // CHECK:STDOUT: !entry: // CHECK:STDOUT: assign file.%n.var, // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- prelude_fake_int.carbon @@ -302,6 +306,8 @@ let n: type = i32; // CHECK:STDOUT: witness = (@ImplicitAs.WithSelf.%ImplicitAs.WithSelf.Convert.decl) // CHECK:STDOUT: // CHECK:STDOUT: !requires: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: @@ -328,6 +334,8 @@ let n: type = i32; // CHECK:STDOUT: %.loc6_47.2: init %X to %return.param = class_init () [concrete = constants.%X.val] // CHECK:STDOUT: %.loc6_48: init %X = converted %.loc6_47.1, %.loc6_47.2 [concrete = constants.%X.val] // CHECK:STDOUT: return %.loc6_48 to %return.param +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: @@ -481,6 +489,8 @@ let n: type = i32; // CHECK:STDOUT: witness = (imports.%Core.Convert) // CHECK:STDOUT: // CHECK:STDOUT: !requires: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: @@ -527,6 +537,8 @@ let n: type = i32; // CHECK:STDOUT: %.loc21_17.2: type = converted %Int.call, [concrete = ] // CHECK:STDOUT: %.loc21_17.3: type = type_literal [concrete = ] // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: specific @Int(constants.%T, constants.%N) { @@ -689,6 +701,8 @@ let n: type = i32; // CHECK:STDOUT: !entry: // CHECK:STDOUT: %.loc8: %empty_struct_type = struct_literal () [concrete = constants.%empty_struct] // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: specific @Int(constants.%T, constants.%N) { diff --git a/toolchain/check/testdata/packages/raw_core.carbon b/toolchain/check/testdata/packages/raw_core.carbon index 5702c2848ed9..6d894a5f520b 100644 --- a/toolchain/check/testdata/packages/raw_core.carbon +++ b/toolchain/check/testdata/packages/raw_core.carbon @@ -128,6 +128,8 @@ var c: r#Core = {.n = 0 as Core.Int(32)}; // CHECK:STDOUT: %F.ref: %F.type = name_ref F, imports.%Core.F [concrete = constants.%F] // CHECK:STDOUT: %F.call: init %empty_tuple.type = call %F.ref() // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @F [from "package_raw_core.carbon"]; @@ -139,6 +141,8 @@ var c: r#Core = {.n = 0 as Core.Int(32)}; // CHECK:STDOUT: %int_32: Core.IntLiteral = int_value 32 [concrete = constants.%int_32] // CHECK:STDOUT: %i32: type = class_type @Int, @Int(constants.%int_32) [concrete = constants.%i32] // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- fail_raw_core_not_core.carbon @@ -181,6 +185,8 @@ var c: r#Core = {.n = 0 as Core.Int(32)}; // CHECK:STDOUT: %Core.ref: = name_ref Core, imports.%Core.048aa3.1 [concrete = imports.%Core.048aa3.1] // CHECK:STDOUT: %F.ref: = name_ref F, [concrete = ] // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @H() { @@ -189,6 +195,8 @@ var c: r#Core = {.n = 0 as Core.Int(32)}; // CHECK:STDOUT: %Int.ref: = name_ref Int, [concrete = ] // CHECK:STDOUT: %int_32: Core.IntLiteral = int_value 32 [concrete = constants.%int_32] // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- class_raw_core.carbon @@ -310,5 +318,7 @@ var c: r#Core = {.n = 0 as Core.Int(32)}; // CHECK:STDOUT: %.loc6_1: init %Core = converted %.loc6_40.1, %.loc6_40.4 [concrete = constants.%Core.val] // CHECK:STDOUT: assign file.%c.var, %.loc6_1 // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/patterns/expression.carbon b/toolchain/check/testdata/patterns/expression.carbon index 1cd257f83715..79194ba0f988 100644 --- a/toolchain/check/testdata/patterns/expression.carbon +++ b/toolchain/check/testdata/patterns/expression.carbon @@ -131,5 +131,7 @@ fn F() { // CHECK:STDOUT: %.loc16_51: %pattern_type.860 = tuple_pattern (%expr_patt.loc16_26, %expr_patt.loc16_43) [concrete = constants.%.2f0] // CHECK:STDOUT: } // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/patterns/tuple.carbon b/toolchain/check/testdata/patterns/tuple.carbon index c4632ed1843d..14aef13f0999 100644 --- a/toolchain/check/testdata/patterns/tuple.carbon +++ b/toolchain/check/testdata/patterns/tuple.carbon @@ -100,6 +100,8 @@ let (((b: ()),)) = ((),); // CHECK:STDOUT: %.loc5_28: %empty_tuple.type = tuple_literal () [concrete = constants.%empty_tuple] // CHECK:STDOUT: %.loc5_29: %tuple.type = tuple_literal (%.loc5_24, %.loc5_28) [concrete = constants.%tuple] // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- init_expr.carbon @@ -148,6 +150,8 @@ let (((b: ()),)) = ((),); // CHECK:STDOUT: %.loc7: ref %tuple.type = temporary_storage // CHECK:STDOUT: %F.call: init %tuple.type to %.loc7 = call %F.ref() // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- ref_expr.carbon @@ -194,6 +198,8 @@ let (((b: ()),)) = ((),); // CHECK:STDOUT: // CHECK:STDOUT: %t.ref: ref %tuple.type = name_ref t, file.%t [concrete = file.%t.var] // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- grouping_parens.carbon @@ -234,6 +240,8 @@ let (((b: ()),)) = ((),); // CHECK:STDOUT: %.loc5: %empty_tuple.type = tuple_literal () [concrete = constants.%empty_tuple] // CHECK:STDOUT: %.loc6: %empty_tuple.type = tuple_literal () [concrete = constants.%empty_tuple] // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- one_tuple.carbon @@ -283,5 +291,7 @@ let (((b: ()),)) = ((),); // CHECK:STDOUT: %.loc6_22: %empty_tuple.type = tuple_literal () [concrete = constants.%empty_tuple] // CHECK:STDOUT: %.loc6_24: %tuple.type = tuple_literal (%.loc6_22) [concrete = constants.%tuple] // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/patterns/underscore.carbon b/toolchain/check/testdata/patterns/underscore.carbon index ff7e20fdcfce..e49d26f3666c 100644 --- a/toolchain/check/testdata/patterns/underscore.carbon +++ b/toolchain/check/testdata/patterns/underscore.carbon @@ -193,6 +193,8 @@ fn F() -> {} { // CHECK:STDOUT: %Destroy.Op.bound: = bound_method %_.var, constants.%Destroy.Op // CHECK:STDOUT: %Destroy.Op.call: init %empty_tuple.type = call %Destroy.Op.bound(%_.var) // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Destroy.Op(%self.param: ref %empty_struct_type) = "no_op"; @@ -205,6 +207,8 @@ fn F() -> {} { // CHECK:STDOUT: %.loc5_1: init %empty_struct_type = converted %.loc5_14.1, %.loc5_14.2 [concrete = constants.%empty_struct] // CHECK:STDOUT: assign file.%_.var, %.loc5_1 // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- function.carbon @@ -269,6 +273,8 @@ fn F() -> {} { // CHECK:STDOUT: fn @G(%_.param: %empty_struct_type) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @H() { @@ -279,6 +285,8 @@ fn F() -> {} { // CHECK:STDOUT: %.loc9_6.2: %empty_struct_type = converted %.loc9_6.1, %empty_struct [concrete = constants.%empty_struct] // CHECK:STDOUT: %F.call: init %empty_tuple.type = call %F.ref(%.loc9_6.2) // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- function_generic.carbon @@ -334,6 +342,8 @@ fn F() -> {} { // CHECK:STDOUT: fn() { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: @@ -345,6 +355,8 @@ fn F() -> {} { // CHECK:STDOUT: %F.specific_fn: = specific_function %F.ref, @F(constants.%empty_struct_type) [concrete = constants.%F.specific_fn] // CHECK:STDOUT: %F.call: init %empty_tuple.type = call %F.specific_fn() // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: specific @F(constants.%_) { @@ -418,6 +430,8 @@ fn F() -> {} { // CHECK:STDOUT: %F.specific_fn: = specific_function %F.ref, @F(constants.%empty_struct_type) [concrete = constants.%F.specific_fn] // CHECK:STDOUT: %F.call: init %empty_tuple.type = call %F.specific_fn() // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: specific @F(constants.%_) { @@ -494,6 +508,8 @@ fn F() -> {} { // CHECK:STDOUT: fn() { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/pointer/address_of_deref.carbon b/toolchain/check/testdata/pointer/address_of_deref.carbon index 91a5e4699de2..bb1fa6e9c9dd 100644 --- a/toolchain/check/testdata/pointer/address_of_deref.carbon +++ b/toolchain/check/testdata/pointer/address_of_deref.carbon @@ -135,6 +135,8 @@ fn F() -> i32 { // CHECK:STDOUT: %Destroy.Op.bound: = bound_method %n.var, constants.%Destroy.Op.1a2547.2 // CHECK:STDOUT: %Destroy.Op.call: init %empty_tuple.type = call %Destroy.Op.bound(%n.var) // CHECK:STDOUT: return %Int.as.Copy.impl.Op.call +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Destroy.Op.loc16_3.1(%self.param: ref %i32.builtin) = "no_op"; @@ -142,5 +144,7 @@ fn F() -> i32 { // CHECK:STDOUT: fn @Destroy.Op.loc16_3.2(%self.param: ref %i32) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/pointer/address_of_lvalue.carbon b/toolchain/check/testdata/pointer/address_of_lvalue.carbon index 6b808bb52538..fc12e70ed130 100644 --- a/toolchain/check/testdata/pointer/address_of_lvalue.carbon +++ b/toolchain/check/testdata/pointer/address_of_lvalue.carbon @@ -326,6 +326,8 @@ fn F() { // CHECK:STDOUT: %Destroy.Op.bound.loc16: = bound_method %s.var, constants.%Destroy.Op.1a2547.6 // CHECK:STDOUT: %Destroy.Op.call.loc16: init %empty_tuple.type = call %Destroy.Op.bound.loc16(%s.var) // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Destroy.Op.loc24(%self.param: ref %ptr.d08) = "no_op"; @@ -335,11 +337,15 @@ fn F() { // CHECK:STDOUT: fn @Destroy.Op.loc22_3.2(%self.param: ref %i32) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Destroy.Op.loc22_3.3(%self.param: ref %tuple.type.e55) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Destroy.Op.loc18(%self.param: ref %ptr.939) = "no_op"; @@ -347,5 +353,7 @@ fn F() { // CHECK:STDOUT: fn @Destroy.Op.loc16(%self.param: ref %struct_type.a.b.b4c) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/pointer/arrow.carbon b/toolchain/check/testdata/pointer/arrow.carbon index 348a62ac4620..1d6d2dc711b9 100644 --- a/toolchain/check/testdata/pointer/arrow.carbon +++ b/toolchain/check/testdata/pointer/arrow.carbon @@ -129,5 +129,7 @@ fn Foo(ptr: C*) { // CHECK:STDOUT: %field.ref.loc27_13: %C.elem = name_ref field, @C.%.loc17 [concrete = @C.%.loc17] // CHECK:STDOUT: %.loc27_13.2: ref %ptr.6b6 = class_element_access %.loc27_13.1, element0 // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/pointer/basic.carbon b/toolchain/check/testdata/pointer/basic.carbon index 375b816d7ac2..6faa31cfb87b 100644 --- a/toolchain/check/testdata/pointer/basic.carbon +++ b/toolchain/check/testdata/pointer/basic.carbon @@ -172,6 +172,8 @@ fn F() -> i32 { // CHECK:STDOUT: %Destroy.Op.bound.loc16: = bound_method %n.var, constants.%Destroy.Op.1a2547.3 // CHECK:STDOUT: %Destroy.Op.call.loc16: init %empty_tuple.type = call %Destroy.Op.bound.loc16(%n.var) // CHECK:STDOUT: return %Int.as.Copy.impl.Op.call +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Destroy.Op.loc17(%self.param: ref %ptr.d08) = "no_op"; @@ -181,5 +183,7 @@ fn F() -> i32 { // CHECK:STDOUT: fn @Destroy.Op.loc16_3.2(%self.param: ref %i32) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/pointer/convert_qualifiers.carbon b/toolchain/check/testdata/pointer/convert_qualifiers.carbon index 496b57f9f99d..97aaef3c9e5d 100644 --- a/toolchain/check/testdata/pointer/convert_qualifiers.carbon +++ b/toolchain/check/testdata/pointer/convert_qualifiers.carbon @@ -151,6 +151,8 @@ fn NonConstNonConst(p: X**) { TakeNonConstConst(p); } // CHECK:STDOUT: %.loc12_13.2: %ptr.faf = converted %p.ref.loc12, %.loc12_13.1 // CHECK:STDOUT: %TakeConst.call: init %empty_tuple.type = call %TakeConst.ref(%.loc12_13.2) // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Const(%p.param: %ptr.faf) { @@ -159,6 +161,8 @@ fn NonConstNonConst(p: X**) { TakeNonConstConst(p); } // CHECK:STDOUT: %p.ref: %ptr.faf = name_ref p, %p // CHECK:STDOUT: %TakeConst.call: init %empty_tuple.type = call %TakeConst.ref(%p.ref) // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @NonConstConst(%p.param: %ptr.845) { @@ -169,6 +173,8 @@ fn NonConstNonConst(p: X**) { TakeNonConstConst(p); } // CHECK:STDOUT: %.loc25_18.2: %ptr.b53 = converted %p.ref, %.loc25_18.1 // CHECK:STDOUT: %TakeConstConst.call: init %empty_tuple.type = call %TakeConstConst.ref(%.loc25_18.2) // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- fail_todo_nested_qualifiers.carbon @@ -195,6 +201,8 @@ fn NonConstNonConst(p: X**) { TakeNonConstConst(p); } // CHECK:STDOUT: %.loc22: %ptr.b53 = converted %p.ref, [concrete = ] // CHECK:STDOUT: %TakeConstConst.call: init %empty_tuple.type = call %TakeConstConst.ref() // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @ConstNonConst(%p.param: %ptr.060) { @@ -204,5 +212,7 @@ fn NonConstNonConst(p: X**) { TakeNonConstConst(p); } // CHECK:STDOUT: %.loc38: %ptr.b53 = converted %p.ref, [concrete = ] // CHECK:STDOUT: %TakeConstConst.call: init %empty_tuple.type = call %TakeConstConst.ref() // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/pointer/fail_address_of_error.carbon b/toolchain/check/testdata/pointer/fail_address_of_error.carbon index c59912d60e6e..92f971857df8 100644 --- a/toolchain/check/testdata/pointer/fail_address_of_error.carbon +++ b/toolchain/check/testdata/pointer/fail_address_of_error.carbon @@ -61,5 +61,7 @@ fn Test() { // CHECK:STDOUT: %addr.loc29_5: = addr_of %undeclared.ref.loc29 [concrete = ] // CHECK:STDOUT: %addr.loc29_3: = addr_of [concrete = ] // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/pointer/fail_deref_error.carbon b/toolchain/check/testdata/pointer/fail_deref_error.carbon index f13f15d615c1..892cbba2dbfa 100644 --- a/toolchain/check/testdata/pointer/fail_deref_error.carbon +++ b/toolchain/check/testdata/pointer/fail_deref_error.carbon @@ -72,5 +72,7 @@ let n2: i32 = undeclared->foo; // CHECK:STDOUT: %.loc24: ref = deref [concrete = ] // CHECK:STDOUT: %foo.ref: = name_ref foo, [concrete = ] // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/pointer/fail_deref_function.carbon b/toolchain/check/testdata/pointer/fail_deref_function.carbon index 2e0cb9c16c21..ef072d784406 100644 --- a/toolchain/check/testdata/pointer/fail_deref_function.carbon +++ b/toolchain/check/testdata/pointer/fail_deref_function.carbon @@ -56,5 +56,7 @@ fn A() { // CHECK:STDOUT: %.loc25: ref = deref [concrete = ] // CHECK:STDOUT: %foo.ref: = name_ref foo, [concrete = ] // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/pointer/fail_deref_namespace.carbon b/toolchain/check/testdata/pointer/fail_deref_namespace.carbon index 55390431f64a..f0b2e150676e 100644 --- a/toolchain/check/testdata/pointer/fail_deref_namespace.carbon +++ b/toolchain/check/testdata/pointer/fail_deref_namespace.carbon @@ -60,5 +60,7 @@ fn F() { // CHECK:STDOUT: %.loc27: ref = deref [concrete = ] // CHECK:STDOUT: %foo.ref: = name_ref foo, [concrete = ] // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/pointer/fail_deref_not_pointer.carbon b/toolchain/check/testdata/pointer/fail_deref_not_pointer.carbon index 5b1ac77631e5..84acd1ab79fb 100644 --- a/toolchain/check/testdata/pointer/fail_deref_not_pointer.carbon +++ b/toolchain/check/testdata/pointer/fail_deref_not_pointer.carbon @@ -114,5 +114,7 @@ fn Deref(n: i32) { // CHECK:STDOUT: %.loc45_5: ref = deref %.loc45_4.2 [concrete = ] // CHECK:STDOUT: %foo.ref.loc45: = name_ref foo, [concrete = ] // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/pointer/fail_deref_type.carbon b/toolchain/check/testdata/pointer/fail_deref_type.carbon index d44a0dfa92ae..1bca0510abfb 100644 --- a/toolchain/check/testdata/pointer/fail_deref_type.carbon +++ b/toolchain/check/testdata/pointer/fail_deref_type.carbon @@ -79,5 +79,7 @@ var p2: i32->foo; // CHECK:STDOUT: assign file.%p.var, // CHECK:STDOUT: assign file.%p2.var, // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/pointer/fail_type_mismatch.carbon b/toolchain/check/testdata/pointer/fail_type_mismatch.carbon index e021a6b035f7..643af7b7bb77 100644 --- a/toolchain/check/testdata/pointer/fail_type_mismatch.carbon +++ b/toolchain/check/testdata/pointer/fail_type_mismatch.carbon @@ -89,5 +89,7 @@ fn ConstMismatch(p: const {}*) -> const ({}*) { // CHECK:STDOUT: %p.ref: %ptr.bf9 = name_ref p, %p // CHECK:STDOUT: %.loc23: %const.987 = converted %p.ref, [concrete = ] // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/pointer/import.carbon b/toolchain/check/testdata/pointer/import.carbon index 85252622abff..12d7d0f288b4 100644 --- a/toolchain/check/testdata/pointer/import.carbon +++ b/toolchain/check/testdata/pointer/import.carbon @@ -134,6 +134,8 @@ var a: i32* = a_ref; // CHECK:STDOUT: %ptr.as.Copy.impl.Op.call: init %ptr.d08 = call %bound_method.loc5_19.2(%addr) [concrete = constants.%addr] // CHECK:STDOUT: assign file.%a_ref.var, %ptr.as.Copy.impl.Op.call // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- implicit.impl.carbon @@ -211,5 +213,7 @@ var a: i32* = a_ref; // CHECK:STDOUT: %ptr.as.Copy.impl.Op.call: init %ptr.d08 = call %bound_method.loc4_15.2(%.loc4) // CHECK:STDOUT: assign file.%a.var, %ptr.as.Copy.impl.Op.call // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/pointer/nested_const.carbon b/toolchain/check/testdata/pointer/nested_const.carbon index 87726631a9e4..05d7eb09e661 100644 --- a/toolchain/check/testdata/pointer/nested_const.carbon +++ b/toolchain/check/testdata/pointer/nested_const.carbon @@ -119,5 +119,7 @@ fn F(p: const (const (const i32*)*)) -> const i32 { // CHECK:STDOUT: %bound_method.loc17_10.2: = bound_method %.loc17_10.2, %specific_fn // CHECK:STDOUT: %const.as.Copy.impl.Op.call: init %const.6a8 = call %bound_method.loc17_10.2(%.loc17_10.2) // CHECK:STDOUT: return %const.as.Copy.impl.Op.call +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/pointer/types.carbon b/toolchain/check/testdata/pointer/types.carbon index 552876a82e1c..fd2435c33781 100644 --- a/toolchain/check/testdata/pointer/types.carbon +++ b/toolchain/check/testdata/pointer/types.carbon @@ -135,6 +135,8 @@ fn ConstPtr(p: const i32*) -> (const i32)* { // CHECK:STDOUT: %bound_method.loc16_10.2: = bound_method %p.ref, %specific_fn // CHECK:STDOUT: %ptr.as.Copy.impl.Op.call: init %ptr.d08 = call %bound_method.loc16_10.2(%p.ref) // CHECK:STDOUT: return %ptr.as.Copy.impl.Op.call +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @ConstPtr(%p.param: %ptr.774) -> out %return.param: %ptr.774 { @@ -146,5 +148,7 @@ fn ConstPtr(p: const i32*) -> (const i32)* { // CHECK:STDOUT: %bound_method.loc20_10.2: = bound_method %p.ref, %specific_fn // CHECK:STDOUT: %ptr.as.Copy.impl.Op.call: init %ptr.774 = call %bound_method.loc20_10.2(%p.ref) // CHECK:STDOUT: return %ptr.as.Copy.impl.Op.call +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/primitives/import_symbolic.carbon b/toolchain/check/testdata/primitives/import_symbolic.carbon index 98c787fdf656..27d636a4c4fc 100644 --- a/toolchain/check/testdata/primitives/import_symbolic.carbon +++ b/toolchain/check/testdata/primitives/import_symbolic.carbon @@ -240,6 +240,8 @@ fn F() -> u32 { // CHECK:STDOUT: %bound_method: = bound_method %impl.elem0.loc7_18.1, %impl.elem0.loc7_18.2 [concrete = constants.%bool.as.Copy.impl.Op.bound] // CHECK:STDOUT: %bool.as.Copy.impl.Op.call: init bool = call %bound_method(%impl.elem0.loc7_18.1) [concrete = constants.%false] // CHECK:STDOUT: return %bool.as.Copy.impl.Op.call +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- import_char.carbon @@ -289,6 +291,8 @@ fn F() -> u32 { // CHECK:STDOUT: %bound_method: = bound_method %impl.elem0.loc7_18.1, %impl.elem0.loc7_18.2 [concrete = constants.%char.as.Copy.impl.Op.bound] // CHECK:STDOUT: %char.as.Copy.impl.Op.call: init %char = call %bound_method(%impl.elem0.loc7_18.1) [concrete = constants.%int_97] // CHECK:STDOUT: return %char.as.Copy.impl.Op.call +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- import_char_literal.carbon @@ -337,6 +341,8 @@ fn F() -> u32 { // CHECK:STDOUT: %bound_method: = bound_method %impl.elem0.loc7_18.1, %impl.elem0.loc7_18.2 [concrete = constants.%Core.CharLiteral.as.Copy.impl.Op.bound] // CHECK:STDOUT: %Core.CharLiteral.as.Copy.impl.Op.call: init Core.CharLiteral = call %bound_method(%impl.elem0.loc7_18.1) [concrete = constants.%.54f] // CHECK:STDOUT: return %Core.CharLiteral.as.Copy.impl.Op.call +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- import_float.carbon @@ -394,6 +400,8 @@ fn F() -> u32 { // CHECK:STDOUT: %bound_method.loc7_18.2: = bound_method %impl.elem0.loc7_18.1, %specific_fn [concrete = constants.%bound_method] // CHECK:STDOUT: %Float.as.Copy.impl.Op.call: init %f64.dc1 = call %bound_method.loc7_18.2(%impl.elem0.loc7_18.1) [concrete = constants.%float] // CHECK:STDOUT: return %Float.as.Copy.impl.Op.call +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- import_float_literal.carbon @@ -442,6 +450,8 @@ fn F() -> u32 { // CHECK:STDOUT: %bound_method: = bound_method %impl.elem0.loc7_18.1, %impl.elem0.loc7_18.2 [concrete = constants.%Core.FloatLiteral.as.Copy.impl.Op.bound] // CHECK:STDOUT: %Core.FloatLiteral.as.Copy.impl.Op.call: init Core.FloatLiteral = call %bound_method(%impl.elem0.loc7_18.1) [concrete = constants.%float.d5ab3d.2] // CHECK:STDOUT: return %Core.FloatLiteral.as.Copy.impl.Op.call +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- import_int.carbon @@ -499,6 +509,8 @@ fn F() -> u32 { // CHECK:STDOUT: %bound_method.loc7_18.2: = bound_method %impl.elem0.loc7_18.1, %specific_fn [concrete = constants.%bound_method] // CHECK:STDOUT: %Int.as.Copy.impl.Op.call: init %i32 = call %bound_method.loc7_18.2(%impl.elem0.loc7_18.1) [concrete = constants.%int_8] // CHECK:STDOUT: return %Int.as.Copy.impl.Op.call +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- import_int_literal.carbon @@ -547,6 +559,8 @@ fn F() -> u32 { // CHECK:STDOUT: %bound_method: = bound_method %impl.elem0.loc7_18.1, %impl.elem0.loc7_18.2 [concrete = constants.%Core.IntLiteral.as.Copy.impl.Op.bound] // CHECK:STDOUT: %Core.IntLiteral.as.Copy.impl.Op.call: init Core.IntLiteral = call %bound_method(%impl.elem0.loc7_18.1) [concrete = constants.%int_7] // CHECK:STDOUT: return %Core.IntLiteral.as.Copy.impl.Op.call +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- unsigned_uint.carbon @@ -604,5 +618,7 @@ fn F() -> u32 { // CHECK:STDOUT: %bound_method.loc7_18.2: = bound_method %impl.elem0.loc7_18.1, %specific_fn [concrete = constants.%bound_method] // CHECK:STDOUT: %UInt.as.Copy.impl.Op.call: init %u32 = call %bound_method.loc7_18.2(%impl.elem0.loc7_18.1) [concrete = constants.%int_8] // CHECK:STDOUT: return %UInt.as.Copy.impl.Op.call +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/primitives/numeric_literals.carbon b/toolchain/check/testdata/primitives/numeric_literals.carbon index a58967c276c5..6ed65afdaa92 100644 --- a/toolchain/check/testdata/primitives/numeric_literals.carbon +++ b/toolchain/check/testdata/primitives/numeric_literals.carbon @@ -164,5 +164,7 @@ let e: f64 = 5.0e39999999999999999993; // CHECK:STDOUT: %float.loc23: Core.FloatLiteral = float_literal_value 10e7 [concrete = constants.%float.8d2] // CHECK:STDOUT: %float.loc24: Core.FloatLiteral = float_literal_value 10e-9 [concrete = constants.%float.48b] // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/primitives/string_literals.carbon b/toolchain/check/testdata/primitives/string_literals.carbon index 376ed097572e..acfb0cc06738 100644 --- a/toolchain/check/testdata/primitives/string_literals.carbon +++ b/toolchain/check/testdata/primitives/string_literals.carbon @@ -141,6 +141,8 @@ This string contains 256 characters. Among them are: // CHECK:STDOUT: %int_5: %u8 = int_value 5 [concrete = constants.%int_5] // CHECK:STDOUT: %String.val: %str.3d4 = struct_value (%str, %int_5) [concrete = constants.%String.val] // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- fail_overfill_small_string.carbon @@ -167,5 +169,7 @@ This string contains 256 characters. Among them are: // CHECK:STDOUT: !entry: // CHECK:STDOUT: %str: %ptr.093 = string_literal "A string so long its size does not fit in `u8`. This results in an error,\nbecause we can't form a `Core.String` value that describes this string.\n\nThis string contains 256 characters. Among them are:\n\n* 6 `g`s,\n* 21 `s`s,\n* 9 newlines,\n* and only one `p`.\n" [concrete = constants.%str.9e7] // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/primitives/type_literals.carbon b/toolchain/check/testdata/primitives/type_literals.carbon index b706a8112d3c..a0f1141306a1 100644 --- a/toolchain/check/testdata/primitives/type_literals.carbon +++ b/toolchain/check/testdata/primitives/type_literals.carbon @@ -393,6 +393,8 @@ var test_str: str = (); // CHECK:STDOUT: %T.as.DefaultOrUnformed.impl.Op.call.loc7: init %i64 = call %T.as.DefaultOrUnformed.impl.Op.specific_fn.4() // CHECK:STDOUT: assign file.%test_i64.var, %T.as.DefaultOrUnformed.impl.Op.call.loc7 // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- uN.carbon @@ -499,6 +501,8 @@ var test_str: str = (); // CHECK:STDOUT: %T.as.DefaultOrUnformed.impl.Op.call.loc7: init %u64 = call %T.as.DefaultOrUnformed.impl.Op.specific_fn.4() // CHECK:STDOUT: assign file.%test_u64.var, %T.as.DefaultOrUnformed.impl.Op.call.loc7 // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- fN.carbon @@ -605,6 +609,8 @@ var test_str: str = (); // CHECK:STDOUT: %T.as.DefaultOrUnformed.impl.Op.call.loc7: init %f128.e39 = call %T.as.DefaultOrUnformed.impl.Op.specific_fn.4() // CHECK:STDOUT: assign file.%test_f128.var, %T.as.DefaultOrUnformed.impl.Op.call.loc7 // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- char.carbon @@ -647,6 +653,8 @@ var test_str: str = (); // CHECK:STDOUT: !entry: // CHECK:STDOUT: %.loc5: Core.CharLiteral = char_value U+0063 [concrete = constants.%.b9b] // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- string.carbon @@ -679,6 +687,8 @@ var test_str: str = (); // CHECK:STDOUT: %int_4: %u64 = int_value 4 [concrete = constants.%int_4] // CHECK:STDOUT: %String.val: %str.3d4 = struct_value (%str, %int_4) [concrete = constants.%String.val] // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- type.carbon @@ -722,5 +732,7 @@ var test_str: str = (); // CHECK:STDOUT: %type.as.Copy.impl.Op.call: init type = call %bound_method(%i32) [concrete = constants.%i32] // CHECK:STDOUT: assign file.%test_type.var, %type.as.Copy.impl.Op.call // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/return/code_after_return.carbon b/toolchain/check/testdata/return/code_after_return.carbon index a995c8309f87..1b3079efe1d5 100644 --- a/toolchain/check/testdata/return/code_after_return.carbon +++ b/toolchain/check/testdata/return/code_after_return.carbon @@ -51,5 +51,7 @@ fn Main() { // CHECK:STDOUT: fn @Main() { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/return/code_after_return_value.carbon b/toolchain/check/testdata/return/code_after_return_value.carbon index 5934f9827e53..17caf1798e6d 100644 --- a/toolchain/check/testdata/return/code_after_return_value.carbon +++ b/toolchain/check/testdata/return/code_after_return_value.carbon @@ -109,5 +109,7 @@ fn F(unused b: bool) -> i32 { // CHECK:STDOUT: %Core.IntLiteral.as.ImplicitAs.impl.Convert.call: init %i32 = call %bound_method.loc16_11.2(%int_0) [concrete = constants.%int_0.3c0] // CHECK:STDOUT: %.loc16: init %i32 = converted %int_0, %Core.IntLiteral.as.ImplicitAs.impl.Convert.call [concrete = constants.%int_0.3c0] // CHECK:STDOUT: return %.loc16 +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/return/fail_call_in_type.carbon b/toolchain/check/testdata/return/fail_call_in_type.carbon index 71a3a4ffec6d..53872b8061cb 100644 --- a/toolchain/check/testdata/return/fail_call_in_type.carbon +++ b/toolchain/check/testdata/return/fail_call_in_type.carbon @@ -94,11 +94,15 @@ fn Six() -> ReturnType() { return 6; } // CHECK:STDOUT: %bound_method: = bound_method %i32, %impl.elem0 [concrete = constants.%type.as.Copy.impl.Op.bound] // CHECK:STDOUT: %type.as.Copy.impl.Op.call: init type = call %bound_method(%i32) [concrete = constants.%i32] // CHECK:STDOUT: return %type.as.Copy.impl.Op.call +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Six() -> { // CHECK:STDOUT: !entry: // CHECK:STDOUT: %int_6: Core.IntLiteral = int_value 6 [concrete = constants.%int_6] // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/return/fail_let_in_type.carbon b/toolchain/check/testdata/return/fail_let_in_type.carbon index 8bb72aa9d866..9d7dea1abf36 100644 --- a/toolchain/check/testdata/return/fail_let_in_type.carbon +++ b/toolchain/check/testdata/return/fail_let_in_type.carbon @@ -130,18 +130,24 @@ fn FirstPerfectNumber() -> z { return 6; } // CHECK:STDOUT: !entry: // CHECK:STDOUT: %int_6: Core.IntLiteral = int_value 6 [concrete = constants.%int_6] // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @HalfDozen() -> { // CHECK:STDOUT: !entry: // CHECK:STDOUT: %int_6: Core.IntLiteral = int_value 6 [concrete = constants.%int_6] // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @FirstPerfectNumber() -> { // CHECK:STDOUT: !entry: // CHECK:STDOUT: %int_6: Core.IntLiteral = int_value 6 [concrete = constants.%int_6] // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @__global_init() { @@ -150,5 +156,7 @@ fn FirstPerfectNumber() -> z { return 6; } // CHECK:STDOUT: %i32.loc27: type = type_literal constants.%i32 [concrete = constants.%i32] // CHECK:STDOUT: %i32.loc39: type = type_literal constants.%i32 [concrete = constants.%i32] // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/return/fail_missing_return.carbon b/toolchain/check/testdata/return/fail_missing_return.carbon index 23784c7993b9..b7c171860069 100644 --- a/toolchain/check/testdata/return/fail_missing_return.carbon +++ b/toolchain/check/testdata/return/fail_missing_return.carbon @@ -62,5 +62,7 @@ fn Main() -> i32 { // CHECK:STDOUT: // CHECK:STDOUT: fn @Main() -> out %return.param: %i32 { // CHECK:STDOUT: !entry: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/return/fail_missing_return_empty_tuple.carbon b/toolchain/check/testdata/return/fail_missing_return_empty_tuple.carbon index 767c84cc6e6b..e1ef94c0ccb9 100644 --- a/toolchain/check/testdata/return/fail_missing_return_empty_tuple.carbon +++ b/toolchain/check/testdata/return/fail_missing_return_empty_tuple.carbon @@ -50,5 +50,7 @@ fn F() -> () { // CHECK:STDOUT: // CHECK:STDOUT: fn @F() -> out %return.param: %empty_tuple.type { // CHECK:STDOUT: !entry: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/return/fail_return_var_no_returned_var.carbon b/toolchain/check/testdata/return/fail_return_var_no_returned_var.carbon index dc4916fe6b5a..bafa2f5511ae 100644 --- a/toolchain/check/testdata/return/fail_return_var_no_returned_var.carbon +++ b/toolchain/check/testdata/return/fail_return_var_no_returned_var.carbon @@ -52,5 +52,7 @@ fn Procedure() -> {} { // CHECK:STDOUT: fn @Procedure() -> out %return.param: %empty_struct_type { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/return/fail_return_with_returned_var.carbon b/toolchain/check/testdata/return/fail_return_with_returned_var.carbon index 23da86c256be..f5b5754ac074 100644 --- a/toolchain/check/testdata/return/fail_return_with_returned_var.carbon +++ b/toolchain/check/testdata/return/fail_return_with_returned_var.carbon @@ -176,6 +176,8 @@ fn G() -> C { // CHECK:STDOUT: %Destroy.Op.bound: = bound_method %v.var, constants.%Destroy.Op.1a2547.2 // CHECK:STDOUT: %Destroy.Op.call: init %empty_tuple.type = call %Destroy.Op.bound(%v.var) // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Destroy.Op.loc16_12.1(%self.param: ref %i32.builtin) = "no_op"; @@ -183,6 +185,8 @@ fn G() -> C { // CHECK:STDOUT: fn @Destroy.Op.loc16_12.2(%self.param: ref %i32) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @G() -> out %return.param: %C { @@ -217,5 +221,7 @@ fn G() -> C { // CHECK:STDOUT: } // CHECK:STDOUT: %c.ref: ref %C = name_ref c, %c // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/return/fail_returned_var_no_return_type.carbon b/toolchain/check/testdata/return/fail_returned_var_no_return_type.carbon index c54b2ff693dd..f1c7c50955a9 100644 --- a/toolchain/check/testdata/return/fail_returned_var_no_return_type.carbon +++ b/toolchain/check/testdata/return/fail_returned_var_no_return_type.carbon @@ -100,6 +100,8 @@ fn ForgotReturnType() { // CHECK:STDOUT: %Destroy.Op.bound: = bound_method %v.var, constants.%Destroy.Op // CHECK:STDOUT: %Destroy.Op.call: init %empty_tuple.type = call %Destroy.Op.bound(%v.var) // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Destroy.Op(%self.param: ref %empty_tuple.type) = "no_op"; @@ -156,6 +158,8 @@ fn ForgotReturnType() { // CHECK:STDOUT: %Destroy.Op.bound: = bound_method %v.var, constants.%Destroy.Op // CHECK:STDOUT: %Destroy.Op.call: init %empty_tuple.type = call %Destroy.Op.bound(%v.var) // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Destroy.Op(%self.param: ref %empty_tuple.type) = "no_op"; diff --git a/toolchain/check/testdata/return/fail_returned_var_shadow.carbon b/toolchain/check/testdata/return/fail_returned_var_shadow.carbon index ae97394e3e75..714337b7324e 100644 --- a/toolchain/check/testdata/return/fail_returned_var_shadow.carbon +++ b/toolchain/check/testdata/return/fail_returned_var_shadow.carbon @@ -187,6 +187,8 @@ fn DifferentScopes() -> i32 { // CHECK:STDOUT: %Destroy.Op.bound.loc17: = bound_method %v.var, constants.%Destroy.Op.1a2547.2 // CHECK:STDOUT: %Destroy.Op.call.loc17: init %empty_tuple.type = call %Destroy.Op.bound.loc17(%v.var) // CHECK:STDOUT: return %.loc27 +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Destroy.Op.loc25_14.1(%self.param: ref %i32.builtin) = "no_op"; @@ -194,6 +196,8 @@ fn DifferentScopes() -> i32 { // CHECK:STDOUT: fn @Destroy.Op.loc25_14.2(%self.param: ref %i32) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @DifferentScopes() -> out %return.param: %i32 { @@ -254,5 +258,7 @@ fn DifferentScopes() -> i32 { // CHECK:STDOUT: %Destroy.Op.bound.loc32: = bound_method %v.var, constants.%Destroy.Op.1a2547.2 // CHECK:STDOUT: %Destroy.Op.call.loc32: init %empty_tuple.type = call %Destroy.Op.bound.loc32(%v.var) // CHECK:STDOUT: return %.loc44 +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/return/fail_returned_var_type.carbon b/toolchain/check/testdata/return/fail_returned_var_type.carbon index 008438ffa0fb..53268a8daeef 100644 --- a/toolchain/check/testdata/return/fail_returned_var_type.carbon +++ b/toolchain/check/testdata/return/fail_returned_var_type.carbon @@ -123,6 +123,8 @@ fn Mismatch() -> i32 { // CHECK:STDOUT: %Destroy.Op.bound: = bound_method %v.var, constants.%Destroy.Op.1a2547.2 // CHECK:STDOUT: %Destroy.Op.call: init %empty_tuple.type = call %Destroy.Op.bound(%v.var) // CHECK:STDOUT: return %.loc23_17 +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Destroy.Op.loc23_12.1(%self.param: ref %f64.794) = "no_op"; @@ -130,5 +132,7 @@ fn Mismatch() -> i32 { // CHECK:STDOUT: fn @Destroy.Op.loc23_12.2(%self.param: ref %f64.dc1) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/return/fail_type_mismatch.carbon b/toolchain/check/testdata/return/fail_type_mismatch.carbon index 2322e9f5b811..0b1f2c707ed2 100644 --- a/toolchain/check/testdata/return/fail_type_mismatch.carbon +++ b/toolchain/check/testdata/return/fail_type_mismatch.carbon @@ -74,5 +74,7 @@ fn Main() -> i32 { // CHECK:STDOUT: %float: Core.FloatLiteral = float_literal_value 10e-1 [concrete = constants.%float] // CHECK:STDOUT: %.loc23: %i32 = converted %float, [concrete = ] // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/return/fail_value_disallowed.carbon b/toolchain/check/testdata/return/fail_value_disallowed.carbon index 1194f95c86d6..179a9348dba8 100644 --- a/toolchain/check/testdata/return/fail_value_disallowed.carbon +++ b/toolchain/check/testdata/return/fail_value_disallowed.carbon @@ -51,5 +51,7 @@ fn Main() { // CHECK:STDOUT: !entry: // CHECK:STDOUT: %int_0: Core.IntLiteral = int_value 0 [concrete = constants.%int_0] // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/return/fail_value_missing.carbon b/toolchain/check/testdata/return/fail_value_missing.carbon index a7ac5defc592..17de669a6cf9 100644 --- a/toolchain/check/testdata/return/fail_value_missing.carbon +++ b/toolchain/check/testdata/return/fail_value_missing.carbon @@ -67,5 +67,7 @@ fn Main() -> i32 { // CHECK:STDOUT: fn @Main() -> out %return.param: %i32 { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/return/fail_var_in_type.carbon b/toolchain/check/testdata/return/fail_var_in_type.carbon index b2549cc28dbe..b919648b3de9 100644 --- a/toolchain/check/testdata/return/fail_var_in_type.carbon +++ b/toolchain/check/testdata/return/fail_var_in_type.carbon @@ -82,6 +82,8 @@ fn Six() -> x { return 6; } // CHECK:STDOUT: !entry: // CHECK:STDOUT: %int_6: Core.IntLiteral = int_value 6 [concrete = constants.%int_6] // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @__global_init() { @@ -92,5 +94,7 @@ fn Six() -> x { return 6; } // CHECK:STDOUT: %type.as.Copy.impl.Op.call: init type = call %bound_method(%i32) [concrete = constants.%i32] // CHECK:STDOUT: assign file.%x.var, %type.as.Copy.impl.Op.call // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/return/import_convert_function.carbon b/toolchain/check/testdata/return/import_convert_function.carbon index c650c78a3695..2775c4e8a530 100644 --- a/toolchain/check/testdata/return/import_convert_function.carbon +++ b/toolchain/check/testdata/return/import_convert_function.carbon @@ -611,6 +611,8 @@ fn F0(unused n: i32) -> P.D { // CHECK:STDOUT: %.loc6_40.8: init %D to %return.param = class_init (%.loc6_40.4, %.loc6_40.7) [concrete = constants.%D.val] // CHECK:STDOUT: %.loc6_41: init %D = converted %.loc6_40.1, %.loc6_40.8 [concrete = constants.%D.val] // CHECK:STDOUT: return %.loc6_41 to %return.param +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @C.as.ImplicitAs.impl.Convert.loc8(%self.param: %C.771) -> out %return.param: %D { @@ -619,6 +621,8 @@ fn F0(unused n: i32) -> P.D { // CHECK:STDOUT: %.loc8_62.1: ref %D = splice_block %return.param {} // CHECK:STDOUT: %Make.call: init %D to %.loc8_62.1 = call %Make.ref() // CHECK:STDOUT: return %Make.call to %return.param +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @C.as.ImplicitAs.impl.Convert.loc9(%self.param: %C.83b) -> out %return.param: %D { @@ -627,6 +631,8 @@ fn F0(unused n: i32) -> P.D { // CHECK:STDOUT: %.loc9_62.1: ref %D = splice_block %return.param {} // CHECK:STDOUT: %Make.call: init %D to %.loc9_62.1 = call %Make.ref() // CHECK:STDOUT: return %Make.call to %return.param +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @C.as.ImplicitAs.impl.Convert.loc10(%self.param: %C.5ce) -> out %return.param: %D { @@ -635,6 +641,8 @@ fn F0(unused n: i32) -> P.D { // CHECK:STDOUT: %.loc10_62.1: ref %D = splice_block %return.param {} // CHECK:STDOUT: %Make.call: init %D to %.loc10_62.1 = call %Make.ref() // CHECK:STDOUT: return %Make.call to %return.param +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @C.as.ImplicitAs.impl.Convert.loc11(%self.param: %C.b3e) -> out %return.param: %D { @@ -643,6 +651,8 @@ fn F0(unused n: i32) -> P.D { // CHECK:STDOUT: %.loc11_62.1: ref %D = splice_block %return.param {} // CHECK:STDOUT: %Make.call: init %D to %.loc11_62.1 = call %Make.ref() // CHECK:STDOUT: return %Make.call to %return.param +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @C.as.ImplicitAs.impl.Convert.loc12(%self.param: %C.8ee) -> out %return.param: %D { @@ -651,6 +661,8 @@ fn F0(unused n: i32) -> P.D { // CHECK:STDOUT: %.loc12_62.1: ref %D = splice_block %return.param {} // CHECK:STDOUT: %Make.call: init %D to %.loc12_62.1 = call %Make.ref() // CHECK:STDOUT: return %Make.call to %return.param +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @C.as.ImplicitAs.impl.Convert.loc13(%self.param: %C.5c1) -> out %return.param: %D { @@ -659,6 +671,8 @@ fn F0(unused n: i32) -> P.D { // CHECK:STDOUT: %.loc13_62.1: ref %D = splice_block %return.param {} // CHECK:STDOUT: %Make.call: init %D to %.loc13_62.1 = call %Make.ref() // CHECK:STDOUT: return %Make.call to %return.param +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @C.as.ImplicitAs.impl.Convert.loc14(%self.param: %C.57b) -> out %return.param: %D { @@ -667,6 +681,8 @@ fn F0(unused n: i32) -> P.D { // CHECK:STDOUT: %.loc14_62.1: ref %D = splice_block %return.param {} // CHECK:STDOUT: %Make.call: init %D to %.loc14_62.1 = call %Make.ref() // CHECK:STDOUT: return %Make.call to %return.param +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @C.as.ImplicitAs.impl.Convert.loc15(%self.param: %C.b0a) -> out %return.param: %D { @@ -675,6 +691,8 @@ fn F0(unused n: i32) -> P.D { // CHECK:STDOUT: %.loc15_62.1: ref %D = splice_block %return.param {} // CHECK:STDOUT: %Make.call: init %D to %.loc15_62.1 = call %Make.ref() // CHECK:STDOUT: return %Make.call to %return.param +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: specific @C(constants.%N.37f) { @@ -1363,6 +1381,8 @@ fn F0(unused n: i32) -> P.D { // CHECK:STDOUT: %Destroy.Op.call.loc8_26.8: init %empty_tuple.type = call constants.%Destroy.Op.bound.d6e(constants.%.027) // CHECK:STDOUT: %Destroy.Op.call.loc7_26.9: init %empty_tuple.type = call constants.%Destroy.Op.bound.234(constants.%.de3) // CHECK:STDOUT: return %Make.call to %return.param +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @C.as.ImplicitAs.impl.Convert.1 [from "library.carbon"]; @@ -1372,6 +1392,8 @@ fn F0(unused n: i32) -> P.D { // CHECK:STDOUT: fn @Destroy.Op.loc7_26.2(%self.param: ref %C.771) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @C.as.ImplicitAs.impl.Convert.2 [from "library.carbon"]; @@ -1379,6 +1401,8 @@ fn F0(unused n: i32) -> P.D { // CHECK:STDOUT: fn @Destroy.Op.loc8(%self.param: ref %C.83b) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @C.as.ImplicitAs.impl.Convert.3 [from "library.carbon"]; @@ -1386,6 +1410,8 @@ fn F0(unused n: i32) -> P.D { // CHECK:STDOUT: fn @Destroy.Op.loc9(%self.param: ref %C.5ce) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @C.as.ImplicitAs.impl.Convert.4 [from "library.carbon"]; @@ -1393,6 +1419,8 @@ fn F0(unused n: i32) -> P.D { // CHECK:STDOUT: fn @Destroy.Op.loc10(%self.param: ref %C.b3e) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @C.as.ImplicitAs.impl.Convert.5 [from "library.carbon"]; @@ -1400,6 +1428,8 @@ fn F0(unused n: i32) -> P.D { // CHECK:STDOUT: fn @Destroy.Op.loc11(%self.param: ref %C.8ee) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @C.as.ImplicitAs.impl.Convert.6 [from "library.carbon"]; @@ -1407,6 +1437,8 @@ fn F0(unused n: i32) -> P.D { // CHECK:STDOUT: fn @Destroy.Op.loc12(%self.param: ref %C.5c1) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @C.as.ImplicitAs.impl.Convert.7 [from "library.carbon"]; @@ -1414,6 +1446,8 @@ fn F0(unused n: i32) -> P.D { // CHECK:STDOUT: fn @Destroy.Op.loc13(%self.param: ref %C.57b) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @C.as.ImplicitAs.impl.Convert.8 [from "library.carbon"]; @@ -1421,6 +1455,8 @@ fn F0(unused n: i32) -> P.D { // CHECK:STDOUT: fn @Destroy.Op.loc14(%self.param: ref %C.b0a) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Make [from "library.carbon"]; diff --git a/toolchain/check/testdata/return/missing_return_no_return_type.carbon b/toolchain/check/testdata/return/missing_return_no_return_type.carbon index 938880b1c44e..7fe1ac590306 100644 --- a/toolchain/check/testdata/return/missing_return_no_return_type.carbon +++ b/toolchain/check/testdata/return/missing_return_no_return_type.carbon @@ -41,5 +41,7 @@ fn F() { // CHECK:STDOUT: fn @F() { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/return/no_value.carbon b/toolchain/check/testdata/return/no_value.carbon index 03814de10364..6ac513e00487 100644 --- a/toolchain/check/testdata/return/no_value.carbon +++ b/toolchain/check/testdata/return/no_value.carbon @@ -42,5 +42,7 @@ fn Main() { // CHECK:STDOUT: fn @Main() { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/return/returned_var.carbon b/toolchain/check/testdata/return/returned_var.carbon index 4b64f02cae8b..132688f0a8c9 100644 --- a/toolchain/check/testdata/return/returned_var.carbon +++ b/toolchain/check/testdata/return/returned_var.carbon @@ -177,6 +177,8 @@ fn G() -> i32 { // CHECK:STDOUT: } // CHECK:STDOUT: %.loc21_22: %C = acquire_value %result // CHECK:STDOUT: return %.loc21_22 to %return.param +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @G() -> out %return.param: %i32 { @@ -200,6 +202,8 @@ fn G() -> i32 { // CHECK:STDOUT: %Destroy.Op.bound: = bound_method %result.var, constants.%Destroy.Op.1a2547.2 // CHECK:STDOUT: %Destroy.Op.call: init %empty_tuple.type = call %Destroy.Op.bound(%result.var) // CHECK:STDOUT: return %.loc26_22 +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Destroy.Op.loc26_12.1(%self.param: ref %i32.builtin) = "no_op"; @@ -207,5 +211,7 @@ fn G() -> i32 { // CHECK:STDOUT: fn @Destroy.Op.loc26_12.2(%self.param: ref %i32) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/return/returned_var_scope.carbon b/toolchain/check/testdata/return/returned_var_scope.carbon index 59b7df6f4470..58d90d964f6a 100644 --- a/toolchain/check/testdata/return/returned_var_scope.carbon +++ b/toolchain/check/testdata/return/returned_var_scope.carbon @@ -189,6 +189,8 @@ fn EnclosingButAfter(b: bool) -> i32 { // CHECK:STDOUT: %Destroy.Op.bound.loc17: = bound_method %v.var, constants.%Destroy.Op.1a2547.2 // CHECK:STDOUT: %Destroy.Op.call.loc17: init %empty_tuple.type = call %Destroy.Op.bound.loc17(%v.var) // CHECK:STDOUT: return %.loc22 +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Destroy.Op.loc20_14.1(%self.param: ref %i32.builtin) = "no_op"; @@ -196,6 +198,8 @@ fn EnclosingButAfter(b: bool) -> i32 { // CHECK:STDOUT: fn @Destroy.Op.loc20_14.2(%self.param: ref %i32) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @EnclosingButAfter(%b.param: bool) -> out %return.param: %i32 { @@ -246,5 +250,7 @@ fn EnclosingButAfter(b: bool) -> i32 { // CHECK:STDOUT: %Destroy.Op.bound.loc27_14.2: = bound_method %v.var, constants.%Destroy.Op.1a2547.2 // CHECK:STDOUT: %Destroy.Op.call.loc27_14.2: init %empty_tuple.type = call %Destroy.Op.bound.loc27_14.2(%v.var) // CHECK:STDOUT: return %.loc30_17 +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/return/struct.carbon b/toolchain/check/testdata/return/struct.carbon index b80e7c4735d6..d998772cfe5e 100644 --- a/toolchain/check/testdata/return/struct.carbon +++ b/toolchain/check/testdata/return/struct.carbon @@ -96,5 +96,7 @@ fn Main() -> {.a: i32} { // CHECK:STDOUT: %.loc16_17.3: init %struct_type.a.a92 = struct_init (%.loc16_17.2) [concrete = constants.%struct.159] // CHECK:STDOUT: %.loc16_18: init %struct_type.a.a92 = converted %.loc16_17.1, %.loc16_17.3 [concrete = constants.%struct.159] // CHECK:STDOUT: return %.loc16_18 +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/return/tuple.carbon b/toolchain/check/testdata/return/tuple.carbon index f8ea0f6d1dad..662db5b5d57e 100644 --- a/toolchain/check/testdata/return/tuple.carbon +++ b/toolchain/check/testdata/return/tuple.carbon @@ -116,5 +116,7 @@ fn Main() -> (i32, i32) { // CHECK:STDOUT: %.loc17_17.6: init %tuple.type.e55 to %return.param = tuple_init (%.loc17_17.3, %.loc17_17.5) [concrete = constants.%tuple.4fd] // CHECK:STDOUT: %.loc17_18: init %tuple.type.e55 = converted %.loc17_17.1, %.loc17_17.6 [concrete = constants.%tuple.4fd] // CHECK:STDOUT: return %.loc17_18 to %return.param +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/return/value.carbon b/toolchain/check/testdata/return/value.carbon index 73a7c4d78623..9e0954654a3e 100644 --- a/toolchain/check/testdata/return/value.carbon +++ b/toolchain/check/testdata/return/value.carbon @@ -88,5 +88,7 @@ fn Main() -> i32 { // CHECK:STDOUT: %Core.IntLiteral.as.ImplicitAs.impl.Convert.call: init %i32 = call %bound_method.loc16_11.2(%int_0) [concrete = constants.%int_0.3c0] // CHECK:STDOUT: %.loc16: init %i32 = converted %int_0, %Core.IntLiteral.as.ImplicitAs.impl.Convert.call [concrete = constants.%int_0.3c0] // CHECK:STDOUT: return %.loc16 +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/struct/empty.carbon b/toolchain/check/testdata/struct/empty.carbon index e0246375f734..3e624afb1dcf 100644 --- a/toolchain/check/testdata/struct/empty.carbon +++ b/toolchain/check/testdata/struct/empty.carbon @@ -65,5 +65,7 @@ var y: {} = x; // CHECK:STDOUT: %.loc16_1: init %empty_struct_type = converted %x.ref, %.loc16_13 [concrete = constants.%empty_struct] // CHECK:STDOUT: assign file.%y.var, %.loc16_1 // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/struct/fail_access_into_invalid.carbon b/toolchain/check/testdata/struct/fail_access_into_invalid.carbon index bf66cf63435f..fc20fe4c46bb 100644 --- a/toolchain/check/testdata/struct/fail_access_into_invalid.carbon +++ b/toolchain/check/testdata/struct/fail_access_into_invalid.carbon @@ -48,5 +48,7 @@ fn F() { a.b; } // CHECK:STDOUT: %a.ref: = name_ref a, [concrete = ] // CHECK:STDOUT: %b.ref: = name_ref b, [concrete = ] // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/struct/fail_assign_empty.carbon b/toolchain/check/testdata/struct/fail_assign_empty.carbon index c82d2c0a2859..827ccaa0b4db 100644 --- a/toolchain/check/testdata/struct/fail_assign_empty.carbon +++ b/toolchain/check/testdata/struct/fail_assign_empty.carbon @@ -65,5 +65,7 @@ var x: {.a: i32} = {}; // CHECK:STDOUT: %.loc19: %empty_struct_type = struct_literal () [concrete = constants.%empty_struct] // CHECK:STDOUT: assign file.%x.var, // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/struct/fail_assign_nested.carbon b/toolchain/check/testdata/struct/fail_assign_nested.carbon index 3bf27ca49602..4b68e3d6d079 100644 --- a/toolchain/check/testdata/struct/fail_assign_nested.carbon +++ b/toolchain/check/testdata/struct/fail_assign_nested.carbon @@ -54,5 +54,7 @@ var x: {.a: {}} = {.b = {}}; // CHECK:STDOUT: %.loc19_27: %struct_type.b.347 = struct_literal (%.loc19_26) [concrete = constants.%struct] // CHECK:STDOUT: assign file.%x.var, // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/struct/fail_assign_to_empty.carbon b/toolchain/check/testdata/struct/fail_assign_to_empty.carbon index 392753a837b5..04967a7430c8 100644 --- a/toolchain/check/testdata/struct/fail_assign_to_empty.carbon +++ b/toolchain/check/testdata/struct/fail_assign_to_empty.carbon @@ -62,5 +62,7 @@ var x: {} = {.a = 1}; // CHECK:STDOUT: %.loc19: %struct_type.a = struct_literal (%int_1) [concrete = constants.%struct] // CHECK:STDOUT: assign file.%x.var, // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/struct/fail_duplicate_name.carbon b/toolchain/check/testdata/struct/fail_duplicate_name.carbon index 5f7d88073ddf..d083f4dbdaf0 100644 --- a/toolchain/check/testdata/struct/fail_duplicate_name.carbon +++ b/toolchain/check/testdata/struct/fail_duplicate_name.carbon @@ -165,5 +165,7 @@ var y: {.b: i32, .c: i32} = {.b = 3, .b = 4}; // CHECK:STDOUT: %int_4: Core.IntLiteral = int_value 4 [concrete = constants.%int_4] // CHECK:STDOUT: assign file.%y.var, // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/struct/fail_field_name_mismatch.carbon b/toolchain/check/testdata/struct/fail_field_name_mismatch.carbon index aa389fcfe184..e875ecb39017 100644 --- a/toolchain/check/testdata/struct/fail_field_name_mismatch.carbon +++ b/toolchain/check/testdata/struct/fail_field_name_mismatch.carbon @@ -188,5 +188,7 @@ var y: {.b: i32} = x; // CHECK:STDOUT: %x.ref: ref %struct_type.a.a92 = name_ref x, file.%x [concrete = file.%x.var] // CHECK:STDOUT: assign file.%y.var, // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/struct/fail_field_type_mismatch.carbon b/toolchain/check/testdata/struct/fail_field_type_mismatch.carbon index 816bf6f20ddd..353f93c691fd 100644 --- a/toolchain/check/testdata/struct/fail_field_type_mismatch.carbon +++ b/toolchain/check/testdata/struct/fail_field_type_mismatch.carbon @@ -67,5 +67,7 @@ var x: {.a: i32} = {.b = 1.0}; // CHECK:STDOUT: %.loc19: %struct_type.b = struct_literal (%float) [concrete = constants.%struct] // CHECK:STDOUT: assign file.%x.var, // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/struct/fail_member_access_type.carbon b/toolchain/check/testdata/struct/fail_member_access_type.carbon index d0262b2bcc11..fa9ed20a2978 100644 --- a/toolchain/check/testdata/struct/fail_member_access_type.carbon +++ b/toolchain/check/testdata/struct/fail_member_access_type.carbon @@ -116,5 +116,7 @@ var y: i32 = x.b; // CHECK:STDOUT: %x.ref: ref %struct_type.a.752 = name_ref x, file.%x [concrete = file.%x.var] // CHECK:STDOUT: assign file.%y.var, // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/struct/fail_member_of_function.carbon b/toolchain/check/testdata/struct/fail_member_of_function.carbon index f0161460999a..b8b98226b9b2 100644 --- a/toolchain/check/testdata/struct/fail_member_of_function.carbon +++ b/toolchain/check/testdata/struct/fail_member_of_function.carbon @@ -48,5 +48,7 @@ fn A() { // CHECK:STDOUT: %A.ref: %A.type = name_ref A, file.%A.decl [concrete = constants.%A] // CHECK:STDOUT: %y.ref: = name_ref y, [concrete = ] // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/struct/fail_nested_incomplete.carbon b/toolchain/check/testdata/struct/fail_nested_incomplete.carbon index 7f66f7572498..881cf8967ce6 100644 --- a/toolchain/check/testdata/struct/fail_nested_incomplete.carbon +++ b/toolchain/check/testdata/struct/fail_nested_incomplete.carbon @@ -75,5 +75,7 @@ var p: Incomplete* = &s.a; // CHECK:STDOUT: %addr: = addr_of %a.ref [concrete = ] // CHECK:STDOUT: assign file.%p.var, // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/struct/fail_non_member_access.carbon b/toolchain/check/testdata/struct/fail_non_member_access.carbon index 47d189488e42..d5bcbe0595eb 100644 --- a/toolchain/check/testdata/struct/fail_non_member_access.carbon +++ b/toolchain/check/testdata/struct/fail_non_member_access.carbon @@ -110,5 +110,7 @@ var y: i32 = x.b; // CHECK:STDOUT: %x.ref: ref %struct_type.a.a92 = name_ref x, file.%x [concrete = file.%x.var] // CHECK:STDOUT: assign file.%y.var, // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/struct/fail_too_few_values.carbon b/toolchain/check/testdata/struct/fail_too_few_values.carbon index 9f40f4876e51..60a974f78b58 100644 --- a/toolchain/check/testdata/struct/fail_too_few_values.carbon +++ b/toolchain/check/testdata/struct/fail_too_few_values.carbon @@ -97,5 +97,7 @@ var x: {.a: i32, .b: i32} = {.a = 1}; // CHECK:STDOUT: %.loc19_36.4: init %i32 to %.loc19_36.3 = in_place_init %.loc19_36.2 [concrete = constants.%int_1.0c6] // CHECK:STDOUT: assign file.%x.var, // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/struct/fail_type_assign.carbon b/toolchain/check/testdata/struct/fail_type_assign.carbon index 051246e5c1cf..329cdb3d0405 100644 --- a/toolchain/check/testdata/struct/fail_type_assign.carbon +++ b/toolchain/check/testdata/struct/fail_type_assign.carbon @@ -72,5 +72,7 @@ var x: {.a: i32} = {.a: i32}; // CHECK:STDOUT: %.loc22: %struct_type.a = converted %struct_type.a, [concrete = ] // CHECK:STDOUT: assign file.%x.var, // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/struct/fail_value_as_type.carbon b/toolchain/check/testdata/struct/fail_value_as_type.carbon index 35da61aada72..452dbbd39787 100644 --- a/toolchain/check/testdata/struct/fail_value_as_type.carbon +++ b/toolchain/check/testdata/struct/fail_value_as_type.carbon @@ -63,5 +63,7 @@ var x: {.a = 1}; // CHECK:STDOUT: !entry: // CHECK:STDOUT: assign file.%x.var, // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/struct/import.carbon b/toolchain/check/testdata/struct/import.carbon index 80d3ee99b7d0..6b16a376c457 100644 --- a/toolchain/check/testdata/struct/import.carbon +++ b/toolchain/check/testdata/struct/import.carbon @@ -280,6 +280,8 @@ fn F() -> {.x: i32} { // CHECK:STDOUT: %F.call: init %C.8d3 to %.loc7 = call %F.ref() // CHECK:STDOUT: assign file.%c.var, %F.call // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- import_symbolic_decl.carbon @@ -342,5 +344,7 @@ fn F() -> {.x: i32} { // CHECK:STDOUT: %.loc7_18.3: init %struct_type.x = struct_init (%Int.as.Copy.impl.Op.call) [concrete = constants.%struct] // CHECK:STDOUT: %.loc7_24: init %struct_type.x = converted %impl.elem0.loc7_18.1, %.loc7_18.3 [concrete = constants.%struct] // CHECK:STDOUT: return %.loc7_24 +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/struct/literal_member_access.carbon b/toolchain/check/testdata/struct/literal_member_access.carbon index de0f85b8d2fb..6e90a7e0a36c 100644 --- a/toolchain/check/testdata/struct/literal_member_access.carbon +++ b/toolchain/check/testdata/struct/literal_member_access.carbon @@ -135,6 +135,8 @@ fn F() -> i32 { // CHECK:STDOUT: %Destroy.Op.bound: = bound_method %.loc18_26.2, constants.%Destroy.Op.1a2547.3 // CHECK:STDOUT: %Destroy.Op.call: init %empty_tuple.type = call %Destroy.Op.bound(%.loc18_26.2) // CHECK:STDOUT: return %Int.as.Copy.impl.Op.call +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Destroy.Op.loc18_26.1(%self.param: ref %i32.builtin) = "no_op"; @@ -142,10 +144,14 @@ fn F() -> i32 { // CHECK:STDOUT: fn @Destroy.Op.loc18_26.2(%self.param: ref %i32) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Destroy.Op.loc18_26.3(%self.param: ref %struct_type.x.y.z) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/struct/member_access.carbon b/toolchain/check/testdata/struct/member_access.carbon index 2b0b10d3a786..3459f21dc0aa 100644 --- a/toolchain/check/testdata/struct/member_access.carbon +++ b/toolchain/check/testdata/struct/member_access.carbon @@ -183,5 +183,7 @@ var z: i32 = y; // CHECK:STDOUT: %Int.as.Copy.impl.Op.call.loc17: init %i32 = call %bound_method.loc17_14.2(%.loc17) // CHECK:STDOUT: assign file.%z.var, %Int.as.Copy.impl.Op.call.loc17 // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/struct/nested_struct_in_place.carbon b/toolchain/check/testdata/struct/nested_struct_in_place.carbon index e141bb5998bb..db1e738b2b88 100644 --- a/toolchain/check/testdata/struct/nested_struct_in_place.carbon +++ b/toolchain/check/testdata/struct/nested_struct_in_place.carbon @@ -117,6 +117,8 @@ fn G() { // CHECK:STDOUT: %Destroy.Op.bound: = bound_method %v.var, constants.%Destroy.Op.1a2547.4 // CHECK:STDOUT: %Destroy.Op.call: init %empty_tuple.type = call %Destroy.Op.bound(%v.var) // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Destroy.Op.loc18_3.1(%self.param: ref %i32.builtin) = "no_op"; @@ -124,15 +126,21 @@ fn G() { // CHECK:STDOUT: fn @Destroy.Op.loc18_3.2(%self.param: ref %i32) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Destroy.Op.loc18_3.3(%self.param: ref %tuple.type.555) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Destroy.Op.loc18_3.4(%self.param: ref %struct_type.a.b.2a0) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/struct/one_entry.carbon b/toolchain/check/testdata/struct/one_entry.carbon index f0c95e213353..69f2af70c902 100644 --- a/toolchain/check/testdata/struct/one_entry.carbon +++ b/toolchain/check/testdata/struct/one_entry.carbon @@ -133,5 +133,7 @@ var y: {.a: i32} = x; // CHECK:STDOUT: %.loc16_1: init %struct_type.a.a92 = converted %x.ref, %.loc16_20.3 // CHECK:STDOUT: assign file.%y.var, %.loc16_1 // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/struct/partially_const.carbon b/toolchain/check/testdata/struct/partially_const.carbon index e84fb8aa0058..8bd162755ec7 100644 --- a/toolchain/check/testdata/struct/partially_const.carbon +++ b/toolchain/check/testdata/struct/partially_const.carbon @@ -138,5 +138,7 @@ fn Make(n: i32) -> {.a: i32, .b: i32, .c: i32} { // CHECK:STDOUT: %.loc16_33.10: init %struct_type.a.b.c.fde to %return.param = struct_init (%.loc16_33.4, %.loc16_33.6, %.loc16_33.9) // CHECK:STDOUT: %.loc16_34: init %struct_type.a.b.c.fde = converted %.loc16_33.1, %.loc16_33.10 // CHECK:STDOUT: return %.loc16_34 to %return.param +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/struct/reorder_fields.carbon b/toolchain/check/testdata/struct/reorder_fields.carbon index d86a961442c8..af27abd8d75a 100644 --- a/toolchain/check/testdata/struct/reorder_fields.carbon +++ b/toolchain/check/testdata/struct/reorder_fields.carbon @@ -193,5 +193,7 @@ fn F() -> {.a: i32, .b: f64} { // CHECK:STDOUT: %.loc21_10.7: init %struct_type.a.b to %return.param = struct_init (%.loc21_10.3, %.loc21_10.6) // CHECK:STDOUT: %.loc21_11: init %struct_type.a.b = converted %y.ref, %.loc21_10.7 // CHECK:STDOUT: return %.loc21_11 to %return.param +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/struct/tuple_as_element.carbon b/toolchain/check/testdata/struct/tuple_as_element.carbon index 0a4bbb8186ca..4e231c0dcb65 100644 --- a/toolchain/check/testdata/struct/tuple_as_element.carbon +++ b/toolchain/check/testdata/struct/tuple_as_element.carbon @@ -181,5 +181,7 @@ var y: {.a: i32, .b: (i32,)} = x; // CHECK:STDOUT: %.loc16_1: init %struct_type.a.b.388 = converted %x.ref, %.loc16_32.11 // CHECK:STDOUT: assign file.%y.var, %.loc16_1 // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/struct/two_entries.carbon b/toolchain/check/testdata/struct/two_entries.carbon index 7a35d968e465..caadcddc1c9e 100644 --- a/toolchain/check/testdata/struct/two_entries.carbon +++ b/toolchain/check/testdata/struct/two_entries.carbon @@ -209,5 +209,7 @@ var y: {.a: i32, .b: i32} = x; // CHECK:STDOUT: %.loc19_1: init %struct_type.a.b.b4c = converted %x.ref, %.loc19_29.9 // CHECK:STDOUT: assign file.%y.var, %.loc19_1 // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/tuple/basics.carbon b/toolchain/check/testdata/tuple/basics.carbon index 49f04a54e305..9860aaa61cb1 100644 --- a/toolchain/check/testdata/tuple/basics.carbon +++ b/toolchain/check/testdata/tuple/basics.carbon @@ -94,6 +94,8 @@ var y: ((), ()) = x; // CHECK:STDOUT: %.loc5_1: init %empty_tuple.type = converted %x.ref, %.loc5_13 [concrete = constants.%empty_tuple] // CHECK:STDOUT: assign file.%y.var, %.loc5_1 // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- nested_tuple.carbon @@ -161,6 +163,8 @@ var y: ((), ()) = x; // CHECK:STDOUT: %.loc4_1: init %tuple.type.6e8 = converted %.loc4_38.1, %.loc4_38.5 [concrete = constants.%tuple.0ca] // CHECK:STDOUT: assign file.%x.var, %.loc4_1 // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- one_element.carbon @@ -225,6 +229,8 @@ var y: ((), ()) = x; // CHECK:STDOUT: %.loc5_1: init %tuple.type = converted %x.ref, %.loc5_16.3 [concrete = constants.%tuple] // CHECK:STDOUT: assign file.%y.var, %.loc5_1 // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- two_elements.carbon @@ -343,5 +349,7 @@ var y: ((), ()) = x; // CHECK:STDOUT: %.loc8_1: init %tuple.type = converted %x.ref, %.loc8_19.7 [concrete = constants.%tuple] // CHECK:STDOUT: assign file.%y.var, %.loc8_1 // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/tuple/element_access.carbon b/toolchain/check/testdata/tuple/element_access.carbon index ab15d6361c3c..9cbca559e210 100644 --- a/toolchain/check/testdata/tuple/element_access.carbon +++ b/toolchain/check/testdata/tuple/element_access.carbon @@ -254,6 +254,8 @@ var b: i32 = a.({.index = 2}.index); // CHECK:STDOUT: %Int.as.Copy.impl.Op.call.loc6: init %i32 = call %bound_method.loc6_15.2(%.loc6) // CHECK:STDOUT: assign file.%c.var, %Int.as.Copy.impl.Op.call.loc6 // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- index_not_literal.carbon @@ -429,6 +431,8 @@ var b: i32 = a.({.index = 2}.index); // CHECK:STDOUT: %Int.as.Copy.impl.Op.call.loc7: init %i32 = call %bound_method.loc7_15.2(%.loc7_15) // CHECK:STDOUT: assign file.%d.var, %Int.as.Copy.impl.Op.call.loc7 // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- return_value_access.carbon @@ -472,5 +476,7 @@ var b: i32 = a.({.index = 2}.index); // CHECK:STDOUT: %bound_method.loc7_13.2: = bound_method %tuple.elem0, %specific_fn // CHECK:STDOUT: %Int.as.Copy.impl.Op.call: init %i32 = call %bound_method.loc7_13.2(%tuple.elem0) // CHECK:STDOUT: return %Int.as.Copy.impl.Op.call +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/tuple/import.carbon b/toolchain/check/testdata/tuple/import.carbon index 7c30546e1c19..89af69d3fa93 100644 --- a/toolchain/check/testdata/tuple/import.carbon +++ b/toolchain/check/testdata/tuple/import.carbon @@ -310,6 +310,8 @@ fn F() -> (i32,) { // CHECK:STDOUT: %F.call: init %C.372 to %.loc7 = call %F.ref() // CHECK:STDOUT: assign file.%c.var, %F.call // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- import_symbolic_decl.carbon @@ -372,5 +374,7 @@ fn F() -> (i32,) { // CHECK:STDOUT: %.loc7_18.2: init %tuple.type.a8a = tuple_init (%Int.as.Copy.impl.Op.call) [concrete = constants.%tuple.a1e] // CHECK:STDOUT: %.loc7_24: init %tuple.type.a8a = converted %impl.elem0.loc7_18.1, %.loc7_18.2 [concrete = constants.%tuple.a1e] // CHECK:STDOUT: return %.loc7_24 +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/tuple/in_place_tuple_init.carbon b/toolchain/check/testdata/tuple/in_place_tuple_init.carbon index 4c9bf426bd96..f050d82fa6a5 100644 --- a/toolchain/check/testdata/tuple/in_place_tuple_init.carbon +++ b/toolchain/check/testdata/tuple/in_place_tuple_init.carbon @@ -113,6 +113,8 @@ fn H() { // CHECK:STDOUT: %Destroy.Op.bound: = bound_method %v.var, constants.%Destroy.Op.1a2547.3 // CHECK:STDOUT: %Destroy.Op.call: init %empty_tuple.type = call %Destroy.Op.bound(%v.var) // CHECK:STDOUT: return %F.call.loc9 to %return.param +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Destroy.Op.loc7_3.1(%self.param: ref %i32.builtin) = "no_op"; @@ -120,11 +122,15 @@ fn H() { // CHECK:STDOUT: fn @Destroy.Op.loc7_3.2(%self.param: ref %i32) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Destroy.Op.loc7_3.3(%self.param: ref %tuple.type.e55) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @H() -> out %return.param: %i32 { @@ -144,6 +150,8 @@ fn H() { // CHECK:STDOUT: %Destroy.Op.bound: = bound_method %.loc15_12.2, constants.%Destroy.Op.1a2547.3 // CHECK:STDOUT: %Destroy.Op.call: init %empty_tuple.type = call %Destroy.Op.bound(%.loc15_12.2) // CHECK:STDOUT: return %Int.as.Copy.impl.Op.call +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- nested_tuple_in_place.carbon @@ -236,6 +244,8 @@ fn H() { // CHECK:STDOUT: %Destroy.Op.bound: = bound_method %v.var, constants.%Destroy.Op.1a2547.4 // CHECK:STDOUT: %Destroy.Op.call: init %empty_tuple.type = call %Destroy.Op.bound(%v.var) // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Destroy.Op.loc7_3.1(%self.param: ref %i32.builtin) = "no_op"; @@ -243,16 +253,22 @@ fn H() { // CHECK:STDOUT: fn @Destroy.Op.loc7_3.2(%self.param: ref %i32) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Destroy.Op.loc7_3.3(%self.param: ref %tuple.type.555) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Destroy.Op.loc7_3.4(%self.param: ref %tuple.type.015) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @H() { @@ -302,10 +318,14 @@ fn H() { // CHECK:STDOUT: %Destroy.Op.bound: = bound_method %v.var, constants.%Destroy.Op.1a2547.5 // CHECK:STDOUT: %Destroy.Op.call: init %empty_tuple.type = call %Destroy.Op.bound(%v.var) // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Destroy.Op.loc13(%self.param: ref %tuple.type.b7e) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/tuple/tuple_pattern.carbon b/toolchain/check/testdata/tuple/tuple_pattern.carbon index 8f99d0fbda81..30feee624a99 100644 --- a/toolchain/check/testdata/tuple/tuple_pattern.carbon +++ b/toolchain/check/testdata/tuple/tuple_pattern.carbon @@ -215,6 +215,8 @@ let (a: {}, b: {}) = ({}, {}, {}); // CHECK:STDOUT: %Destroy.Op.bound.loc7: = bound_method %.var.loc7, constants.%Destroy.Op.1a2547.2 // CHECK:STDOUT: %Destroy.Op.call.loc7: init %empty_tuple.type = call %Destroy.Op.bound.loc7(%.var.loc7) // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Destroy.Op.loc8_3.1(%self.param: ref %empty_struct_type) = "no_op"; @@ -222,6 +224,8 @@ let (a: {}, b: {}) = ({}, {}, {}); // CHECK:STDOUT: fn @Destroy.Op.loc8_3.2(%self.param: ref %tuple.type.b6b) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- variable.carbon @@ -323,6 +327,8 @@ let (a: {}, b: {}) = ({}, {}, {}); // CHECK:STDOUT: %Destroy.Op.bound.loc6: = bound_method %tuple.var, constants.%Destroy.Op.1a2547.2 // CHECK:STDOUT: %Destroy.Op.call.loc6: init %empty_tuple.type = call %Destroy.Op.bound.loc6(%tuple.var) // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Destroy.Op.loc7_3.1(%self.param: ref %empty_struct_type) = "no_op"; @@ -330,6 +336,8 @@ let (a: {}, b: {}) = ({}, {}, {}); // CHECK:STDOUT: fn @Destroy.Op.loc7_3.2(%self.param: ref %tuple.type.b6b) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @G() { @@ -391,6 +399,8 @@ let (a: {}, b: {}) = ({}, {}, {}); // CHECK:STDOUT: %Destroy.Op.bound: = bound_method %.var, constants.%Destroy.Op.1a2547.2 // CHECK:STDOUT: %Destroy.Op.call: init %empty_tuple.type = call %Destroy.Op.bound(%.var) // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @H() { @@ -421,6 +431,8 @@ let (a: {}, b: {}) = ({}, {}, {}); // CHECK:STDOUT: %Destroy.Op.bound: = bound_method %.var, constants.%Destroy.Op.1a2547.2 // CHECK:STDOUT: %Destroy.Op.call: init %empty_tuple.type = call %Destroy.Op.bound(%.var) // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- nested.carbon @@ -478,6 +490,8 @@ let (a: {}, b: {}) = ({}, {}, {}); // CHECK:STDOUT: %.loc6_50: %pattern_type.361 = tuple_pattern (%x.patt, %.loc6_49) [concrete = constants.%.1e3] // CHECK:STDOUT: } // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- package_scope.carbon @@ -522,5 +536,7 @@ let (a: {}, b: {}) = ({}, {}, {}); // CHECK:STDOUT: %.loc5_28: %empty_struct_type = struct_literal () [concrete = constants.%empty_struct] // CHECK:STDOUT: %.loc5_29: %tuple.type = tuple_literal (%.loc5_24, %.loc5_28) [concrete = constants.%tuple] // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/var/export_name.carbon b/toolchain/check/testdata/var/export_name.carbon index c64b9b3999a4..54f24316b1f0 100644 --- a/toolchain/check/testdata/var/export_name.carbon +++ b/toolchain/check/testdata/var/export_name.carbon @@ -100,6 +100,8 @@ var w: () = v; // CHECK:STDOUT: %T.as.DefaultOrUnformed.impl.Op.call: init %empty_tuple.type = call %T.as.DefaultOrUnformed.impl.Op.specific_fn() // CHECK:STDOUT: assign file.%v.var, %T.as.DefaultOrUnformed.impl.Op.call // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- export.carbon @@ -178,5 +180,7 @@ var w: () = v; // CHECK:STDOUT: %.loc6_1: init %empty_tuple.type = converted %v.ref, %.loc6_13 [concrete = constants.%empty_tuple] // CHECK:STDOUT: assign file.%w.var, %.loc6_1 // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/var/fail_duplicate_decl.carbon b/toolchain/check/testdata/var/fail_duplicate_decl.carbon index 482178376888..77869281733c 100644 --- a/toolchain/check/testdata/var/fail_duplicate_decl.carbon +++ b/toolchain/check/testdata/var/fail_duplicate_decl.carbon @@ -96,6 +96,8 @@ fn Main() { // CHECK:STDOUT: %Destroy.Op.bound.loc3: = bound_method %x.var.loc3, constants.%Destroy.Op // CHECK:STDOUT: %Destroy.Op.call.loc3: init %empty_tuple.type = call %Destroy.Op.bound.loc3(%x.var.loc3) // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Destroy.Op(%self.param: ref %empty_tuple.type) = "no_op"; diff --git a/toolchain/check/testdata/var/fail_init_type_mismatch.carbon b/toolchain/check/testdata/var/fail_init_type_mismatch.carbon index ad704ba32861..a1a902ee903b 100644 --- a/toolchain/check/testdata/var/fail_init_type_mismatch.carbon +++ b/toolchain/check/testdata/var/fail_init_type_mismatch.carbon @@ -68,5 +68,7 @@ var x: {} = (); // CHECK:STDOUT: %.loc22_1: %empty_struct_type = converted %.loc22_14, [concrete = ] // CHECK:STDOUT: assign file.%x.var, // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/var/fail_init_with_self.carbon b/toolchain/check/testdata/var/fail_init_with_self.carbon index ce7bf45e44cc..c8986fa5f0f3 100644 --- a/toolchain/check/testdata/var/fail_init_with_self.carbon +++ b/toolchain/check/testdata/var/fail_init_with_self.carbon @@ -79,6 +79,8 @@ fn Main() { // CHECK:STDOUT: %Destroy.Op.bound: = bound_method %x.var, constants.%Destroy.Op // CHECK:STDOUT: %Destroy.Op.call: init %empty_tuple.type = call %Destroy.Op.bound(%x.var) // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Destroy.Op(%self.param: ref %empty_tuple.type) = "no_op"; diff --git a/toolchain/check/testdata/var/fail_storage_is_literal.carbon b/toolchain/check/testdata/var/fail_storage_is_literal.carbon index b7594124c56f..f07a54b94508 100644 --- a/toolchain/check/testdata/var/fail_storage_is_literal.carbon +++ b/toolchain/check/testdata/var/fail_storage_is_literal.carbon @@ -69,5 +69,7 @@ fn Main() { // CHECK:STDOUT: %x.var_patt: = var_pattern %x.patt [concrete = ] // CHECK:STDOUT: } // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/var/global_decl.carbon b/toolchain/check/testdata/var/global_decl.carbon index ed4c9ae36052..9542f5209496 100644 --- a/toolchain/check/testdata/var/global_decl.carbon +++ b/toolchain/check/testdata/var/global_decl.carbon @@ -52,5 +52,7 @@ var x: {.v: ()} = {.v = ()}; // CHECK:STDOUT: %.loc14_1: init %struct_type.v = converted %.loc14_27.1, %.loc14_27.4 [concrete = constants.%struct] // CHECK:STDOUT: assign file.%x.var, %.loc14_1 // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/var/global_decl_import.carbon b/toolchain/check/testdata/var/global_decl_import.carbon index e59c22915c70..a77886e193f2 100644 --- a/toolchain/check/testdata/var/global_decl_import.carbon +++ b/toolchain/check/testdata/var/global_decl_import.carbon @@ -55,5 +55,7 @@ fn G() -> {.v: ()} { // CHECK:STDOUT: %.loc8_10.4: init %struct_type.v = struct_init (%.loc8_10.3) [concrete = constants.%struct] // CHECK:STDOUT: %.loc8_11: init %struct_type.v = converted %x.ref, %.loc8_10.4 [concrete = constants.%struct] // CHECK:STDOUT: return %.loc8_11 +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/var/global_decl_with_init.carbon b/toolchain/check/testdata/var/global_decl_with_init.carbon index ef0852df36d7..e898849c8c3f 100644 --- a/toolchain/check/testdata/var/global_decl_with_init.carbon +++ b/toolchain/check/testdata/var/global_decl_with_init.carbon @@ -71,6 +71,8 @@ var (x: (), y: ()) = ((), ()); // CHECK:STDOUT: %.loc4_1: init %struct_type.v = converted %.loc4_27.1, %.loc4_27.4 [concrete = constants.%struct] // CHECK:STDOUT: assign file.%x.var, %.loc4_1 // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- var_in_tuple.carbon @@ -123,6 +125,8 @@ var (x: (), y: ()) = ((), ()); // CHECK:STDOUT: %.loc4_13: init %empty_tuple.type = converted %.loc4_32.1, %.loc4_32.2 [concrete = constants.%empty_tuple] // CHECK:STDOUT: assign file.%y.var, %.loc4_13 // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- tuple_in_var.carbon @@ -185,5 +189,7 @@ var (x: (), y: ()) = ((), ()); // CHECK:STDOUT: %.loc4_1: init %tuple.type = converted %.loc4_29.1, %.loc4_29.6 [concrete = constants.%tuple] // CHECK:STDOUT: assign file.%.var, %.loc4_1 // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/var/global_lookup.carbon b/toolchain/check/testdata/var/global_lookup.carbon index 4117224a14e3..7ce6c210c8bc 100644 --- a/toolchain/check/testdata/var/global_lookup.carbon +++ b/toolchain/check/testdata/var/global_lookup.carbon @@ -79,5 +79,7 @@ var y: {.v: ()} = x; // CHECK:STDOUT: %.loc16_1: init %struct_type.v = converted %x.ref, %.loc16_19.5 [concrete = constants.%struct] // CHECK:STDOUT: assign file.%y.var, %.loc16_1 // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/var/global_lookup_in_scope.carbon b/toolchain/check/testdata/var/global_lookup_in_scope.carbon index 243a0b8d36cc..f5f6384478ec 100644 --- a/toolchain/check/testdata/var/global_lookup_in_scope.carbon +++ b/toolchain/check/testdata/var/global_lookup_in_scope.carbon @@ -94,6 +94,8 @@ fn Main() { // CHECK:STDOUT: %Destroy.Op.bound: = bound_method %y.var, constants.%Destroy.Op.1a2547.2 // CHECK:STDOUT: %Destroy.Op.call: init %empty_tuple.type = call %Destroy.Op.bound(%y.var) // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Destroy.Op.loc5_3.1(%self.param: ref %empty_tuple.type) = "no_op"; @@ -101,6 +103,8 @@ fn Main() { // CHECK:STDOUT: fn @Destroy.Op.loc5_3.2(%self.param: ref %struct_type.v) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @__global_init() { @@ -114,5 +118,7 @@ fn Main() { // CHECK:STDOUT: %.loc2_1: init %struct_type.v = converted %.loc2_27.1, %.loc2_27.4 [concrete = constants.%struct] // CHECK:STDOUT: assign file.%x.var, %.loc2_1 // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/var/import.carbon b/toolchain/check/testdata/var/import.carbon index fedab88b414e..243ba19f1531 100644 --- a/toolchain/check/testdata/var/import.carbon +++ b/toolchain/check/testdata/var/import.carbon @@ -57,6 +57,8 @@ var a: () = a_ref; // CHECK:STDOUT: %.loc4_1: init %empty_tuple.type = converted %.loc4_18.1, %.loc4_18.2 [concrete = constants.%empty_tuple] // CHECK:STDOUT: assign file.%a_ref.var, %.loc4_1 // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- implicit.impl.carbon @@ -102,5 +104,7 @@ var a: () = a_ref; // CHECK:STDOUT: %.loc4_1: init %empty_tuple.type = converted %a_ref.ref, %.loc4_13 [concrete = constants.%empty_tuple] // CHECK:STDOUT: assign file.%a.var, %.loc4_1 // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/var/import_access.carbon b/toolchain/check/testdata/var/import_access.carbon index 6715bfdb933f..a220337c2343 100644 --- a/toolchain/check/testdata/var/import_access.carbon +++ b/toolchain/check/testdata/var/import_access.carbon @@ -89,6 +89,8 @@ var v2: () = Test.v; // CHECK:STDOUT: %.loc4_9: init %empty_tuple.type = converted %.loc4_22.1, %.loc4_22.2 [concrete = constants.%empty_tuple] // CHECK:STDOUT: assign file.%v.var, %.loc4_9 // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- def.impl.carbon @@ -134,6 +136,8 @@ var v2: () = Test.v; // CHECK:STDOUT: %.loc4_1: init %empty_tuple.type = converted %v.ref, %.loc4_14 [concrete = constants.%empty_tuple] // CHECK:STDOUT: assign file.%v2.var, %.loc4_1 // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- fail_local_def.carbon @@ -169,6 +173,8 @@ var v2: () = Test.v; // CHECK:STDOUT: %v.ref: = name_ref v, [concrete = ] // CHECK:STDOUT: assign file.%v2.var, // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- fail_other_def.carbon @@ -212,5 +218,7 @@ var v2: () = Test.v; // CHECK:STDOUT: %v.ref: = name_ref v, [concrete = ] // CHECK:STDOUT: assign file.%v2.var, // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/var/initialization.carbon b/toolchain/check/testdata/var/initialization.carbon index 6fa47a1423ae..aac0f8a91aa7 100644 --- a/toolchain/check/testdata/var/initialization.carbon +++ b/toolchain/check/testdata/var/initialization.carbon @@ -97,6 +97,8 @@ fn Main() { // CHECK:STDOUT: %Destroy.Op.bound: = bound_method %x.var, constants.%Destroy.Op // CHECK:STDOUT: %Destroy.Op.call: init %empty_tuple.type = call %Destroy.Op.bound(%x.var) // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Destroy.Op(%self.param: ref %empty_tuple.type) = "no_op"; @@ -144,6 +146,8 @@ fn Main() { // CHECK:STDOUT: %Destroy.Op.bound: = bound_method %x.var, constants.%Destroy.Op // CHECK:STDOUT: %Destroy.Op.call: init %empty_tuple.type = call %Destroy.Op.bound(%x.var) // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Destroy.Op(%self.param: ref %empty_tuple.type) = "no_op"; diff --git a/toolchain/check/testdata/var/lookup.carbon b/toolchain/check/testdata/var/lookup.carbon index eb414270ebc4..ce6333c3b1c9 100644 --- a/toolchain/check/testdata/var/lookup.carbon +++ b/toolchain/check/testdata/var/lookup.carbon @@ -70,6 +70,8 @@ fn Main() { // CHECK:STDOUT: %Destroy.Op.bound: = bound_method %x.var, constants.%Destroy.Op // CHECK:STDOUT: %Destroy.Op.call: init %empty_tuple.type = call %Destroy.Op.bound(%x.var) // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Destroy.Op(%self.param: ref %empty_tuple.type) = "no_op"; diff --git a/toolchain/check/testdata/var/shadowing.carbon b/toolchain/check/testdata/var/shadowing.carbon index 86e506fc7184..07fb66ae464d 100644 --- a/toolchain/check/testdata/var/shadowing.carbon +++ b/toolchain/check/testdata/var/shadowing.carbon @@ -137,6 +137,8 @@ fn Main() { // CHECK:STDOUT: %Destroy.Op.bound.loc5: = bound_method %NS.var, constants.%Destroy.Op // CHECK:STDOUT: %Destroy.Op.call.loc5: init %empty_tuple.type = call %Destroy.Op.bound.loc5(%NS.var) // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Destroy.Op(%self.param: ref %empty_tuple.type) = "no_op"; diff --git a/toolchain/check/testdata/var/var_pattern.carbon b/toolchain/check/testdata/var/var_pattern.carbon index f1480a2ed4b0..7f5d81aa232f 100644 --- a/toolchain/check/testdata/var/var_pattern.carbon +++ b/toolchain/check/testdata/var/var_pattern.carbon @@ -233,6 +233,8 @@ fn Call() { // CHECK:STDOUT: %Destroy.Op.bound: = bound_method %x.var, constants.%Destroy.Op // CHECK:STDOUT: %Destroy.Op.call: init %empty_tuple.type = call %Destroy.Op.bound(%x.var) // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Destroy.Op(%self.param: ref %empty_tuple.type) = "no_op"; @@ -305,6 +307,8 @@ fn Call() { // CHECK:STDOUT: %Destroy.Op.bound: = bound_method %y.var, constants.%Destroy.Op // CHECK:STDOUT: %Destroy.Op.call: init %empty_tuple.type = call %Destroy.Op.bound(%y.var) // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Destroy.Op(%self.param: ref %empty_tuple.type) = "no_op"; @@ -385,6 +389,8 @@ fn Call() { // CHECK:STDOUT: %Destroy.Op.bound: = bound_method %.var, constants.%Destroy.Op.1a2547.2 // CHECK:STDOUT: %Destroy.Op.call: init %empty_tuple.type = call %Destroy.Op.bound(%.var) // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Destroy.Op.loc5_3.1(%self.param: ref %empty_tuple.type) = "no_op"; @@ -392,6 +398,8 @@ fn Call() { // CHECK:STDOUT: fn @Destroy.Op.loc5_3.2(%self.param: ref %tuple.type) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- tuple_in_let_var.carbon @@ -470,6 +478,8 @@ fn Call() { // CHECK:STDOUT: %Destroy.Op.bound: = bound_method %.var, constants.%Destroy.Op.1a2547.2 // CHECK:STDOUT: %Destroy.Op.call: init %empty_tuple.type = call %Destroy.Op.bound(%.var) // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Destroy.Op.loc5_7.1(%self.param: ref %empty_tuple.type) = "no_op"; @@ -477,6 +487,8 @@ fn Call() { // CHECK:STDOUT: fn @Destroy.Op.loc5_7.2(%self.param: ref %tuple.type) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- function.carbon @@ -571,6 +583,8 @@ fn Call() { // CHECK:STDOUT: %Destroy.Op.bound.loc7: = bound_method %v.var, constants.%Destroy.Op // CHECK:STDOUT: %Destroy.Op.call.loc7: init %empty_tuple.type = call %Destroy.Op.bound.loc7(%v.var) // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Destroy.Op(%self.param: ref %empty_tuple.type) = "no_op"; @@ -678,6 +692,8 @@ fn Call() { // CHECK:STDOUT: fn @F(%x.param: %empty_tuple.type, %y.param: ref %empty_tuple.type) [from "public_function.carbon"] { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- use_public_function.carbon @@ -751,6 +767,8 @@ fn Call() { // CHECK:STDOUT: %bound_method: = bound_method %y.var, %impl.elem0 // CHECK:STDOUT: %Destroy.Op.call: init %empty_tuple.type = call %bound_method(%y.var) // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @F [from "public_function.carbon"]; @@ -924,6 +942,8 @@ fn Call() { // CHECK:STDOUT: %Destroy.Op.bound.loc8_22: = bound_method %y.var, constants.%Destroy.Op // CHECK:STDOUT: %Destroy.Op.call.loc8_22: init %empty_tuple.type = call %Destroy.Op.bound.loc8_22(%y.var) // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Destroy.Op(%self.param: ref %empty_tuple.type) = "no_op"; @@ -969,6 +989,8 @@ fn Call() { // CHECK:STDOUT: %Destroy.Op.bound: = bound_method %a.var, constants.%Destroy.Op.1a2547.2 // CHECK:STDOUT: %Destroy.Op.call: init %empty_tuple.type = call %Destroy.Op.bound(%a.var) // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Destroy.Op.loc7_12.1(%self.param: ref %empty_struct_type) = "no_op"; @@ -976,6 +998,8 @@ fn Call() { // CHECK:STDOUT: fn @Destroy.Op.loc7_12.2(%self.param: ref %X) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- var_param_from_int_literal.carbon @@ -1043,6 +1067,8 @@ fn Call() { // CHECK:STDOUT: %Destroy.Op.bound: = bound_method %n.var, constants.%Destroy.Op.1a2547.2 // CHECK:STDOUT: %Destroy.Op.call: init %empty_tuple.type = call %Destroy.Op.bound(%n.var) // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Destroy.Op.loc5_12.1(%self.param: ref %i32.builtin) = "no_op"; @@ -1050,5 +1076,7 @@ fn Call() { // CHECK:STDOUT: fn @Destroy.Op.loc5_12.2(%self.param: ref %i32) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/where_expr/constraints.carbon b/toolchain/check/testdata/where_expr/constraints.carbon index 90d823d1a6a2..b502bfa4a1f3 100644 --- a/toolchain/check/testdata/where_expr/constraints.carbon +++ b/toolchain/check/testdata/where_expr/constraints.carbon @@ -563,5 +563,7 @@ fn F() { // CHECK:STDOUT: %x.patt: %pattern_type = value_binding_pattern x [concrete = constants.%x.patt] // CHECK:STDOUT: } // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/where_expr/dot_self_index.carbon b/toolchain/check/testdata/where_expr/dot_self_index.carbon index 646056df9534..299314df1ade 100644 --- a/toolchain/check/testdata/where_expr/dot_self_index.carbon +++ b/toolchain/check/testdata/where_expr/dot_self_index.carbon @@ -136,6 +136,8 @@ fn G(U: Empty(i32) where .A = i32*) { // CHECK:STDOUT: fn(%U.param: @H.%Empty_where.type (%Empty_where.type.e78)) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/where_expr/equal_rewrite.carbon b/toolchain/check/testdata/where_expr/equal_rewrite.carbon index e9c6f3b8ba9e..715622764c94 100644 --- a/toolchain/check/testdata/where_expr/equal_rewrite.carbon +++ b/toolchain/check/testdata/where_expr/equal_rewrite.carbon @@ -439,6 +439,8 @@ let K: (E where .F = .Self.G) = bool; // CHECK:STDOUT: fn() { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: @@ -452,6 +454,8 @@ let K: (E where .F = .Self.G) = bool; // CHECK:STDOUT: fn() { // CHECK:STDOUT: !entry: // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: @@ -583,6 +587,8 @@ let K: (E where .F = .Self.G) = bool; // CHECK:STDOUT: fn() { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: @@ -596,6 +602,8 @@ let K: (E where .F = .Self.G) = bool; // CHECK:STDOUT: fn() { // CHECK:STDOUT: !entry: // CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/where_expr/non_generic.carbon b/toolchain/check/testdata/where_expr/non_generic.carbon index 89d3366c74a5..07646ff0cd1a 100644 --- a/toolchain/check/testdata/where_expr/non_generic.carbon +++ b/toolchain/check/testdata/where_expr/non_generic.carbon @@ -64,5 +64,7 @@ fn NotGenericF(unused U: I where .T == i32) {} // CHECK:STDOUT: fn @NotGenericF(%U.param: %I_where.type) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/while/while.carbon b/toolchain/check/testdata/while/while.carbon index 12993561f1e9..654a3d508e26 100644 --- a/toolchain/check/testdata/while/while.carbon +++ b/toolchain/check/testdata/while/while.carbon @@ -162,6 +162,8 @@ fn While() { // CHECK:STDOUT: %H.ref: %H.type = name_ref H, file.%H.decl [concrete = constants.%H] // CHECK:STDOUT: %H.call: init %empty_tuple.type = call %H.ref() // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- unreachable_end.carbon @@ -206,6 +208,8 @@ fn While() { // CHECK:STDOUT: %H.ref: %H.type = name_ref H, file.%H.decl [concrete = constants.%H] // CHECK:STDOUT: %H.call: init %empty_tuple.type = call %H.ref() // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- break_continue.carbon @@ -324,5 +328,7 @@ fn While() { // CHECK:STDOUT: // CHECK:STDOUT: !while.done.loc14: // CHECK:STDOUT: return +// CHECK:STDOUT: +// CHECK:STDOUT: !observes: // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/diagnostics/kind.def b/toolchain/diagnostics/kind.def index d9a9bf2a825c..837f170f1616 100644 --- a/toolchain/diagnostics/kind.def +++ b/toolchain/diagnostics/kind.def @@ -398,6 +398,9 @@ CARBON_DIAGNOSTIC_KIND(RequireImplsUnidentifiedFacetType) CARBON_DIAGNOSTIC_KIND(RequireImplsNotImplemented) CARBON_DIAGNOSTIC_KIND(RequireInWrongScope) +// Observe checking. +CARBON_DIAGNOSTIC_KIND(ObserveInWrongScope) + // Let declaration checking. CARBON_DIAGNOSTIC_KIND(ExpectedInitializerAfterLet) diff --git a/toolchain/sem_ir/BUILD b/toolchain/sem_ir/BUILD index aba7c5053ddc..e4c1862e64bb 100644 --- a/toolchain/sem_ir/BUILD +++ b/toolchain/sem_ir/BUILD @@ -104,6 +104,7 @@ cc_library( "name.cpp", "name_scope.cpp", "named_constraint.cpp", + "observe.cpp", "pattern.cpp", "require_impls.cpp", "specific_interface.cpp", @@ -138,6 +139,7 @@ cc_library( "name.h", "name_scope.h", "named_constraint.h", + "observe.h", "pattern.h", "require_impls.h", "struct_type_field.h", diff --git a/toolchain/sem_ir/file.cpp b/toolchain/sem_ir/file.cpp index 55da37679e22..7991d9506e55 100644 --- a/toolchain/sem_ir/file.cpp +++ b/toolchain/sem_ir/file.cpp @@ -50,6 +50,9 @@ File::File(const Parse::Tree* parse_tree, CheckIRId check_ir_id, require_impls_(check_ir_id), // 1 reserved id for `RequireImplsBlockId::Empty`. require_impls_blocks_(allocator_, check_ir_id, 1), + observes_(check_ir_id), + // 1 reserved id for `ObserveBlockId::Empty`. + observe_blocks_(allocator_, check_ir_id, 1), associated_constants_(check_ir_id), facet_types_(check_ir_id), identified_facet_types_(check_ir_id), diff --git a/toolchain/sem_ir/file.h b/toolchain/sem_ir/file.h index c6a23e0298af..3bcf8fee9e14 100644 --- a/toolchain/sem_ir/file.h +++ b/toolchain/sem_ir/file.h @@ -38,6 +38,7 @@ #include "toolchain/sem_ir/name.h" #include "toolchain/sem_ir/name_scope.h" #include "toolchain/sem_ir/named_constraint.h" +#include "toolchain/sem_ir/observe.h" #include "toolchain/sem_ir/require_impls.h" #include "toolchain/sem_ir/singleton_insts.h" #include "toolchain/sem_ir/specific_interface.h" @@ -196,6 +197,12 @@ class File : public Printable { auto require_impls_blocks() const -> const RequireImplsBlockStore& { return require_impls_blocks_; } + auto observes() -> ObserveStore& { return observes_; } + auto observes() const -> const ObserveStore& { return observes_; } + auto observe_blocks() -> ObserveBlockStore& { return observe_blocks_; } + auto observe_blocks() const -> const ObserveBlockStore& { + return observe_blocks_; + } auto associated_constants() -> AssociatedConstantStore& { return associated_constants_; } @@ -375,6 +382,12 @@ class File : public Printable { // Storage for blocks of RequireImpls. RequireImplsBlockStore require_impls_blocks_; + // Storage for observes. + ObserveStore observes_; + + // Storage for blocks of Observe. + ObserveBlockStore observe_blocks_; + // Storage for associated constants. AssociatedConstantStore associated_constants_; diff --git a/toolchain/sem_ir/formatter.cpp b/toolchain/sem_ir/formatter.cpp index bdaba2ce9e77..1fcc029ac941 100644 --- a/toolchain/sem_ir/formatter.cpp +++ b/toolchain/sem_ir/formatter.cpp @@ -418,6 +418,7 @@ auto Formatter::FormatInterface(InterfaceId id, const Interface& interface_info) out() << "\n"; FormatRequireImplsBlock(interface_info.require_impls_block_id); + FormatObserveBlock(interface_info.observe_block_id); CloseBrace(); } else { @@ -598,10 +599,13 @@ auto Formatter::FormatFunction(FunctionId id, const Function& fn) -> void { FormatCodeBlock(block_id); } + FormatObserveBlock(fn.observe_block_id); + CloseBrace(); } else { Semicolon(); } + out() << '\n'; FormatEntityEnd(fn.generic_id); @@ -1448,6 +1452,49 @@ auto Formatter::FormatRequireImpls(RequireImplsId id) -> void { CloseBrace(); } +auto Formatter::FormatObserve(ObserveId id) -> void { + out() << ' '; + + const auto& observe = sem_ir_->observes().Get(id); + OpenBrace(); + Indent(); + out() << "observe "; + if (!observe.operations_id.has_value()) { + return; + } + + auto first_operation = true; + for (auto operation_id : + sem_ir_->inst_blocks().GetOrEmpty(observe.operations_id)) { + CARBON_KIND_SWITCH(sem_ir_->insts().Get(operation_id)) { + case CARBON_KIND(ObserveEquivalent eq): { + if (first_operation) { + FormatArg(eq.lhs_id); + first_operation = false; + } + out() << " == "; + FormatArg(eq.rhs_id); + break; + } + case CARBON_KIND(ObserveImpls impls): { + if (first_operation) { + FormatArg(impls.lhs_id); + first_operation = false; + } + out() << " impls "; + FormatArg(impls.rhs_id); + break; + } + default: { + break; + } + } + } + + out() << "\n"; + CloseBrace(); +} + auto Formatter::FormatRequireImplsBlock(RequireImplsBlockId block_id) -> void { IndentLabel(); out() << "!requires:\n"; @@ -1462,6 +1509,20 @@ auto Formatter::FormatRequireImplsBlock(RequireImplsBlockId block_id) -> void { } } +auto Formatter::FormatObserveBlock(ObserveBlockId block_id) -> void { + IndentLabel(); + out() << "!observes:\n"; + if (!block_id.has_value()) { + return; + } + for (auto observe_id : sem_ir_->observe_blocks().Get(block_id)) { + Indent(); + FormatArg(observe_id); + FormatObserve(observe_id); + out() << "\n"; + } +} + auto Formatter::FormatArg(EntityNameId id) -> void { if (!id.has_value()) { out() << "_"; diff --git a/toolchain/sem_ir/formatter.h b/toolchain/sem_ir/formatter.h index 35dcb000d65c..516b64863b9f 100644 --- a/toolchain/sem_ir/formatter.h +++ b/toolchain/sem_ir/formatter.h @@ -13,6 +13,7 @@ #include "toolchain/parse/tree_and_subtrees.h" #include "toolchain/sem_ir/file.h" #include "toolchain/sem_ir/formatter_chunks.h" +#include "toolchain/sem_ir/ids.h" #include "toolchain/sem_ir/inst_namer.h" namespace Carbon::SemIR { @@ -185,6 +186,9 @@ class Formatter { // Prints the contents of a require impls as a block. auto FormatRequireImpls(RequireImplsId id) -> void; + // Prints the contents of an observe as a block. + auto FormatObserve(ObserveId id) -> void; + // Prints a single instruction. This typically formats as: // `FormatInstLhs()` `` `FormatInstRhs()` `` // @@ -242,6 +246,10 @@ class Formatter { // instructions. Starts with a `!requires:` label. auto FormatRequireImplsBlock(RequireImplsBlockId block_id) -> void; + // Format a block of `observe` declarations from their `ObserveId` + // instructions. Starts with an `!observes:` label. + auto FormatObserveBlock(ObserveBlockId block_id) -> void; + template auto FormatArgs(Args... args) -> void { out() << ' '; diff --git a/toolchain/sem_ir/function.h b/toolchain/sem_ir/function.h index 5847dd2aa32b..8e7a25d40bf3 100644 --- a/toolchain/sem_ir/function.h +++ b/toolchain/sem_ir/function.h @@ -124,6 +124,9 @@ struct FunctionFields { // TODO: Extend this to support composite return forms. InstId return_pattern_id; + // This block consists of `ObserveId`s declared inside the function body. + ObserveBlockId observe_block_id = ObserveBlockId::None; + // Which kind of special function this is, if any. This is used in cases where // a special function would otherwise be indistinguishable from a normal // function. diff --git a/toolchain/sem_ir/id_kind.h b/toolchain/sem_ir/id_kind.h index a05eafaea3b6..e336ce8c3415 100644 --- a/toolchain/sem_ir/id_kind.h +++ b/toolchain/sem_ir/id_kind.h @@ -66,6 +66,7 @@ using IdKind = TypeEnum< NameId, NameScopeId, NamedConstraintId, + ObserveId, RawBundleId, RequireImplsId, SpecificId, diff --git a/toolchain/sem_ir/ids.cpp b/toolchain/sem_ir/ids.cpp index 9804a51b215b..5dc2f1ef2921 100644 --- a/toolchain/sem_ir/ids.cpp +++ b/toolchain/sem_ir/ids.cpp @@ -279,6 +279,14 @@ auto RequireImplsBlockId::Print(llvm::raw_ostream& out) const -> void { } } +auto ObserveBlockId::Print(llvm::raw_ostream& out) const -> void { + if (*this == Empty) { + out << Label << "_empty"; + } else { + IdBase::Print(out); + } +} + auto LocId::Print(llvm::raw_ostream& out) const -> void { switch (kind()) { case Kind::None: diff --git a/toolchain/sem_ir/ids.h b/toolchain/sem_ir/ids.h index 9a6c955e69d1..20738de1c1f6 100644 --- a/toolchain/sem_ir/ids.h +++ b/toolchain/sem_ir/ids.h @@ -1010,6 +1010,27 @@ struct RequireImplsBlockId : public IdBase { inline constexpr RequireImplsBlockId RequireImplsBlockId::Empty = RequireImplsBlockId(0); +// The ID of an `Observe`. +struct ObserveId : public IdBase { + static constexpr llvm::StringLiteral Label = "observe"; + + using IdBase::IdBase; +}; + +// The ID of a `ObserveId` block. +struct ObserveBlockId : public IdBase { + static constexpr llvm::StringLiteral Label = "observe_block"; + + // The canonical empty block, reused to avoid allocating empty vectors. Always + // the 0-index block. + static const ObserveBlockId Empty; + + using IdBase::IdBase; + auto Print(llvm::raw_ostream& out) const -> void; +}; + +inline constexpr ObserveBlockId ObserveBlockId::Empty = ObserveBlockId(0); + // The ID of a bundle of arguments with an unspecified type. struct RawBundleId : public IdBase { static constexpr llvm::StringLiteral Label = "bundle"; diff --git a/toolchain/sem_ir/inst_fingerprinter.cpp b/toolchain/sem_ir/inst_fingerprinter.cpp index 928ecede3f3f..d1a579f4419d 100644 --- a/toolchain/sem_ir/inst_fingerprinter.cpp +++ b/toolchain/sem_ir/inst_fingerprinter.cpp @@ -478,6 +478,13 @@ struct Worklist { Add(require.parent_scope_id); } + auto Add(ObserveId observe_id) -> void { + CARBON_CHECK(observe_id.has_value()); + const auto& observe = sem_ir->observes().Get(observe_id); + Add(observe.operations_id); + Add(observe.enclosing_scope_inst_id); + } + auto Add(AssociatedConstantId assoc_const_id) -> void { AddEntity( sem_ir->associated_constants().Get(assoc_const_id)); diff --git a/toolchain/sem_ir/inst_kind.def b/toolchain/sem_ir/inst_kind.def index 17db80af3a6a..6a473bfb8d6a 100644 --- a/toolchain/sem_ir/inst_kind.def +++ b/toolchain/sem_ir/inst_kind.def @@ -110,6 +110,9 @@ CARBON_SEM_IR_INST_KIND(NamedConstraintWithSelfDecl) CARBON_SEM_IR_INST_KIND(NameRef) CARBON_SEM_IR_INST_KIND(Namespace) CARBON_SEM_IR_INST_KIND(NamespaceType) +CARBON_SEM_IR_INST_KIND(ObserveEquivalent) +CARBON_SEM_IR_INST_KIND(ObserveImpls) +CARBON_SEM_IR_INST_KIND(ObserveDecl) CARBON_SEM_IR_INST_KIND(OutFormParamPatternAction) CARBON_SEM_IR_INST_KIND(OutParam) CARBON_SEM_IR_INST_KIND(OutParamPattern) diff --git a/toolchain/sem_ir/inst_namer.cpp b/toolchain/sem_ir/inst_namer.cpp index 90691591d13a..9b3ca9a8818f 100644 --- a/toolchain/sem_ir/inst_namer.cpp +++ b/toolchain/sem_ir/inst_namer.cpp @@ -189,6 +189,10 @@ auto InstNamer::GetScopeIdOffset(ScopeIdTypeEnum id_enum) const -> int { [[fallthrough]]; case ScopeIdTypeEnum::For: + offset += sem_ir_->observes().size(); + [[fallthrough]]; + case ScopeIdTypeEnum::For: + offset += sem_ir_->require_impls().size(); [[fallthrough]]; case ScopeIdTypeEnum::For: @@ -635,6 +639,36 @@ auto InstNamer::PushEntity(FunctionId function_id, ScopeId scope_id, PushBlockId(scope_id, fn.call_params_id); } +auto InstNamer::PushEntity(ObserveId observe_id, ScopeId /*scope_id*/, + Scope& scope) -> void { + const auto& observe = sem_ir_->observes().Get(observe_id); + LocId observe_loc(observe.decl_id); + + llvm::StringRef scope_prefix; + CARBON_KIND_SWITCH(sem_ir_->insts().Get(observe.enclosing_scope_inst_id)) { + case CARBON_KIND(SemIR::InterfaceWithSelfDecl interface): { + scope_prefix = MaybePushEntity(interface.interface_id); + break; + } + case CARBON_KIND(SemIR::FunctionDecl fn): { + scope_prefix = MaybePushEntity(fn.function_id); + break; + } + default: { + scope_prefix = ""; + break; + } + } + + // TODO: Currently observe declarations in the same scope have the same name. + // Generate unique names for them like we do when we are pushing + // RequireImplsId entity. + scope.name = + globals_.AllocateName(*this, observe_loc, + llvm::formatv("{0}{1}observe", scope_prefix, + scope_prefix.empty() ? "" : ".")); +} + auto InstNamer::PushEntity(RequireImplsId require_impls_id, ScopeId scope_id, Scope& scope) -> void { const auto& require = sem_ir_->require_impls().Get(require_impls_id); @@ -1290,6 +1324,18 @@ auto InstNamer::NamingContext::NameInst() -> void { AddInstNameId(sem_ir().name_scopes().Get(inst.name_scope_id).name_id()); return; } + case CARBON_KIND(ObserveDecl inst): { + AddEntityNameAndMaybePush(inst.observe_id, ".decl"); + return; + } + case ObserveEquivalent::Kind: { + AddInstName("eq"); + return; + } + case ObserveImpls::Kind: { + AddInstName("impls"); + return; + } case CARBON_KIND_ANY(AnyParam, inst): { AddInstNameId(inst.pretty_name_id, ".param"); return; diff --git a/toolchain/sem_ir/inst_namer.h b/toolchain/sem_ir/inst_namer.h index df4be57513e2..ffc44a76b45e 100644 --- a/toolchain/sem_ir/inst_namer.h +++ b/toolchain/sem_ir/inst_namer.h @@ -5,6 +5,8 @@ #ifndef CARBON_TOOLCHAIN_SEM_IR_INST_NAMER_H_ #define CARBON_TOOLCHAIN_SEM_IR_INST_NAMER_H_ +#include + #include "common/type_enum.h" #include "llvm/Support/raw_ostream.h" #include "toolchain/lex/tokenized_buffer.h" @@ -55,8 +57,8 @@ class InstNamer { using ScopeIdTypeEnum = TypeEnum; + NamedConstraintWithSelfId, ObserveId, RequireImplsId, + SpecificInterfaceId, VtableId>; // Construct the instruction namer, and assign names to all instructions in // the provided file. @@ -86,6 +88,8 @@ class InstNamer { index = sem_ir_->named_constraints().GetRawIndex(id); } else if constexpr (std::is_same_v) { index = sem_ir_->named_constraints().GetRawIndex(id.id); + } else if constexpr (std::is_same_v) { + index = sem_ir_->observes().GetRawIndex(id); } else if constexpr (std::is_same_v) { index = sem_ir_->require_impls().GetRawIndex(id); } else if constexpr (std::is_same_v) { @@ -251,6 +255,7 @@ class InstNamer { Scope& scope) -> void; auto PushEntity(NamedConstraintWithSelfId named_constraint_id, ScopeId scope_id, Scope& scope) -> void; + auto PushEntity(ObserveId observe_id, ScopeId scope_id, Scope& scope) -> void; auto PushEntity(RequireImplsId require_impls_id, ScopeId scope_id, Scope& scope) -> void; auto PushEntity(VtableId vtable_id, ScopeId scope_id, Scope& scope) -> void; diff --git a/toolchain/sem_ir/interface.h b/toolchain/sem_ir/interface.h index 5d9f4785065d..eba5edb46ed7 100644 --- a/toolchain/sem_ir/interface.h +++ b/toolchain/sem_ir/interface.h @@ -40,6 +40,7 @@ struct InterfaceFields { // The following members are set at the `}` of the interface definition. RequireImplsBlockId require_impls_block_id = RequireImplsBlockId::None; + ObserveBlockId observe_block_id = ObserveBlockId::None; InstBlockId associated_entities_id = InstBlockId::None; }; diff --git a/toolchain/sem_ir/observe.cpp b/toolchain/sem_ir/observe.cpp new file mode 100644 index 000000000000..ef335f0161d1 --- /dev/null +++ b/toolchain/sem_ir/observe.cpp @@ -0,0 +1,18 @@ +// 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 + +#include "toolchain/sem_ir/observe.h" + +#include "toolchain/base/block_value_store_impl.h" +#include "toolchain/base/value_store_impl.h" + +namespace Carbon { +template class ValueStore>; +template class ValueStore, + Tag>; +template class BlockValueStore>; +} // namespace Carbon diff --git a/toolchain/sem_ir/observe.h b/toolchain/sem_ir/observe.h new file mode 100644 index 000000000000..e5f138848f08 --- /dev/null +++ b/toolchain/sem_ir/observe.h @@ -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 + +#ifndef CARBON_TOOLCHAIN_SEM_IR_OBSERVE_H_ +#define CARBON_TOOLCHAIN_SEM_IR_OBSERVE_H_ + +#include "toolchain/base/block_value_store.h" +#include "toolchain/base/canonical_value_store.h" +#include "toolchain/sem_ir/ids.h" + +namespace Carbon::SemIR { + +// An observe declaration from an interface or function, written +// `observe T == U` or `observe T impls Z`. +// +// While this comes from a `observe` declaration, it is not an Entity like most +// other declarations, with a name and parameters, so it does not inherit +// EntityWithParamsBase. +struct Observe : Printable { + // The location of the `observe` declaration. + InstId decl_id; + // A block of `ObserveEquivalent` and `ObserveImpls` insts. + InstBlockId operations_id; + // The scope which contains the `observe` declaration. This is either an + // interface or a function. + InstId enclosing_scope_inst_id; + + auto Print(llvm::raw_ostream& out) const -> void { + out << '{'; + out << "decl_id: " << decl_id << ", operations_id: " << operations_id + << ", enclosing_scope_inst_id: " << enclosing_scope_inst_id; + out << '}'; + } +}; + +using ObserveStore = ValueStore>; +using ObserveBlockStore = + BlockValueStore>; + +} // namespace Carbon::SemIR + +namespace Carbon { +extern template class ValueStore>; +extern template class ValueStore, + Tag>; +extern template class BlockValueStore>; +} // namespace Carbon + +#endif // CARBON_TOOLCHAIN_SEM_IR_OBSERVE_H_ diff --git a/toolchain/sem_ir/typed_insts.h b/toolchain/sem_ir/typed_insts.h index 28bbef87a7ef..9c9ca7985afe 100644 --- a/toolchain/sem_ir/typed_insts.h +++ b/toolchain/sem_ir/typed_insts.h @@ -1696,6 +1696,47 @@ struct RequirementRewrite { InstId rhs_id; }; +// An observation that two expressions evaluate to the same constant, as +// specified by an `expr == expr` clause in an `observe` declaration. +struct ObserveEquivalent { + static constexpr auto Kind = + InstKind::ObserveEquivalent.Define( + {.ir_name = "observe_equivalent", + .constant_kind = InstConstantKind::Always, + .is_lowered = false}); + + // No type since not an expression + InstId lhs_id; + InstId rhs_id; +}; + +// An observation that the LHS expression is a facet type that implements the +// interface on the RHS and meets any constraints in the RHS, as specified by an +// `expr impls expr` clause in an `observe` declaration. +struct ObserveImpls { + static constexpr auto Kind = + InstKind::ObserveImpls.Define( + {.ir_name = "observe_impls", + .constant_kind = InstConstantKind::Always, + .is_lowered = false}); + + // No type since not an expression + InstId lhs_id; + InstId rhs_id; +}; + +// An `observe ...` declaration. +struct ObserveDecl { + static constexpr auto Kind = + InstKind::ObserveDecl.Define( + {.ir_name = "observe_decl", + .constant_kind = InstConstantKind::AlwaysUnique, + .is_lowered = false}); + + // No type since not an expression + ObserveId observe_id; +}; + struct Return { static constexpr auto Kind = InstKind::Return.Define( {.ir_name = "return",