mirror of
https://github.com/carbon-language/carbon-lang.git
synced 2026-10-05 13:11:05 +01:00
Detect duplicate struct member names (#2764)
Detect struct literal or struct type literal member duplicate name Closes #2762
This commit is contained in:
@@ -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;
|
||||
}
|
||||
Reference in New Issue
Block a user