/* * '\\' has a special meaning on phase 2 if and only if it is immediately * followed by '\n'. In any other position it's left alone as any other * character. * * [5.1.1.2(1.2)]: * Each instance of a backslash character (\) immediately followed by * a new-line character is deleted, splicing physical source lines to * form logical source lines. Only the last backslash on any physical * source line shall be eligible for being part of such a splice. * A source file that is not empty shall end in a new-line character, * which shall not be immediately preceded by a backslash character * before any such splicing takes place. * * Note that this happens on the phase 2, before we even think of any * tokens. In other words, splicing is ignorant of and transparent for * the rest of tokenizer. */ #define A(x) #x #define B(x) A(x) /* This should result in "\a" */ /* XXX: currently sparse produces "a" */ /* Partially fixed: now it gives "\\a", which is a separate problem */ B(\a) #define C\ 1 /* This should give 1 */ C #define D\ 1 /* And this should give D, since '\n' is removed and we get no whitespace */ /* XXX: currently sparse produces 1 */ /* Fixed */ D #define E '\\ a' /* This should give '\a' - with no warnings issued */ /* XXX: currently sparse complains a lot and ends up producing a */ /* Fixed */ E /* This should give nothing */ /* XXX: currently sparse produces more junk */ /* Fixed */ // junk \ more junk /* This should also give nothing */ /* XXX: currently sparse produces / * comment * / */ /* Fixed */ /\ * comment *\ / /* And this should complain since final newline should not be eaten by '\\' */ /* XXX: currently sparse does not notice */ /* Fixed */ \