diff options
-rw-r--r-- | expr.c | 10 | ||||
-rw-r--r-- | scan.c | 24 |
2 files changed, 29 insertions, 5 deletions
@@ -342,7 +342,10 @@ primaryexpr(struct scope *s) do { e->string.data = xreallocarray(e->string.data, e->string.size + strlen(tok.lit), 1); dst = e->string.data + e->string.size; - for (src = tok.lit + 1; *src != '"'; ++dst) + src = tok.lit; + if (*src != '"') + fatal("wide string literal not yet implemented"); + for (++src; *src != '"'; ++dst) *dst = unescape(&src); e->string.size = dst - e->string.data; next(); @@ -352,7 +355,10 @@ primaryexpr(struct scope *s) e = decay(e); break; case TCHARCONST: - src = tok.lit + 1; + src = tok.lit; + if (*src != '\'') + fatal("wide character constant not yet implemented"); + ++src; e = mkconstexpr(&typeint, unescape(&src)); if (*src != '\'') error(&tok.loc, "character constant contains more than one character: %c", *src); @@ -122,8 +122,8 @@ static int ident(struct scanner *s) { s->usebuf = true; - do nextchar(s); - while (isalnum(s->chr) || s->chr == '_'); + while (isalnum(s->chr) || s->chr == '_') + nextchar(s); return TIDENT; } @@ -285,7 +285,6 @@ again: return op2(s, TMOD, TMODASSIGN); case '&': return op3(s, TBAND, TBANDASSIGN, TLAND); - // TODO: u8, U, and L string literals case '\'': return charconst(s); case '*': @@ -367,6 +366,25 @@ again: case ',': nextchar(s); return TCOMMA; + case 'L': + case 'U': + case 'u': + s->usebuf = true; + nextchar(s); + switch (s->chr) { + case '\'': + return charconst(s); + case '8': + if (s->buf.str[0] != 'u') + break; + nextchar(s); + if (s->chr != '"') + break; + /* fallthrough */ + case '"': + return stringlit(s); + } + return ident(s); case EOF: return TEOF; default: |