mirror of
https://github.com/rui314/chibicc
synced 2024-12-01 18:26:56 +03:00
Preserve newline and space during macro expansion
This commit is contained in:
parent
a8d76ad435
commit
8075582c21
@ -532,6 +532,8 @@ static Token *subst(Token *tok, MacroArg *args) {
|
|||||||
// before they are substituted into a macro body.
|
// before they are substituted into a macro body.
|
||||||
if (arg) {
|
if (arg) {
|
||||||
Token *t = preprocess2(arg->tok);
|
Token *t = preprocess2(arg->tok);
|
||||||
|
t->at_bol = tok->at_bol;
|
||||||
|
t->has_space = tok->has_space;
|
||||||
for (; t->kind != TK_EOF; t = t->next)
|
for (; t->kind != TK_EOF; t = t->next)
|
||||||
cur = cur->next = copy_token(t);
|
cur = cur->next = copy_token(t);
|
||||||
tok = tok->next;
|
tok = tok->next;
|
||||||
@ -563,6 +565,8 @@ static bool expand_macro(Token **rest, Token *tok) {
|
|||||||
Hideset *hs = hideset_union(tok->hideset, new_hideset(m->name));
|
Hideset *hs = hideset_union(tok->hideset, new_hideset(m->name));
|
||||||
Token *body = add_hideset(m->body, hs);
|
Token *body = add_hideset(m->body, hs);
|
||||||
*rest = append(body, tok->next);
|
*rest = append(body, tok->next);
|
||||||
|
(*rest)->at_bol = tok->at_bol;
|
||||||
|
(*rest)->has_space = tok->has_space;
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -587,6 +591,8 @@ static bool expand_macro(Token **rest, Token *tok) {
|
|||||||
Token *body = subst(m->body, args);
|
Token *body = subst(m->body, args);
|
||||||
body = add_hideset(body, hs);
|
body = add_hideset(body, hs);
|
||||||
*rest = append(body, tok->next);
|
*rest = append(body, tok->next);
|
||||||
|
(*rest)->at_bol = macro_token->at_bol;
|
||||||
|
(*rest)->has_space = macro_token->has_space;
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
16
test/macro.c
16
test/macro.c
@ -290,6 +290,22 @@ int main() {
|
|||||||
#endif
|
#endif
|
||||||
ASSERT(5, m);
|
ASSERT(5, m);
|
||||||
|
|
||||||
|
#define STR(x) #x
|
||||||
|
#define M12(x) STR(x)
|
||||||
|
#define M13(x) M12(foo.x)
|
||||||
|
ASSERT(0, strcmp(M13(bar), "foo.bar"));
|
||||||
|
|
||||||
|
#define M13(x) M12(foo. x)
|
||||||
|
ASSERT(0, strcmp(M13(bar), "foo. bar"));
|
||||||
|
|
||||||
|
#define M12 foo
|
||||||
|
#define M13(x) STR(x)
|
||||||
|
#define M14(x) M13(x.M12)
|
||||||
|
ASSERT(0, strcmp(M14(bar), "bar.foo"));
|
||||||
|
|
||||||
|
#define M14(x) M13(x. M12)
|
||||||
|
ASSERT(0, strcmp(M14(bar), "bar. foo"));
|
||||||
|
|
||||||
printf("OK\n");
|
printf("OK\n");
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user