mirror of
https://github.com/carbon-language/carbon-lang.git
synced 2026-10-05 22:02:55 +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(
|
||||
|
||||
Reference in New Issue
Block a user