From 87940a649e3b4f757905015de95225d57ec2f27c Mon Sep 17 00:00:00 2001 From: Tim Foley Date: Fri, 24 Jul 2020 18:12:41 -0700 Subject: Fix bugs related to mutating implementations of interface methods (#1461) There are two main bug fixes here: * We were failing to diagnose when code calls a `[mutating]` method on a value that doesn't support mutation (that is an r-value instead of an l-value). * We had a bug in the synthesis logic for interface requirements where we used the *result* type of the requirement in place of each of the *parameter* types. The second bug made synthesis often produce incorrect signatures with `void` parameters. The first bug meant that even though a `[mutating]` method should not be able to satisfy a non-`[mutating]` method (and we had code to enforce this for the "exact match" case), when we go on to try and synthesize a non-`[mutating]` method that satisfies the requirement by delegating to the user-written one, it would end up succeeding, because nothing was stopping a non-`[mutating]` method from calling a `[mutating]` one. In each case this code adds a fix and a test case to confirm it. --- source/slang/slang-check-decl.cpp | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) (limited to 'source/slang/slang-check-decl.cpp') diff --git a/source/slang/slang-check-decl.cpp b/source/slang/slang-check-decl.cpp index 2879d7fa2..3cc0fd0f5 100644 --- a/source/slang/slang-check-decl.cpp +++ b/source/slang/slang-check-decl.cpp @@ -1576,7 +1576,7 @@ namespace Slang // auto synParamDecl = m_astBuilder->create(); synParamDecl->nameAndLoc = paramDeclRef.getDecl()->nameAndLoc; - synParamDecl->type.type = resultType; + synParamDecl->type.type = paramType; // We need to add the parameter as a child declaration of // the method we are building. @@ -1599,7 +1599,12 @@ namespace Slang // if any. // ThisExpr* synThis = nullptr; - if( !requiredMemberDeclRef.getDecl()->hasModifier() ) + if( requiredMemberDeclRef.getDecl()->hasModifier() ) + { + auto synStaticModifier = m_astBuilder->create(); + synFuncDecl->modifiers.first = synStaticModifier; + } + else { // For a non-`static` requirement, we need a `this` parameter. // -- cgit v1.2.3