diff --git a/compiler/parser.v b/compiler/parser.v index 547ff461ea..faf2dfea98 100644 --- a/compiler/parser.v +++ b/compiler/parser.v @@ -2665,13 +2665,22 @@ fn (p mut Parser) cast(typ string) string { p.expected_type = '' // `string(buffer)` => `tos2(buffer)` // `string(buffer, len)` => `tos(buffer, len)` - if typ == 'string' && (expr_typ == 'byte*' || expr_typ == 'byteptr') { + // `string(bytes_array, len)` => `tos(bytes_array.data, len)` + is_byteptr := expr_typ == 'byte*' || expr_typ == 'byteptr' + is_bytearr := expr_typ == 'array_byte' + if typ == 'string' && (is_byteptr || is_bytearr) { if p.tok == .comma { p.check(.comma) p.cgen.set_placeholder(pos, 'tos(') + if is_bytearr { + p.gen('.data') + } p.gen(', ') p.check_types(p.expression(), 'int') } else { + if is_bytearr { + p.gen('.data') + } p.cgen.set_placeholder(pos, 'tos2(') } } diff --git a/vlib/builtin/string_test.v b/vlib/builtin/string_test.v index 5808ed4abe..96a57d01f9 100644 --- a/vlib/builtin/string_test.v +++ b/vlib/builtin/string_test.v @@ -328,4 +328,6 @@ fn test_bytes_to_string() { buf[4] = `o` assert string(buf) == 'hello' assert string(buf, 2) == 'he' + bytes := [`h`, `e`, `l`, `l`, `o`] + assert string(bytes) == 'hello' }