Richard Smith пре 7 месеци
родитељ
комит
6086d6eef2
2 измењених фајлова са 19 додато и 0 уклоњено
  1. 4 0
      core/prelude/types/string.carbon
  2. 15 0
      toolchain/lower/testdata/primitives/string.carbon

+ 4 - 0
core/prelude/types/string.carbon

@@ -12,6 +12,10 @@ import library "prelude/types/uint";
 class String {
   fn Size[self: Self]() -> u64 { return self.size; }
 
+  impl as Copy {
+    fn Op[self: Self]() -> Self { return {.ptr = self.ptr, .size = self.size}; }
+  }
+
   // TODO: This should be an array iterator.
   private var ptr: Char*;
   // TODO: This should be a word-sized integer.

+ 15 - 0
toolchain/lower/testdata/primitives/string.carbon

@@ -31,6 +31,10 @@ fn I() {
   F(v);
 }
 
+fn Copy(s: str) -> str {
+  return s;
+}
+
 // CHECK:STDOUT: ; ModuleID = 'string.carbon'
 // CHECK:STDOUT: source_filename = "string.carbon"
 // CHECK:STDOUT:
@@ -59,6 +63,14 @@ fn I() {
 // CHECK:STDOUT:   ret void, !dbg !14
 // CHECK:STDOUT: }
 // CHECK:STDOUT:
+// CHECK:STDOUT: define void @_CCopy.Main(ptr sret({ ptr, i64 }) %return, ptr %s) !dbg !15 {
+// CHECK:STDOUT: entry:
+// CHECK:STDOUT:   call void @"_COp.String.Core:Copy.Core"(ptr %return, ptr %s), !dbg !16
+// CHECK:STDOUT:   ret void, !dbg !17
+// CHECK:STDOUT: }
+// CHECK:STDOUT:
+// CHECK:STDOUT: declare void @"_COp.String.Core:Copy.Core"(ptr sret({ ptr, i64 }), ptr)
+// CHECK:STDOUT:
 // CHECK:STDOUT: !llvm.module.flags = !{!0, !1}
 // CHECK:STDOUT: !llvm.dbg.cu = !{!2}
 // CHECK:STDOUT:
@@ -77,3 +89,6 @@ fn I() {
 // CHECK:STDOUT: !12 = distinct !DISubprogram(name: "I", linkageName: "_CI.Main", scope: null, file: !3, line: 28, type: !5, spFlags: DISPFlagDefinition, unit: !2)
 // CHECK:STDOUT: !13 = !DILocation(line: 31, column: 3, scope: !12)
 // CHECK:STDOUT: !14 = !DILocation(line: 28, column: 1, scope: !12)
+// CHECK:STDOUT: !15 = distinct !DISubprogram(name: "Copy", linkageName: "_CCopy.Main", scope: null, file: !3, line: 34, type: !5, spFlags: DISPFlagDefinition, unit: !2)
+// CHECK:STDOUT: !16 = !DILocation(line: 35, column: 10, scope: !15)
+// CHECK:STDOUT: !17 = !DILocation(line: 35, column: 3, scope: !15)