Detect duplicate struct member names (#2764)

Detect struct literal or struct type literal member duplicate name

Closes #2762
This commit is contained in:
Amr Hesham
2023-04-12 16:24:29 -07:00
committed by GitHub
parent 694dd7bf55
commit 0fd0855da0
3 changed files with 45 additions and 2 deletions
+15 -2
View File
@@ -320,19 +320,32 @@ auto NameResolver::ResolveNames(Expression& expression,
CARBON_RETURN_IF_ERROR(ResolveNames(*field, enclosing_scope));
}
break;
case ExpressionKind::StructLiteral:
case ExpressionKind::StructLiteral: {
std::set<std::string_view> member_names;
for (FieldInitializer& init : cast<StructLiteral>(expression).fields()) {
CARBON_RETURN_IF_ERROR(
ResolveNames(init.expression(), enclosing_scope));
if (!member_names.insert(init.name()).second) {
return ProgramError(init.expression().source_loc())
<< "Duplicate name `" << init.name() << "` in struct literal";
}
}
break;
case ExpressionKind::StructTypeLiteral:
}
case ExpressionKind::StructTypeLiteral: {
std::set<std::string_view> member_names;
for (FieldInitializer& init :
cast<StructTypeLiteral>(expression).fields()) {
CARBON_RETURN_IF_ERROR(
ResolveNames(init.expression(), enclosing_scope));
if (!member_names.insert(init.name()).second) {
return ProgramError(init.expression().source_loc())
<< "Duplicate name `" << init.name()
<< "` in struct type literal";
}
}
break;
}
case ExpressionKind::IdentifierExpression: {
auto& identifier = cast<IdentifierExpression>(expression);
CARBON_ASSIGN_OR_RETURN(
@@ -0,0 +1,15 @@
// Part of the Carbon Language project, under the Apache License v2.0 with LLVM
// Exceptions. See /LICENSE for license information.
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
//
// AUTOUPDATE
// RUN: %{not} %{explorer-run}
// RUN: %{not} %{explorer-run-trace}
package ExplorerTest api;
fn Main() -> i32 {
// CHECK:STDERR: COMPILATION ERROR: {{.*}}/explorer/testdata/struct/fail_struct_literal_duplicate_member.carbon:[[@LINE+1]]: Duplicate name `x` in struct literal
var x: auto = {.x = 0, .x = 0};
return 0;
}
@@ -0,0 +1,15 @@
// Part of the Carbon Language project, under the Apache License v2.0 with LLVM
// Exceptions. See /LICENSE for license information.
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
//
// AUTOUPDATE
// RUN: %{not} %{explorer-run}
// RUN: %{not} %{explorer-run-trace}
package ExplorerTest api;
fn Main() -> i32 {
// CHECK:STDERR: COMPILATION ERROR: {{.*}}/explorer/testdata/struct/fail_struct_type_literal_duplicate_member.carbon:[[@LINE+1]]: Duplicate name `x` in struct type literal
var y: {.x: i32, .x: i32};
return 0;
}