Reject duplicate built-in type definitions

This commit is contained in:
Kamil Śliwak 2023-09-18 14:01:32 +02:00
parent 017771032b
commit 0819e31de8
3 changed files with 37 additions and 1 deletions

View File

@ -172,7 +172,25 @@ void TypeRegistration::endVisit(TypeDefinition const& _typeDefinition)
return;
if (auto const* builtin = dynamic_cast<Builtin const*>(_typeDefinition.typeExpression()))
annotation(_typeDefinition).typeConstructor = annotation(*builtin).typeConstructor;
{
auto [previousDefinitionIt, inserted] = annotation().builtinTypeDefinitions.try_emplace(
builtin->nameParameter(),
&_typeDefinition
);
if (inserted)
annotation(_typeDefinition).typeConstructor = annotation(*builtin).typeConstructor;
else
{
auto const& [builtinName, previousDefinition] = *previousDefinitionIt;
m_errorReporter.typeError(
9609_error,
_typeDefinition.location(),
SecondarySourceLocation{}.append("Previous definition:", previousDefinition->location()),
"Duplicate builtin type definition."
);
}
}
else
annotation(_typeDefinition).typeConstructor = m_typeSystem.declareTypeConstructor(
_typeDefinition.name(),

View File

@ -42,6 +42,7 @@ public:
{
std::map<PrimitiveClass, TypeClassInstantiations> primitiveClassInstantiations;
std::map<BuiltinClass, TypeClassInstantiations> builtinClassInstantiations;
std::map<std::string, TypeDefinition const*> builtinTypeDefinitions;
};
TypeRegistration(Analysis& _analysis);

View File

@ -0,0 +1,17 @@
pragma experimental solidity;
type void1 = __builtin("void");
type void2 = __builtin("void");
type word1 = __builtin("word");
type word2 = __builtin("word");
type fun1(T, U) = __builtin("fun");
type fun2(T, U) = __builtin("fun");
// ====
// EVMVersion: >=constantinople
// ----
// Warning 2264: (0-29): Experimental features are turned on. Do not use experimental features on live deployments.
// TypeError 9609: (63-94): Duplicate builtin type definition.
// TypeError 9609: (128-159): Duplicate builtin type definition.
// TypeError 9609: (197-232): Duplicate builtin type definition.