summaryrefslogtreecommitdiff
path: root/source/slang/slang-check-decl.cpp
diff options
context:
space:
mode:
authorYong He <yonghe@outlook.com>2023-10-02 15:39:34 -0700
committerGitHub <noreply@github.com>2023-10-02 15:39:34 -0700
commitd87493a46c00be37b820a473c0827bbb865eb222 (patch)
tree33155e6be017238e07314f7793423dd50b748150 /source/slang/slang-check-decl.cpp
parentcea230bc686ef87db4cff47e367bbf824b90377d (diff)
More direct-SPIRV fixes. (#3257)
* More direct-SPIRV fixes. * Fix array-reg-to-mem. --------- Co-authored-by: Yong He <yhe@nvidia.com>
Diffstat (limited to 'source/slang/slang-check-decl.cpp')
-rw-r--r--source/slang/slang-check-decl.cpp32
1 files changed, 22 insertions, 10 deletions
diff --git a/source/slang/slang-check-decl.cpp b/source/slang/slang-check-decl.cpp
index 351d5a9cc..1e3c6a361 100644
--- a/source/slang/slang-check-decl.cpp
+++ b/source/slang/slang-check-decl.cpp
@@ -1836,18 +1836,20 @@ namespace Slang
RefPtr<WitnessTable> witnessTable)
{
if(satisfyingMemberDeclRef.getDecl()->hasModifier<MutatingAttribute>()
- && !requiredMemberDeclRef.getDecl()->hasModifier<MutatingAttribute>())
+ != requiredMemberDeclRef.getDecl()->hasModifier<MutatingAttribute>())
{
- // A `[mutating]` method can't satisfy a non-`[mutating]` requirement,
- // but vice-versa is okay.
+ // A `[mutating]` method can't satisfy a non-`[mutating]` requirement.
+ // The opposite direction is okay, but we will need to synthesize a wrapper
+ // to ensure type matches, so we will return false here either way.
return false;
}
if (satisfyingMemberDeclRef.getDecl()->hasModifier<ConstRefAttribute>()
- && !requiredMemberDeclRef.getDecl()->hasModifier<ConstRefAttribute>())
+ != requiredMemberDeclRef.getDecl()->hasModifier<ConstRefAttribute>())
{
- // A `[constref]` method can't satisfy a non-`[constref]` requirement,
- // but vice-versa is okay.
+ // A `[constref]` method can't satisfy a non-`[constref]` requirement.
+ // The opposite direction is okay, but we will need to synthesize a wrapper
+ // to ensure type matches, so we will return false here either way.
return false;
}
@@ -2677,11 +2679,21 @@ namespace Slang
synArg->type = paramType;
synArgs.add(synArg);
- if (paramDeclRef.getDecl()->findModifier<NoDiffModifier>())
+ // Add modifiers
+ for (auto modifier : paramDeclRef.getDecl()->modifiers)
{
- auto noDiffModifier = m_astBuilder->create<NoDiffModifier>();
- noDiffModifier->keywordName = getSession()->getNameObj("no_diff");
- addModifier(synParamDecl, noDiffModifier);
+ if (as<NoDiffModifier>(modifier))
+ {
+ auto noDiffModifier = m_astBuilder->create<NoDiffModifier>();
+ noDiffModifier->keywordName = getSession()->getNameObj("no_diff");
+ addModifier(synParamDecl, noDiffModifier);
+ }
+ else if (as<InOutModifier>(modifier) || as<OutModifier>(modifier) || as<ConstRefModifier>(modifier) || as<RefModifier>(modifier))
+ {
+ auto clonedModifier = (Modifier*)m_astBuilder->createByNodeType(modifier->astNodeType);
+ clonedModifier->keywordName = modifier->keywordName;
+ addModifier(synParamDecl, clonedModifier);
+ }
}
}