From 157d9461b1e287568559670ecad6ffcb07ee64f8 Mon Sep 17 00:00:00 2001 From: Lucian Radu Teodorescu Date: Thu, 28 Nov 2019 22:23:57 +0200 Subject: [PATCH] Minor fixes in the conversion code --- src/SparrowFrontend/Helpers/CommonCode.cpp | 3 ++- src/SparrowFrontend/Helpers/SprTypeTraits.cpp | 5 ++--- .../Services/Convert/ConvertServiceImpl.cpp | 17 ++++++----------- .../Services/Convert/ConvertServiceImpl.h | 3 +-- src/SparrowFrontend/Services/IConvertService.h | 1 - unittests/SparrowFrontend/TestConvert.cpp | 2 +- 6 files changed, 12 insertions(+), 19 deletions(-) diff --git a/src/SparrowFrontend/Helpers/CommonCode.cpp b/src/SparrowFrontend/Helpers/CommonCode.cpp index 5d48b2b8..896e4c0d 100644 --- a/src/SparrowFrontend/Helpers/CommonCode.cpp +++ b/src/SparrowFrontend/Helpers/CommonCode.cpp @@ -244,7 +244,8 @@ NodeHandle SprFrontend::createTmpForRef(NodeHandle src, TypeWithStorage destType src.location(), StringRef("$tmpForRef"), TypeNode::create(src.location(), srcT)); auto varRef = VarRefExp::create(src.location(), var); auto store = MemStoreExp::create(src.location(), src, varRef); - auto cast = BitcastExp::create(src.location(), TypeNode::create(src.location(), destType), varRef); + auto cast = + BitcastExp::create(src.location(), TypeNode::create(src.location(), destType), varRef); return NodeList::create(src.location(), fromIniList({var, store, cast})); } diff --git a/src/SparrowFrontend/Helpers/SprTypeTraits.cpp b/src/SparrowFrontend/Helpers/SprTypeTraits.cpp index e562b256..58edfbd7 100644 --- a/src/SparrowFrontend/Helpers/SprTypeTraits.cpp +++ b/src/SparrowFrontend/Helpers/SprTypeTraits.cpp @@ -174,9 +174,8 @@ Type SprFrontend::commonType(CompilationContext* context, Type t1, Type t2) { // If there is one conversion from one type to another (and not vice-versa) take the less // specialized type - ConversionFlags flags = flagDontAddReference; - ConversionResult c1 = g_ConvertService->checkConversion(context, t1, t2, flags); - ConversionResult c2 = g_ConvertService->checkConversion(context, t2, t1, flags); + ConversionResult c1 = g_ConvertService->checkConversion(context, t1, t2); + ConversionResult c2 = g_ConvertService->checkConversion(context, t2, t1); if (c1 && !c2) { return t2; } diff --git a/src/SparrowFrontend/Services/Convert/ConvertServiceImpl.cpp b/src/SparrowFrontend/Services/Convert/ConvertServiceImpl.cpp index f6756645..5095c89a 100644 --- a/src/SparrowFrontend/Services/Convert/ConvertServiceImpl.cpp +++ b/src/SparrowFrontend/Services/Convert/ConvertServiceImpl.cpp @@ -155,8 +155,7 @@ bool ConvertServiceImpl::checkConversionToConcept(ConversionResult& res, // Case 1: concept -> concept if (isConceptType(srcBase)) { // Check wrapper types - bool canAddRef = (flags & flagDontAddReference) == 0; - if (!checkWrapperTypes(res, src, dest, canAddRef)) + if (!checkWrapperTypes(res, src, dest)) return false; // Iteratively search the base concept to find our dest type @@ -183,8 +182,7 @@ bool ConvertServiceImpl::checkConversionToConcept(ConversionResult& res, destTypeKind = typeKindData; // Check wrapper types - bool canAddRef = (flags & flagDontAddReference) == 0; - if (!checkWrapperTypes(res, src, dest, canAddRef)) + if (!checkWrapperTypes(res, src, dest)) return false; bool isOk = false; @@ -221,8 +219,7 @@ bool ConvertServiceImpl::checkDataConversion(ConversionResult& res, CompilationC // Case 1: The datatypes have the same decl if (dest.referredNode() == src.referredNode()) { // Check wrapper types - bool canAddRef = (flags & flagDontAddReference) == 0; - if (!checkWrapperTypes(res, src, dest, canAddRef)) + if (!checkWrapperTypes(res, src, dest)) return false; res.addConversion(convDirect); @@ -268,8 +265,7 @@ bool ConvertServiceImpl::checkDataConversion(ConversionResult& res, CompilationC res.addConversion(convCustom, ConvAction(ActionType::customCvt, resType), sourceCode); // Finally, check the wrapper types - bool canAddRef = (flags & flagDontAddReference) == 0; - if (!checkWrapperTypes(res, resType, dest, canAddRef)) + if (!checkWrapperTypes(res, resType, dest)) return false; return true; @@ -419,7 +415,7 @@ int setPlainIfKindMissing(int kind) { return kind == 0 ? typeKindData : kind; } } // namespace bool ConvertServiceImpl::checkWrapperTypes( - ConversionResult& res, TypeWithStorage src, TypeWithStorage dest, bool canAddRef) { + ConversionResult& res, TypeWithStorage src, TypeWithStorage dest) { // Analyze the two types: figure our their base type and all the wrappers static KindStack srcKinds; @@ -555,11 +551,10 @@ bool ConvertServiceImpl::checkWrapperTypes( src = removeRef(src); res.addConversion(convImplicit, ConvAction(ActionType::dereference, src)); } - // TODO: remove this + // Handle cases like T mut -> T or T ptr mut -> T ptr if (Feather::isCategoryType(src) && src.numReferences() > dest.numReferences()) { src = removeCategoryIfPresent(src); res.addConversion(convDirect, ConvAction(ActionType::dereference, src)); - // TODO (now): Should we make this convImplicit? } if (src != dest) { if (needsCast) diff --git a/src/SparrowFrontend/Services/Convert/ConvertServiceImpl.h b/src/SparrowFrontend/Services/Convert/ConvertServiceImpl.h index 788b66f9..f4c3c868 100644 --- a/src/SparrowFrontend/Services/Convert/ConvertServiceImpl.h +++ b/src/SparrowFrontend/Services/Convert/ConvertServiceImpl.h @@ -49,8 +49,7 @@ struct ConvertServiceImpl : IConvertService { //! The base types are assumed to be the same and just the wrapper types differ. //! Add all the conversions to 'res'. Returns false if conversion is impossible. //! The source type must be a data-like type. - bool checkWrapperTypes( - ConversionResult& res, TypeWithStorage src, TypeWithStorage dest, bool canAddRef); + bool checkWrapperTypes(ConversionResult& res, TypeWithStorage src, TypeWithStorage dest); }; } // namespace SprFrontend diff --git a/src/SparrowFrontend/Services/IConvertService.h b/src/SparrowFrontend/Services/IConvertService.h index 67f0e94b..4916021d 100644 --- a/src/SparrowFrontend/Services/IConvertService.h +++ b/src/SparrowFrontend/Services/IConvertService.h @@ -8,7 +8,6 @@ namespace SprFrontend { enum ConversionFlags { flagsDefault = 0, flagDontCallConversionCtor = 1, - flagDontAddReference = 2, }; //! The interface for the service that deals with conversions between types. diff --git a/unittests/SparrowFrontend/TestConvert.cpp b/unittests/SparrowFrontend/TestConvert.cpp index e2a8ea9d..70107d88 100644 --- a/unittests/SparrowFrontend/TestConvert.cpp +++ b/unittests/SparrowFrontend/TestConvert.cpp @@ -442,7 +442,7 @@ TEST_CASE_METHOD(ConvertFixture, "Conversion rules") { RC_PRE(srcPtr != dest); RC_LOG() << srcPtr << " -> " << dest << endl; - int flags = flagDontAddReference | flagDontCallConversionCtor; + int flags = flagDontCallConversionCtor; auto c1 = getConvType(src, dest, ConversionFlags(flags)); RC_LOG() << " " << src << " -> " << dest << " = " << int(c1) << endl; if (c1)