modernc.org/gc@v1.0.1-0.20240304020402-f0dba7c97c2b/testdata/errchk/test/string_lit.go (about) 1 // run 2 3 // Copyright 2009 The Go Authors. All rights reserved. 4 // Use of this source code is governed by a BSD-style 5 // license that can be found in the LICENSE file. 6 7 // Test string literal syntax. 8 9 package main 10 11 import "os" 12 13 var ecode int 14 15 func assert(a, b, c string) { 16 if a != b { 17 ecode = 1 18 print("FAIL: ", c, ": ", a, "!=", b, "\n") 19 var max int = len(a) 20 if len(b) > max { 21 max = len(b) 22 } 23 for i := 0; i < max; i++ { 24 ac := 0 25 bc := 0 26 if i < len(a) { 27 ac = int(a[i]) 28 } 29 if i < len(b) { 30 bc = int(b[i]) 31 } 32 if ac != bc { 33 print("\ta[", i, "] = ", ac, "; b[", i, "] =", bc, "\n") 34 } 35 } 36 panic("string_lit") 37 } 38 } 39 40 const ( 41 gx1 = "aä本☺" 42 gx2 = "aä\xFF\xFF本☺" 43 gx2fix = "aä\uFFFD\uFFFD本☺" 44 ) 45 46 var ( 47 gr1 = []rune(gx1) 48 gr2 = []rune(gx2) 49 gb1 = []byte(gx1) 50 gb2 = []byte(gx2) 51 ) 52 53 func main() { 54 ecode = 0 55 s := 56 "" + 57 " " + 58 "'`" + 59 "a" + 60 "ä" + 61 "本" + 62 "\a\b\f\n\r\t\v\\\"" + 63 "\000\123\x00\xca\xFE\u0123\ubabe\U0000babe" + 64 65 `` + 66 ` ` + 67 `'"` + 68 `a` + 69 `ä` + 70 `本` + 71 `\a\b\f\n\r\t\v\\\'` + 72 `\000\123\x00\xca\xFE\u0123\ubabe\U0000babe` + 73 `\x\u\U\` 74 75 assert("", ``, "empty") 76 assert(" ", " ", "blank") 77 assert("\x61", "a", "lowercase a") 78 assert("\x61", `a`, "lowercase a (backquote)") 79 assert("\u00e4", "ä", "a umlaut") 80 assert("\u00e4", `ä`, "a umlaut (backquote)") 81 assert("\u672c", "本", "nihon") 82 assert("\u672c", `本`, "nihon (backquote)") 83 assert("\x07\x08\x0c\x0a\x0d\x09\x0b\x5c\x22", 84 "\a\b\f\n\r\t\v\\\"", 85 "backslashes") 86 assert("\\a\\b\\f\\n\\r\\t\\v\\\\\\\"", 87 `\a\b\f\n\r\t\v\\\"`, 88 "backslashes (backquote)") 89 assert("\x00\x53\000\xca\376S몾몾", 90 "\000\123\x00\312\xFE\u0053\ubabe\U0000babe", 91 "backslashes 2") 92 assert("\\000\\123\\x00\\312\\xFE\\u0123\\ubabe\\U0000babe", 93 `\000\123\x00\312\xFE\u0123\ubabe\U0000babe`, 94 "backslashes 2 (backquote)") 95 assert("\\x\\u\\U\\", `\x\u\U\`, "backslash 3 (backquote)") 96 97 // test large and surrogate-half runes. perhaps not the most logical place for these tests. 98 var r int32 99 r = 0x10ffff // largest rune value 100 s = string(r) 101 assert(s, "\xf4\x8f\xbf\xbf", "largest rune") 102 r = 0x10ffff + 1 103 s = string(r) 104 assert(s, "\xef\xbf\xbd", "too-large rune") 105 r = 0xD800 106 s = string(r) 107 assert(s, "\xef\xbf\xbd", "surrogate rune min") 108 r = 0xDFFF 109 s = string(r) 110 assert(s, "\xef\xbf\xbd", "surrogate rune max") 111 r = -1 112 s = string(r) 113 assert(s, "\xef\xbf\xbd", "negative rune") 114 115 // the large rune tests again, this time using constants instead of a variable. 116 // these conversions will be done at compile time. 117 s = string(0x10ffff) // largest rune value 118 assert(s, "\xf4\x8f\xbf\xbf", "largest rune constant") 119 s = string(0x10ffff + 1) 120 assert(s, "\xef\xbf\xbd", "too-large rune constant") 121 s = string(0xD800) 122 assert(s, "\xef\xbf\xbd", "surrogate rune min constant") 123 s = string(0xDFFF) 124 assert(s, "\xef\xbf\xbd", "surrogate rune max constant") 125 s = string(-1) 126 assert(s, "\xef\xbf\xbd", "negative rune") 127 128 // the large rune tests yet again, with a slice. 129 rs := []rune{0x10ffff, 0x10ffff + 1, 0xD800, 0xDFFF, -1} 130 s = string(rs) 131 assert(s, "\xf4\x8f\xbf\xbf\xef\xbf\xbd\xef\xbf\xbd\xef\xbf\xbd\xef\xbf\xbd", "large rune slice") 132 133 assert(string(gr1), gx1, "global ->[]rune") 134 assert(string(gr2), gx2fix, "global invalid ->[]rune") 135 assert(string(gb1), gx1, "->[]byte") 136 assert(string(gb2), gx2, "global invalid ->[]byte") 137 138 var ( 139 r1 = []rune(gx1) 140 r2 = []rune(gx2) 141 b1 = []byte(gx1) 142 b2 = []byte(gx2) 143 ) 144 assert(string(r1), gx1, "->[]rune") 145 assert(string(r2), gx2fix, "invalid ->[]rune") 146 assert(string(b1), gx1, "->[]byte") 147 assert(string(b2), gx2, "invalid ->[]byte") 148 149 os.Exit(ecode) 150 }