From 108e39e095f7cc34053698a1519472e4e1bab945 Mon Sep 17 00:00:00 2001 From: Ivana Ivanovska Date: Fri, 28 Nov 2025 17:34:25 +0100 Subject: [PATCH] Fix SemIR printout for string literals in macros (#6440) Added SemIR printout for string literals in macros in the tests. Removed adding the inst in the imports to make the printout succeed. Part of #6303 --- toolchain/check/cpp/import.cpp | 1 - .../check/testdata/interop/cpp/macros.carbon | 113 ++++++++++++++++-- 2 files changed, 106 insertions(+), 8 deletions(-) diff --git a/toolchain/check/cpp/import.cpp b/toolchain/check/cpp/import.cpp index 74653a403128..8a2211275084 100644 --- a/toolchain/check/cpp/import.cpp +++ b/toolchain/check/cpp/import.cpp @@ -2284,7 +2284,6 @@ static auto MapConstant(Context& context, SemIR::LocId loc_id, context.string_literal_values().Add(string_literal->getString()); auto inst_id = MakeStringLiteral(context, Parse::StringLiteralId::None, string_id); - context.imports().push_back(inst_id); return inst_id; } else if (isa(expr)) { auto type_id = MapNullptrType(context, loc_id).type_id; diff --git a/toolchain/check/testdata/interop/cpp/macros.carbon b/toolchain/check/testdata/interop/cpp/macros.carbon index 959ec2036740..58440e37afb3 100644 --- a/toolchain/check/testdata/interop/cpp/macros.carbon +++ b/toolchain/check/testdata/interop/cpp/macros.carbon @@ -261,13 +261,15 @@ library "[[@TEST_NAME]]"; import Cpp library "string_literal_object_like_macro.h"; fn F() { - let a: str = Cpp.SimpleString; - let b: str = Cpp.EmptyString; - let c: str = Cpp.EscapeCharacter; - let d: str = Cpp.Concatenated; - let e: str = Cpp.RawString; - let f: str = Cpp.Utf8String; - let g: str = Cpp.Indirect; + //@dump-sem-ir-begin + let a: str = Cpp.SimpleString; + let b: str = Cpp.EmptyString; + let c: str = Cpp.EscapeCharacter; + let d: str = Cpp.Concatenated; + let e: str = Cpp.RawString; + let f: str = Cpp.Utf8String; + let g: str = Cpp.Indirect; + //@dump-sem-ir-end } // --- unsupported_string_literal_types.h @@ -1100,6 +1102,103 @@ fn F() { // CHECK:STDOUT: // CHECK:STDOUT: } // CHECK:STDOUT: +// CHECK:STDOUT: --- import_string_literal_object_like_macro.carbon +// CHECK:STDOUT: +// CHECK:STDOUT: constants { +// CHECK:STDOUT: %str.ee0: type = class_type @String [concrete] +// CHECK:STDOUT: %int_64: Core.IntLiteral = int_value 64 [concrete] +// CHECK:STDOUT: %u64: type = class_type @UInt, @UInt(%int_64) [concrete] +// CHECK:STDOUT: %char: type = class_type @Char [concrete] +// CHECK:STDOUT: %ptr.fb0: type = ptr_type %char [concrete] +// CHECK:STDOUT: %pattern_type.461: type = pattern_type %str.ee0 [concrete] +// CHECK:STDOUT: %str.dea: %ptr.fb0 = string_literal "abc" [concrete] +// CHECK:STDOUT: %int_3: %u64 = int_value 3 [concrete] +// CHECK:STDOUT: %String.val.822: %str.ee0 = struct_value (%str.dea, %int_3) [concrete] +// CHECK:STDOUT: %str.937: %ptr.fb0 = string_literal "" [concrete] +// CHECK:STDOUT: %int_0: %u64 = int_value 0 [concrete] +// CHECK:STDOUT: %String.val.cef: %str.ee0 = struct_value (%str.937, %int_0) [concrete] +// CHECK:STDOUT: %str.1d3: %ptr.fb0 = string_literal " \t " [concrete] +// CHECK:STDOUT: %String.val.446: %str.ee0 = struct_value (%str.1d3, %int_3) [concrete] +// CHECK:STDOUT: %str.c82: %ptr.fb0 = string_literal "ab" [concrete] +// CHECK:STDOUT: %int_2: %u64 = int_value 2 [concrete] +// CHECK:STDOUT: %String.val.f11: %str.ee0 = struct_value (%str.c82, %int_2) [concrete] +// CHECK:STDOUT: %str.130: %ptr.fb0 = string_literal " foo: \"bar\" { 123 } " [concrete] +// CHECK:STDOUT: %int_20: %u64 = int_value 20 [concrete] +// CHECK:STDOUT: %String.val.a83: %str.ee0 = struct_value (%str.130, %int_20) [concrete] +// CHECK:STDOUT: %str.ace: %ptr.fb0 = string_literal "\xD0\xB0\xD0\xB1\xD0\xB2" [concrete] +// CHECK:STDOUT: %int_6: %u64 = int_value 6 [concrete] +// CHECK:STDOUT: %String.val.2c7: %str.ee0 = struct_value (%str.ace, %int_6) [concrete] +// CHECK:STDOUT: %str.245: %ptr.fb0 = string_literal "xy" [concrete] +// CHECK:STDOUT: %String.val.b8c: %str.ee0 = struct_value (%str.245, %int_2) [concrete] +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: imports { +// CHECK:STDOUT: %Cpp: = namespace file.%Cpp.import_cpp, [concrete] { +// CHECK:STDOUT: .SimpleString = @F.%String.val.1 +// CHECK:STDOUT: .EmptyString = @F.%String.val.2 +// CHECK:STDOUT: .EscapeCharacter = @F.%String.val.3 +// CHECK:STDOUT: .Concatenated = @F.%String.val.4 +// CHECK:STDOUT: .RawString = @F.%String.val.5 +// CHECK:STDOUT: .Utf8String = @F.%String.val.6 +// CHECK:STDOUT: .Indirect = @F.%String.val.7 +// CHECK:STDOUT: import Cpp//... +// CHECK:STDOUT: } +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: fn @F() { +// CHECK:STDOUT: !entry: +// CHECK:STDOUT: name_binding_decl { +// CHECK:STDOUT: %a.patt: %pattern_type.461 = value_binding_pattern a [concrete] +// CHECK:STDOUT: } +// CHECK:STDOUT: %Cpp.ref.loc8: = name_ref Cpp, imports.%Cpp [concrete = imports.%Cpp] +// CHECK:STDOUT: +// CHECK:STDOUT: %SimpleString.ref: %str.ee0 = name_ref SimpleString, %String.val.1 [concrete = constants.%String.val.822] +// CHECK:STDOUT: %a: %str.ee0 = value_binding a, %SimpleString.ref +// CHECK:STDOUT: name_binding_decl { +// CHECK:STDOUT: %b.patt: %pattern_type.461 = value_binding_pattern b [concrete] +// CHECK:STDOUT: } +// CHECK:STDOUT: %Cpp.ref.loc9: = name_ref Cpp, imports.%Cpp [concrete = imports.%Cpp] +// CHECK:STDOUT: +// CHECK:STDOUT: %EmptyString.ref: %str.ee0 = name_ref EmptyString, %String.val.2 [concrete = constants.%String.val.cef] +// CHECK:STDOUT: %b: %str.ee0 = value_binding b, %EmptyString.ref +// CHECK:STDOUT: name_binding_decl { +// CHECK:STDOUT: %c.patt: %pattern_type.461 = value_binding_pattern c [concrete] +// CHECK:STDOUT: } +// CHECK:STDOUT: %Cpp.ref.loc10: = name_ref Cpp, imports.%Cpp [concrete = imports.%Cpp] +// CHECK:STDOUT: +// CHECK:STDOUT: %EscapeCharacter.ref: %str.ee0 = name_ref EscapeCharacter, %String.val.3 [concrete = constants.%String.val.446] +// CHECK:STDOUT: %c: %str.ee0 = value_binding c, %EscapeCharacter.ref +// CHECK:STDOUT: name_binding_decl { +// CHECK:STDOUT: %d.patt: %pattern_type.461 = value_binding_pattern d [concrete] +// CHECK:STDOUT: } +// CHECK:STDOUT: %Cpp.ref.loc11: = name_ref Cpp, imports.%Cpp [concrete = imports.%Cpp] +// CHECK:STDOUT: +// CHECK:STDOUT: %Concatenated.ref: %str.ee0 = name_ref Concatenated, %String.val.4 [concrete = constants.%String.val.f11] +// CHECK:STDOUT: %d: %str.ee0 = value_binding d, %Concatenated.ref +// CHECK:STDOUT: name_binding_decl { +// CHECK:STDOUT: %e.patt: %pattern_type.461 = value_binding_pattern e [concrete] +// CHECK:STDOUT: } +// CHECK:STDOUT: %Cpp.ref.loc12: = name_ref Cpp, imports.%Cpp [concrete = imports.%Cpp] +// CHECK:STDOUT: +// CHECK:STDOUT: %RawString.ref: %str.ee0 = name_ref RawString, %String.val.5 [concrete = constants.%String.val.a83] +// CHECK:STDOUT: %e: %str.ee0 = value_binding e, %RawString.ref +// CHECK:STDOUT: name_binding_decl { +// CHECK:STDOUT: %f.patt: %pattern_type.461 = value_binding_pattern f [concrete] +// CHECK:STDOUT: } +// CHECK:STDOUT: %Cpp.ref.loc13: = name_ref Cpp, imports.%Cpp [concrete = imports.%Cpp] +// CHECK:STDOUT: +// CHECK:STDOUT: %Utf8String.ref: %str.ee0 = name_ref Utf8String, %String.val.6 [concrete = constants.%String.val.2c7] +// CHECK:STDOUT: %f: %str.ee0 = value_binding f, %Utf8String.ref +// CHECK:STDOUT: name_binding_decl { +// CHECK:STDOUT: %g.patt: %pattern_type.461 = value_binding_pattern g [concrete] +// CHECK:STDOUT: } +// CHECK:STDOUT: %Cpp.ref.loc14: = name_ref Cpp, imports.%Cpp [concrete = imports.%Cpp] +// CHECK:STDOUT: +// CHECK:STDOUT: %Indirect.ref: %str.ee0 = name_ref Indirect, %String.val.7 [concrete = constants.%String.val.b8c] +// CHECK:STDOUT: %g: %str.ee0 = value_binding g, %Indirect.ref +// CHECK:STDOUT: +// CHECK:STDOUT: } +// CHECK:STDOUT: // CHECK:STDOUT: --- import_floating_point_literal_macro.carbon // CHECK:STDOUT: // CHECK:STDOUT: constants {