return;
}
j = dir.SkipBlanks(j + 1);
+ while (tokens > 0 && dir.TokenAt(tokens - 1).IsBlank()) {
+ --tokens;
+ }
if (j == tokens) {
return;
}
} else if (dirName == "error") {
prescanner->Say(
dir.GetIntervalProvenanceRange(dirOffset, tokens - dirOffset),
- "#error: %s"_err_en_US, dir.ToString().data());
- } else if (dirName == "warning") {
+ "%s"_err_en_US, dir.ToString().data());
+ } else if (dirName == "warning" || dirName == "comment" ||
+ dirName == "note") {
prescanner->Say(
dir.GetIntervalProvenanceRange(dirOffset, tokens - dirOffset),
- "#warning: %s"_en_US, dir.ToString().data());
+ "%s"_en_US, dir.ToString().data());
} else if (dirName == "include") {
if (j == tokens) {
prescanner->Say(
}
std::string include;
if (dir.TokenAt(j).ToString() == "<") {
- if (dir.TokenAt(tokens - 1).ToString() != ">") {
+ std::size_t k{j + 1};
+ if (k >= tokens) {
prescanner->Say(dir.GetIntervalProvenanceRange(j, tokens - j),
- "#include: expected '>' at end of directive"_err_en_US);
+ "#include: file name missing"_err_en_US);
return;
}
- TokenSequence braced{dir, j + 1, tokens - j - 2};
+ while (k < tokens && dir.TokenAt(k) != ">") {
+ ++k;
+ }
+ if (k >= tokens) {
+ prescanner->Say(dir.GetIntervalProvenanceRange(j, tokens - j),
+ "#include: expected '>' at end of included file"_en_US);
+ } else if (k + 1 < tokens) {
+ prescanner->Say(dir.GetIntervalProvenanceRange(k + 1, tokens - k - 1),
+ "#include: extra stuff ignored after '>'"_en_US);
+ }
+ TokenSequence braced{dir, j + 1, k - j - 1};
include = ReplaceMacros(braced, *prescanner).ToString();
} else if (j + 1 == tokens &&
(include = dir.TokenAt(j).ToString()).substr(0, 1) == "\"" &&