diff --git a/include/revng/Model/PrimitiveType.h b/include/revng/Model/PrimitiveType.h index fa4e97819..85406a4ab 100644 --- a/include/revng/Model/PrimitiveType.h +++ b/include/revng/Model/PrimitiveType.h @@ -25,8 +25,10 @@ TUPLE-TREE-YAML */ class model::PrimitiveType : public model::generated::PrimitiveType { public: using generated::PrimitiveType::PrimitiveType; - // TODO: these do not conform to the constructors convention - PrimitiveType() : generated::PrimitiveType(){}; + + // These constructors have to be overridden because primitive type IDs + // are special: they are never randomly generated and instead depend on + // the type specifics. explicit PrimitiveType(uint64_t ID); PrimitiveType(PrimitiveTypeKind::Values PrimitiveKind, uint8_t ByteSize); diff --git a/include/revng/Model/Type.h b/include/revng/Model/Type.h index 3adfe2313..18c7ec56d 100644 --- a/include/revng/Model/Type.h +++ b/include/revng/Model/Type.h @@ -53,16 +53,12 @@ public: static constexpr const auto AssociatedKind = TypeKind::Invalid; public: - // TODO: Constructors cannot be inherited, since the default one is - // manually implemented in order to generate a random ID - Type(); + using generated::Type::Type; + + // Constructors that do not accept an ID have to be overridden because they + // need to generate a random one. Type(TypeKind::Values TK); - Type(TypeKind::Values Kind, uint64_t ID) : Type(Kind, ID, Identifier(), "") {} - Type(TypeKind::Values Kind, - uint64_t ID, - Identifier CustomName, - std::string OriginalName) : - model::generated::Type(Kind, ID, CustomName, OriginalName) {} + Type(); public: static bool classof(const Type *T) { return classof(T->key()); } diff --git a/lib/Model/Type.cpp b/lib/Model/Type.cpp index 079825177..218cae71a 100644 --- a/lib/Model/Type.cpp +++ b/lib/Model/Type.cpp @@ -517,14 +517,6 @@ static uint64_t makePrimitiveID(PrimitiveTypeKind::Values PrimitiveKind, return (static_cast(PrimitiveKind) << 8) | Size; } -static PrimitiveTypeKind::Values getPrimitiveKind(uint64_t ID) { - return static_cast(ID >> 8); -} - -static uint8_t getPrimitiveSize(uint64_t ID) { - return ID & ((1 << 8) - 1); -} - PrimitiveType::PrimitiveType(PrimitiveTypeKind::Values PrimitiveKind, uint8_t Size) : PrimitiveType(AssociatedKind, @@ -535,6 +527,14 @@ PrimitiveType::PrimitiveType(PrimitiveTypeKind::Values PrimitiveKind, Size) { } +static PrimitiveTypeKind::Values getPrimitiveKind(uint64_t ID) { + return static_cast(ID >> 8); +} + +static uint8_t getPrimitiveSize(uint64_t ID) { + return ID & ((1 << 8) - 1); +} + PrimitiveType::PrimitiveType(uint64_t ID) : PrimitiveType(AssociatedKind, ID,