mirror of
https://github.com/carbon-language/carbon-lang.git
synced 2026-09-24 19:40:10 +01:00
Change String.size from u64 to i64 (#7614)
`String.size` is likely to be a signed word-sized integer in the future, (per a Discord conversation). Changing to `i64` now allows us to iterate over a string's contents using `IntRange`.
This commit is contained in:
@@ -14,7 +14,7 @@ import library "prelude/types/int";
|
||||
import library "prelude/operators/as";
|
||||
|
||||
class String {
|
||||
fn Size(self) -> u64 { return self.size; }
|
||||
fn Size(self) -> i64 { return self.size; }
|
||||
|
||||
impl as Copy {
|
||||
fn Op(self) -> Self { return {.ptr = self.ptr, .size = self.size}; }
|
||||
@@ -22,7 +22,7 @@ class String {
|
||||
// TODO: This should be an array iterator.
|
||||
private var ptr: Char*;
|
||||
// TODO: This should be a word-sized integer.
|
||||
private var size: u64;
|
||||
private var size: i64;
|
||||
}
|
||||
|
||||
impl String as UnformedInit {}
|
||||
|
||||
+20
-20
@@ -1375,36 +1375,36 @@ let _: C(1) = {} as C(Cpp.COUNT);
|
||||
// CHECK:STDOUT: constants {
|
||||
// CHECK:STDOUT: %str.3d4: 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: %i64: type = class_type @Int, @Int(%int_64) [concrete]
|
||||
// CHECK:STDOUT: %char: type = class_type @Char [concrete]
|
||||
// CHECK:STDOUT: %ptr.b46: type = ptr_type %char [concrete]
|
||||
// CHECK:STDOUT: %pattern_type.adf: type = pattern_type %str.3d4 [concrete]
|
||||
// CHECK:STDOUT: %a.patt: %pattern_type.adf = value_binding_pattern a [concrete]
|
||||
// CHECK:STDOUT: %str.d76: %ptr.b46 = string_literal "abc" [concrete]
|
||||
// CHECK:STDOUT: %int_3: %u64 = int_value 3 [concrete]
|
||||
// CHECK:STDOUT: %String.val.6e1: %str.3d4 = struct_value (%str.d76, %int_3) [concrete]
|
||||
// CHECK:STDOUT: %int_3: %i64 = int_value 3 [concrete]
|
||||
// CHECK:STDOUT: %String.val.2dc: %str.3d4 = struct_value (%str.d76, %int_3) [concrete]
|
||||
// CHECK:STDOUT: %b.patt: %pattern_type.adf = value_binding_pattern b [concrete]
|
||||
// CHECK:STDOUT: %str.3d5: %ptr.b46 = string_literal "" [concrete]
|
||||
// CHECK:STDOUT: %int_0: %u64 = int_value 0 [concrete]
|
||||
// CHECK:STDOUT: %String.val.9fd: %str.3d4 = struct_value (%str.3d5, %int_0) [concrete]
|
||||
// CHECK:STDOUT: %int_0: %i64 = int_value 0 [concrete]
|
||||
// CHECK:STDOUT: %String.val.b11: %str.3d4 = struct_value (%str.3d5, %int_0) [concrete]
|
||||
// CHECK:STDOUT: %c.patt: %pattern_type.adf = value_binding_pattern c [concrete]
|
||||
// CHECK:STDOUT: %str.4fa: %ptr.b46 = string_literal " \t " [concrete]
|
||||
// CHECK:STDOUT: %String.val.86a: %str.3d4 = struct_value (%str.4fa, %int_3) [concrete]
|
||||
// CHECK:STDOUT: %String.val.5de: %str.3d4 = struct_value (%str.4fa, %int_3) [concrete]
|
||||
// CHECK:STDOUT: %d.patt: %pattern_type.adf = value_binding_pattern d [concrete]
|
||||
// CHECK:STDOUT: %str.475: %ptr.b46 = string_literal "ab" [concrete]
|
||||
// CHECK:STDOUT: %int_2: %u64 = int_value 2 [concrete]
|
||||
// CHECK:STDOUT: %String.val.efd: %str.3d4 = struct_value (%str.475, %int_2) [concrete]
|
||||
// CHECK:STDOUT: %int_2: %i64 = int_value 2 [concrete]
|
||||
// CHECK:STDOUT: %String.val.c5e: %str.3d4 = struct_value (%str.475, %int_2) [concrete]
|
||||
// CHECK:STDOUT: %e.patt: %pattern_type.adf = value_binding_pattern e [concrete]
|
||||
// CHECK:STDOUT: %str.434: %ptr.b46 = string_literal " foo: \"bar\" { 123 } " [concrete]
|
||||
// CHECK:STDOUT: %int_20: %u64 = int_value 20 [concrete]
|
||||
// CHECK:STDOUT: %String.val.70a: %str.3d4 = struct_value (%str.434, %int_20) [concrete]
|
||||
// CHECK:STDOUT: %int_20: %i64 = int_value 20 [concrete]
|
||||
// CHECK:STDOUT: %String.val.593: %str.3d4 = struct_value (%str.434, %int_20) [concrete]
|
||||
// CHECK:STDOUT: %f.patt: %pattern_type.adf = value_binding_pattern f [concrete]
|
||||
// CHECK:STDOUT: %str.fa3: %ptr.b46 = string_literal "\xD0\xB0\xD0\xB1\xD0\xB2" [concrete]
|
||||
// CHECK:STDOUT: %int_6: %u64 = int_value 6 [concrete]
|
||||
// CHECK:STDOUT: %String.val.711: %str.3d4 = struct_value (%str.fa3, %int_6) [concrete]
|
||||
// CHECK:STDOUT: %int_6: %i64 = int_value 6 [concrete]
|
||||
// CHECK:STDOUT: %String.val.7f0: %str.3d4 = struct_value (%str.fa3, %int_6) [concrete]
|
||||
// CHECK:STDOUT: %g.patt: %pattern_type.adf = value_binding_pattern g [concrete]
|
||||
// CHECK:STDOUT: %str.618: %ptr.b46 = string_literal "xy" [concrete]
|
||||
// CHECK:STDOUT: %String.val.fce: %str.3d4 = struct_value (%str.618, %int_2) [concrete]
|
||||
// CHECK:STDOUT: %String.val.41b: %str.3d4 = struct_value (%str.618, %int_2) [concrete]
|
||||
// CHECK:STDOUT: }
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: imports {
|
||||
@@ -1424,7 +1424,7 @@ let _: C(1) = {} as C(Cpp.COUNT);
|
||||
// CHECK:STDOUT: !entry:
|
||||
// CHECK:STDOUT: %Cpp.ref.loc8: <namespace> = name_ref Cpp, imports.%Cpp [concrete = imports.%Cpp]
|
||||
// CHECK:STDOUT: <elided>
|
||||
// CHECK:STDOUT: %SimpleString.ref: %str.3d4 = name_ref SimpleString, %String.val.1 [concrete = constants.%String.val.6e1]
|
||||
// CHECK:STDOUT: %SimpleString.ref: %str.3d4 = name_ref SimpleString, %String.val.1 [concrete = constants.%String.val.2dc]
|
||||
// CHECK:STDOUT: %str.loc8: type = type_literal constants.%str.3d4 [concrete = constants.%str.3d4]
|
||||
// CHECK:STDOUT: %a: %str.3d4 = wrapper_binding a, %SimpleString.ref
|
||||
// CHECK:STDOUT: name_binding_decl {
|
||||
@@ -1432,7 +1432,7 @@ let _: C(1) = {} as C(Cpp.COUNT);
|
||||
// CHECK:STDOUT: }
|
||||
// CHECK:STDOUT: %Cpp.ref.loc9: <namespace> = name_ref Cpp, imports.%Cpp [concrete = imports.%Cpp]
|
||||
// CHECK:STDOUT: <elided>
|
||||
// CHECK:STDOUT: %EmptyString.ref: %str.3d4 = name_ref EmptyString, %String.val.2 [concrete = constants.%String.val.9fd]
|
||||
// CHECK:STDOUT: %EmptyString.ref: %str.3d4 = name_ref EmptyString, %String.val.2 [concrete = constants.%String.val.b11]
|
||||
// CHECK:STDOUT: %str.loc9: type = type_literal constants.%str.3d4 [concrete = constants.%str.3d4]
|
||||
// CHECK:STDOUT: %b: %str.3d4 = wrapper_binding b, %EmptyString.ref
|
||||
// CHECK:STDOUT: name_binding_decl {
|
||||
@@ -1440,7 +1440,7 @@ let _: C(1) = {} as C(Cpp.COUNT);
|
||||
// CHECK:STDOUT: }
|
||||
// CHECK:STDOUT: %Cpp.ref.loc10: <namespace> = name_ref Cpp, imports.%Cpp [concrete = imports.%Cpp]
|
||||
// CHECK:STDOUT: <elided>
|
||||
// CHECK:STDOUT: %EscapeCharacter.ref: %str.3d4 = name_ref EscapeCharacter, %String.val.3 [concrete = constants.%String.val.86a]
|
||||
// CHECK:STDOUT: %EscapeCharacter.ref: %str.3d4 = name_ref EscapeCharacter, %String.val.3 [concrete = constants.%String.val.5de]
|
||||
// CHECK:STDOUT: %str.loc10: type = type_literal constants.%str.3d4 [concrete = constants.%str.3d4]
|
||||
// CHECK:STDOUT: %c: %str.3d4 = wrapper_binding c, %EscapeCharacter.ref
|
||||
// CHECK:STDOUT: name_binding_decl {
|
||||
@@ -1448,7 +1448,7 @@ let _: C(1) = {} as C(Cpp.COUNT);
|
||||
// CHECK:STDOUT: }
|
||||
// CHECK:STDOUT: %Cpp.ref.loc11: <namespace> = name_ref Cpp, imports.%Cpp [concrete = imports.%Cpp]
|
||||
// CHECK:STDOUT: <elided>
|
||||
// CHECK:STDOUT: %Concatenated.ref: %str.3d4 = name_ref Concatenated, %String.val.4 [concrete = constants.%String.val.efd]
|
||||
// CHECK:STDOUT: %Concatenated.ref: %str.3d4 = name_ref Concatenated, %String.val.4 [concrete = constants.%String.val.c5e]
|
||||
// CHECK:STDOUT: %str.loc11: type = type_literal constants.%str.3d4 [concrete = constants.%str.3d4]
|
||||
// CHECK:STDOUT: %d: %str.3d4 = wrapper_binding d, %Concatenated.ref
|
||||
// CHECK:STDOUT: name_binding_decl {
|
||||
@@ -1456,7 +1456,7 @@ let _: C(1) = {} as C(Cpp.COUNT);
|
||||
// CHECK:STDOUT: }
|
||||
// CHECK:STDOUT: %Cpp.ref.loc12: <namespace> = name_ref Cpp, imports.%Cpp [concrete = imports.%Cpp]
|
||||
// CHECK:STDOUT: <elided>
|
||||
// CHECK:STDOUT: %RawString.ref: %str.3d4 = name_ref RawString, %String.val.5 [concrete = constants.%String.val.70a]
|
||||
// CHECK:STDOUT: %RawString.ref: %str.3d4 = name_ref RawString, %String.val.5 [concrete = constants.%String.val.593]
|
||||
// CHECK:STDOUT: %str.loc12: type = type_literal constants.%str.3d4 [concrete = constants.%str.3d4]
|
||||
// CHECK:STDOUT: %e: %str.3d4 = wrapper_binding e, %RawString.ref
|
||||
// CHECK:STDOUT: name_binding_decl {
|
||||
@@ -1464,7 +1464,7 @@ let _: C(1) = {} as C(Cpp.COUNT);
|
||||
// CHECK:STDOUT: }
|
||||
// CHECK:STDOUT: %Cpp.ref.loc13: <namespace> = name_ref Cpp, imports.%Cpp [concrete = imports.%Cpp]
|
||||
// CHECK:STDOUT: <elided>
|
||||
// CHECK:STDOUT: %Utf8String.ref: %str.3d4 = name_ref Utf8String, %String.val.6 [concrete = constants.%String.val.711]
|
||||
// CHECK:STDOUT: %Utf8String.ref: %str.3d4 = name_ref Utf8String, %String.val.6 [concrete = constants.%String.val.7f0]
|
||||
// CHECK:STDOUT: %str.loc13: type = type_literal constants.%str.3d4 [concrete = constants.%str.3d4]
|
||||
// CHECK:STDOUT: %f: %str.3d4 = wrapper_binding f, %Utf8String.ref
|
||||
// CHECK:STDOUT: name_binding_decl {
|
||||
@@ -1472,7 +1472,7 @@ let _: C(1) = {} as C(Cpp.COUNT);
|
||||
// CHECK:STDOUT: }
|
||||
// CHECK:STDOUT: %Cpp.ref.loc14: <namespace> = name_ref Cpp, imports.%Cpp [concrete = imports.%Cpp]
|
||||
// CHECK:STDOUT: <elided>
|
||||
// CHECK:STDOUT: %Indirect.ref: %str.3d4 = name_ref Indirect, %String.val.7 [concrete = constants.%String.val.fce]
|
||||
// CHECK:STDOUT: %Indirect.ref: %str.3d4 = name_ref Indirect, %String.val.7 [concrete = constants.%String.val.41b]
|
||||
// CHECK:STDOUT: %str.loc14: type = type_literal constants.%str.3d4 [concrete = constants.%str.3d4]
|
||||
// CHECK:STDOUT: %g: %str.3d4 = wrapper_binding g, %Indirect.ref
|
||||
// CHECK:STDOUT: name_binding_decl {
|
||||
|
||||
@@ -83,11 +83,11 @@ fn TestStringIndexing() {
|
||||
// CHECK:STDOUT: %C: type = class_type @C [concrete]
|
||||
// CHECK:STDOUT: %str.3d4: 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: %i64: type = class_type @Int, @Int(%int_64) [concrete]
|
||||
// CHECK:STDOUT: %char: type = class_type @Char [concrete]
|
||||
// CHECK:STDOUT: %ptr.b46: type = ptr_type %char [concrete]
|
||||
// CHECK:STDOUT: %str.4f8: %ptr.b46 = string_literal "Test" [concrete]
|
||||
// CHECK:STDOUT: %int_4: %u64 = int_value 4 [concrete]
|
||||
// CHECK:STDOUT: %int_4: %i64 = int_value 4 [concrete]
|
||||
// CHECK:STDOUT: %String.val: %str.3d4 = struct_value (%str.4f8, %int_4) [concrete]
|
||||
// CHECK:STDOUT: }
|
||||
// CHECK:STDOUT:
|
||||
@@ -95,7 +95,7 @@ fn TestStringIndexing() {
|
||||
// CHECK:STDOUT: !entry:
|
||||
// CHECK:STDOUT: <elided>
|
||||
// CHECK:STDOUT: %str: %ptr.b46 = string_literal "Test" [concrete = constants.%str.4f8]
|
||||
// CHECK:STDOUT: %int_4: %u64 = int_value 4 [concrete = constants.%int_4]
|
||||
// CHECK:STDOUT: %int_4: %i64 = int_value 4 [concrete = constants.%int_4]
|
||||
// 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: <elided>
|
||||
@@ -109,14 +109,13 @@ fn TestStringIndexing() {
|
||||
// CHECK:STDOUT: %c.patt: %pattern_type.2ff = value_binding_pattern c [concrete]
|
||||
// CHECK:STDOUT: %str.3d4: 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: %i64: type = class_type @Int, @Int(%int_64) [concrete]
|
||||
// CHECK:STDOUT: %ptr.b46: type = ptr_type %char [concrete]
|
||||
// CHECK:STDOUT: %str.4f8: %ptr.b46 = string_literal "Test" [concrete]
|
||||
// CHECK:STDOUT: %int_4: %u64 = int_value 4 [concrete]
|
||||
// CHECK:STDOUT: %int_4: %i64 = int_value 4 [concrete]
|
||||
// CHECK:STDOUT: %String.val: %str.3d4 = struct_value (%str.4f8, %int_4) [concrete]
|
||||
// CHECK:STDOUT: %int_0: Core.IntLiteral = int_value 0 [concrete]
|
||||
// CHECK:STDOUT: %IndexWith.type.385: type = facet_type <@IndexWith, @IndexWith(Core.IntLiteral)> [concrete]
|
||||
// CHECK:STDOUT: %i64: type = class_type @Int, @Int(%int_64) [concrete]
|
||||
// CHECK:STDOUT: %ImplicitAs.type.221: type = facet_type <@ImplicitAs, @ImplicitAs(%i64)> [concrete]
|
||||
// CHECK:STDOUT: %T.2f3: %ImplicitAs.type.221 = symbolic_binding T, 0 [symbolic]
|
||||
// CHECK:STDOUT: %str.as.IndexWith.impl.At.type.62e: type = fn_type @str.as.IndexWith.impl.At, @str.as.IndexWith.impl(%T.2f3) [symbolic]
|
||||
@@ -149,7 +148,7 @@ fn TestStringIndexing() {
|
||||
// CHECK:STDOUT: fn @TestStringIndexing() {
|
||||
// CHECK:STDOUT: !entry:
|
||||
// CHECK:STDOUT: %str.loc5: %ptr.b46 = string_literal "Test" [concrete = constants.%str.4f8]
|
||||
// CHECK:STDOUT: %int_4.loc5: %u64 = int_value 4 [concrete = constants.%int_4]
|
||||
// CHECK:STDOUT: %int_4.loc5: %i64 = int_value 4 [concrete = constants.%int_4]
|
||||
// CHECK:STDOUT: %String.val.loc5: %str.3d4 = struct_value (%str.loc5, %int_4.loc5) [concrete = constants.%String.val]
|
||||
// CHECK:STDOUT: %int_0: Core.IntLiteral = int_value 0 [concrete = constants.%int_0]
|
||||
// CHECK:STDOUT: %impl.elem1.loc5: %.197 = impl_witness_access constants.%IndexWith.impl_witness.47e, element1 [concrete = constants.%str.as.IndexWith.impl.At.19c]
|
||||
@@ -169,7 +168,7 @@ fn TestStringIndexing() {
|
||||
// CHECK:STDOUT: %c.patt: %pattern_type.2ff = value_binding_pattern c [concrete = constants.%c.patt]
|
||||
// CHECK:STDOUT: }
|
||||
// CHECK:STDOUT: %str.loc6: %ptr.b46 = string_literal "Test" [concrete = constants.%str.4f8]
|
||||
// CHECK:STDOUT: %int_4.loc6: %u64 = int_value 4 [concrete = constants.%int_4]
|
||||
// CHECK:STDOUT: %int_4.loc6: %i64 = int_value 4 [concrete = constants.%int_4]
|
||||
// CHECK:STDOUT: %String.val.loc6: %str.3d4 = struct_value (%str.loc6, %int_4.loc6) [concrete = constants.%String.val]
|
||||
// CHECK:STDOUT: %int_3: Core.IntLiteral = int_value 3 [concrete = constants.%int_3]
|
||||
// CHECK:STDOUT: %impl.elem1.loc6: %.197 = impl_witness_access constants.%IndexWith.impl_witness.47e, element1 [concrete = constants.%str.as.IndexWith.impl.At.19c]
|
||||
|
||||
+5
-5
@@ -41,29 +41,29 @@ fn Copy(s: str) -> str {
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: @0 = private unnamed_addr constant [6 x i8] c"Hello\00", align 1
|
||||
// CHECK:STDOUT: @1 = private unnamed_addr constant [6 x i8] c"World\00", align 1
|
||||
// CHECK:STDOUT: @String.val.75d.String.val = internal constant { ptr, i64 } { ptr @0, i64 5 }
|
||||
// CHECK:STDOUT: @String.val.2f1.String.val = internal constant { ptr, i64 } { ptr @1, i64 5 }
|
||||
// CHECK:STDOUT: @String.val.a16.String.val = internal constant { ptr, i64 } { ptr @0, i64 5 }
|
||||
// CHECK:STDOUT: @String.val.296.String.val = internal constant { ptr, i64 } { ptr @1, i64 5 }
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: declare void @_CF.Main(ptr)
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: ; Function Attrs: nounwind
|
||||
// CHECK:STDOUT: define void @_CG.Main() #0 !dbg !4 {
|
||||
// CHECK:STDOUT: entry:
|
||||
// CHECK:STDOUT: call void @_CF.Main(ptr @String.val.75d.String.val), !dbg !7
|
||||
// CHECK:STDOUT: call void @_CF.Main(ptr @String.val.a16.String.val), !dbg !7
|
||||
// CHECK:STDOUT: ret void, !dbg !8
|
||||
// CHECK:STDOUT: }
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: ; Function Attrs: nounwind
|
||||
// CHECK:STDOUT: define void @_CH.Main() #0 !dbg !9 {
|
||||
// CHECK:STDOUT: entry:
|
||||
// CHECK:STDOUT: call void @_CF.Main(ptr @String.val.75d.String.val), !dbg !10
|
||||
// CHECK:STDOUT: call void @_CF.Main(ptr @String.val.a16.String.val), !dbg !10
|
||||
// CHECK:STDOUT: ret void, !dbg !11
|
||||
// CHECK:STDOUT: }
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: ; Function Attrs: nounwind
|
||||
// CHECK:STDOUT: define void @_CI.Main() #0 !dbg !12 {
|
||||
// CHECK:STDOUT: entry:
|
||||
// CHECK:STDOUT: call void @_CF.Main(ptr @String.val.2f1.String.val), !dbg !13
|
||||
// CHECK:STDOUT: call void @_CF.Main(ptr @String.val.296.String.val), !dbg !13
|
||||
// CHECK:STDOUT: ret void, !dbg !14
|
||||
// CHECK:STDOUT: }
|
||||
// CHECK:STDOUT:
|
||||
|
||||
Reference in New Issue
Block a user