diff --git a/src/lib/check_compliance.cpp b/src/lib/check_compliance.cpp index a70abeb..0ad1182 100644 --- a/src/lib/check_compliance.cpp +++ b/src/lib/check_compliance.cpp @@ -93,6 +93,25 @@ namespace contractverify RETURN_IF_FALSE(checkTemplSpec(fwdDecl.templateSpecification().value(), stateStructName, analysisData)); return true; } + + bool checkEnum(const cppast::CppEnum& enumDecl, AnalysisData& analysisData) + { + analysisData.additionalScopePrefixes.push_back(enumDecl.name()); + + if (!enumDecl.name().empty() && !enumDecl.underlyingType().empty()) + { + RETURN_IF_FALSE(isTypeAllowed(enumDecl.underlyingType(), analysisData.additionalScopePrefixes)); + + if (isTypeAllowedAsIO(enumDecl.underlyingType(), analysisData)) + { + std::vector scopedName = analysisData.scopeNames; + scopedName.push_back(enumDecl.name()); + analysisData.additionalInputOutputTypes.push_back(std::move(scopedName)); + } + } + + return true; + } } // namespace @@ -198,8 +217,7 @@ namespace contractverify return true; case cppast::CppEntityType::ENUM: - analysisData.additionalScopePrefixes.push_back(static_cast(entity).name()); - return true; + return checkEnum(static_cast(entity), analysisData); case cppast::CppEntityType::MACRO_CALL: // macro arguments? but we are anyways restricted to the known macros diff --git a/test/contract_verify_test.cpp b/test/contract_verify_test.cpp index 598a035..b2f4617 100644 --- a/test/contract_verify_test.cpp +++ b/test/contract_verify_test.cpp @@ -195,6 +195,10 @@ namespace contractverify "test_ok_oracles.h", "Oracles" }, + { + "test_ok_input_output_enum_class_uint8.h", + "InputOutputEnumClassUint8" + }, }; FailureTestInfo failureTestInfos[] = diff --git a/test/testfiles/test_ok_input_output_enum_class_uint8.h b/test/testfiles/test_ok_input_output_enum_class_uint8.h new file mode 100644 index 0000000..8b299f1 --- /dev/null +++ b/test/testfiles/test_ok_input_output_enum_class_uint8.h @@ -0,0 +1,16 @@ +using namespace QPI; + +struct TESTCON : public ContractBase +{ +public: + enum class EAuctionType : uint8 + { + English = 0, + Dutch = 1, + }; + + struct GetAuction_output + { + EAuctionType auctionType; + }; +};