Convert first Print argument to String before evaluating (#1548)

Fixes #1439.
This commit is contained in:
Thejaswi Kadur
2022-07-27 10:29:09 -07:00
committed by GitHub
parent 2430c31ea2
commit 790e075986
2 changed files with 35 additions and 5 deletions
+8 -5
View File
@@ -1156,15 +1156,18 @@ auto Interpreter::StepExp() -> ErrorOr<Success> {
switch (cast<IntrinsicExpression>(exp).intrinsic()) {
case IntrinsicExpression::Intrinsic::Print: {
const auto& args = cast<TupleValue>(*act.results()[0]).elements();
CARBON_ASSIGN_OR_RETURN(
Nonnull<const Value*> format_string_value,
Convert(args[0], arena_->New<StringType>(), exp.source_loc()));
const char* format_string =
cast<StringValue>(*format_string_value).value().c_str();
switch (args.size()) {
case 1:
llvm::outs() << llvm::formatv(
cast<StringValue>(*args[0]).value().c_str());
llvm::outs() << llvm::formatv(format_string);
break;
case 2:
llvm::outs() << llvm::formatv(
cast<StringValue>(*args[0]).value().c_str(),
cast<IntValue>(*args[1]).value());
llvm::outs() << llvm::formatv(format_string,
cast<IntValue>(*args[1]).value());
break;
default:
CARBON_FATAL() << "Unexpected arg count: " << args.size();