diff --git a/explorer/ast/value.cpp b/explorer/ast/value.cpp index 8a46b811cae8..04fa25514555 100644 --- a/explorer/ast/value.cpp +++ b/explorer/ast/value.cpp @@ -414,10 +414,14 @@ void Value::Print(llvm::raw_ostream& out) const { case Value::Kind::TupleValue: { out << "("; llvm::ListSeparator sep; - for (Nonnull element : - cast(*this).elements()) { + const auto elements = cast(*this).elements(); + for (Nonnull element : elements) { out << sep << *element; } + // Print trailing comma for single element tuples: (i32,). + if (elements.size() == 1) { + out << ","; + } out << ")"; break; } diff --git a/explorer/testdata/basic_syntax/fail_alternative_not_type.carbon b/explorer/testdata/basic_syntax/fail_alternative_not_type.carbon index 07c8830e409d..2acc2ac9bdd3 100644 --- a/explorer/testdata/basic_syntax/fail_alternative_not_type.carbon +++ b/explorer/testdata/basic_syntax/fail_alternative_not_type.carbon @@ -8,7 +8,7 @@ package ExplorerTest api; -// CHECK:STDERR: COMPILATION ERROR: {{.*}}/explorer/testdata/basic_syntax/fail_alternative_not_type.carbon:[[@LINE+1]]: type error in type expression: '(i32)' is not implicitly convertible to 'type' +// CHECK:STDERR: COMPILATION ERROR: {{.*}}/explorer/testdata/basic_syntax/fail_alternative_not_type.carbon:[[@LINE+1]]: type error in type expression: '(i32,)' is not implicitly convertible to 'type' choice C { X(42) } fn Main() -> i32 { diff --git a/explorer/testdata/impl_match/fail_tuple_recurse.carbon b/explorer/testdata/impl_match/fail_tuple_recurse.carbon index 380edcfdc84d..d822706dc3bd 100644 --- a/explorer/testdata/impl_match/fail_tuple_recurse.carbon +++ b/explorer/testdata/impl_match/fail_tuple_recurse.carbon @@ -17,7 +17,7 @@ fn F[T:! Foo](x: T) {} fn Main() -> i32 { // CHECK:STDERR: COMPILATION ERROR: {{.*}}/explorer/testdata/impl_match/fail_tuple_recurse.carbon:[[@LINE+3]]: impl matching recursively performed a more complex match using the same impl // CHECK:STDERR: outer match: i32 as interface Foo - // CHECK:STDERR: inner match: (i32) as interface Foo + // CHECK:STDERR: inner match: (i32,) as interface Foo F(0); return 0; } diff --git a/explorer/testdata/interface/fail_impl_bad_member.carbon b/explorer/testdata/interface/fail_impl_bad_member.carbon index ea6a8aaf4bae..118cdd26de73 100644 --- a/explorer/testdata/interface/fail_impl_bad_member.carbon +++ b/explorer/testdata/interface/fail_impl_bad_member.carbon @@ -23,8 +23,8 @@ class Point { fn Scale[self: Point](v: i32) -> i32 { return 0; // CHECK:STDERR: COMPILATION ERROR: {{.*}}/explorer/testdata/interface/fail_impl_bad_member.carbon:[[@LINE+3]]: type error in member of implementation - // CHECK:STDERR: expected: fn (i32) -> class Point - // CHECK:STDERR: actual: fn (i32) -> i32 + // CHECK:STDERR: expected: fn (i32,) -> class Point + // CHECK:STDERR: actual: fn (i32,) -> i32 } } } diff --git a/explorer/testdata/tuple/fail_equality_type.carbon b/explorer/testdata/tuple/fail_equality_type.carbon index 74099c9e6121..7a46e51ed710 100644 --- a/explorer/testdata/tuple/fail_equality_type.carbon +++ b/explorer/testdata/tuple/fail_equality_type.carbon @@ -11,7 +11,7 @@ package ExplorerTest api; fn Main() -> i32 { var t1: (i32, i32) = (5, 2); var t2: (i32,) = (5,); - // CHECK:STDERR: COMPILATION ERROR: {{.*}}/explorer/testdata/tuple/fail_equality_type.carbon:[[@LINE+1]]: (i32, i32) is not equality comparable with (i32) (could not find implementation of interface EqWith(U = (i32)) for (i32, i32)) + // CHECK:STDERR: COMPILATION ERROR: {{.*}}/explorer/testdata/tuple/fail_equality_type.carbon:[[@LINE+1]]: (i32, i32) is not equality comparable with (i32,) (could not find implementation of interface EqWith(U = (i32,)) for (i32, i32)) if (t1 == t2) { return 1; } else {