Fix integer literal token printing. (#2050)

Summary:
An `llvm::APInt` is always treated as a signed value by `operator<<`;
check [1]. This resulted in printing incorrect values for tokens that
have their MSB set to 1. For example, a value 9 would be printed as -7
since its `APInt` object would be 4-bits wide. However, integer literals
are always tokenized without the sign character so it is safe to treat
the values as unsigned for printing pruposes.

[1] https://llvm.org/doxygen/APInt_8h_source.html

Co-authored-by: ergawy <kareem.ergawy@guardsquare.com>
This commit is contained in:
Kareem Ergawy
2022-08-17 09:29:07 -07:00
committed by GitHub
co-authored by ergawy
parent d6c72e3d33
commit 3d44169199
2 changed files with 16 additions and 1 deletions
+13
View File
@@ -1175,5 +1175,18 @@ TEST_F(LexerTest, PrintingAsYaml) {
{"spelling", ""}}}}));
}
TEST_F(LexerTest, PrintToken) {
auto buffer = Lex("0x9");
ASSERT_FALSE(buffer.has_errors());
std::string print_output;
llvm::raw_string_ostream print_stream(print_output);
buffer.Print(print_stream);
llvm::StringRef print = print_stream.str();
EXPECT_THAT(GetAndDropLine(print),
StrEq("token: { index: 0, kind: 'IntegerLiteral', line: 1, "
"column: 1, indent: 1, spelling: '0x9', value: `9`, "
"has_trailing_space: true }"));
}
} // namespace
} // namespace Carbon::Testing